From 764b6034e3ae4efc694da366fbcd566ba7e68047 Mon Sep 17 00:00:00 2001
From: PartyDonut <42371342+PartyDonut@users.noreply.github.com>
Date: Sun, 15 Sep 2024 14:12:28 +0200
Subject: [PATCH] Init repo
---
.fvmrc | 3 +
.github/workflows/build.yml | 201 +
.gitignore | 47 +
.metadata | 30 +
.vscode/launch.json | 91 +
.vscode/settings.json | 12 +
.vscode/tasks.json | 86 +
LICENSE.txt | 674 +
README.md | 16 +
analysis_options.yaml | 19 +
android/.gitignore | 13 +
android/app/build.gradle | 77 +
android/app/src/debug/AndroidManifest.xml | 7 +
android/app/src/main/AndroidManifest.xml | 42 +
.../app/src/main/ic_launcher-playstore.png | Bin 0 -> 28206 bytes
.../nl/jknaapen/fladder/MainActivity.kt | 7 +
.../drawable-hdpi/ic_launcher_foreground.png | Bin 0 -> 6546 bytes
.../drawable-mdpi/ic_launcher_foreground.png | Bin 0 -> 4170 bytes
.../res/drawable-v21/launch_background.xml | 12 +
.../drawable-xhdpi/ic_launcher_foreground.png | Bin 0 -> 9223 bytes
.../ic_launcher_foreground.png | Bin 0 -> 14757 bytes
.../ic_launcher_foreground.png | Bin 0 -> 22325 bytes
.../res/drawable/ic_launcher_monochrome.png | Bin 0 -> 110488 bytes
.../res/drawable/ic_notification_icon.png | Bin 0 -> 12517 bytes
.../main/res/drawable/launch_background.xml | 10 +
.../res/mipmap-anydpi-v26/ic_launcher.xml | 6 +
.../res/mipmap-anydpi-v26/launcher_icon.xml | 5 +
.../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2797 bytes
.../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 6517 bytes
.../mipmap-hdpi/ic_launcher_monochrome.png | Bin 0 -> 3017 bytes
.../main/res/mipmap-hdpi/launcher_icon.png | Bin 0 -> 2811 bytes
.../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1846 bytes
.../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 4272 bytes
.../mipmap-mdpi/ic_launcher_monochrome.png | Bin 0 -> 2013 bytes
.../main/res/mipmap-mdpi/launcher_icon.png | Bin 0 -> 1868 bytes
.../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3743 bytes
.../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 9287 bytes
.../mipmap-xhdpi/ic_launcher_monochrome.png | Bin 0 -> 3859 bytes
.../main/res/mipmap-xhdpi/launcher_icon.png | Bin 0 -> 3773 bytes
.../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5859 bytes
.../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 14743 bytes
.../mipmap-xxhdpi/ic_launcher_monochrome.png | Bin 0 -> 5546 bytes
.../main/res/mipmap-xxhdpi/launcher_icon.png | Bin 0 -> 5787 bytes
.../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 7930 bytes
.../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 22503 bytes
.../mipmap-xxxhdpi/ic_launcher_monochrome.png | Bin 0 -> 6672 bytes
.../main/res/mipmap-xxxhdpi/launcher_icon.png | Bin 0 -> 8085 bytes
.../app/src/main/res/values-night/styles.xml | 19 +
android/app/src/main/res/values/colors.xml | 4 +
android/app/src/main/res/values/styles.xml | 19 +
android/app/src/profile/AndroidManifest.xml | 7 +
android/build.gradle | 18 +
android/gradle.properties | 3 +
.../gradle/wrapper/gradle-wrapper.properties | 5 +
android/settings.gradle | 26 +
assets/fonts/mp-font.ttf | Bin 0 -> 6244952 bytes
assets/marketing/banner.afphoto | Bin 0 -> 4369483 bytes
assets/marketing/banner.png | Bin 0 -> 325037 bytes
.../screenshots/Mobile/Dashboard.png | Bin 0 -> 2032745 bytes
.../screenshots/Mobile/Dashboard_2.png | Bin 0 -> 1878914 bytes
.../marketing/screenshots/Mobile/Details.png | Bin 0 -> 2163711 bytes
.../screenshots/Mobile/Details_2.png | Bin 0 -> 749035 bytes
.../screenshots/Mobile/Favourites.png | Bin 0 -> 748901 bytes
.../marketing/screenshots/Mobile/Library.png | Bin 0 -> 1653829 bytes
.../marketing/screenshots/Mobile/Player.png | Bin 0 -> 916554 bytes
.../screenshots/Mobile/Resume_Tab.png | Bin 0 -> 1019878 bytes
.../marketing/screenshots/Mobile/Settings.png | Bin 0 -> 116919 bytes
assets/marketing/screenshots/Mobile/Sync.png | Bin 0 -> 171071 bytes
.../screenshots/Tablet/Dashboard.png | Bin 0 -> 2200681 bytes
.../marketing/screenshots/Tablet/Details.png | Bin 0 -> 1343079 bytes
.../marketing/screenshots/Tablet/Settings.png | Bin 0 -> 79623 bytes
assets/marketing/screenshots/Tablet/Sync.png | Bin 0 -> 191649 bytes
build.yaml | 34 +
devtools_options.yaml | 1 +
icons/fladder_adaptive_icon.png | Bin 0 -> 44278 bytes
icons/fladder_icon.png | Bin 0 -> 233949 bytes
icons/fladder_icon.svg | 16 +
icons/fladder_icon_desktop.png | Bin 0 -> 537129 bytes
icons/fladder_icon_grayscale.svg | 19 +
icons/fladder_icon_outline.svg | 8 +
icons/fladder_store_icon.jpg | Bin 0 -> 20370 bytes
icons_launcher.yaml | 23 +
ios/.gitignore | 34 +
ios/Flutter/AppFrameworkInfo.plist | 26 +
ios/Flutter/Debug.xcconfig | 2 +
ios/Flutter/Release.xcconfig | 2 +
ios/Podfile | 44 +
ios/Podfile.lock | 123 +
ios/Runner.xcodeproj/project.pbxproj | 552 +
.../contents.xcworkspacedata | 7 +
.../xcshareddata/IDEWorkspaceChecks.plist | 8 +
.../xcshareddata/WorkspaceSettings.xcsettings | 8 +
.../xcshareddata/xcschemes/Runner.xcscheme | 87 +
.../contents.xcworkspacedata | 10 +
.../xcshareddata/IDEWorkspaceChecks.plist | 8 +
.../xcshareddata/WorkspaceSettings.xcsettings | 8 +
ios/Runner/AppDelegate.swift | 13 +
.../AppIcon.appiconset/Contents.json | 122 +
.../Icon-App-1024x1024@1x.png | Bin 0 -> 57337 bytes
.../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 757 bytes
.../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes
.../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1878 bytes
.../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 967 bytes
.../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1809 bytes
.../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 2739 bytes
.../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes
.../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 2516 bytes
.../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 3865 bytes
.../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 0 -> 1576 bytes
.../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 0 -> 3179 bytes
.../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 1766 bytes
.../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 3629 bytes
.../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 3865 bytes
.../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 5994 bytes
.../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 0 -> 2269 bytes
.../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 0 -> 4660 bytes
.../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 2367 bytes
.../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 4961 bytes
.../Icon-App-83.5x83.5@2x.png | Bin 0 -> 5429 bytes
.../LaunchImage.imageset/Contents.json | 23 +
.../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes
.../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes
.../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes
.../LaunchImage.imageset/README.md | 5 +
ios/Runner/Base.lproj/LaunchScreen.storyboard | 37 +
ios/Runner/Base.lproj/Main.storyboard | 26 +
ios/Runner/Info.plist | 51 +
ios/Runner/Runner-Bridging-Header.h | 1 +
l10n.yaml | 5 +
lib/android_tv/main.dart | 53 +
lib/jellyfin/client_index.dart | 1 +
lib/jellyfin/client_mapping.dart | 1 +
lib/jellyfin/enum_models.dart | 47 +
.../jellyfin_open_api.enums.swagger.dart | 5318 ++
.../jellyfin_open_api.swagger.chopper.dart | 10335 +++
lib/jellyfin/jellyfin_open_api.swagger.dart | 65767 ++++++++++++++++
lib/jellyfin/jellyfin_open_api.swagger.g.dart | 9317 +++
lib/l10n/app_en.arb | 669 +
lib/l10n/app_es.arb | 669 +
lib/l10n/app_fr.arb | 669 +
lib/l10n/app_jp.arb | 669 +
lib/l10n/app_nl.arb | 669 +
lib/l10n/app_zh.arb | 669 +
lib/l10n/l10n_errors.txt | 1 +
lib/main.dart | 339 +
lib/models/account_model.dart | 107 +
lib/models/account_model.freezed.dart | 450 +
lib/models/account_model.g.dart | 50 +
lib/models/book_model.dart | 72 +
lib/models/boxset_model.dart | 47 +
lib/models/boxset_model.mapper.dart | 242 +
lib/models/collection_types.dart | 49 +
lib/models/credentials_model.dart | 81 +
lib/models/favourites_model.dart | 26 +
lib/models/home_model.dart | 34 +
lib/models/information_model.dart | 107 +
lib/models/item_base_model.dart | 363 +
lib/models/item_base_model.mapper.dart | 214 +
lib/models/item_editing_model.dart | 318 +
lib/models/items/chapters_model.dart | 90 +
lib/models/items/episode_model.dart | 201 +
lib/models/items/episode_model.mapper.dart | 301 +
lib/models/items/folder_model.dart | 50 +
lib/models/items/folder_model.mapper.dart | 242 +
lib/models/items/images_models.dart | 286 +
lib/models/items/intro_skip_model.dart | 47 +
.../items/intro_skip_model.freezed.dart | 565 +
lib/models/items/intro_skip_model.g.dart | 46 +
lib/models/items/item_properties_model.dart | 21 +
.../items/item_properties_model.freezed.dart | 156 +
lib/models/items/item_shared_models.dart | 380 +
.../items/item_shared_models.mapper.dart | 162 +
lib/models/items/item_stream_model.dart | 67 +
.../items/item_stream_model.mapper.dart | 245 +
lib/models/items/media_streams_model.dart | 372 +
lib/models/items/movie_model.dart | 107 +
lib/models/items/movie_model.mapper.dart | 318 +
lib/models/items/overview_model.dart | 82 +
lib/models/items/overview_model.mapper.dart | 302 +
lib/models/items/person_model.dart | 68 +
lib/models/items/person_model.mapper.dart | 281 +
lib/models/items/photos_model.dart | 154 +
lib/models/items/photos_model.mapper.dart | 498 +
lib/models/items/season_model.dart | 98 +
lib/models/items/season_model.mapper.dart | 287 +
lib/models/items/series_model.dart | 96 +
lib/models/items/series_model.mapper.dart | 309 +
lib/models/items/trick_play_model.dart | 61 +
.../items/trick_play_model.freezed.dart | 297 +
lib/models/items/trick_play_model.g.dart | 33 +
lib/models/library_model.dart | 61 +
.../library_search/library_search_model.dart | 223 +
.../library_search_model.mapper.dart | 418 +
.../library_search_options.dart | 127 +
lib/models/login_screen_model.dart | 26 +
lib/models/media_playback_model.dart | 52 +
.../playback/direct_playback_model.dart | 209 +
.../playback/offline_playback_model.dart | 175 +
lib/models/playback/playback_model.dart | 370 +
.../playback/transcode_playback_model.dart | 210 +
lib/models/playlist_model.dart | 40 +
lib/models/recommended_model.dart | 25 +
lib/models/search_model.dart | 28 +
.../settings/client_settings_model.dart | 117 +
.../client_settings_model.freezed.dart | 526 +
.../settings/client_settings_model.g.dart | 83 +
lib/models/settings/home_settings_model.dart | 108 +
.../settings/subtitle_settings_model.dart | 254 +
.../settings/video_player_settings.dart | 113 +
lib/models/syncing/download_stream.dart | 41 +
lib/models/syncing/i_synced_item.dart | 75 +
lib/models/syncing/i_synced_item.g.dart | 3600 +
lib/models/syncing/sync_item.dart | 197 +
lib/models/syncing/sync_item.freezed.dart | 494 +
lib/models/syncing/sync_item.g.dart | 71 +
lib/models/syncing/sync_settings_model.dart | 16 +
.../syncing/sync_settings_model.freezed.dart | 144 +
lib/models/trickplayer_model.dart | 177 +
lib/models/video_stream_model.dart | 208 +
lib/models/view_model.dart | 97 +
lib/models/views_model.dart | 24 +
lib/profiles/default_profile.dart | 35 +
lib/profiles/web_profile.dart | 269 +
lib/providers/api_provider.dart | 73 +
lib/providers/api_provider.g.dart | 25 +
lib/providers/auth_provider.dart | 123 +
lib/providers/book_viewer_provider.dart | 188 +
lib/providers/collections_provider.dart | 100 +
lib/providers/dashboard_provider.dart | 111 +
lib/providers/discovery_provider.dart | 114 +
lib/providers/discovery_provider.g.dart | 26 +
lib/providers/discovery_provider.mapper.dart | 130 +
lib/providers/edit_item_provider.dart | 234 +
lib/providers/favourites_provider.dart | 81 +
lib/providers/image_provider.dart | 90 +
.../items/book_details_provider.dart | 149 +
.../items/episode_details_provider.dart | 106 +
.../items/folder_details_provider.dart | 42 +
lib/providers/items/identify_provider.dart | 132 +
lib/providers/items/information_provider.dart | 47 +
.../items/item_details_provider.dart | 22 +
.../items/movies_details_provider.dart | 51 +
.../items/movies_details_provider.g.dart | 174 +
.../items/person_details_provider.dart | 69 +
.../items/photo_details_provider.dart | 49 +
.../items/season_details_provider.dart | 33 +
.../items/series_details_provider.dart | 95 +
lib/providers/library_provider.dart | 174 +
lib/providers/library_search_provider.dart | 670 +
lib/providers/playlist_provider.dart | 83 +
lib/providers/related_provider.dart | 27 +
lib/providers/search_provider.dart | 42 +
lib/providers/service_provider.dart | 938 +
lib/providers/session_info_provider.dart | 64 +
.../session_info_provider.freezed.dart | 173 +
lib/providers/session_info_provider.g.dart | 46 +
.../book_viewer_settings_provider.dart | 140 +
.../settings/client_settings_provider.dart | 54 +
.../settings/home_settings_provider.dart | 21 +
.../photo_view_settings_provider.dart | 82 +
.../settings/subtitle_settings_provider.dart | 40 +
.../video_player_settings_provider.dart | 57 +
lib/providers/shared_provider.dart | 202 +
.../sync/background_download_provider.dart | 16 +
.../sync/background_download_provider.g.dart | 26 +
lib/providers/sync/sync_provider_helpers.dart | 104 +
.../sync/sync_provider_helpers.g.dart | 603 +
lib/providers/sync_provider.dart | 627 +
lib/providers/sync_provider_web.dart | 13 +
lib/providers/user_provider.dart | 145 +
lib/providers/user_provider.g.dart | 40 +
lib/providers/video_player_provider.dart | 125 +
lib/providers/views_provider.dart | 64 +
lib/routes/app_routes.dart | 121 +
lib/routes/build_routes/home_routes.dart | 182 +
lib/routes/build_routes/route_builder.dart | 124 +
lib/routes/build_routes/settings_routes.dart | 103 +
.../book_viewer/book_viewer_chapters.dart | 118 +
.../book_viewer/book_viewer_controls.dart | 398 +
.../book_viewer/book_viewer_reader.dart | 119 +
.../book_viewer/book_viewer_reader_web.dart | 33 +
.../book_viewer/book_viewer_screen.dart | 270 +
.../book_viewer/book_viewer_settings.dart | 187 +
.../collections/add_to_collection.dart | 174 +
lib/screens/dashboard/dashboard_screen.dart | 203 +
.../details_screens/book_detail_screen.dart | 228 +
.../components/label_title_item.dart | 39 +
.../components/media_stream_information.dart | 146 +
.../components/overview_header.dart | 165 +
.../details_screens/details_screens.dart | 4 +
lib/screens/details_screens/empty_item.dart | 19 +
.../episode_detail_screen.dart | 176 +
.../details_screens/folder_detail_screen.dart | 59 +
.../details_screens/movie_detail_screen.dart | 164 +
.../details_screens/person_detail_screen.dart | 127 +
.../details_screens/season_detail_screen.dart | 185 +
.../details_screens/series_detail_screen.dart | 165 +
lib/screens/favourites/favourites_screen.dart | 82 +
lib/screens/home.dart | 86 +
.../library/components/library_tabs.dart | 83 +
lib/screens/library/library_screen.dart | 92 +
lib/screens/library/tabs/favourites_tab.dart | 37 +
lib/screens/library/tabs/library_tab.dart | 40 +
.../library/tabs/recommendations_tab.dart | 49 +
lib/screens/library/tabs/timeline_tab.dart | 132 +
.../library_search/library_search_screen.dart | 790 +
.../widgets/library_filter_chips.dart | 219 +
.../widgets/library_sort_dialogue.dart | 78 +
.../library_search/widgets/library_views.dart | 387 +
.../widgets/suggestion_search_bar.dart | 184 +
lib/screens/login/lock_screen.dart | 145 +
lib/screens/login/login_edit_user.dart | 99 +
lib/screens/login/login_screen.dart | 393 +
lib/screens/login/login_user_grid.dart | 149 +
.../widgets/discover_servers_widget.dart | 161 +
lib/screens/login/widgets/login_icon.dart | 97 +
lib/screens/media_content.dart | 16 +
lib/screens/metadata/edit_item.dart | 165 +
.../metadata/edit_screens/edit_fields.dart | 738 +
.../edit_screens/edit_image_content.dart | 243 +
lib/screens/metadata/identifty_screen.dart | 361 +
lib/screens/metadata/info_screen.dart | 217 +
lib/screens/metadata/refresh_metadata.dart | 123 +
.../photo_viewer/photo_viewer_controls.dart | 343 +
.../photo_viewer/photo_viewer_screen.dart | 526 +
.../photo_viewer/simple_video_player.dart | 261 +
lib/screens/playlists/add_to_playlists.dart | 159 +
lib/screens/search/search_screen.dart | 89 +
.../settings/client_settings_page.dart | 476 +
.../settings/player_settings_page.dart | 123 +
.../settings/quick_connect_window.dart | 119 +
.../settings/security_settings_page.dart | 41 +
lib/screens/settings/settings_list_tile.dart | 72 +
lib/screens/settings/settings_scaffold.dart | 95 +
lib/screens/settings/settings_screen.dart | 223 +
.../widgets/settings_label_divider.dart | 25 +
.../widgets/settings_message_box.dart | 47 +
.../settings/widgets/subtitle_editor.dart | 94 +
lib/screens/shared/adaptive_dialog.dart | 23 +
lib/screens/shared/animated_fade_size.dart | 26 +
.../shared/authenticate_button_options.dart | 72 +
lib/screens/shared/chips/category_chip.dart | 264 +
lib/screens/shared/default_alert_dialog.dart | 71 +
lib/screens/shared/default_titlebar.dart | 169 +
lib/screens/shared/detail_scaffold.dart | 303 +
lib/screens/shared/file_picker.dart | 198 +
lib/screens/shared/fladder_icon.dart | 57 +
lib/screens/shared/fladder_logo.dart | 32 +
lib/screens/shared/fladder_snackbar.dart | 189 +
lib/screens/shared/flat_button.dart | 46 +
lib/screens/shared/floating_search_bar.dart | 102 +
.../shared/focused_outlined_text_field.dart | 89 +
lib/screens/shared/input_fields.dart | 44 +
lib/screens/shared/media/carousel_banner.dart | 378 +
lib/screens/shared/media/chapter_row.dart | 117 +
.../shared/media/components/chip_button.dart | 26 +
.../shared/media/components/media_header.dart | 53 +
.../media/components/media_play_button.dart | 81 +
.../media/components/next_up_episode.dart | 103 +
.../shared/media/components/poster_image.dart | 428 +
.../components/small_detail_widgets.dart | 95 +
.../shared/media/episode_details_list.dart | 159 +
lib/screens/shared/media/episode_posters.dart | 306 +
.../shared/media/expanding_overview.dart | 84 +
lib/screens/shared/media/external_urls.dart | 68 +
.../shared/media/item_detail_list_widget.dart | 110 +
lib/screens/shared/media/people_row.dart | 99 +
lib/screens/shared/media/person_list_.dart | 38 +
lib/screens/shared/media/poster_grid.dart | 71 +
.../shared/media/poster_list_item.dart | 218 +
lib/screens/shared/media/poster_row.dart | 49 +
lib/screens/shared/media/poster_widget.dart | 127 +
lib/screens/shared/media/season_row.dart | 186 +
lib/screens/shared/nested_bottom_appbar.dart | 38 +
lib/screens/shared/nested_scaffold.dart | 34 +
lib/screens/shared/nested_sliver_appbar.dart | 83 +
lib/screens/shared/outlined_text_field.dart | 177 +
lib/screens/shared/passcode_input.dart | 173 +
lib/screens/shared/user_icon.dart | 72 +
lib/screens/splash_screen.dart | 56 +
lib/screens/syncing/sync_button.dart | 71 +
lib/screens/syncing/sync_child_item.dart | 66 +
lib/screens/syncing/sync_item_details.dart | 256 +
lib/screens/syncing/sync_list_item.dart | 148 +
lib/screens/syncing/sync_widgets.dart | 138 +
lib/screens/syncing/synced_screen.dart | 91 +
.../syncing/widgets/sync_markedfordelete.dart | 41 +
.../widgets/sync_progress_builder.dart | 17 +
.../syncing/widgets/synced_episode_item.dart | 122 +
.../syncing/widgets/synced_season_poster.dart | 95 +
.../video_playback_information.dart | 77 +
.../components/video_player_chapters.dart | 92 +
.../video_player_controls_extras.dart | 111 +
.../video_player_options_sheet.dart | 430 +
.../components/video_player_queue.dart | 153 +
.../components/video_progress_bar.dart | 414 +
.../components/video_subtitle_controls.dart | 341 +
.../components/video_subtitles.dart | 64 +
.../components/video_volume_slider.dart | 76 +
lib/screens/video_player/video_player.dart | 153 +
.../video_player/video_player_controls.dart | 625 +
lib/theme.dart | 135 +
lib/util/absorb_events.dart | 22 +
lib/util/adaptive_layout.dart | 193 +
lib/util/application_info.dart | 38 +
lib/util/auth_service.dart | 36 +
lib/util/box_fit_extension.dart | 16 +
lib/util/custom_color_themes.dart | 81 +
lib/util/debouncer.dart | 14 +
lib/util/disable_keypad_focus.dart | 28 +
lib/util/duration_extensions.dart | 17 +
lib/util/fab_extended_anim.dart | 44 +
lib/util/fladder_image.dart | 63 +
lib/util/grouping.dart | 14 +
lib/util/header_generate.dart | 11 +
lib/util/humanize_duration.dart | 28 +
.../item_base_model_extensions.dart | 250 +
.../item_base_model/play_item_helpers.dart | 340 +
lib/util/jelly_id.dart | 8 +
lib/util/jellyfin_extension.dart | 28 +
lib/util/keyed_list_view.dart | 96 +
lib/util/list_extensions.dart | 92 +
lib/util/list_padding.dart | 42 +
lib/util/local_extension.dart | 14 +
lib/util/localization_helper.dart | 6 +
lib/util/map_bool_helper.dart | 62 +
lib/util/mouse_parking.dart | 40 +
lib/util/num_extension.dart | 14 +
lib/util/option_dialogue.dart | 31 +
lib/util/player_extensions.dart | 16 +
lib/util/player_extensions_web.dart | 6 +
lib/util/poster_defaults.dart | 8 +
lib/util/refresh_state.dart | 40 +
lib/util/simple_duration_picker.dart | 174 +
lib/util/size_formatting.dart | 22 +
lib/util/sliver_list_padding.dart | 25 +
lib/util/sticky_header_text.dart | 49 +
lib/util/stream_value.dart | 38 +
lib/util/string_extensions.dart | 68 +
lib/util/theme_extensions.dart | 6 +
lib/util/theme_mode_extension.dart | 12 +
lib/util/themes_data.dart | 25 +
lib/util/throttler.dart | 20 +
lib/util/track_extensions.dart | 45 +
lib/util/video_properties.dart | 119 +
lib/util/widget_extensions.dart | 29 +
lib/widgets/gapped_container_shape.dart | 108 +
.../components/adaptive_fab.dart | 50 +
.../components/destination_model.dart | 92 +
.../components/drawer_list_button.dart | 77 +
.../components/fladder_appbar.dart | 59 +
.../components/floating_player_bar.dart | 207 +
.../components/navigation_body.dart | 170 +
.../components/navigation_button.dart | 125 +
.../components/navigation_drawer.dart | 153 +
.../components/settings_user_icon.dart | 30 +
.../navigation_scaffold.dart | 118 +
lib/widgets/pop_up/delete_file.dart | 39 +
lib/widgets/shared/adaptive_date_picker.dart | 57 +
lib/widgets/shared/animated_icon.dart | 92 +
lib/widgets/shared/clickable_text.dart | 61 +
lib/widgets/shared/elevated_icon.dart | 85 +
lib/widgets/shared/enum_selection.dart | 82 +
lib/widgets/shared/filled_button_await.dart | 61 +
lib/widgets/shared/fladder_scrollbar.dart | 39 +
lib/widgets/shared/fladder_slider.dart | 202 +
lib/widgets/shared/hide_on_scroll.dart | 77 +
lib/widgets/shared/horizontal_list.dart | 190 +
lib/widgets/shared/hover_widget.dart | 30 +
lib/widgets/shared/icon_button_await.dart | 56 +
lib/widgets/shared/item_actions.dart | 119 +
lib/widgets/shared/list_button.dart | 30 +
lib/widgets/shared/modal_bottom_sheet.dart | 101 +
lib/widgets/shared/modal_side_sheet.dart | 146 +
lib/widgets/shared/pinch_poster_zoom.dart | 33 +
lib/widgets/shared/poster_size_slider.dart | 43 +
.../shared/progress_floating_button.dart | 181 +
lib/widgets/shared/pull_to_refresh.dart | 83 +
lib/widgets/shared/scroll_position.dart | 66 +
.../shared/selectable_icon_button.dart | 103 +
lib/widgets/shared/shapes.dart | 65 +
lib/widgets/shared/spaced_list_tile.dart | 27 +
lib/widgets/shared/status_card.dart | 31 +
lib/widgets/shared/trickplay_image.dart | 126 +
lib/wrappers/media_control_base.dart | 64 +
lib/wrappers/media_control_wrapper.dart | 241 +
lib/wrappers/media_control_wrapper_web.dart | 169 +
lib/wrappers/media_wrapper_interface.dart | 71 +
linux/.gitignore | 1 +
linux/CMakeLists.txt | 138 +
linux/flutter/CMakeLists.txt | 88 +
linux/flutter/generated_plugin_registrant.cc | 43 +
linux/flutter/generated_plugin_registrant.h | 15 +
linux/flutter/generated_plugins.cmake | 32 +
linux/main.cc | 6 +
linux/my_application.cc | 116 +
linux/my_application.h | 18 +
macos/.gitignore | 7 +
macos/Flutter/Flutter-Debug.xcconfig | 2 +
macos/Flutter/Flutter-Release.xcconfig | 2 +
macos/Flutter/GeneratedPluginRegistrant.swift | 48 +
macos/Podfile | 43 +
macos/Podfile.lock | 123 +
macos/Runner.xcodeproj/project.pbxproj | 791 +
.../xcshareddata/IDEWorkspaceChecks.plist | 8 +
.../xcshareddata/xcschemes/Runner.xcscheme | 98 +
.../contents.xcworkspacedata | 10 +
.../xcshareddata/IDEWorkspaceChecks.plist | 8 +
macos/Runner/AppDelegate.swift | 9 +
.../AppIcon.appiconset/Contents.json | 68 +
.../AppIcon.appiconset/app_icon-1024.png | Bin 0 -> 539828 bytes
.../AppIcon.appiconset/app_icon-128.png | Bin 0 -> 12897 bytes
.../AppIcon.appiconset/app_icon-16.png | Bin 0 -> 1772 bytes
.../AppIcon.appiconset/app_icon-256.png | Bin 0 -> 38026 bytes
.../AppIcon.appiconset/app_icon-32.png | Bin 0 -> 2733 bytes
.../AppIcon.appiconset/app_icon-512.png | Bin 0 -> 138788 bytes
.../AppIcon.appiconset/app_icon-64.png | Bin 0 -> 5415 bytes
.../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 248999 bytes
.../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 11558 bytes
.../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 1284 bytes
.../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 31039 bytes
.../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 2533 bytes
.../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 84397 bytes
.../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 5245 bytes
macos/Runner/Base.lproj/MainMenu.xib | 343 +
macos/Runner/Configs/AppInfo.xcconfig | 14 +
macos/Runner/Configs/Debug.xcconfig | 2 +
macos/Runner/Configs/Release.xcconfig | 2 +
macos/Runner/Configs/Warnings.xcconfig | 13 +
macos/Runner/DebugProfile.entitlements | 14 +
macos/Runner/Info.plist | 32 +
macos/Runner/MainFlutterWindow.swift | 15 +
macos/Runner/Release.entitlements | 10 +
macos/RunnerTests/RunnerTests.swift | 12 +
pubspec.lock | 2159 +
pubspec.yaml | 165 +
snap/gui/app_icon.desktop | 8 +
snap/gui/app_icon.png | Bin 0 -> 31039 bytes
swagger/jellyfin-open-api.json | 58320 ++++++++++++++
test/widget_test.dart | 29 +
true | 5 +
web/favicon.png | Bin 0 -> 722 bytes
web/icons/Icon-192.png | Bin 0 -> 7930 bytes
web/icons/Icon-512.png | Bin 0 -> 28206 bytes
web/icons/Icon-maskable-192.png | Bin 0 -> 7930 bytes
web/icons/Icon-maskable-512.png | Bin 0 -> 28206 bytes
web/index.html | 59 +
web/manifest.json | 35 +
windows/.gitignore | 17 +
windows/CMakeLists.txt | 101 +
windows/flutter/CMakeLists.txt | 109 +
.../flutter/generated_plugin_registrant.cc | 47 +
windows/flutter/generated_plugin_registrant.h | 15 +
windows/flutter/generated_plugins.cmake | 37 +
windows/runner/CMakeLists.txt | 40 +
windows/runner/Runner.rc | 121 +
windows/runner/flutter_window.cpp | 71 +
windows/runner/flutter_window.h | 33 +
windows/runner/main.cpp | 47 +
windows/runner/resource.h | 16 +
windows/runner/resources/app_icon.ico | Bin 0 -> 65776 bytes
windows/runner/runner.exe.manifest | 20 +
windows/runner/utils.cpp | 64 +
windows/runner/utils.h | 19 +
windows/runner/win32_window.cpp | 288 +
windows/runner/win32_window.h | 102 +
566 files changed, 212335 insertions(+)
create mode 100644 .fvmrc
create mode 100644 .github/workflows/build.yml
create mode 100644 .gitignore
create mode 100644 .metadata
create mode 100644 .vscode/launch.json
create mode 100644 .vscode/settings.json
create mode 100644 .vscode/tasks.json
create mode 100644 LICENSE.txt
create mode 100644 README.md
create mode 100644 analysis_options.yaml
create mode 100644 android/.gitignore
create mode 100644 android/app/build.gradle
create mode 100644 android/app/src/debug/AndroidManifest.xml
create mode 100644 android/app/src/main/AndroidManifest.xml
create mode 100644 android/app/src/main/ic_launcher-playstore.png
create mode 100644 android/app/src/main/kotlin/nl/jknaapen/fladder/MainActivity.kt
create mode 100644 android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png
create mode 100644 android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png
create mode 100644 android/app/src/main/res/drawable-v21/launch_background.xml
create mode 100644 android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png
create mode 100644 android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png
create mode 100644 android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png
create mode 100644 android/app/src/main/res/drawable/ic_launcher_monochrome.png
create mode 100644 android/app/src/main/res/drawable/ic_notification_icon.png
create mode 100644 android/app/src/main/res/drawable/launch_background.xml
create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/launcher_icon.xml
create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png
create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png
create mode 100644 android/app/src/main/res/mipmap-hdpi/launcher_icon.png
create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png
create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png
create mode 100644 android/app/src/main/res/mipmap-mdpi/launcher_icon.png
create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png
create mode 100644 android/app/src/main/res/mipmap-xhdpi/launcher_icon.png
create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png
create mode 100644 android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png
create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png
create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png
create mode 100644 android/app/src/main/res/values-night/styles.xml
create mode 100644 android/app/src/main/res/values/colors.xml
create mode 100644 android/app/src/main/res/values/styles.xml
create mode 100644 android/app/src/profile/AndroidManifest.xml
create mode 100644 android/build.gradle
create mode 100644 android/gradle.properties
create mode 100644 android/gradle/wrapper/gradle-wrapper.properties
create mode 100644 android/settings.gradle
create mode 100644 assets/fonts/mp-font.ttf
create mode 100644 assets/marketing/banner.afphoto
create mode 100644 assets/marketing/banner.png
create mode 100644 assets/marketing/screenshots/Mobile/Dashboard.png
create mode 100644 assets/marketing/screenshots/Mobile/Dashboard_2.png
create mode 100644 assets/marketing/screenshots/Mobile/Details.png
create mode 100644 assets/marketing/screenshots/Mobile/Details_2.png
create mode 100644 assets/marketing/screenshots/Mobile/Favourites.png
create mode 100644 assets/marketing/screenshots/Mobile/Library.png
create mode 100644 assets/marketing/screenshots/Mobile/Player.png
create mode 100644 assets/marketing/screenshots/Mobile/Resume_Tab.png
create mode 100644 assets/marketing/screenshots/Mobile/Settings.png
create mode 100644 assets/marketing/screenshots/Mobile/Sync.png
create mode 100644 assets/marketing/screenshots/Tablet/Dashboard.png
create mode 100644 assets/marketing/screenshots/Tablet/Details.png
create mode 100644 assets/marketing/screenshots/Tablet/Settings.png
create mode 100644 assets/marketing/screenshots/Tablet/Sync.png
create mode 100644 build.yaml
create mode 100644 devtools_options.yaml
create mode 100644 icons/fladder_adaptive_icon.png
create mode 100644 icons/fladder_icon.png
create mode 100644 icons/fladder_icon.svg
create mode 100644 icons/fladder_icon_desktop.png
create mode 100644 icons/fladder_icon_grayscale.svg
create mode 100644 icons/fladder_icon_outline.svg
create mode 100644 icons/fladder_store_icon.jpg
create mode 100644 icons_launcher.yaml
create mode 100644 ios/.gitignore
create mode 100644 ios/Flutter/AppFrameworkInfo.plist
create mode 100644 ios/Flutter/Debug.xcconfig
create mode 100644 ios/Flutter/Release.xcconfig
create mode 100644 ios/Podfile
create mode 100644 ios/Podfile.lock
create mode 100644 ios/Runner.xcodeproj/project.pbxproj
create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata
create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
create mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
create mode 100644 ios/Runner/AppDelegate.swift
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard
create mode 100644 ios/Runner/Base.lproj/Main.storyboard
create mode 100644 ios/Runner/Info.plist
create mode 100644 ios/Runner/Runner-Bridging-Header.h
create mode 100644 l10n.yaml
create mode 100644 lib/android_tv/main.dart
create mode 100644 lib/jellyfin/client_index.dart
create mode 100644 lib/jellyfin/client_mapping.dart
create mode 100644 lib/jellyfin/enum_models.dart
create mode 100644 lib/jellyfin/jellyfin_open_api.enums.swagger.dart
create mode 100644 lib/jellyfin/jellyfin_open_api.swagger.chopper.dart
create mode 100644 lib/jellyfin/jellyfin_open_api.swagger.dart
create mode 100644 lib/jellyfin/jellyfin_open_api.swagger.g.dart
create mode 100644 lib/l10n/app_en.arb
create mode 100644 lib/l10n/app_es.arb
create mode 100644 lib/l10n/app_fr.arb
create mode 100644 lib/l10n/app_jp.arb
create mode 100644 lib/l10n/app_nl.arb
create mode 100644 lib/l10n/app_zh.arb
create mode 100644 lib/l10n/l10n_errors.txt
create mode 100644 lib/main.dart
create mode 100644 lib/models/account_model.dart
create mode 100644 lib/models/account_model.freezed.dart
create mode 100644 lib/models/account_model.g.dart
create mode 100644 lib/models/book_model.dart
create mode 100644 lib/models/boxset_model.dart
create mode 100644 lib/models/boxset_model.mapper.dart
create mode 100644 lib/models/collection_types.dart
create mode 100644 lib/models/credentials_model.dart
create mode 100644 lib/models/favourites_model.dart
create mode 100644 lib/models/home_model.dart
create mode 100644 lib/models/information_model.dart
create mode 100644 lib/models/item_base_model.dart
create mode 100644 lib/models/item_base_model.mapper.dart
create mode 100644 lib/models/item_editing_model.dart
create mode 100644 lib/models/items/chapters_model.dart
create mode 100644 lib/models/items/episode_model.dart
create mode 100644 lib/models/items/episode_model.mapper.dart
create mode 100644 lib/models/items/folder_model.dart
create mode 100644 lib/models/items/folder_model.mapper.dart
create mode 100644 lib/models/items/images_models.dart
create mode 100644 lib/models/items/intro_skip_model.dart
create mode 100644 lib/models/items/intro_skip_model.freezed.dart
create mode 100644 lib/models/items/intro_skip_model.g.dart
create mode 100644 lib/models/items/item_properties_model.dart
create mode 100644 lib/models/items/item_properties_model.freezed.dart
create mode 100644 lib/models/items/item_shared_models.dart
create mode 100644 lib/models/items/item_shared_models.mapper.dart
create mode 100644 lib/models/items/item_stream_model.dart
create mode 100644 lib/models/items/item_stream_model.mapper.dart
create mode 100644 lib/models/items/media_streams_model.dart
create mode 100644 lib/models/items/movie_model.dart
create mode 100644 lib/models/items/movie_model.mapper.dart
create mode 100644 lib/models/items/overview_model.dart
create mode 100644 lib/models/items/overview_model.mapper.dart
create mode 100644 lib/models/items/person_model.dart
create mode 100644 lib/models/items/person_model.mapper.dart
create mode 100644 lib/models/items/photos_model.dart
create mode 100644 lib/models/items/photos_model.mapper.dart
create mode 100644 lib/models/items/season_model.dart
create mode 100644 lib/models/items/season_model.mapper.dart
create mode 100644 lib/models/items/series_model.dart
create mode 100644 lib/models/items/series_model.mapper.dart
create mode 100644 lib/models/items/trick_play_model.dart
create mode 100644 lib/models/items/trick_play_model.freezed.dart
create mode 100644 lib/models/items/trick_play_model.g.dart
create mode 100644 lib/models/library_model.dart
create mode 100644 lib/models/library_search/library_search_model.dart
create mode 100644 lib/models/library_search/library_search_model.mapper.dart
create mode 100644 lib/models/library_search/library_search_options.dart
create mode 100644 lib/models/login_screen_model.dart
create mode 100644 lib/models/media_playback_model.dart
create mode 100644 lib/models/playback/direct_playback_model.dart
create mode 100644 lib/models/playback/offline_playback_model.dart
create mode 100644 lib/models/playback/playback_model.dart
create mode 100644 lib/models/playback/transcode_playback_model.dart
create mode 100644 lib/models/playlist_model.dart
create mode 100644 lib/models/recommended_model.dart
create mode 100644 lib/models/search_model.dart
create mode 100644 lib/models/settings/client_settings_model.dart
create mode 100644 lib/models/settings/client_settings_model.freezed.dart
create mode 100644 lib/models/settings/client_settings_model.g.dart
create mode 100644 lib/models/settings/home_settings_model.dart
create mode 100644 lib/models/settings/subtitle_settings_model.dart
create mode 100644 lib/models/settings/video_player_settings.dart
create mode 100644 lib/models/syncing/download_stream.dart
create mode 100644 lib/models/syncing/i_synced_item.dart
create mode 100644 lib/models/syncing/i_synced_item.g.dart
create mode 100644 lib/models/syncing/sync_item.dart
create mode 100644 lib/models/syncing/sync_item.freezed.dart
create mode 100644 lib/models/syncing/sync_item.g.dart
create mode 100644 lib/models/syncing/sync_settings_model.dart
create mode 100644 lib/models/syncing/sync_settings_model.freezed.dart
create mode 100644 lib/models/trickplayer_model.dart
create mode 100644 lib/models/video_stream_model.dart
create mode 100644 lib/models/view_model.dart
create mode 100644 lib/models/views_model.dart
create mode 100644 lib/profiles/default_profile.dart
create mode 100644 lib/profiles/web_profile.dart
create mode 100644 lib/providers/api_provider.dart
create mode 100644 lib/providers/api_provider.g.dart
create mode 100644 lib/providers/auth_provider.dart
create mode 100644 lib/providers/book_viewer_provider.dart
create mode 100644 lib/providers/collections_provider.dart
create mode 100644 lib/providers/dashboard_provider.dart
create mode 100644 lib/providers/discovery_provider.dart
create mode 100644 lib/providers/discovery_provider.g.dart
create mode 100644 lib/providers/discovery_provider.mapper.dart
create mode 100644 lib/providers/edit_item_provider.dart
create mode 100644 lib/providers/favourites_provider.dart
create mode 100644 lib/providers/image_provider.dart
create mode 100644 lib/providers/items/book_details_provider.dart
create mode 100644 lib/providers/items/episode_details_provider.dart
create mode 100644 lib/providers/items/folder_details_provider.dart
create mode 100644 lib/providers/items/identify_provider.dart
create mode 100644 lib/providers/items/information_provider.dart
create mode 100644 lib/providers/items/item_details_provider.dart
create mode 100644 lib/providers/items/movies_details_provider.dart
create mode 100644 lib/providers/items/movies_details_provider.g.dart
create mode 100644 lib/providers/items/person_details_provider.dart
create mode 100644 lib/providers/items/photo_details_provider.dart
create mode 100644 lib/providers/items/season_details_provider.dart
create mode 100644 lib/providers/items/series_details_provider.dart
create mode 100644 lib/providers/library_provider.dart
create mode 100644 lib/providers/library_search_provider.dart
create mode 100644 lib/providers/playlist_provider.dart
create mode 100644 lib/providers/related_provider.dart
create mode 100644 lib/providers/search_provider.dart
create mode 100644 lib/providers/service_provider.dart
create mode 100644 lib/providers/session_info_provider.dart
create mode 100644 lib/providers/session_info_provider.freezed.dart
create mode 100644 lib/providers/session_info_provider.g.dart
create mode 100644 lib/providers/settings/book_viewer_settings_provider.dart
create mode 100644 lib/providers/settings/client_settings_provider.dart
create mode 100644 lib/providers/settings/home_settings_provider.dart
create mode 100644 lib/providers/settings/photo_view_settings_provider.dart
create mode 100644 lib/providers/settings/subtitle_settings_provider.dart
create mode 100644 lib/providers/settings/video_player_settings_provider.dart
create mode 100644 lib/providers/shared_provider.dart
create mode 100644 lib/providers/sync/background_download_provider.dart
create mode 100644 lib/providers/sync/background_download_provider.g.dart
create mode 100644 lib/providers/sync/sync_provider_helpers.dart
create mode 100644 lib/providers/sync/sync_provider_helpers.g.dart
create mode 100644 lib/providers/sync_provider.dart
create mode 100644 lib/providers/sync_provider_web.dart
create mode 100644 lib/providers/user_provider.dart
create mode 100644 lib/providers/user_provider.g.dart
create mode 100644 lib/providers/video_player_provider.dart
create mode 100644 lib/providers/views_provider.dart
create mode 100644 lib/routes/app_routes.dart
create mode 100644 lib/routes/build_routes/home_routes.dart
create mode 100644 lib/routes/build_routes/route_builder.dart
create mode 100644 lib/routes/build_routes/settings_routes.dart
create mode 100644 lib/screens/book_viewer/book_viewer_chapters.dart
create mode 100644 lib/screens/book_viewer/book_viewer_controls.dart
create mode 100644 lib/screens/book_viewer/book_viewer_reader.dart
create mode 100644 lib/screens/book_viewer/book_viewer_reader_web.dart
create mode 100644 lib/screens/book_viewer/book_viewer_screen.dart
create mode 100644 lib/screens/book_viewer/book_viewer_settings.dart
create mode 100644 lib/screens/collections/add_to_collection.dart
create mode 100644 lib/screens/dashboard/dashboard_screen.dart
create mode 100644 lib/screens/details_screens/book_detail_screen.dart
create mode 100644 lib/screens/details_screens/components/label_title_item.dart
create mode 100644 lib/screens/details_screens/components/media_stream_information.dart
create mode 100644 lib/screens/details_screens/components/overview_header.dart
create mode 100644 lib/screens/details_screens/details_screens.dart
create mode 100644 lib/screens/details_screens/empty_item.dart
create mode 100644 lib/screens/details_screens/episode_detail_screen.dart
create mode 100644 lib/screens/details_screens/folder_detail_screen.dart
create mode 100644 lib/screens/details_screens/movie_detail_screen.dart
create mode 100644 lib/screens/details_screens/person_detail_screen.dart
create mode 100644 lib/screens/details_screens/season_detail_screen.dart
create mode 100644 lib/screens/details_screens/series_detail_screen.dart
create mode 100644 lib/screens/favourites/favourites_screen.dart
create mode 100644 lib/screens/home.dart
create mode 100644 lib/screens/library/components/library_tabs.dart
create mode 100644 lib/screens/library/library_screen.dart
create mode 100644 lib/screens/library/tabs/favourites_tab.dart
create mode 100644 lib/screens/library/tabs/library_tab.dart
create mode 100644 lib/screens/library/tabs/recommendations_tab.dart
create mode 100644 lib/screens/library/tabs/timeline_tab.dart
create mode 100644 lib/screens/library_search/library_search_screen.dart
create mode 100644 lib/screens/library_search/widgets/library_filter_chips.dart
create mode 100644 lib/screens/library_search/widgets/library_sort_dialogue.dart
create mode 100644 lib/screens/library_search/widgets/library_views.dart
create mode 100644 lib/screens/library_search/widgets/suggestion_search_bar.dart
create mode 100644 lib/screens/login/lock_screen.dart
create mode 100644 lib/screens/login/login_edit_user.dart
create mode 100644 lib/screens/login/login_screen.dart
create mode 100644 lib/screens/login/login_user_grid.dart
create mode 100644 lib/screens/login/widgets/discover_servers_widget.dart
create mode 100644 lib/screens/login/widgets/login_icon.dart
create mode 100644 lib/screens/media_content.dart
create mode 100644 lib/screens/metadata/edit_item.dart
create mode 100644 lib/screens/metadata/edit_screens/edit_fields.dart
create mode 100644 lib/screens/metadata/edit_screens/edit_image_content.dart
create mode 100644 lib/screens/metadata/identifty_screen.dart
create mode 100644 lib/screens/metadata/info_screen.dart
create mode 100644 lib/screens/metadata/refresh_metadata.dart
create mode 100644 lib/screens/photo_viewer/photo_viewer_controls.dart
create mode 100644 lib/screens/photo_viewer/photo_viewer_screen.dart
create mode 100644 lib/screens/photo_viewer/simple_video_player.dart
create mode 100644 lib/screens/playlists/add_to_playlists.dart
create mode 100644 lib/screens/search/search_screen.dart
create mode 100644 lib/screens/settings/client_settings_page.dart
create mode 100644 lib/screens/settings/player_settings_page.dart
create mode 100644 lib/screens/settings/quick_connect_window.dart
create mode 100644 lib/screens/settings/security_settings_page.dart
create mode 100644 lib/screens/settings/settings_list_tile.dart
create mode 100644 lib/screens/settings/settings_scaffold.dart
create mode 100644 lib/screens/settings/settings_screen.dart
create mode 100644 lib/screens/settings/widgets/settings_label_divider.dart
create mode 100644 lib/screens/settings/widgets/settings_message_box.dart
create mode 100644 lib/screens/settings/widgets/subtitle_editor.dart
create mode 100644 lib/screens/shared/adaptive_dialog.dart
create mode 100644 lib/screens/shared/animated_fade_size.dart
create mode 100644 lib/screens/shared/authenticate_button_options.dart
create mode 100644 lib/screens/shared/chips/category_chip.dart
create mode 100644 lib/screens/shared/default_alert_dialog.dart
create mode 100644 lib/screens/shared/default_titlebar.dart
create mode 100644 lib/screens/shared/detail_scaffold.dart
create mode 100644 lib/screens/shared/file_picker.dart
create mode 100644 lib/screens/shared/fladder_icon.dart
create mode 100644 lib/screens/shared/fladder_logo.dart
create mode 100644 lib/screens/shared/fladder_snackbar.dart
create mode 100644 lib/screens/shared/flat_button.dart
create mode 100644 lib/screens/shared/floating_search_bar.dart
create mode 100644 lib/screens/shared/focused_outlined_text_field.dart
create mode 100644 lib/screens/shared/input_fields.dart
create mode 100644 lib/screens/shared/media/carousel_banner.dart
create mode 100644 lib/screens/shared/media/chapter_row.dart
create mode 100644 lib/screens/shared/media/components/chip_button.dart
create mode 100644 lib/screens/shared/media/components/media_header.dart
create mode 100644 lib/screens/shared/media/components/media_play_button.dart
create mode 100644 lib/screens/shared/media/components/next_up_episode.dart
create mode 100644 lib/screens/shared/media/components/poster_image.dart
create mode 100644 lib/screens/shared/media/components/small_detail_widgets.dart
create mode 100644 lib/screens/shared/media/episode_details_list.dart
create mode 100644 lib/screens/shared/media/episode_posters.dart
create mode 100644 lib/screens/shared/media/expanding_overview.dart
create mode 100644 lib/screens/shared/media/external_urls.dart
create mode 100644 lib/screens/shared/media/item_detail_list_widget.dart
create mode 100644 lib/screens/shared/media/people_row.dart
create mode 100644 lib/screens/shared/media/person_list_.dart
create mode 100644 lib/screens/shared/media/poster_grid.dart
create mode 100644 lib/screens/shared/media/poster_list_item.dart
create mode 100644 lib/screens/shared/media/poster_row.dart
create mode 100644 lib/screens/shared/media/poster_widget.dart
create mode 100644 lib/screens/shared/media/season_row.dart
create mode 100644 lib/screens/shared/nested_bottom_appbar.dart
create mode 100644 lib/screens/shared/nested_scaffold.dart
create mode 100644 lib/screens/shared/nested_sliver_appbar.dart
create mode 100644 lib/screens/shared/outlined_text_field.dart
create mode 100644 lib/screens/shared/passcode_input.dart
create mode 100644 lib/screens/shared/user_icon.dart
create mode 100644 lib/screens/splash_screen.dart
create mode 100644 lib/screens/syncing/sync_button.dart
create mode 100644 lib/screens/syncing/sync_child_item.dart
create mode 100644 lib/screens/syncing/sync_item_details.dart
create mode 100644 lib/screens/syncing/sync_list_item.dart
create mode 100644 lib/screens/syncing/sync_widgets.dart
create mode 100644 lib/screens/syncing/synced_screen.dart
create mode 100644 lib/screens/syncing/widgets/sync_markedfordelete.dart
create mode 100644 lib/screens/syncing/widgets/sync_progress_builder.dart
create mode 100644 lib/screens/syncing/widgets/synced_episode_item.dart
create mode 100644 lib/screens/syncing/widgets/synced_season_poster.dart
create mode 100644 lib/screens/video_player/components/video_playback_information.dart
create mode 100644 lib/screens/video_player/components/video_player_chapters.dart
create mode 100644 lib/screens/video_player/components/video_player_controls_extras.dart
create mode 100644 lib/screens/video_player/components/video_player_options_sheet.dart
create mode 100644 lib/screens/video_player/components/video_player_queue.dart
create mode 100644 lib/screens/video_player/components/video_progress_bar.dart
create mode 100644 lib/screens/video_player/components/video_subtitle_controls.dart
create mode 100644 lib/screens/video_player/components/video_subtitles.dart
create mode 100644 lib/screens/video_player/components/video_volume_slider.dart
create mode 100644 lib/screens/video_player/video_player.dart
create mode 100644 lib/screens/video_player/video_player_controls.dart
create mode 100644 lib/theme.dart
create mode 100644 lib/util/absorb_events.dart
create mode 100644 lib/util/adaptive_layout.dart
create mode 100644 lib/util/application_info.dart
create mode 100644 lib/util/auth_service.dart
create mode 100644 lib/util/box_fit_extension.dart
create mode 100644 lib/util/custom_color_themes.dart
create mode 100644 lib/util/debouncer.dart
create mode 100644 lib/util/disable_keypad_focus.dart
create mode 100644 lib/util/duration_extensions.dart
create mode 100644 lib/util/fab_extended_anim.dart
create mode 100644 lib/util/fladder_image.dart
create mode 100644 lib/util/grouping.dart
create mode 100644 lib/util/header_generate.dart
create mode 100644 lib/util/humanize_duration.dart
create mode 100644 lib/util/item_base_model/item_base_model_extensions.dart
create mode 100644 lib/util/item_base_model/play_item_helpers.dart
create mode 100644 lib/util/jelly_id.dart
create mode 100644 lib/util/jellyfin_extension.dart
create mode 100644 lib/util/keyed_list_view.dart
create mode 100644 lib/util/list_extensions.dart
create mode 100644 lib/util/list_padding.dart
create mode 100644 lib/util/local_extension.dart
create mode 100644 lib/util/localization_helper.dart
create mode 100644 lib/util/map_bool_helper.dart
create mode 100644 lib/util/mouse_parking.dart
create mode 100644 lib/util/num_extension.dart
create mode 100644 lib/util/option_dialogue.dart
create mode 100644 lib/util/player_extensions.dart
create mode 100644 lib/util/player_extensions_web.dart
create mode 100644 lib/util/poster_defaults.dart
create mode 100644 lib/util/refresh_state.dart
create mode 100644 lib/util/simple_duration_picker.dart
create mode 100644 lib/util/size_formatting.dart
create mode 100644 lib/util/sliver_list_padding.dart
create mode 100644 lib/util/sticky_header_text.dart
create mode 100644 lib/util/stream_value.dart
create mode 100644 lib/util/string_extensions.dart
create mode 100644 lib/util/theme_extensions.dart
create mode 100644 lib/util/theme_mode_extension.dart
create mode 100644 lib/util/themes_data.dart
create mode 100644 lib/util/throttler.dart
create mode 100644 lib/util/track_extensions.dart
create mode 100644 lib/util/video_properties.dart
create mode 100644 lib/util/widget_extensions.dart
create mode 100644 lib/widgets/gapped_container_shape.dart
create mode 100644 lib/widgets/navigation_scaffold/components/adaptive_fab.dart
create mode 100644 lib/widgets/navigation_scaffold/components/destination_model.dart
create mode 100644 lib/widgets/navigation_scaffold/components/drawer_list_button.dart
create mode 100644 lib/widgets/navigation_scaffold/components/fladder_appbar.dart
create mode 100644 lib/widgets/navigation_scaffold/components/floating_player_bar.dart
create mode 100644 lib/widgets/navigation_scaffold/components/navigation_body.dart
create mode 100644 lib/widgets/navigation_scaffold/components/navigation_button.dart
create mode 100644 lib/widgets/navigation_scaffold/components/navigation_drawer.dart
create mode 100644 lib/widgets/navigation_scaffold/components/settings_user_icon.dart
create mode 100644 lib/widgets/navigation_scaffold/navigation_scaffold.dart
create mode 100644 lib/widgets/pop_up/delete_file.dart
create mode 100644 lib/widgets/shared/adaptive_date_picker.dart
create mode 100644 lib/widgets/shared/animated_icon.dart
create mode 100644 lib/widgets/shared/clickable_text.dart
create mode 100644 lib/widgets/shared/elevated_icon.dart
create mode 100644 lib/widgets/shared/enum_selection.dart
create mode 100644 lib/widgets/shared/filled_button_await.dart
create mode 100644 lib/widgets/shared/fladder_scrollbar.dart
create mode 100644 lib/widgets/shared/fladder_slider.dart
create mode 100644 lib/widgets/shared/hide_on_scroll.dart
create mode 100644 lib/widgets/shared/horizontal_list.dart
create mode 100644 lib/widgets/shared/hover_widget.dart
create mode 100644 lib/widgets/shared/icon_button_await.dart
create mode 100644 lib/widgets/shared/item_actions.dart
create mode 100644 lib/widgets/shared/list_button.dart
create mode 100644 lib/widgets/shared/modal_bottom_sheet.dart
create mode 100644 lib/widgets/shared/modal_side_sheet.dart
create mode 100644 lib/widgets/shared/pinch_poster_zoom.dart
create mode 100644 lib/widgets/shared/poster_size_slider.dart
create mode 100644 lib/widgets/shared/progress_floating_button.dart
create mode 100644 lib/widgets/shared/pull_to_refresh.dart
create mode 100644 lib/widgets/shared/scroll_position.dart
create mode 100644 lib/widgets/shared/selectable_icon_button.dart
create mode 100644 lib/widgets/shared/shapes.dart
create mode 100644 lib/widgets/shared/spaced_list_tile.dart
create mode 100644 lib/widgets/shared/status_card.dart
create mode 100644 lib/widgets/shared/trickplay_image.dart
create mode 100644 lib/wrappers/media_control_base.dart
create mode 100644 lib/wrappers/media_control_wrapper.dart
create mode 100644 lib/wrappers/media_control_wrapper_web.dart
create mode 100644 lib/wrappers/media_wrapper_interface.dart
create mode 100644 linux/.gitignore
create mode 100644 linux/CMakeLists.txt
create mode 100644 linux/flutter/CMakeLists.txt
create mode 100644 linux/flutter/generated_plugin_registrant.cc
create mode 100644 linux/flutter/generated_plugin_registrant.h
create mode 100644 linux/flutter/generated_plugins.cmake
create mode 100644 linux/main.cc
create mode 100644 linux/my_application.cc
create mode 100644 linux/my_application.h
create mode 100644 macos/.gitignore
create mode 100644 macos/Flutter/Flutter-Debug.xcconfig
create mode 100644 macos/Flutter/Flutter-Release.xcconfig
create mode 100644 macos/Flutter/GeneratedPluginRegistrant.swift
create mode 100644 macos/Podfile
create mode 100644 macos/Podfile.lock
create mode 100644 macos/Runner.xcodeproj/project.pbxproj
create mode 100644 macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
create mode 100644 macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
create mode 100644 macos/Runner.xcworkspace/contents.xcworkspacedata
create mode 100644 macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
create mode 100644 macos/Runner/AppDelegate.swift
create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon-1024.png
create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon-128.png
create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon-16.png
create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon-256.png
create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon-32.png
create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon-512.png
create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon-64.png
create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
create mode 100644 macos/Runner/Base.lproj/MainMenu.xib
create mode 100644 macos/Runner/Configs/AppInfo.xcconfig
create mode 100644 macos/Runner/Configs/Debug.xcconfig
create mode 100644 macos/Runner/Configs/Release.xcconfig
create mode 100644 macos/Runner/Configs/Warnings.xcconfig
create mode 100644 macos/Runner/DebugProfile.entitlements
create mode 100644 macos/Runner/Info.plist
create mode 100644 macos/Runner/MainFlutterWindow.swift
create mode 100644 macos/Runner/Release.entitlements
create mode 100644 macos/RunnerTests/RunnerTests.swift
create mode 100644 pubspec.lock
create mode 100644 pubspec.yaml
create mode 100644 snap/gui/app_icon.desktop
create mode 100644 snap/gui/app_icon.png
create mode 100644 swagger/jellyfin-open-api.json
create mode 100644 test/widget_test.dart
create mode 100644 true
create mode 100644 web/favicon.png
create mode 100644 web/icons/Icon-192.png
create mode 100644 web/icons/Icon-512.png
create mode 100644 web/icons/Icon-maskable-192.png
create mode 100644 web/icons/Icon-maskable-512.png
create mode 100644 web/index.html
create mode 100644 web/manifest.json
create mode 100644 windows/.gitignore
create mode 100644 windows/CMakeLists.txt
create mode 100644 windows/flutter/CMakeLists.txt
create mode 100644 windows/flutter/generated_plugin_registrant.cc
create mode 100644 windows/flutter/generated_plugin_registrant.h
create mode 100644 windows/flutter/generated_plugins.cmake
create mode 100644 windows/runner/CMakeLists.txt
create mode 100644 windows/runner/Runner.rc
create mode 100644 windows/runner/flutter_window.cpp
create mode 100644 windows/runner/flutter_window.h
create mode 100644 windows/runner/main.cpp
create mode 100644 windows/runner/resource.h
create mode 100644 windows/runner/resources/app_icon.ico
create mode 100644 windows/runner/runner.exe.manifest
create mode 100644 windows/runner/utils.cpp
create mode 100644 windows/runner/utils.h
create mode 100644 windows/runner/win32_window.cpp
create mode 100644 windows/runner/win32_window.h
diff --git a/.fvmrc b/.fvmrc
new file mode 100644
index 0000000..4efffa7
--- /dev/null
+++ b/.fvmrc
@@ -0,0 +1,3 @@
+{
+ "flutter": "3.22.1"
+}
\ No newline at end of file
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..b087aa8
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,201 @@
+name: Build Fladder
+
+on:
+ push:
+ branches:
+ - develop
+ pull_request:
+ branches:
+ - develop
+
+jobs:
+ #Implement linting/tests here first
+ flutter-checks:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4.1.1
+
+ - name: Set up Flutter
+ uses: subosito/flutter-action@v2.12.0
+ with:
+ channel: "stable"
+ cache: true
+ cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" # optional, change this to force refresh cache
+ cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" # optional, change this to specify the cache path
+
+ - name: Get dependencies
+ run: flutter pub get
+
+ build-android:
+ needs: flutter-checks
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4.1.1
+
+ - name: Set up Flutter
+ uses: subosito/flutter-action@v2.12.0
+ with:
+ channel: "stable"
+ cache: true
+ cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" # optional, change this to force refresh cache
+ cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" # optional, change this to specify the cache path
+
+ - name: Get dependencies
+ run: flutter pub get
+
+ - name: Build Android APK
+ run: flutter build apk
+
+ - name: Archive Android artifact
+ uses: actions/upload-artifact@v4.0.0
+ with:
+ name: Android
+ path: build/app/outputs/apk/release/app-release.apk
+
+ build-windows:
+ needs: flutter-checks
+ runs-on: windows-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4.1.1
+
+ - name: Set up Flutter
+ uses: subosito/flutter-action@v2.12.0
+ with:
+ channel: "stable"
+ cache: true
+ cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" # optional, change this to force refresh cache
+ cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" # optional, change this to specify the cache path
+
+ - name: Get dependencies
+ run: flutter pub get
+
+ - name: Build Windows EXE
+ run: flutter build windows
+
+ - name: Archive Windows artifact
+ uses: actions/upload-artifact@v4.0.0
+ with:
+ name: Windows
+ path: build\windows\x64\runner\Release\
+
+ # build-ios:
+ # runs-on: macos-latest
+
+ # steps:
+ # - name: Checkout repository
+ # uses: actions/checkout@v4.1.1
+
+ # - name: Set up Flutter
+ # uses: subosito/flutter-action@v2.12.0
+ # with:
+ # channel: "stable"
+ # cache: true
+ # cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" # optional, change this to force refresh cache
+ # cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" # optional, change this to specify the cache path
+
+ # - name: Get dependencies
+ # run: flutter pub get
+
+ # - name: Build iOS app
+ # run: flutter build ios
+
+ # - name: Archive iOS artifact
+ # uses: actions/upload-artifact@v2
+ # with:
+ # name: ios
+ # path: build/ios/iphoneos/Runner.app
+
+ build-macos:
+ needs: flutter-checks
+ runs-on: macos-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4.1.1
+
+ - name: Set up Flutter
+ uses: subosito/flutter-action@v2.12.0
+ with:
+ channel: "stable"
+ cache: true
+ cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" # optional, change this to force refresh cache
+ cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" # optional, change this to specify the cache path
+
+ - name: Get dependencies
+ run: flutter pub get
+
+ - name: Build macOS app
+ run: flutter build macos
+
+ - name: Archive macOS artifact
+ uses: actions/upload-artifact@v4.0.0
+ with:
+ name: macOS
+ path: build/macos/Build/Products/Release/fladder.app
+
+ # build-linux:
+ # needs: flutter-checks
+ # runs-on: ubuntu-latest
+
+ # steps:
+ # - name: Checkout repository
+ # uses: actions/checkout@v4.1.1
+
+ # - name: Set up Flutter
+ # uses: subosito/flutter-action@v2.12.0
+ # with:
+ # channel: "stable"
+ # cache: true
+ # cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" # optional, change this to force refresh cache
+ # cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" # optional, change this to specify the cache path
+
+ # - name: Get dependencies
+ # run: flutter pub get
+
+ # - name: Get packages
+ # run: |
+ # sudo apt-get update -y
+ # sudo apt-get install -y ninja-build libgtk-3-dev
+
+ # - name: Build Linux app
+ # run: flutter build linux
+
+ # - name: Archive Linux artifact
+ # uses: actions/upload-artifact@v2
+ # with:
+ # name: linux
+ # path: build/linux/x64/release/bundle
+
+ build-web:
+ needs: flutter-checks
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4.1.1
+
+ - name: Set up Flutter
+ uses: subosito/flutter-action@v2.12.0
+ with:
+ channel: "stable"
+ cache: true
+ cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" # optional, change this to force refresh cache
+ cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" # optional, change this to specify the cache path
+
+ - name: Get dependencies
+ run: flutter pub get
+
+ - name: Build web app
+ run: flutter build web
+
+ - name: Archive web artifact
+ uses: actions/upload-artifact@v4.0.0
+ with:
+ name: Web
+ path: build/web
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..43ae556
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,47 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+migrate_working_dir/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release
+
+# FVM Version Cache
+.fvm/
\ No newline at end of file
diff --git a/.metadata b/.metadata
new file mode 100644
index 0000000..fce676f
--- /dev/null
+++ b/.metadata
@@ -0,0 +1,30 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+ revision: "2f708eb8396e362e280fac22cf171c2cb467343c"
+ channel: "stable"
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: 2f708eb8396e362e280fac22cf171c2cb467343c
+ base_revision: 2f708eb8396e362e280fac22cf171c2cb467343c
+ - platform: android
+ create_revision: 2f708eb8396e362e280fac22cf171c2cb467343c
+ base_revision: 2f708eb8396e362e280fac22cf171c2cb467343c
+
+ # User provided section
+
+ # List of Local paths (relative to this file) that should be
+ # ignored by the migrate tool.
+ #
+ # Files that are not part of the templates will be ignored by default.
+ unmanaged_files:
+ - 'lib/main.dart'
+ - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..ee0f98d
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,91 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "fladder",
+ "request": "launch",
+ "type": "dart",
+ "args": [
+ "--web-port",
+ "8096"
+ ],
+ },
+ {
+ "name": "fladder (profile mode)",
+ "request": "launch",
+ "type": "dart",
+ "flutterMode": "profile",
+ "args": [
+ "--web-port",
+ "9090"
+ ],
+ },
+ {
+ "name": "fladder (release mode)",
+ "request": "launch",
+ "type": "dart",
+ "flutterMode": "release",
+ "args": [
+ "--web-port",
+ "9090"
+ ],
+ },
+ {
+ "name": "Android",
+ "request": "launch",
+ "type": "dart",
+ },
+ {
+ "name": "iPhone",
+ "request": "launch",
+ "type": "dart",
+ "deviceId": "iphone"
+ },
+ {
+ "name": "Windows",
+ "request": "launch",
+ "type": "dart",
+ "flutterMode": "debug",
+ "deviceId": "windows"
+ },
+ {
+ "name": "Web",
+ "request": "launch",
+ "type": "dart",
+ "deviceId": "chrome",
+ "args": [
+ "--web-port",
+ "9090"
+ ],
+ },
+ {
+ "name": "Web (release mode)",
+ "request": "launch",
+ "type": "dart",
+ "deviceId": "chrome",
+ "flutterMode": "release",
+ "args": [
+ "--web-port",
+ "9090"
+ ],
+ },
+ {
+ "name": "AndroidTV",
+ "request": "launch",
+ "program": "lib/android_tv/main.dart",
+ "type": "dart",
+ },
+ ],
+ "compounds": [
+ {
+ "name": "All Devices",
+ "configurations": [
+ "Windows",
+ "Android"
+ ],
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..26a7a6d
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,12 @@
+{
+ "cSpell.words": [
+ "Jellyfin"
+ ],
+ "dart.flutterSdkPath": ".fvm/versions/3.22.1",
+ "search.exclude": {
+ "**/.fvm": true
+ },
+ "files.watcherExclude": {
+ "**/.fvm": true
+ }
+}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..e4930d3
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,86 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "Generate Localization",
+ "type": "dart",
+ "command": "flutter",
+ "args": [
+ "gen-l10n"
+ ],
+ "isBackground": true,
+ "presentation": {
+ "reveal": "never",
+ "revealProblems": "onProblem",
+ "panel": "dedicated",
+ "showReuseMessage": false,
+ "clear": true,
+ "focus": false
+ },
+ "problemMatcher": []
+ },
+ {
+ "type": "flutter",
+ "command": "flutter",
+ "args": [
+ "build",
+ "windows"
+ ],
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ },
+ "problemMatcher": [],
+ "label": "flutter: flutter build windows",
+ "detail": ""
+ },
+ {
+ "type": "flutter",
+ "command": "flutter",
+ "args": [
+ "build",
+ "macos"
+ ],
+ "group": "build",
+ "problemMatcher": [],
+ "label": "flutter: flutter build macos",
+ "detail": ""
+ },
+ {
+ "type": "flutter",
+ "command": "flutter",
+ "args": [
+ "build",
+ "apk"
+ ],
+ "group": "build",
+ "problemMatcher": [],
+ "label": "flutter: flutter build apk",
+ "detail": ""
+ },
+ {
+ "type": "flutter",
+ "command": "flutter",
+ "args": [
+ "build",
+ "aab"
+ ],
+ "group": "build",
+ "problemMatcher": [],
+ "label": "flutter: flutter build aab",
+ "detail": ""
+ },
+ {
+ "type": "flutter",
+ "command": "dart",
+ "args": [
+ "run",
+ "flutter_launcher_icons"
+ ],
+ "group": "build",
+ "problemMatcher": [],
+ "label": "flutter: flutter create launcher icons",
+ "detail": ""
+ }
+ ],
+}
\ No newline at end of file
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6483cdd
--- /dev/null
+++ b/README.md
@@ -0,0 +1,16 @@
+# fladder
+
+A new Flutter project.
+
+## Getting Started
+
+This project is a starting point for a Flutter application.
+
+A few resources to get you started if this is your first Flutter project:
+
+- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
+- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
+
+For help getting started with Flutter development, view the
+[online documentation](https://docs.flutter.dev/), which offers tutorials,
+samples, guidance on mobile development, and a full API reference.
diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 0000000..615795d
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1,19 @@
+include: package:lints/recommended.yaml
+
+analyzer:
+ exclude: [build/**, lib/jellyfin/**]
+ language:
+ # strict-casts: false
+ # strict-raw-types: true
+ plugins:
+ - custom_lint
+
+linter:
+ rules:
+ cancel_subscriptions: true
+ avoid_print: false # Uncomment to disable the `avoid_print` rule
+ no_logic_in_create_state: true
+ # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
+ prefer_relative_imports: false
+ avoid_relative_lib_imports: true
+ eol_at_end_of_file: true
diff --git a/android/.gitignore b/android/.gitignore
new file mode 100644
index 0000000..6f56801
--- /dev/null
+++ b/android/.gitignore
@@ -0,0 +1,13 @@
+gradle-wrapper.jar
+/.gradle
+/captures/
+/gradlew
+/gradlew.bat
+/local.properties
+GeneratedPluginRegistrant.java
+
+# Remember to never publicly share your keystore.
+# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
+key.properties
+**/*.keystore
+**/*.jks
diff --git a/android/app/build.gradle b/android/app/build.gradle
new file mode 100644
index 0000000..bd80375
--- /dev/null
+++ b/android/app/build.gradle
@@ -0,0 +1,77 @@
+plugins {
+ id "com.android.application"
+ id "kotlin-android"
+ id "dev.flutter.flutter-gradle-plugin"
+}
+
+def keystoreProperties = new Properties()
+def keystorePropertiesFile = rootProject.file('key.properties')
+if (keystorePropertiesFile.exists()) {
+ keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+}
+
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+ localPropertiesFile.withReader('UTF-8') { reader ->
+ localProperties.load(reader)
+ }
+}
+
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
+if (flutterVersionCode == null) {
+ flutterVersionCode = '1'
+}
+
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
+if (flutterVersionName == null) {
+ flutterVersionName = '1.0'
+}
+
+android {
+ compileSdkVersion flutter.compileSdkVersion
+ ndkVersion flutter.ndkVersion
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+
+ sourceSets {
+ main.java.srcDirs += 'src/main/kotlin'
+ }
+
+ defaultConfig {
+ applicationId "nl.jknaapen.fladder"
+ minSdkVersion 26
+ targetSdkVersion flutter.targetSdkVersion
+ versionCode flutterVersionCode.toInteger()
+ versionName flutterVersionName
+ }
+
+ signingConfigs {
+ release {
+ keyAlias keystoreProperties['keyAlias']
+ keyPassword keystoreProperties['keyPassword']
+ storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
+ storePassword keystoreProperties['storePassword']
+ }
+ }
+
+ buildTypes {
+ release {
+ signingConfig signingConfigs.release
+ }
+ debug{
+ applicationIdSuffix = ".debug"
+ }
+ }
+}
+
+flutter {
+ source '../..'
+}
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000..16f7f90
--- /dev/null
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..09ec338
--- /dev/null
+++ b/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/ic_launcher-playstore.png b/android/app/src/main/ic_launcher-playstore.png
new file mode 100644
index 0000000000000000000000000000000000000000..8c9490fbf9ab2540b43fd4386ec4eb01472b470f
GIT binary patch
literal 28206
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
CO0@d`
literal 0
HcmV?d00001
diff --git a/android/app/src/main/kotlin/nl/jknaapen/fladder/MainActivity.kt b/android/app/src/main/kotlin/nl/jknaapen/fladder/MainActivity.kt
new file mode 100644
index 0000000..9726f5e
--- /dev/null
+++ b/android/app/src/main/kotlin/nl/jknaapen/fladder/MainActivity.kt
@@ -0,0 +1,7 @@
+package nl.jknaapen.fladder
+
+import io.flutter.embedding.android.FlutterFragmentActivity
+import com.ryanheise.audioservice.AudioServiceFragmentActivity;
+
+class MainActivity: AudioServiceFragmentActivity () {
+}
diff --git a/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..641a97ce1b8c5d2204f93cf5e0245ee4e54bd350
GIT binary patch
literal 6546
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
XML^zz7IFW6Eocg071?TOlc4_rAy=r}
literal 0
HcmV?d00001
diff --git a/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..765a506b6c57ee2cd19056cf35cd299b19207b11
GIT binary patch
literal 4170
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
literal 0
HcmV?d00001
diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml
new file mode 100644
index 0000000..f74085f
--- /dev/null
+++ b/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a07d08451382b52504928796f701cb4c8f7211f
GIT binary patch
literal 9223
zcmeIYWm_E14=zk8v{1Yh`%&Bqi#se*+}&kyE$(i`y?D_r?hXr!yE~NP?y!ry9sbV;
zc)q|nFJ|UVu9-Ckh%P-Pjoy4;*dgDf8dbUr@YWZ8yXMkztA8f0
z_G9V7U4%c0t2dv*+`?V4)VD_t4Py=`rZkm}h$vEZX3c@#Wy@`P9gh?@M|=1`Ob1k+(&2@?vq;BqdV((4y=0n&tXe7RvkPh7AJZP1h)tLZC}M;jGP7{*KN!7
zV81vxc?*M~8!E7Mih2JT%`o`L@)E)Nmkt5~rHG8Uh`Q%HSoTNHFXk_U>x+qXi&wJV
z()md%jI6*;?GR%W4F>vsC`?%g5v752>CxUFZ
zPi{G4`{-*s_h}KNs%FHN-NS=8XqgO~@FQ9J7>w*aT$gK2*b2WV0dP*)^=mg^8EsI-
zFUP>++Sl%Sc$Q0J5KF!ERXr2^0dB|V2t-6Q{T?9)@mM%B4EOX_YWRev(;&ex^78&1
zPi%xRbnC^+qyJg$XAeGwuaQ_r)yoN(D<%9zO{Gp4YTzQaKDR*9gs@@}*hOgjmDOkw
z+aa@=b;Y8V^$|IXJ>~&l%05KyUfD2oUyMU6PwNNq_@NI&RDfdHx0e?)1qpYxf9szd
zGZ7H$*_g?Vx^|`vPB}m#X!t6|0_H=iaf>64lF*N|3ch^27fETsl){=sR|F`zFvT+E
zXJ?R>-h876vMUccD{=JaZG2Ng=B6X$`gFSGXjS}8V#-v$9&3&;m2;wFLHW;ndqU3s
z+9yNzxwVGaRok6SDSP(Mm34Q`sDn6;`|lB{2zPdg*m@@StCJ0+8#mOQgMUW#QxCzp
zRVmGoYzsa(Eq!7SiKMz`RRUXjFoX-V(*F2<d(ybAf#dVQ4@yw0ZEdTN66ws
z;s&$4))X^moR1a2BWCiKhH?RyseY785_O-jA%WMcS8lD%{&m#ziHE{{JaEp-@atTO
z1FBd2_gixBAgCNoB5FHgk&cG(uzk&nSj^o|s<{3i=Drs9enrdDuixdS{MsBgV$Owv
zW*rWW;(YTbmgTh}&moT}FWV$P50G!Hq&HZ5^2Ak^>U1eWe#0p&a6gRN?Kok<%wwEm
zaKL;7MXrH8E=roK^-
zlQ!X;>z^9I99z)qQ#M!nP^nx>lVu*6J}Eu9+e@F+y#iPkYCzeo9Fu>_3AWbWZQ`_d
zNq&5cEp~xb97Oh{FGnnF{V~#|(4hp%0snj3Mcitgfw1=SHPa;r-*hBy~n`~CRR0zK#87wRSIoFrXH-5PT6
zR-Ri2W1$$H*%bcRPNUJuWG8O;EBdSuI3Y2INQ`qJ_&I6AK91S&Qb&}Qu_?igNfh1O
z=?6qlBF330y_WbN`)2~Esp@MQB30Tm6S+xuCxeEbCV^!IZAg*ze&u^mNC`5xK$lNL
zBUle8Fp)_k{xvP$)Q-@eDsQmsE@b%IexEHNNb*@o$yd@`jCF^LhTM00)<2gcpyb<1
zO$W7&OO?n+d>HrJWqio{JPHa;m-*W?lqR-VLp(V`v#3L_?MMM;_ijR?2h>8_^P}Fl
zQqGZmU`G;R8vQ}9PW3O9cNGWod(QRKQ&qx9r|MaMbVkI&MuF<6JP#{mF-eB
zGf=K0;z-Dw`kUifIZi^g&{u5MzsN~<3jinhhnd+b+y1L3Nkt%0x?%;m=QsiUIV`?a
z+3@=LsqL6-C9sfv^`{kb>PC4)@yFk_dqD1GyN2XUt+g?O)p>pyIp>;+Cx-J3f~}*6
z&E%=6VuQ$t-#Eo*guz42u_Wjh1D11yUnkTilAe>%wH_26>t7Fw-BWg}^>bwn4ehzP
z8yZ)?KjKt&d3!ZqL6j1H(8>*wh|?OBa=Cq+Otx|6R}Cobo~ohXxwX9D8dw)T?_F5%
zkh*{96c1BV1Zjpr&6%RDxrM|+oY_u^x~Bm-*I1d2MZ7NXfteFO5^La;cOQVY&<1@}
z`V0#4bwNkFve-`PfU
zwz(HTvz(p#=km9&d0(_EnkaueVy&LQ@dk$HRCXbvVavY_$`zm*`IUHeemeZ1>$bVM
zzks?r?lv4euIB3z(C@Oq47zD3wB`_WxIZFC6RcCh@RQ~Pqq=lbD|u51DD28V%y*`
zfr-xa7JCKvn>Z{J(|rZBXl?R-Rxo}sXxf2`%rG(UnKRFD2DgKv)BhLvVS=WzsASY0
zjwz9hh^E>cQuo;|&d0oFgpfJyMpwfxeC9GcXk<#6=hWip;u^}Q_wV}nb&>bAOD6)o
zTvz(I$$km1Ck*hM!?$w#63&xsG5*~4?fGMk1xzX#F=@00d!GAUg*unXx8)_r$pvQ?BxCffe)_(|lW5;|Nh
zKX2ylZRO8~8mT_NO8BP6JheUk^qnq0-yE8oQ}=2s`0={dQ@1K}Unq4XADa!q+Dchk
z%JZ4b%HX8q_r6G62)QOzwWjWDv>3GH1tVKNF|8CPMu42eUJ2Dmn_Xo@jxv@cIZjp=
z&`rMl222~TWW%CGg!@V6Eh*I19lqHrWnX@fWFi-mvUnA+X?K?25*A`KI=Y(*EDh)c
z=CaaPyKZO9tyH5mU}Uqag}4&)?Cw58iVLpJZbX9T1rLs2Tikw4dihG88cDUsZu;iA
zX5)XUHEEvlnBzFyHze1W6tRR{nTgZY7|0UPBx*CEVw}ojhTm1xmUXMo%s)JVcB3eQ
za^iKw`$71<5nciyGn^0&y-U^8sdy{`trt_b9}^GBBTI_IE2ZcdOP%^{tTwuy;xjWL
zeRlrrUKQ6Q`?FOC_p$0*;g(Mo)!`TCYVW0r$3{BXcmGKGm2xb37gO*D4Hy1SoFKnw
z4jL0=lO{Y*FIrnz*lTAdjlBv8#BK=hwf#g_MaUQZ5*g8TuN3lef=^So@pyZbNUmD_
zU!%@~zO;>GpSe_=dNS6%#neXZ?ZbmYeFeEzrkP7IWM3q%*TxpY(RJ&qvYMAeqfB
zg~3!wYT4_5CnJB`A)T*8DIAeBVzg6Kt;wzyW&9YqZ3mu4BV~A++!YUCPbo_%nqRx()eKmIF2<0?266mA^7Z8>(M
zm(cd*ORd1%U#7j#tDVJ`q6xW$|4*q#H0IsEw(pcVe8#ni$6)_GqTc+vZJhKmQ)o5O
zmVa~oYRtW?N|ch1Tj>YC(!qwKI(1a_j`6vrk-(BE+NytlOX0$P-eVKp!CJ9sD888`
zQZr9S_940puusItxV)wToj!iF#n}NevsRyp2DE{>#WX
zTGCA^j#mHt$1!p<(>=5#-U1rF(n7Mz#zLU8RhEk?Q{5Lv;`z8WzGykh1skzdRnL$Q
z8y+6M6po7TyfU_3!OR;9&Fm;XvWML*DzktsZ*IvB?>#V84p-fYEpNRn>kqjv;r
zPn!Q?O2ue&gR3g>LIJB!k+S+NiPlDzdZD2>RrOKzaL6sJ0rzPYBoW+2){+^Xm9Z=e*rl(^YK9
z=K|}0GZRc$?RmbeTiu)y;p6O7YkZ4bLANi_yv5+8W6O2wEsEUD9K53!BAD&%FZrH%
zVlMm+DeM=(FoQH-%tPw-SHZlIy^Fx+Hp8VcQ}m|Uw?l{Yb0W|Hbd7?vF75ipnass=
zMUXz4#ZrDfN5!+I5@zPykVokz>pb$l6P;K#im_)+k`89MMlgA|_|2hHOE?nlVy*%o
zA1ATaQj+jRq_R|3mid@N80=2WcTTkVlW18N4=2D2VyS};fl`~T3i{pL
zUf*~Ih+I^dY>^ARk`0EabYXnsGYIlYI(HM=@z>6q=eMk^WpRxqlR
zo~_^FKyQRLJ+ut#Gm;JS%u8x?0b6_LN#S2*TC#^^1|dZw;23n>23u+U^Pc1wOsF}4
zoxKxG`1x*zoTXZ-%}8Kk{s^mmlu>^9veLO7#MD+~)7C3aRW&S5{l
z(yythK8%w)h#En>zv^4H_~&>gFnzD+4BrnXuK|*bc1c6K
z?b~D4rLci&-Cg6t28tx%a1HhNrmUazA_7}R`jeUS`}Rg+jVY^(0mDo>*?QI04mO!k
zfhB-r)br-nZ?Ar@}Qe5
zq_#iD`^^<&$LS{Kpy;Xex(v{1R%>HhC2W@+z-`jw_pW1dX6@S~fpG_V_i2YQJQgH!K5%6b^YEq=;-gc%hvi@ovP-uF
zy1GPxaZKjrPbC$A{3l(|>e}s$z541r5P=6>#Vq&l~*g0zq%
z(T_Q!@tRaY>r#0?adbi`?%TK1t6`Is&GYl_=WI;OSDTf$H|t`)kTk*4=|nV`fC9MM
zuKBJH8l9w$f$=b5WvC?Kib%DU^g+`iKC@-p)qQLpDxgo3V^>)|F}0wc%d`9DeIw(#
zg@FU6+(E>*3-QtY32Q6rEwHGg*+zm34|QUGNL_j#h#{eZB>fH!I5!64f=_$E(>u*m
zzA!Ts)_Q}-LEPd*Fl8Uj!)lQ@9jjZmjHMe6-}~W}=5SoF7r<-{RvM4JP>F!$l_xkF
z#;ZB2bAjlz%`w}_G0MXzl+e!ERP}
z`Q@M3T1$BD7wbs(q2k7phEC=YqcA5z7Egj
zA%i(}4z71@`I7g3Q6t;^AS6Co{-*yuD%mSj)jt!nW$Ois+#WkD2ks;sFooGljt1-L
zvs@D-k~?z~X&SWxXYjZ*XY*I3%i7{Fix8aoGv7?3-Qq|`Lzys-U}%yPnE0RWQd)nF
zKHK(U-cmthG1~msv9gw>bg}w)iASu5i=aM|1lgv|u~=mo8g)X_7!7cASbTj>`(Yxq
zfuM7eNod}Ssoe!TyK4jmP12PTm$C`7i;pgbHydI`pLXXnexE%_0fo!Dk{p>HzfS1vW^fa>f4
z9rbQ)uK$QKX|JWONAg)X_7za3E&S+ulqmb&c6|P89`5fTR=l^5_J>w!U%23R*&g4-
zdbQo104EW60*XcxbOJ;m7vJ}xW!%f&abs>ka>X-WJk6a^?s72Fc08B(M>e^oorE{k
z+m2}6a<@03gCmkSQTLPHnEnt
z#w`&;4Bq{BJUJnpE_A6ZvKw0k%><&Ue2O_RDy%qEWwMhs#WijQ%LQN&M2g#-bh#^J
zM>Lhsxm|}W+!_!PwrLNn8pMXssYy@L8e@)~H;0F?UIVMj@mcti8f(|)y8F#3C6f^W
ze+i@0eav~|Zh5o&j@Z7b;<#{^`(TOPY7LpWNQNl{?5~~0ub9nE*P!s(315l?T~>rx
zU{P;d<1GoV38(YzYa3rzR<#rZ@!nGE;)>j%7M71x$g$X_8NUSmCT0Gb_WA%mdZcv;
z?0g<>#R^eMcX3!?C)3gq*d2lR1GxHf)}?7&Z1LM_asE0$^&5;9)3d6tw?M`-rEfBW
znum$DD6y+fokVs#o$IW#-WvCLfV>m)TlFdZ{KSV0*NN~tO45ptL9RYTvsD$tgdNnO
zm4QluH*DXZ5?h!LD|-*onA6l%}od2@p*S=vVkC{l#j5+!02e>1m
zQk%Jgnd2VM%m*|}gX+g~$-}VSfW7Lm@*p=oQ3}~0YYYWXl@vCXm34Cj9-kro6)V7I
zixxb9=m==s+dZS`fh*RwGjdCY8DMvG_UE=u-+c3GEmqMY^$hBBbI!s~Kk22t@l9&h
z@oN0lqRolYFllk|7NO>icj>vtqO3CnQ6v0?`9Fo-iv(mSzn9VxiAhdV&h`!rILMCo
zf#V9asDDDHitKi?`eNoMYswm0x|7?F%)0X`38IqZH?Z7M^YFB*mVOCx&gUT6~
z)uwYt3152yt`l)$zrBOg;ULI2wqNWwoMEAamLSK*$*YQUIVSjmONV)py+YUbEV6ZJ
z=9=|yY(l=0|6jUKdu*O=FVs974gb}(@C1vaIe0b93fY}T&!aal13wYj*Pbd;J!&Pu
z6L>S#LxyH}*SU=+buDSbqS+#&{OTxSTc|YluoGrXp{{E_pSB{TOKMQ-bb0zTs!ML{`-1&)fqa<
zLeOKu(FDxHUs&XXAyao>ix0Y6nn7U9dH_t`n&N91e!0eMRr78P(gzL~YXU%-Qj0d!
zZ(QUrfmXCDc?Idu6691plR0yIV%04%kkom`r_*oIT}ko?7N+IgJ{ktF8_|Qh-0p47VFoU{*kC@Htc4H@
z*3D4E=eOu})96r9gR5ZKhyRVf8?ABpudYjOwJLu1zfI^{0Zwif7=y(_3|8qp;S}n<
z9L3o05K@JB4Nlhu{BVsW5lTgA7Q}AvI=WVfl~OzM_q2$a%uB5c8DpP6q+}Yf9Lmus
z@NXEf+}jy@2yhViWAJ!+IC6=&MmweOR;;5wP8x9+;F#YR%o`llGYvhsiy{5bUd&hW
z4;T0D>xJcCk9D%@yTMYuYpukVZy#QVVs8+sR2uFiB0?OC`9Z*j51yXlQou!**9yIw$Ww&JaF6IuBH;~nFTVZkA
zBn9vQ%N(!4)&i?OB3YQ8mM%qi8dj{by^vNf?o9G_;%&(c0|zW=ISjndOzdVR>B>5u
zZ;2G5rpGQw-r>AMG-WlFctd)d23GNAN6o3BUqezu>lt&A<&2YbO*{NgR9ABgaQ{9|
z7FtgxTl4#W=bO5G7sU3Bf#Yy+ay;kmIO+ftyuI@JGhr}#Bf_#sa9$l`GXc%Y753Va
zT_t;*n0xVOlB$M7!rnJAk+Wh#`v;DUXE}2I^N6?H67<8PD)`L!g<>@5)3v0FnzcbK
z+o^MrkYN3kG6q^`P%1*u`FB#7sOyDjeS5?Gwz?(Xg$+~45t?iO5vySuwvaEG9ab2qoXzu^1%Zq?bX
z-K{g-)BViTJw1IQloTY95%3WpARv&XrNmSqARxv5U2rhqUkuMAhrwTdT8oM*xu{5r
zkV=b-aEI}bTRL-hw0>;wmF
z+T_BCj6{V;#qHF}0R5x{^6UFgM?Pe++{bq6%?#LL1zyx`8GZ7rOKS&)ACk(y{|mv0g#HOlnY<{!MVZyy
zA$=s&z}LWcn6n0tXMyS4O_Fvo-FbKQdd1u0x87Ma0EPhsu>CtK_#?jqA`lJ&;ycv;
zz5kyD{+|U_MQ8W9Q!%irsPc41!!mr)4vI2-7kT)2v#Da2|BFS1V21gQ*1;n>Wjq(P
z@H*Kg$a@8IdkCQd6U6ofbV0fK*_;%>KuC0H8T)NL?$f6Bm9w^P_b;$1C5&DVMe>gX
z3WNYE+MvVa-8-y850K|lUF9$16>>7fUN+65D%10~xw0kdqhRr9Vux6xW*}!{)8%tp
z_tD4{=dxo@P4#58gG)245kADMDTMGvNoP8z({|OtV$*>ta{E`|Pjl_4RuFawom_1e
zHx+%XH@~n>iW}@jb6y;9&BLxq{bE&J)330+DCZ9d0V2Q*JQ1=u&?%p>hRs=2@u>A+
z@C>Y@5aQ-aps$QpXqfmW>!w}X?qjQ3VZoN0g=5fV(Pt&y=gCCot?A=qGa@?x;zasC
zQg@D*uuz?&U!e8xGPu_r#u@)XFY_2vdZ14_x4x3_%avXWtYLIS`!afUgYw@LE62GU
zYMQ!1`uZtL(yp|EED$H~{|4D6NPX{Au9TO!#s&yD5HvPPIjwuX&f#*d|K!+H$<0B}
zs;^%@+yn`$kI`({r{rBWuc)=c{jK;ZghCp=72ZQlWo8)?vMqd?q8Wx^6ep6$3!7K{$KGX2<#u9wk@hVJ8qvGgccWQQ?qplrM5M8xEXYF?!`2q?G*
zdE90aR7J|;LbT(7wF&+>nmr+u9dx~hktwwjrf?EsW~Z2hnU3#dzYH=GR=#nT-+j=diOvg(0}-+BU8J+
zSz{SI%AXW4y91ta*#qSla?d&AeUU0Q4K$zUdm`@)sj4NidY&P_D?&im5un+#{#l_K
z++?P*$gR$O-?K&ue9#P~y?s5lEW(?>+)}(a2v0AimKr~Q^G>DI3P9@jYIF~tBg_pM6RpSrVX$FjF=?j49}ulOl-;@?ShVg
z8$HjBB?p(N6_G7k`Y2NU5CSM*toObNc3F5Q(jocRkIMO?i^5T`6EMvI)+HqoDJn<|
zvsLo2F}&X+|5Tj=s2_Qn3T`(SvMM44>8-4T)oK1ChJrKsPZ}O&-dwl8Bp+FnZe;~(
z+N0<>WaFcw7uuY+%5;`ZLM*HbTA@rMi-$#UpXm0c7E}?b(PPJ?huRN!5B(htYVxVI
zOjepK0@G3W_n^e)_}#UHtX58-UE}YZS~=MLVL(W^jeDsyhlz?IC5deFin@c2C6lk0
zrKnrNASoni{(qz}>9R%rG_sbVY~A<;8^6b0X$x-iJa^UY5K+*&0rNTs*a0pbr0J`s
zV2iGXjgEA_;k*w25+BKZt?8~%at((-BmJjGYwPG-VN+nCX8E6fKSJd@Q??%%46VV_
z2otWW6qH(@GQ+ffI1Wl0zr7yQ-X*qDR@6SHgO2@uYyyg^#SXqhC=sCzLL_3@Et;o`
zh9a`}CTiQyj-u^RBAFYW6}v!a}qCx0#LsOjk>hx;NliLkniDFOYFPkp*>X{*4%ZO^10C
zJlTq7EwsUP*1+Rz=l(Evhte&0BjSIm{OBxPYtf)2W
zNeF`8on;deOB5ZC!3lBC9c#f@P`G-nOQZ^{p+e}$Af_C|TtoetF%mMu|6Q;QcOOtG
zqsaJP(M)I({ofhb-0=x)yQUdW1(Nu_D@C3+G`@jIb*^&pUL>c4kvk@K%Pv>1@Ox2j
z{)7Ecxlpd!eMdcZ9{M!Ht5Lvo@CPIxykX-b4^(f@Wso;g_n&}{p7uHVtTwyvrc
zn}UW&hK6SQu7_iLDxUj!(=Q=~*$nyFObbzRKur!CM%1#>(`%MCmA|Ds*
zTobEg9!UeacKxnihVta|(WhvgUlK1hzww-Xb5So*D&?6(lkDyLUUl8D1nf5SJ{W8l<+$mf`p8F+Z1{Bq-WPj4SHH{(Mp-7Rdy?W(P~Y6`4i6I&A~eM%w_IgS_NM5B`-;Y>h3|D;`(uup(3uv{T^TQe
za*}TdgDt;imHN+n407_FS8{dQ3B2FOzR0u^qH(i;ec1b5){5F|+LoK(kdhYqX)kIL
z9SgapdH++;ptZYlzj$+2pOe%4V802QMxmRFnw|Y+xwtq3I6N{%#x#Ni+CbcNFE2*y
zQa)qmzRSqgVP--J*<`YckL2)B{+2X
zZ^Q$s8p-n@`7p0BCGHkS2TM!E2DcupoIf@_7-sA}Fo<$;8UBud*9^pc1l*XD&@QEV
zCxPdvv!vf;Hqqd9UN*yLqb)^psB0zPa*jYpl(!xpc8a%$%(!7qWNbH|Ug`BQ0j=!p
zQ^=NqGiJH|pzl=M%wUy-@!n9`oP}T-m(@n#)ApyXhVPqUmi=;&eY_{+8$=*3gvfoS
zYw${VgoQ&!yBJU