From a90302f7bae012ba8d247204d121541534ecfc81 Mon Sep 17 00:00:00 2001 From: jackfiled Date: Thu, 4 Jul 2024 15:27:19 +0800 Subject: [PATCH] init: repo --- Chiara/.editorconfig | 210 ++ Chiara/.gitea/workflows/build.yaml | 26 + Chiara/.gitignore | 484 ++++ Chiara/AnitomySharp/Anitomy.cs | 96 + Chiara/AnitomySharp/AnitomySharp.csproj | 9 + Chiara/AnitomySharp/Element.cs | 90 + Chiara/AnitomySharp/Keyword.cs | 279 ++ Chiara/AnitomySharp/Options.cs | 28 + Chiara/AnitomySharp/Parser.cs | 430 +++ Chiara/AnitomySharp/ParserHelper.cs | 281 ++ Chiara/AnitomySharp/ParserNumber.cs | 681 +++++ Chiara/AnitomySharp/StringHelper.cs | 91 + Chiara/AnitomySharp/Token.cs | 226 ++ Chiara/AnitomySharp/TokenRange.cs | 17 + Chiara/AnitomySharp/Tokenizer.cs | 322 +++ Chiara/Chiara.Tests/.gitignore | 3 + .../AnitomySharpTests/DataTests.cs | 91 + .../AnitomySharpTests/test-cases.json | 2380 +++++++++++++++++ Chiara/Chiara.Tests/Chiara.Tests.csproj | 34 + Chiara/Chiara.Tests/GlobalUsings.cs | 3 + .../Services/MediaRepositoryScannerTests.cs | 27 + Chiara/Chiara.Tests/Utils/MockCreator.cs | 20 + Chiara/Chiara.sln | 47 + Chiara/Chiara/Abstractions/IFile.cs | 10 + Chiara/Chiara/Abstractions/IFileStore.cs | 12 + Chiara/Chiara/Abstractions/IMediaItem.cs | 10 + .../Abstractions/IMediaRepositoryScanner.cs | 12 + Chiara/Chiara/Chiara.csproj | 34 + Chiara/Chiara/Controllers/AlbumController.cs | 40 + Chiara/Chiara/Controllers/FileController.cs | 28 + Chiara/Chiara/Controllers/HlsController.cs | 152 ++ .../Controllers/MediaRepositoryController.cs | 74 + Chiara/Chiara/Controllers/SeasonController.cs | 38 + Chiara/Chiara/Controllers/SongController.cs | 39 + .../DataTransferObjects/AlbumResponse.cs | 36 + .../CreateMediaRepositoryRequest.cs | 12 + .../DataTransferObjects/EpisodeResponse.cs | 32 + .../MediaRepositoryResponse.cs | 30 + .../DataTransferObjects/ShowSeasonResponse.cs | 28 + .../DataTransferObjects/SongResponse.cs | 36 + .../VideoPlayingResponse.cs | 9 + Chiara/Chiara/Dockerfile | 8 + .../Extensions/ServiceCollectionExtensions.cs | 19 + .../WebApplicationBuilderExtensions.cs | 12 + .../20240521123215_CreateDatabase.Designer.cs | 58 + .../20240521123215_CreateDatabase.cs | 38 + .../20240529140720_AddAlbum.Designer.cs | 131 + .../Migrations/20240529140720_AddAlbum.cs | 113 + .../20240530030313_AddSongUrl.Designer.cs | 135 + .../Migrations/20240530030313_AddSongUrl.cs | 29 + .../20240601063131_UnifyFile.Designer.cs | 135 + .../Migrations/20240601063131_UnifyFile.cs | 38 + ...40601065653_AlbumCoverImageUrl.Designer.cs | 139 + .../20240601065653_AlbumCoverImageUrl.cs | 29 + .../20240607080833_AddHashValue.Designer.cs | 144 + .../Migrations/20240607080833_AddHashValue.cs | 47 + ...onAndEpisodeAndMediaRepository.Designer.cs | 275 ++ ..._ShowSeasonAndEpisodeAndMediaRepository.cs | 128 + ...0240609065607_AddEpisodeNumber.Designer.cs | 278 ++ .../20240609065607_AddEpisodeNumber.cs | 29 + ...240611062733_UpdateEpisodeType.Designer.cs | 279 ++ .../20240611062733_UpdateEpisodeType.cs | 34 + .../ChiaraDbContextModelSnapshot.cs | 276 ++ Chiara/Chiara/Models/Album.cs | 42 + Chiara/Chiara/Models/ChiaraOptions.cs | 8 + Chiara/Chiara/Models/DatabaseFile.cs | 24 + Chiara/Chiara/Models/Episode.cs | 37 + Chiara/Chiara/Models/LocalFile.cs | 17 + Chiara/Chiara/Models/MediaItemTypes.cs | 16 + Chiara/Chiara/Models/MediaRepository.cs | 14 + Chiara/Chiara/Models/ShowSeason.cs | 34 + Chiara/Chiara/Models/Song.cs | 22 + Chiara/Chiara/Program.cs | 35 + Chiara/Chiara/Properties/launchSettings.json | 23 + Chiara/Chiara/Services/ChiaraDbContext.cs | 49 + .../Services/DefaultMediaRepositoryScanner.cs | 229 ++ Chiara/Chiara/Services/FfmpegService.cs | 30 + Chiara/Chiara/Services/FileService.cs | 88 + Chiara/Chiara/Services/LocalFileService.cs | 36 + Chiara/Chiara/Services/MigrationService.cs | 44 + Chiara/Chiara/Services/RefreshService.cs | 45 + Chiara/Chiara/appsettings.Development.json | 14 + Chiara/Chiara/appsettings.json | 9 + Chiara/Chiara/docker-compose.yaml | 28 + Chiara/Chiara/wwwroot/.gitkeep | 0 ChiaraAndroid/.gitignore | 15 + ChiaraAndroid/.idea/.gitignore | 3 + ChiaraAndroid/.idea/.name | 1 + ChiaraAndroid/.idea/compiler.xml | 6 + .../.idea/deploymentTargetSelector.xml | 18 + ChiaraAndroid/.idea/gradle.xml | 19 + .../inspectionProfiles/Project_Default.xml | 41 + ChiaraAndroid/.idea/kotlinc.xml | 6 + ChiaraAndroid/.idea/migrations.xml | 10 + ChiaraAndroid/.idea/misc.xml | 9 + ChiaraAndroid/.idea/vcs.xml | 6 + ChiaraAndroid/app/.gitignore | 1 + ChiaraAndroid/app/build.gradle.kts | 152 ++ ChiaraAndroid/app/proguard-rules.pro | 21 + .../chiara/ExampleInstrumentedTest.kt | 24 + .../app/src/main/AndroidManifest.xml | 40 + .../app/src/main/ic_login-playstore.png | Bin 0 -> 14476 bytes .../java/top/rrricardo/chiara/MainActivity.kt | 44 + .../top/rrricardo/chiara/MainApplication.kt | 13 + .../java/top/rrricardo/chiara/di/AppModule.kt | 32 + .../top/rrricardo/chiara/di/ServiceModule.kt | 33 + .../chiara/extension/LongExtensions.kt | 17 + .../rrricardo/chiara/model/AlbumPageState.kt | 11 + .../rrricardo/chiara/model/HomePageState.kt | 15 + .../chiara/model/MusicControllerState.kt | 11 + .../top/rrricardo/chiara/model/PlayerState.kt | 7 + .../top/rrricardo/chiara/model/RepeatState.kt | 7 + .../rrricardo/chiara/model/ShowPageState.kt | 8 + .../rrricardo/chiara/model/VideoPageState.kt | 11 + .../chiara/service/MusicController.kt | 103 + .../service/impl/MusicControllerImpl.kt | 229 ++ .../chiara/service/impl/MusicService.kt | 38 + .../java/top/rrricardo/chiara/ui/ChiaraApp.kt | 160 ++ .../chiara/ui/component/AnimatedVinyl.kt | 133 + .../chiara/ui/component/ChiaraAppBar.kt | 83 + .../chiara/ui/component/HomeBottomBar.kt | 268 ++ .../chiara/ui/component/MusicItem.kt | 154 ++ .../chiara/ui/component/VideoItem.kt | 91 + .../top/rrricardo/chiara/ui/page/AlbumPage.kt | 90 + .../top/rrricardo/chiara/ui/page/HomePage.kt | 225 ++ .../rrricardo/chiara/ui/page/PlayListPage.kt | 114 + .../top/rrricardo/chiara/ui/page/ShowPage.kt | 74 + .../top/rrricardo/chiara/ui/page/SongPage.kt | 338 +++ .../rrricardo/chiara/ui/page/SplashPage.kt | 76 + .../top/rrricardo/chiara/ui/page/VideoPage.kt | 171 ++ .../top/rrricardo/chiara/ui/theme/Color.kt | 11 + .../top/rrricardo/chiara/ui/theme/Theme.kt | 59 + .../top/rrricardo/chiara/ui/theme/Type.kt | 34 + .../chiara/ui/viewmodel/AlbumPageViewModel.kt | 77 + .../chiara/ui/viewmodel/HomePageViewModel.kt | 106 + .../chiara/ui/viewmodel/MainViewModel.kt | 62 + .../chiara/ui/viewmodel/ShowPageViewModel.kt | 50 + .../chiara/ui/viewmodel/SongViewModel.kt | 22 + .../chiara/ui/viewmodel/VideoPageViewModel.kt | 101 + .../app/src/main/openapi/chiara.json | 864 ++++++ .../app/src/main/res/drawable/ic_image.xml | 5 + .../main/res/drawable/ic_login_foreground.xml | 16 + .../app/src/main/res/drawable/ic_music.xml | 5 + .../src/main/res/drawable/ic_round_album.xml | 5 + .../res/drawable/ic_round_library_music.xml | 5 + .../src/main/res/drawable/ic_round_pause.xml | 9 + .../main/res/drawable/ic_round_play_arrow.xml | 9 + .../src/main/res/drawable/ic_round_repeat.xml | 5 + .../main/res/drawable/ic_round_repeat_one.xml | 5 + .../main/res/drawable/ic_round_shuffle.xml | 5 + .../res/drawable/ic_round_video_library.xml | 5 + .../main/res/drawable/vinyl_background.png | Bin 0 -> 561966 bytes .../main/res/mipmap-anydpi-v26/ic_login.xml | 5 + .../res/mipmap-anydpi-v26/ic_login_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_login.webp | Bin 0 -> 1064 bytes .../main/res/mipmap-hdpi/ic_login_round.webp | Bin 0 -> 2922 bytes .../src/main/res/mipmap-mdpi/ic_login.webp | Bin 0 -> 784 bytes .../main/res/mipmap-mdpi/ic_login_round.webp | Bin 0 -> 1870 bytes .../src/main/res/mipmap-xhdpi/ic_login.webp | Bin 0 -> 1728 bytes .../main/res/mipmap-xhdpi/ic_login_round.webp | Bin 0 -> 4030 bytes .../src/main/res/mipmap-xxhdpi/ic_login.webp | Bin 0 -> 2426 bytes .../res/mipmap-xxhdpi/ic_login_round.webp | Bin 0 -> 6150 bytes .../src/main/res/mipmap-xxxhdpi/ic_login.webp | Bin 0 -> 3140 bytes .../res/mipmap-xxxhdpi/ic_login_round.webp | Bin 0 -> 8646 bytes .../app/src/main/res/values/colors.xml | 10 + .../main/res/values/ic_login_background.xml | 4 + .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/themes.xml | 5 + .../app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + .../top/rrricardo/chiara/ExampleUnitTest.kt | 17 + ChiaraAndroid/build.gradle.kts | 9 + ChiaraAndroid/gradle.properties | 23 + ChiaraAndroid/gradle/libs.versions.toml | 74 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + ChiaraAndroid/gradlew | 185 ++ ChiaraAndroid/gradlew.bat | 89 + ChiaraAndroid/settings.gradle.kts | 33 + Clock/.gitignore | 15 + Clock/.idea/.gitignore | 3 + Clock/.idea/codeStyles/Project.xml | 123 + Clock/.idea/codeStyles/codeStyleConfig.xml | 5 + Clock/.idea/compiler.xml | 6 + Clock/.idea/deploymentTargetDropDown.xml | 23 + Clock/.idea/gradle.xml | 19 + .../inspectionProfiles/Project_Default.xml | 41 + Clock/.idea/kotlinc.xml | 6 + Clock/.idea/migrations.xml | 10 + Clock/.idea/misc.xml | 10 + Clock/.idea/vcs.xml | 6 + Clock/app/.gitignore | 1 + Clock/app/build.gradle.kts | 90 + Clock/app/proguard-rules.pro | 21 + .../clock/ExampleInstrumentedTest.kt | 24 + Clock/app/src/main/AndroidManifest.xml | 25 + .../java/top/rrricardo/clock/MainActivity.kt | 43 + .../clock/controller/AnimatorController.kt | 42 + .../rrricardo/clock/model/ClockViewModel.kt | 100 + .../java/top/rrricardo/clock/ui/ClockApp.kt | 255 ++ .../top/rrricardo/clock/ui/ZoneManager.kt | 98 + .../top/rrricardo/clock/ui/theme/Color.kt | 11 + .../top/rrricardo/clock/ui/theme/Theme.kt | 70 + .../java/top/rrricardo/clock/ui/theme/Type.kt | 34 + Clock/app/src/main/res/values/colors.xml | 10 + Clock/app/src/main/res/values/strings.xml | 3 + Clock/app/src/main/res/values/themes.xml | 5 + Clock/app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + .../top/rrricardo/clock/ExampleUnitTest.kt | 17 + Clock/build.gradle.kts | 6 + Clock/gradle.properties | 23 + Clock/gradle/libs.versions.toml | 46 + Clock/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + Clock/gradlew | 185 ++ Clock/gradlew.bat | 89 + Clock/settings.gradle.kts | 35 + MusicPlayer/.gitignore | 15 + MusicPlayer/.idea/.gitignore | 3 + MusicPlayer/.idea/compiler.xml | 6 + .../.idea/deploymentTargetSelector.xml | 13 + MusicPlayer/.idea/gradle.xml | 19 + MusicPlayer/.idea/kotlinc.xml | 6 + MusicPlayer/.idea/migrations.xml | 10 + MusicPlayer/.idea/misc.xml | 10 + MusicPlayer/.idea/vcs.xml | 6 + MusicPlayer/app/.gitignore | 1 + MusicPlayer/app/build.gradle.kts | 119 + MusicPlayer/app/proguard-rules.pro | 21 + .../musicplayer/ExampleInstrumentedTest.kt | 24 + MusicPlayer/app/src/main/AndroidManifest.xml | 36 + .../java/top/rrricardo/musicplayer/App.kt | 8 + .../top/rrricardo/musicplayer/MainActivity.kt | 62 + .../top/rrricardo/musicplayer/di/AppModule.kt | 39 + .../rrricardo/musicplayer/di/ServiceModule.kt | 34 + .../rrricardo/musicplayer/model/HomeEvent.kt | 11 + .../musicplayer/model/HomeUiState.kt | 8 + .../model/MusicControllerUiState.kt | 10 + .../rrricardo/musicplayer/model/PlayState.kt | 7 + .../top/rrricardo/musicplayer/model/Song.kt | 26 + .../rrricardo/musicplayer/model/SongEvent.kt | 9 + .../musicplayer/service/AppDatabase.kt | 10 + .../musicplayer/service/MusicController.kt | 37 + .../musicplayer/service/SongRepository.kt | 12 + .../service/impl/LocalSongRepository.kt | 24 + .../service/impl/MusicControllerImpl.kt | 126 + .../musicplayer/service/impl/MusicService.kt | 44 + .../musicplayer/ui/MusicPlayerApp.kt | 83 + .../musicplayer/ui/component/AnimatedVinyl.kt | 99 + .../musicplayer/ui/component/MusicItem.kt | 120 + .../rrricardo/musicplayer/ui/page/HomePage.kt | 285 ++ .../musicplayer/ui/page/SongScreen.kt | 343 +++ .../rrricardo/musicplayer/ui/theme/Color.kt | 11 + .../rrricardo/musicplayer/ui/theme/Shape.kt | 37 + .../rrricardo/musicplayer/ui/theme/Theme.kt | 58 + .../rrricardo/musicplayer/ui/theme/Type.kt | 34 + .../musicplayer/ui/viewmodel/HomeViewModel.kt | 92 + .../ui/viewmodel/SharedViewModel.kt | 63 + .../musicplayer/ui/viewmodel/SongViewModel.kt | 41 + .../usecase/AddMediaItemsUseCase.kt | 10 + .../usecase/DestroyMediaControllerUseCase.kt | 8 + .../usecase/GetCurrentSongPositionUseCase.kt | 8 + .../musicplayer/usecase/GetSongsUseCase.kt | 8 + .../musicplayer/usecase/PauseSongUseCase.kt | 8 + .../musicplayer/usecase/PlaySongUseCase.kt | 8 + .../musicplayer/usecase/ResumeSongUseCase.kt | 8 + .../usecase/SeekSongToPositionUseCase.kt | 8 + .../SetMediaControllerCallbackUseCase.kt | 23 + .../usecase/SkipToNextSongUseCase.kt | 12 + .../usecase/SkipToPreviousSongUseCase.kt | 12 + .../musicplayer/utils/LongExtensions.kt | 15 + .../app/src/main/res/drawable/ic_image.xml | 5 + .../res/drawable/ic_launcher_background.xml | 170 ++ .../app/src/main/res/drawable/ic_logo.xml | 15 + .../app/src/main/res/drawable/ic_music.xml | 5 + .../src/main/res/drawable/ic_round_pause.xml | 9 + .../main/res/drawable/ic_round_play_arrow.xml | 9 + .../main/res/drawable/vinyl_background.png | Bin 0 -> 561966 bytes .../app/src/main/res/values/colors.xml | 10 + .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/themes.xml | 5 + .../app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + .../rrricardo/musicplayer/ExampleUnitTest.kt | 17 + MusicPlayer/build.gradle.kts | 7 + MusicPlayer/gradle.properties | 23 + MusicPlayer/gradle/libs.versions.toml | 67 + MusicPlayer/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + MusicPlayer/gradlew | 185 ++ MusicPlayer/gradlew.bat | 89 + MusicPlayer/settings.gradle.kts | 35 + 293 files changed, 18994 insertions(+) create mode 100644 Chiara/.editorconfig create mode 100644 Chiara/.gitea/workflows/build.yaml create mode 100644 Chiara/.gitignore create mode 100644 Chiara/AnitomySharp/Anitomy.cs create mode 100644 Chiara/AnitomySharp/AnitomySharp.csproj create mode 100644 Chiara/AnitomySharp/Element.cs create mode 100644 Chiara/AnitomySharp/Keyword.cs create mode 100644 Chiara/AnitomySharp/Options.cs create mode 100644 Chiara/AnitomySharp/Parser.cs create mode 100644 Chiara/AnitomySharp/ParserHelper.cs create mode 100644 Chiara/AnitomySharp/ParserNumber.cs create mode 100644 Chiara/AnitomySharp/StringHelper.cs create mode 100644 Chiara/AnitomySharp/Token.cs create mode 100644 Chiara/AnitomySharp/TokenRange.cs create mode 100644 Chiara/AnitomySharp/Tokenizer.cs create mode 100644 Chiara/Chiara.Tests/.gitignore create mode 100644 Chiara/Chiara.Tests/AnitomySharpTests/DataTests.cs create mode 100644 Chiara/Chiara.Tests/AnitomySharpTests/test-cases.json create mode 100644 Chiara/Chiara.Tests/Chiara.Tests.csproj create mode 100644 Chiara/Chiara.Tests/GlobalUsings.cs create mode 100644 Chiara/Chiara.Tests/Services/MediaRepositoryScannerTests.cs create mode 100644 Chiara/Chiara.Tests/Utils/MockCreator.cs create mode 100644 Chiara/Chiara.sln create mode 100644 Chiara/Chiara/Abstractions/IFile.cs create mode 100644 Chiara/Chiara/Abstractions/IFileStore.cs create mode 100644 Chiara/Chiara/Abstractions/IMediaItem.cs create mode 100644 Chiara/Chiara/Abstractions/IMediaRepositoryScanner.cs create mode 100644 Chiara/Chiara/Chiara.csproj create mode 100644 Chiara/Chiara/Controllers/AlbumController.cs create mode 100644 Chiara/Chiara/Controllers/FileController.cs create mode 100644 Chiara/Chiara/Controllers/HlsController.cs create mode 100644 Chiara/Chiara/Controllers/MediaRepositoryController.cs create mode 100644 Chiara/Chiara/Controllers/SeasonController.cs create mode 100644 Chiara/Chiara/Controllers/SongController.cs create mode 100644 Chiara/Chiara/DataTransferObjects/AlbumResponse.cs create mode 100644 Chiara/Chiara/DataTransferObjects/CreateMediaRepositoryRequest.cs create mode 100644 Chiara/Chiara/DataTransferObjects/EpisodeResponse.cs create mode 100644 Chiara/Chiara/DataTransferObjects/MediaRepositoryResponse.cs create mode 100644 Chiara/Chiara/DataTransferObjects/ShowSeasonResponse.cs create mode 100644 Chiara/Chiara/DataTransferObjects/SongResponse.cs create mode 100644 Chiara/Chiara/DataTransferObjects/VideoPlayingResponse.cs create mode 100644 Chiara/Chiara/Dockerfile create mode 100644 Chiara/Chiara/Extensions/ServiceCollectionExtensions.cs create mode 100644 Chiara/Chiara/Extensions/WebApplicationBuilderExtensions.cs create mode 100644 Chiara/Chiara/Migrations/20240521123215_CreateDatabase.Designer.cs create mode 100644 Chiara/Chiara/Migrations/20240521123215_CreateDatabase.cs create mode 100644 Chiara/Chiara/Migrations/20240529140720_AddAlbum.Designer.cs create mode 100644 Chiara/Chiara/Migrations/20240529140720_AddAlbum.cs create mode 100644 Chiara/Chiara/Migrations/20240530030313_AddSongUrl.Designer.cs create mode 100644 Chiara/Chiara/Migrations/20240530030313_AddSongUrl.cs create mode 100644 Chiara/Chiara/Migrations/20240601063131_UnifyFile.Designer.cs create mode 100644 Chiara/Chiara/Migrations/20240601063131_UnifyFile.cs create mode 100644 Chiara/Chiara/Migrations/20240601065653_AlbumCoverImageUrl.Designer.cs create mode 100644 Chiara/Chiara/Migrations/20240601065653_AlbumCoverImageUrl.cs create mode 100644 Chiara/Chiara/Migrations/20240607080833_AddHashValue.Designer.cs create mode 100644 Chiara/Chiara/Migrations/20240607080833_AddHashValue.cs create mode 100644 Chiara/Chiara/Migrations/20240608144941_ShowSeasonAndEpisodeAndMediaRepository.Designer.cs create mode 100644 Chiara/Chiara/Migrations/20240608144941_ShowSeasonAndEpisodeAndMediaRepository.cs create mode 100644 Chiara/Chiara/Migrations/20240609065607_AddEpisodeNumber.Designer.cs create mode 100644 Chiara/Chiara/Migrations/20240609065607_AddEpisodeNumber.cs create mode 100644 Chiara/Chiara/Migrations/20240611062733_UpdateEpisodeType.Designer.cs create mode 100644 Chiara/Chiara/Migrations/20240611062733_UpdateEpisodeType.cs create mode 100644 Chiara/Chiara/Migrations/ChiaraDbContextModelSnapshot.cs create mode 100644 Chiara/Chiara/Models/Album.cs create mode 100644 Chiara/Chiara/Models/ChiaraOptions.cs create mode 100644 Chiara/Chiara/Models/DatabaseFile.cs create mode 100644 Chiara/Chiara/Models/Episode.cs create mode 100644 Chiara/Chiara/Models/LocalFile.cs create mode 100644 Chiara/Chiara/Models/MediaItemTypes.cs create mode 100644 Chiara/Chiara/Models/MediaRepository.cs create mode 100644 Chiara/Chiara/Models/ShowSeason.cs create mode 100644 Chiara/Chiara/Models/Song.cs create mode 100644 Chiara/Chiara/Program.cs create mode 100644 Chiara/Chiara/Properties/launchSettings.json create mode 100644 Chiara/Chiara/Services/ChiaraDbContext.cs create mode 100644 Chiara/Chiara/Services/DefaultMediaRepositoryScanner.cs create mode 100644 Chiara/Chiara/Services/FfmpegService.cs create mode 100644 Chiara/Chiara/Services/FileService.cs create mode 100644 Chiara/Chiara/Services/LocalFileService.cs create mode 100644 Chiara/Chiara/Services/MigrationService.cs create mode 100644 Chiara/Chiara/Services/RefreshService.cs create mode 100644 Chiara/Chiara/appsettings.Development.json create mode 100644 Chiara/Chiara/appsettings.json create mode 100644 Chiara/Chiara/docker-compose.yaml create mode 100644 Chiara/Chiara/wwwroot/.gitkeep create mode 100644 ChiaraAndroid/.gitignore create mode 100644 ChiaraAndroid/.idea/.gitignore create mode 100644 ChiaraAndroid/.idea/.name create mode 100644 ChiaraAndroid/.idea/compiler.xml create mode 100644 ChiaraAndroid/.idea/deploymentTargetSelector.xml create mode 100644 ChiaraAndroid/.idea/gradle.xml create mode 100644 ChiaraAndroid/.idea/inspectionProfiles/Project_Default.xml create mode 100644 ChiaraAndroid/.idea/kotlinc.xml create mode 100644 ChiaraAndroid/.idea/migrations.xml create mode 100644 ChiaraAndroid/.idea/misc.xml create mode 100644 ChiaraAndroid/.idea/vcs.xml create mode 100644 ChiaraAndroid/app/.gitignore create mode 100644 ChiaraAndroid/app/build.gradle.kts create mode 100644 ChiaraAndroid/app/proguard-rules.pro create mode 100644 ChiaraAndroid/app/src/androidTest/java/top/rrricardo/chiara/ExampleInstrumentedTest.kt create mode 100644 ChiaraAndroid/app/src/main/AndroidManifest.xml create mode 100644 ChiaraAndroid/app/src/main/ic_login-playstore.png create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/MainActivity.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/MainApplication.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/di/AppModule.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/di/ServiceModule.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/extension/LongExtensions.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/AlbumPageState.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/HomePageState.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/MusicControllerState.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/PlayerState.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/RepeatState.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/ShowPageState.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/VideoPageState.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/service/MusicController.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/service/impl/MusicControllerImpl.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/service/impl/MusicService.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/ChiaraApp.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/AnimatedVinyl.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/ChiaraAppBar.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/HomeBottomBar.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/MusicItem.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/VideoItem.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/AlbumPage.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/HomePage.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/PlayListPage.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/ShowPage.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/SongPage.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/SplashPage.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/VideoPage.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/theme/Color.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/theme/Theme.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/theme/Type.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/AlbumPageViewModel.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/HomePageViewModel.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/MainViewModel.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/ShowPageViewModel.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/SongViewModel.kt create mode 100644 ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/VideoPageViewModel.kt create mode 100644 ChiaraAndroid/app/src/main/openapi/chiara.json create mode 100644 ChiaraAndroid/app/src/main/res/drawable/ic_image.xml create mode 100644 ChiaraAndroid/app/src/main/res/drawable/ic_login_foreground.xml create mode 100644 ChiaraAndroid/app/src/main/res/drawable/ic_music.xml create mode 100644 ChiaraAndroid/app/src/main/res/drawable/ic_round_album.xml create mode 100644 ChiaraAndroid/app/src/main/res/drawable/ic_round_library_music.xml create mode 100644 ChiaraAndroid/app/src/main/res/drawable/ic_round_pause.xml create mode 100644 ChiaraAndroid/app/src/main/res/drawable/ic_round_play_arrow.xml create mode 100644 ChiaraAndroid/app/src/main/res/drawable/ic_round_repeat.xml create mode 100644 ChiaraAndroid/app/src/main/res/drawable/ic_round_repeat_one.xml create mode 100644 ChiaraAndroid/app/src/main/res/drawable/ic_round_shuffle.xml create mode 100644 ChiaraAndroid/app/src/main/res/drawable/ic_round_video_library.xml create mode 100644 ChiaraAndroid/app/src/main/res/drawable/vinyl_background.png create mode 100644 ChiaraAndroid/app/src/main/res/mipmap-anydpi-v26/ic_login.xml create mode 100644 ChiaraAndroid/app/src/main/res/mipmap-anydpi-v26/ic_login_round.xml create mode 100644 ChiaraAndroid/app/src/main/res/mipmap-hdpi/ic_login.webp create mode 100644 ChiaraAndroid/app/src/main/res/mipmap-hdpi/ic_login_round.webp create mode 100644 ChiaraAndroid/app/src/main/res/mipmap-mdpi/ic_login.webp create mode 100644 ChiaraAndroid/app/src/main/res/mipmap-mdpi/ic_login_round.webp create mode 100644 ChiaraAndroid/app/src/main/res/mipmap-xhdpi/ic_login.webp create mode 100644 ChiaraAndroid/app/src/main/res/mipmap-xhdpi/ic_login_round.webp create mode 100644 ChiaraAndroid/app/src/main/res/mipmap-xxhdpi/ic_login.webp create mode 100644 ChiaraAndroid/app/src/main/res/mipmap-xxhdpi/ic_login_round.webp create mode 100644 ChiaraAndroid/app/src/main/res/mipmap-xxxhdpi/ic_login.webp create mode 100644 ChiaraAndroid/app/src/main/res/mipmap-xxxhdpi/ic_login_round.webp create mode 100644 ChiaraAndroid/app/src/main/res/values/colors.xml create mode 100644 ChiaraAndroid/app/src/main/res/values/ic_login_background.xml create mode 100644 ChiaraAndroid/app/src/main/res/values/strings.xml create mode 100644 ChiaraAndroid/app/src/main/res/values/themes.xml create mode 100644 ChiaraAndroid/app/src/main/res/xml/backup_rules.xml create mode 100644 ChiaraAndroid/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 ChiaraAndroid/app/src/test/java/top/rrricardo/chiara/ExampleUnitTest.kt create mode 100644 ChiaraAndroid/build.gradle.kts create mode 100644 ChiaraAndroid/gradle.properties create mode 100644 ChiaraAndroid/gradle/libs.versions.toml create mode 100644 ChiaraAndroid/gradle/wrapper/gradle-wrapper.jar create mode 100644 ChiaraAndroid/gradle/wrapper/gradle-wrapper.properties create mode 100755 ChiaraAndroid/gradlew create mode 100644 ChiaraAndroid/gradlew.bat create mode 100644 ChiaraAndroid/settings.gradle.kts create mode 100644 Clock/.gitignore create mode 100644 Clock/.idea/.gitignore create mode 100644 Clock/.idea/codeStyles/Project.xml create mode 100644 Clock/.idea/codeStyles/codeStyleConfig.xml create mode 100644 Clock/.idea/compiler.xml create mode 100644 Clock/.idea/deploymentTargetDropDown.xml create mode 100644 Clock/.idea/gradle.xml create mode 100644 Clock/.idea/inspectionProfiles/Project_Default.xml create mode 100644 Clock/.idea/kotlinc.xml create mode 100644 Clock/.idea/migrations.xml create mode 100644 Clock/.idea/misc.xml create mode 100644 Clock/.idea/vcs.xml create mode 100644 Clock/app/.gitignore create mode 100644 Clock/app/build.gradle.kts create mode 100644 Clock/app/proguard-rules.pro create mode 100644 Clock/app/src/androidTest/java/top/rrricardo/clock/ExampleInstrumentedTest.kt create mode 100644 Clock/app/src/main/AndroidManifest.xml create mode 100644 Clock/app/src/main/java/top/rrricardo/clock/MainActivity.kt create mode 100644 Clock/app/src/main/java/top/rrricardo/clock/controller/AnimatorController.kt create mode 100644 Clock/app/src/main/java/top/rrricardo/clock/model/ClockViewModel.kt create mode 100644 Clock/app/src/main/java/top/rrricardo/clock/ui/ClockApp.kt create mode 100644 Clock/app/src/main/java/top/rrricardo/clock/ui/ZoneManager.kt create mode 100644 Clock/app/src/main/java/top/rrricardo/clock/ui/theme/Color.kt create mode 100644 Clock/app/src/main/java/top/rrricardo/clock/ui/theme/Theme.kt create mode 100644 Clock/app/src/main/java/top/rrricardo/clock/ui/theme/Type.kt create mode 100644 Clock/app/src/main/res/values/colors.xml create mode 100644 Clock/app/src/main/res/values/strings.xml create mode 100644 Clock/app/src/main/res/values/themes.xml create mode 100644 Clock/app/src/main/res/xml/backup_rules.xml create mode 100644 Clock/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 Clock/app/src/test/java/top/rrricardo/clock/ExampleUnitTest.kt create mode 100644 Clock/build.gradle.kts create mode 100644 Clock/gradle.properties create mode 100644 Clock/gradle/libs.versions.toml create mode 100644 Clock/gradle/wrapper/gradle-wrapper.jar create mode 100644 Clock/gradle/wrapper/gradle-wrapper.properties create mode 100755 Clock/gradlew create mode 100644 Clock/gradlew.bat create mode 100644 Clock/settings.gradle.kts create mode 100644 MusicPlayer/.gitignore create mode 100644 MusicPlayer/.idea/.gitignore create mode 100644 MusicPlayer/.idea/compiler.xml create mode 100644 MusicPlayer/.idea/deploymentTargetSelector.xml create mode 100644 MusicPlayer/.idea/gradle.xml create mode 100644 MusicPlayer/.idea/kotlinc.xml create mode 100644 MusicPlayer/.idea/migrations.xml create mode 100644 MusicPlayer/.idea/misc.xml create mode 100644 MusicPlayer/.idea/vcs.xml create mode 100644 MusicPlayer/app/.gitignore create mode 100644 MusicPlayer/app/build.gradle.kts create mode 100644 MusicPlayer/app/proguard-rules.pro create mode 100644 MusicPlayer/app/src/androidTest/java/top/rrricardo/musicplayer/ExampleInstrumentedTest.kt create mode 100644 MusicPlayer/app/src/main/AndroidManifest.xml create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/App.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/MainActivity.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/di/AppModule.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/di/ServiceModule.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/model/HomeEvent.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/model/HomeUiState.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/model/MusicControllerUiState.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/model/PlayState.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/model/Song.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/model/SongEvent.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/service/AppDatabase.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/service/MusicController.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/service/SongRepository.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/service/impl/LocalSongRepository.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/service/impl/MusicControllerImpl.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/service/impl/MusicService.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/ui/MusicPlayerApp.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/ui/component/AnimatedVinyl.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/ui/component/MusicItem.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/ui/page/HomePage.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/ui/page/SongScreen.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/ui/theme/Color.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/ui/theme/Shape.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/ui/theme/Theme.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/ui/theme/Type.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/ui/viewmodel/HomeViewModel.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/ui/viewmodel/SharedViewModel.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/ui/viewmodel/SongViewModel.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/usecase/AddMediaItemsUseCase.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/usecase/DestroyMediaControllerUseCase.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/usecase/GetCurrentSongPositionUseCase.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/usecase/GetSongsUseCase.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/usecase/PauseSongUseCase.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/usecase/PlaySongUseCase.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/usecase/ResumeSongUseCase.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/usecase/SeekSongToPositionUseCase.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/usecase/SetMediaControllerCallbackUseCase.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/usecase/SkipToNextSongUseCase.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/usecase/SkipToPreviousSongUseCase.kt create mode 100644 MusicPlayer/app/src/main/java/top/rrricardo/musicplayer/utils/LongExtensions.kt create mode 100644 MusicPlayer/app/src/main/res/drawable/ic_image.xml create mode 100644 MusicPlayer/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 MusicPlayer/app/src/main/res/drawable/ic_logo.xml create mode 100644 MusicPlayer/app/src/main/res/drawable/ic_music.xml create mode 100644 MusicPlayer/app/src/main/res/drawable/ic_round_pause.xml create mode 100644 MusicPlayer/app/src/main/res/drawable/ic_round_play_arrow.xml create mode 100644 MusicPlayer/app/src/main/res/drawable/vinyl_background.png create mode 100644 MusicPlayer/app/src/main/res/values/colors.xml create mode 100644 MusicPlayer/app/src/main/res/values/strings.xml create mode 100644 MusicPlayer/app/src/main/res/values/themes.xml create mode 100644 MusicPlayer/app/src/main/res/xml/backup_rules.xml create mode 100644 MusicPlayer/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 MusicPlayer/app/src/test/java/top/rrricardo/musicplayer/ExampleUnitTest.kt create mode 100644 MusicPlayer/build.gradle.kts create mode 100644 MusicPlayer/gradle.properties create mode 100644 MusicPlayer/gradle/libs.versions.toml create mode 100644 MusicPlayer/gradle/wrapper/gradle-wrapper.jar create mode 100644 MusicPlayer/gradle/wrapper/gradle-wrapper.properties create mode 100755 MusicPlayer/gradlew create mode 100644 MusicPlayer/gradlew.bat create mode 100644 MusicPlayer/settings.gradle.kts diff --git a/Chiara/.editorconfig b/Chiara/.editorconfig new file mode 100644 index 0000000..d3ccc72 --- /dev/null +++ b/Chiara/.editorconfig @@ -0,0 +1,210 @@ +# editorconfig.org + +# top-most EditorConfig file +root = true + +# Default settings: +# A newline ending every file +# Use 4 spaces as indentation +[*] +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[project.json] +indent_size = 2 + +# C# and Visual Basic files +[*.{cs,vb}] +charset = utf-8-bom + +# Analyzers +dotnet_analyzer_diagnostic.category-Security.severity = error +dotnet_code_quality.ca1802.api_surface = private, internal + +# Miscellaneous style rules +dotnet_sort_system_directives_first = true +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# avoid this. unless absolutely necessary +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# name all constant fields using PascalCase +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.required_modifiers = const +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# static fields should have s_ prefix +dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion +dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields +dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style +dotnet_naming_symbols.static_fields.applicable_kinds = field +dotnet_naming_symbols.static_fields.required_modifiers = static +dotnet_naming_symbols.static_fields.applicable_accessibilities = private, internal, private_protected +dotnet_naming_style.static_prefix_style.required_prefix = s_ +dotnet_naming_style.static_prefix_style.capitalization = camel_case + +# internal and private fields should be _camelCase +dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion +dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields +dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style +dotnet_naming_symbols.private_internal_fields.applicable_kinds = field +dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal +dotnet_naming_style.camel_case_underscore_style.required_prefix = _ +dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case + +# Code quality +dotnet_style_readonly_field = true:suggestion +dotnet_code_quality_unused_parameters = non_public:suggestion + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:refactoring +dotnet_style_prefer_conditional_expression_over_return = true:refactoring + +# CA2208: Instantiate argument exceptions correctly +dotnet_diagnostic.CA2208.severity = error + +# C# files +[*.cs] +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_switch_labels = true +csharp_indent_labels = one_less_than_current + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion + +# Code style defaults +csharp_using_directive_placement = outside_namespace:suggestion +csharp_prefer_braces = true:refactoring +csharp_preserve_single_line_blocks = true:none +csharp_preserve_single_line_statements = false:none +csharp_prefer_static_local_function = true:suggestion +csharp_prefer_simple_using_statement = false:none +csharp_style_prefer_switch_expression = true:suggestion + +# Expression-bodied members +csharp_style_expression_bodied_methods = true:refactoring +csharp_style_expression_bodied_constructors = true:refactoring +csharp_style_expression_bodied_operators = true:refactoring +csharp_style_expression_bodied_properties = true:refactoring +csharp_style_expression_bodied_indexers = true:refactoring +csharp_style_expression_bodied_accessors = true:refactoring +csharp_style_expression_bodied_lambdas = true:refactoring +csharp_style_expression_bodied_local_functions = true:refactoring + +# Pattern matching +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +# Expression-level preferences +csharp_prefer_simple_default_expression = true:suggestion + +# Null checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion + +# Other features +csharp_style_prefer_index_operator = false:none +csharp_style_prefer_range_operator = false:none +csharp_style_pattern_local_over_anonymous_function = false:none + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = do_not_ignore +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Namespace preference +csharp_style_namespace_declarations = file_scoped:suggestion + +# Types: use keywords instead of BCL types, and permit var only when the type is clear +csharp_style_var_for_built_in_types = false:suggestion +csharp_style_var_when_type_is_apparent = false:none +csharp_style_var_elsewhere = false:suggestion + +# Visual Basic files +[*.vb] +# Modifier preferences +visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion + +# C++ Files +[*.{cpp,h,in}] +curly_bracket_next_line = true +indent_brace_style = Allman + +# Xml project files +[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}] +indent_size = 2 + +# Xml build files +[*.builds] +indent_size = 2 + +# Xml files +[*.{xml,stylecop,resx,ruleset}] +indent_size = 2 + +# Xml config files +[*.{props,targets,config,nuspec}] +indent_size = 2 + +# Shell scripts +[*.sh] +end_of_line = lf + +[*.{cmd, bat}] +end_of_line = crlf + +# Markdown files +[*.md] +# Double trailing spaces can be used for BR tags, and other instances are enforced by Markdownlint +trim_trailing_whitespace = false diff --git a/Chiara/.gitea/workflows/build.yaml b/Chiara/.gitea/workflows/build.yaml new file mode 100644 index 0000000..a34e216 --- /dev/null +++ b/Chiara/.gitea/workflows/build.yaml @@ -0,0 +1,26 @@ +name: Build Docker Image +on: + push: + branches: + - master + +jobs: + Build-Martina: + runs-on: archlinux + steps: + - uses: https://git.rrricardo.top/actions/checkout@v4 + name: Check out code + - name: Cache nuget packages + uses: https://git.rrricardo.top/actions/cache@v4 + with: + path: ~/.nuget/packages + key: ${{ runner.os }}-nuget + save-always: true + - name: Publish dotnet app + run: | + cd Chiara + dotnet publish + - name: Build docker image + run: | + cd Chiara + docker build . -t chiara:latest diff --git a/Chiara/.gitignore b/Chiara/.gitignore new file mode 100644 index 0000000..104b544 --- /dev/null +++ b/Chiara/.gitignore @@ -0,0 +1,484 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from `dotnet new gitignore` + +# dotenv files +.env + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml +.idea + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# Vim temporary swap files +*.swp diff --git a/Chiara/AnitomySharp/Anitomy.cs b/Chiara/AnitomySharp/Anitomy.cs new file mode 100644 index 0000000..f7ea214 --- /dev/null +++ b/Chiara/AnitomySharp/Anitomy.cs @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2014-2017, Eren Okka + * Copyright (c) 2016-2017, Paul Miller + * Copyright (c) 2017-2018, Tyler Bratton + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +namespace AnitomySharp; + +/// +/// A library capable of parsing Anime filenames +/// This code is a C++ to C# port of Anitomy>, +/// using the already existing Java port AnitomyJ as a reference. +/// +public class Anitomy +{ + private Anitomy() {} + + /// + /// Parses an anime into its constituent elements. + /// + /// the anime file name + /// the options to parse with, use Parse(filename) to use default options + /// the list of parsed elements + public static IEnumerable Parse(string filename, Options options) + { + List elements = []; + List tokens = []; + + if (options.ParseFileExtension) + { + string extension = ""; + if (RemoveExtensionFromFilename(ref filename, ref extension)) + { + elements.Add(new Element(ElementCategory.ElementFileExtension, extension)); + } + } + + if (string.IsNullOrEmpty(filename)) + { + return elements; + } + elements.Add(new Element(ElementCategory.ElementFileName, filename)); + + bool isTokenized = new Tokenizer(filename, elements, options, tokens).Tokenize(); + if (!isTokenized) + { + return elements; + } + new Parser(elements, options, tokens).Parse(); + return elements; + } + + /// + /// Parses an anime into its consituent elements. + /// + /// the anime file name + /// the list of parsed elements + public static IEnumerable Parse(string filename) + { + return Parse(filename, new Options()); + } + + /// + /// Removes the extension from the + /// + /// the ref that will be updated with the new filename + /// the ref that will be updated with the file extension + /// if the extension was successfully separated from the filename + private static bool RemoveExtensionFromFilename(ref string filename, ref string extension) + { + int position; + if (string.IsNullOrEmpty(filename) || (position = filename.LastIndexOf('.')) == -1) + { + return false; + } + + extension = filename[(position + 1)..]; + if (extension.Length > 4 || !extension.All(char.IsLetterOrDigit)) + { + return false; + } + + string keyword = KeywordManager.Normalize(extension); + if (!KeywordManager.Contains(ElementCategory.ElementFileExtension, keyword)) + { + return false; + } + + filename = filename[..position]; + return true; + } +} diff --git a/Chiara/AnitomySharp/AnitomySharp.csproj b/Chiara/AnitomySharp/AnitomySharp.csproj new file mode 100644 index 0000000..3a63532 --- /dev/null +++ b/Chiara/AnitomySharp/AnitomySharp.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/Chiara/AnitomySharp/Element.cs b/Chiara/AnitomySharp/Element.cs new file mode 100644 index 0000000..9252328 --- /dev/null +++ b/Chiara/AnitomySharp/Element.cs @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2014-2017, Eren Okka + * Copyright (c) 2016-2017, Paul Miller + * Copyright (c) 2017-2018, Tyler Bratton + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +namespace AnitomySharp; + +/// +/// An represents an identified Anime . +/// A single filename may contain multiple of the same +/// token(e.g ). +/// +public class Element +{ + public ElementCategory Category { get; set; } + public string Value { get; } + + /// + /// Constructs a new Element + /// + /// the category of the element + /// the element's value + public Element(ElementCategory category, string value) + { + Category = category; + Value = value; + } + + public override int GetHashCode() + { + return -1926371015 + Value.GetHashCode(); + } + + public override bool Equals(object? obj) + { + if (this == obj) + { + return true; + } + + if (obj == null || GetType() != obj.GetType()) + { + return false; + } + + var other = (Element) obj; + return Category.Equals(other.Category); + } + + public override string ToString() + { + return $"Element{{category={Category}, value='{Value}'}}"; + } +} + +/** Element Categories */ +public enum ElementCategory +{ + ElementAnimeSeason, + ElementAnimeSeasonPrefix, + ElementAnimeTitle, + ElementAnimeType, + ElementAnimeYear, + ElementAudioTerm, + ElementDeviceCompatibility, + ElementEpisodeNumber, + ElementEpisodeNumberAlt, + ElementEpisodePrefix, + ElementEpisodeTitle, + ElementFileChecksum, + ElementFileExtension, + ElementFileName, + ElementLanguage, + ElementOther, + ElementReleaseGroup, + ElementReleaseInformation, + ElementReleaseVersion, + ElementSource, + ElementSubtitles, + ElementVideoResolution, + ElementVideoTerm, + ElementVolumeNumber, + ElementVolumePrefix, + ElementUnknown +} diff --git a/Chiara/AnitomySharp/Keyword.cs b/Chiara/AnitomySharp/Keyword.cs new file mode 100644 index 0000000..f4e84a4 --- /dev/null +++ b/Chiara/AnitomySharp/Keyword.cs @@ -0,0 +1,279 @@ +/* + * Copyright (c) 2014-2017, Eren Okka + * Copyright (c) 2016-2017, Paul Miller + * Copyright (c) 2017-2018, Tyler Bratton + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +namespace AnitomySharp; + +/// +/// A class to manager the list of known anime keywords. This class is analogous to keyword.cpp of Anitomy, and KeywordManager.java of AnitomyJ +/// +public static class KeywordManager +{ + private static readonly Dictionary s_keys = new(); + private static readonly Dictionary s_extensions = new(); + private static readonly List>> s_peekEntries; + + static KeywordManager() + { + var optionsDefault = new KeywordOptions(); + var optionsInvalid = new KeywordOptions(true, true, false); + var optionsUnidentifiable = new KeywordOptions(false, true, true); + var optionsUnidentifiableInvalid = new KeywordOptions(false, true, false); + var optionsUnidentifiableUnsearchable = new KeywordOptions(false, false, true); + + Add(ElementCategory.ElementAnimeSeasonPrefix, + optionsUnidentifiable, + new List {"SAISON", "SEASON"}); + + Add(ElementCategory.ElementAnimeType, + optionsUnidentifiable, + new List {"GEKIJOUBAN", "MOVIE", "OAD", "OAV", "ONA", "OVA", "SPECIAL", "SPECIALS", "TV"}); + + Add(ElementCategory.ElementAnimeType, + optionsUnidentifiableUnsearchable, + new List {"SP"}); // e.g. "Yumeiro Patissiere SP Professional" + + Add(ElementCategory.ElementAnimeType, + optionsUnidentifiableInvalid, + new List {"ED", "ENDING", "NCED", "NCOP", "OP", "OPENING", "PREVIEW", "PV"}); + + Add(ElementCategory.ElementAudioTerm, + optionsDefault, + new List { + // Audio channels + "2.0CH", "2CH", "5.1", "5.1CH", "DTS", "DTS-ES", "DTS5.1", + "TRUEHD5.1", + // Audio codec + "AAC", "AACX2", "AACX3", "AACX4", "AC3", "EAC3", "E-AC-3", + "FLAC", "FLACX2", "FLACX3", "FLACX4", "LOSSLESS", "MP3", "OGG", "VORBIS", + // Audio language + "DUALAUDIO", "DUAL AUDIO" + }); + + Add(ElementCategory.ElementDeviceCompatibility, + optionsDefault, + new List {"IPAD3", "IPHONE5", "IPOD", "PS3", "XBOX", "XBOX360"}); + + Add(ElementCategory.ElementDeviceCompatibility, + optionsUnidentifiable, + new List {"ANDROID"}); + + Add(ElementCategory.ElementEpisodePrefix, + optionsDefault, + new List {"EP", "EP.", "EPS", "EPS.", "EPISODE", "EPISODE.", "EPISODES", "CAPITULO", "EPISODIO", "FOLGE"}); + + Add(ElementCategory.ElementEpisodePrefix, + optionsInvalid, + new List {"E", "\\x7B2C"}); // single-letter episode keywords are not valid tokens + + Add(ElementCategory.ElementFileExtension, + optionsDefault, + new List {"3GP", "AVI", "DIVX", "FLV", "M2TS", "MKV", "MOV", "MP4", "MPG", "OGM", "RM", "RMVB", "TS", "WEBM", "WMV"}); + + Add(ElementCategory.ElementFileExtension, + optionsInvalid, + new List {"AAC", "AIFF", "FLAC", "M4A", "MP3", "MKA", "OGG", "WAV", "WMA", "7Z", "RAR", "ZIP", "ASS", "SRT"}); + + Add(ElementCategory.ElementLanguage, + optionsDefault, + new List {"ENG", "ENGLISH", "ESPANO", "JAP", "PT-BR", "SPANISH", "VOSTFR"}); + + Add(ElementCategory.ElementLanguage, + optionsUnidentifiable, + new List {"ESP", "ITA"}); // e.g. "Tokyo ESP:, "Bokura ga Ita" + + Add(ElementCategory.ElementOther, + optionsDefault, + new List {"REMASTER", "REMASTERED", "UNCENSORED", "UNCUT", "TS", "VFR", "WIDESCREEN", "WS"}); + + Add(ElementCategory.ElementReleaseGroup, + optionsDefault, + new List {"THORA"}); + + Add(ElementCategory.ElementReleaseInformation, + optionsDefault, + new List {"BATCH", "COMPLETE", "PATCH", "REMUX"}); + + Add(ElementCategory.ElementReleaseInformation, + optionsUnidentifiable, + new List {"END", "FINAL"}); // e.g. "The End of Evangelion", 'Final Approach" + + Add(ElementCategory.ElementReleaseVersion, + optionsDefault, + new List {"V0", "V1", "V2", "V3", "V4"}); + + Add(ElementCategory.ElementSource, + optionsDefault, + new List {"BD", "BDRIP", "BLURAY", "BLU-RAY", "DVD", "DVD5", "DVD9", "DVD-R2J", "DVDRIP", "DVD-RIP", "R2DVD", "R2J", "R2JDVD", "R2JDVDRIP", "HDTV", "HDTVRIP", "TVRIP", "TV-RIP", "WEBCAST", "WEBRIP"}); + + Add(ElementCategory.ElementSubtitles, + optionsDefault, + new List {"ASS", "BIG5", "DUB", "DUBBED", "HARDSUB", "HARDSUBS", "RAW", "SOFTSUB", "SOFTSUBS", "SUB", "SUBBED", "SUBTITLED"}); + + Add(ElementCategory.ElementVideoTerm, + optionsDefault, + new List { + // Frame rate + "23.976FPS", "24FPS", "29.97FPS", "30FPS", "60FPS", "120FPS", + // Video codec + "8BIT", "8-BIT", "10BIT", "10BITS", "10-BIT", "10-BITS", + "HI10", "HI10P", "HI444", "HI444P", "HI444PP", + "H264", "H265", "H.264", "H.265", "X264", "X265", "X.264", + "AVC", "HEVC", "HEVC2", "DIVX", "DIVX5", "DIVX6", "XVID", + // Video format + "AVI", "RMVB", "WMV", "WMV3", "WMV9", + // Video quality + "HQ", "LQ", + // Video resolution + "HD", "SD"}); + + Add(ElementCategory.ElementVolumePrefix, + optionsDefault, + new List {"VOL", "VOL.", "VOLUME"}); + + s_peekEntries = new List>> + { + Tuple.Create(ElementCategory.ElementAudioTerm, new List { "Dual Audio" }), + Tuple.Create(ElementCategory.ElementVideoTerm, new List { "H264", "H.264", "h264", "h.264" }), + Tuple.Create(ElementCategory.ElementVideoResolution, new List { "480p", "720p", "1080p" }), + Tuple.Create(ElementCategory.ElementSource, new List { "Blu-Ray" }) + }; + } + + public static string Normalize(string word) + { + return string.IsNullOrEmpty(word) ? word : word.ToUpperInvariant(); + } + + public static bool Contains(ElementCategory category, string keyword) + { + var keys = GetKeywordContainer(category); + if (keys.TryGetValue(keyword, out var foundEntry)) + { + return foundEntry.Category == category; + } + + return false; + } + + /// + /// Finds a particular keyword. If found sets category and options to the found search result. + /// + /// the keyword to search for + /// the reference that will be set/changed to the found keyword category + /// the reference that will be set/changed to the found keyword options + /// if the keyword was found + public static bool FindAndSet(string keyword, ref ElementCategory category, ref KeywordOptions options) + { + Dictionary keys = GetKeywordContainer(category); + if (!keys.TryGetValue(keyword, out var foundEntry)) + { + return false; + } + + if (category == ElementCategory.ElementUnknown) + { + category = foundEntry.Category; + } + else if (foundEntry.Category != category) + { + return false; + } + options = foundEntry.Options; + return true; + } + + /// + /// Given a particular filename and range attempt to preidentify the token before we attempt the main parsing logic + /// + /// the filename + /// the search range + /// elements array that any pre-identified elements will be added to + /// elements array that any pre-identified token ranges will be added to + public static void PeekAndAdd(string filename, TokenRange range, List elements, List preIdentifiedTokens) + { + int endR = range.Offset + range.Size; + string search = filename.Substring(range.Offset, endR > filename.Length ? filename.Length - range.Offset : endR - range.Offset); + foreach (var entry in s_peekEntries) + { + foreach (string keyword in entry.Item2) + { + int foundIdx = search.IndexOf(keyword, StringComparison.CurrentCulture); + if (foundIdx == -1) continue; + foundIdx += range.Offset; + elements.Add(new Element(entry.Item1, keyword)); + preIdentifiedTokens.Add(new TokenRange(foundIdx, keyword.Length)); + } + } + } + + // Private API + + /** Returns the appropriate keyword container. */ + private static Dictionary GetKeywordContainer(ElementCategory category) + { + return category == ElementCategory.ElementFileExtension ? s_extensions : s_keys; + } + + /// Adds a category, options, and keywords to the internal keywords list. + private static void Add(ElementCategory category, KeywordOptions options, IEnumerable keywords) + { + var keys = GetKeywordContainer(category); + foreach (string key in keywords.Where(k => !string.IsNullOrEmpty(k) && !keys.ContainsKey(k))) + { + keys[key] = new Keyword(category, options); + } + } +} + +/// +/// Keyword options for a particular keyword. +/// +public class KeywordOptions +{ + public bool Identifiable { get; } + public bool Searchable { get; } + public bool Valid { get; } + + public KeywordOptions() : this(true, true, true) {} + + /// + /// Constructs a new keyword options + /// + /// if the token is identifiable + /// if the token is searchable + /// if the token is valid + public KeywordOptions(bool identifiable, bool searchable, bool valid) + { + Identifiable = identifiable; + Searchable = searchable; + Valid = valid; + } + +} + +/// +/// A Keyword +/// +public struct Keyword +{ + public readonly ElementCategory Category; + public readonly KeywordOptions Options; + + /// + /// Constructs a new Keyword + /// + /// the category of the keyword + /// the keyword's options + public Keyword(ElementCategory category, KeywordOptions options) + { + Category = category; + Options = options; + } +} diff --git a/Chiara/AnitomySharp/Options.cs b/Chiara/AnitomySharp/Options.cs new file mode 100644 index 0000000..be2fba1 --- /dev/null +++ b/Chiara/AnitomySharp/Options.cs @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2014-2017, Eren Okka + * Copyright (c) 2016-2017, Paul Miller + * Copyright (c) 2017-2018, Tyler Bratton + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +namespace AnitomySharp; + +/// +/// AnitomySharp search configuration options +/// +public class Options( + string delimiters = " _.&+,|", + bool episode = true, + bool title = true, + bool extension = true, + bool group = true) +{ + public string AllowedDelimiters { get; } = delimiters; + public bool ParseEpisodeNumber { get; } = episode; + public bool ParseEpisodeTitle { get; } = title; + public bool ParseFileExtension { get; } = extension; + public bool ParseReleaseGroup { get; } = group; +} diff --git a/Chiara/AnitomySharp/Parser.cs b/Chiara/AnitomySharp/Parser.cs new file mode 100644 index 0000000..8df43ff --- /dev/null +++ b/Chiara/AnitomySharp/Parser.cs @@ -0,0 +1,430 @@ +/* + * Copyright (c) 2014-2017, Eren Okka + * Copyright (c) 2016-2017, Paul Miller + * Copyright (c) 2017-2018, Tyler Bratton + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +namespace AnitomySharp; + +/// +/// Class to classify s +/// +public class Parser +{ + public bool IsEpisodeKeywordsFound { get; private set; } + public ParserHelper ParseHelper { get; } + public ParserNumber ParseNumber { get; } + public List Elements { get; } + public List Tokens { get; } + private Options Options { get; } + + /// + /// Constructs a new token parser + /// + /// the list where parsed elements will be added + /// the parser options + /// the list of tokens + public Parser(List elements, Options options, List tokens) + { + Elements = elements; + Options = options; + Tokens = tokens; + ParseHelper = new ParserHelper(this); + ParseNumber = new ParserNumber(this); + } + + /** Begins the parsing process */ + public bool Parse() + { + SearchForKeywords(); + SearchForIsolatedNumbers(); + + if (Options.ParseEpisodeNumber) + { + SearchForEpisodeNumber(); + } + + SearchForAnimeTitle(); + + if (Options.ParseReleaseGroup && Empty(ElementCategory.ElementReleaseGroup)) + { + SearchForReleaseGroup(); + } + + if (Options.ParseEpisodeTitle && !Empty(ElementCategory.ElementEpisodeNumber)) + { + SearchForEpisodeTitle(); + } + + ValidateElements(); + return Empty(ElementCategory.ElementAnimeTitle); + } + + /** Search for anime keywords. */ + private void SearchForKeywords() + { + for (int i = 0; i < Tokens.Count; i++) + { + var token = Tokens[i]; + if (token.Category != Token.TokenCategory.Unknown) continue; + + string word = token.Content; + word = word.Trim(" -".ToCharArray()); + if (string.IsNullOrEmpty(word)) continue; + + // Don't bother if the word is a number that cannot be CRC + if (word.Length != 8 && StringHelper.IsNumericString(word)) continue; + + string keyword = KeywordManager.Normalize(word); + var category = ElementCategory.ElementUnknown; + var options = new KeywordOptions(); + + if (KeywordManager.FindAndSet(keyword, ref category, ref options)) + { + if (!Options.ParseReleaseGroup && category == ElementCategory.ElementReleaseGroup) continue; + if (!ParserHelper.IsElementCategorySearchable(category) || !options.Searchable) continue; + if (ParserHelper.IsElementCategorySingular(category) && !Empty(category)) continue; + switch (category) + { + case ElementCategory.ElementAnimeSeasonPrefix: + ParseHelper.CheckAndSetAnimeSeasonKeyword(token, i); + continue; + case ElementCategory.ElementEpisodePrefix when options.Valid: + ParseHelper.CheckExtentKeyword(ElementCategory.ElementEpisodeNumber, i, token); + continue; + case ElementCategory.ElementReleaseVersion: + word = word[1..]; + break; + case ElementCategory.ElementVolumePrefix: + ParseHelper.CheckExtentKeyword(ElementCategory.ElementVolumeNumber, i, token); + continue; + } + } + else + { + if (Empty(ElementCategory.ElementFileChecksum) && ParserHelper.IsCrc32(word)) + { + category = ElementCategory.ElementFileChecksum; + } + else if (Empty(ElementCategory.ElementVideoResolution) && ParserHelper.IsResolution(word)) + { + category = ElementCategory.ElementVideoResolution; + } + } + + if (category == ElementCategory.ElementUnknown) continue; + Elements.Add(new Element(category, word)); + if (options.Identifiable) + { + token.Category = Token.TokenCategory.Identifier; + } + } + } + + /** Search for episode number. */ + private void SearchForEpisodeNumber() + { + // List all unknown tokens that contain a number + var tokens = new List(); + for (int i = 0; i < Tokens.Count; i++) + { + var token = Tokens[i]; + if (token.Category == Token.TokenCategory.Unknown && + ParserHelper.IndexOfFirstDigit(token.Content) != -1) + { + tokens.Add(i); + } + } + + if (tokens.Count == 0) return; + + IsEpisodeKeywordsFound = !Empty(ElementCategory.ElementEpisodeNumber); + + // If a token matches a known episode pattern, it has to be the episode number + if (ParseNumber.SearchForEpisodePatterns(tokens)) return; + + // We have previously found an episode number via keywords + if (!Empty(ElementCategory.ElementEpisodeNumber)) return; + + // From now on, we're only interested in numeric tokens + tokens.RemoveAll(r => !StringHelper.IsNumericString(Tokens[r].Content)); + + // e.g. "01 (176)", "29 (04)" + if (ParseNumber.SearchForEquivalentNumbers(tokens)) return; + + // e.g. " - 08" + if (ParseNumber.SearchForSeparatedNumbers(tokens)) return; + + // "e.g. "[12]", "(2006)" + if (ParseNumber.SearchForIsolatedNumbers(tokens)) return; + + // Consider using the last number as a last resort + ParseNumber.SearchForLastNumber(tokens); + } + + /// + /// Search for anime title + /// + private void SearchForAnimeTitle() + { + bool enclosedTitle = false; + + int tokenBegin = Token.FindToken(Tokens, 0, Tokens.Count, Token.TokenFlag.FlagNotEnclosed, + Token.TokenFlag.FlagUnknown); + + // If that doesn't work, find the first unknown token in the second enclosed + // group, assuming that the first one is the release group + if (!Token.InListRange(tokenBegin, Tokens)) + { + tokenBegin = 0; + enclosedTitle = true; + bool skippedPreviousGroup = false; + + do + { + tokenBegin = Token.FindToken(Tokens, tokenBegin, Tokens.Count, Token.TokenFlag.FlagUnknown); + if (!Token.InListRange(tokenBegin, Tokens)) break; + + // Ignore groups that are composed of non-Latin characters + if (StringHelper.IsMostlyLatinString(Tokens[tokenBegin].Content) && skippedPreviousGroup) + { + break; + } + + // Get the first unknown token of the next group + tokenBegin = Token.FindToken(Tokens, tokenBegin, Tokens.Count, Token.TokenFlag.FlagBracket); + tokenBegin = Token.FindToken(Tokens, tokenBegin, Tokens.Count, Token.TokenFlag.FlagUnknown); + skippedPreviousGroup = true; + } while (Token.InListRange(tokenBegin, Tokens)); + } + + if (!Token.InListRange(tokenBegin, Tokens)) return; + + // Continue until an identifier (or a bracket, if the title is enclosed) is found + int tokenEnd = Token.FindToken( + Tokens, + tokenBegin, + Tokens.Count, + Token.TokenFlag.FlagIdentifier, + enclosedTitle ? Token.TokenFlag.FlagBracket : Token.TokenFlag.FlagNone); + + // If within the interval there's an open bracket without its matching pair, + // move the upper endpoint back to the bracket + if (!enclosedTitle) + { + int lastBracket = tokenEnd; + bool bracketOpen = false; + for (int i = tokenBegin; i < tokenEnd; i++) + { + if (Tokens[i].Category != Token.TokenCategory.Bracket) continue; + lastBracket = i; + bracketOpen = !bracketOpen; + } + + if (bracketOpen) tokenEnd = lastBracket; + } + + // If the interval ends with an enclosed group (e.g. "Anime Title [Fansub]"), + // move the upper endpoint back to the beginning of the group. We ignore + // parentheses in order to keep certain groups (e.g. "(TV)") intact. + if (!enclosedTitle) + { + int token = Token.FindPrevToken(Tokens, tokenEnd, Token.TokenFlag.FlagNotDelimiter); + + while (ParseHelper.IsTokenCategory(token, Token.TokenCategory.Bracket) && Tokens[token].Content[0] != ')') + { + token = Token.FindPrevToken(Tokens, token, Token.TokenFlag.FlagBracket); + if (!Token.InListRange(token, Tokens)) continue; + tokenEnd = token; + token = Token.FindPrevToken(Tokens, tokenEnd, Token.TokenFlag.FlagNotDelimiter); + } + } + + ParseHelper.BuildElement(ElementCategory.ElementAnimeTitle, false, + Tokens.GetRange(tokenBegin, tokenEnd - tokenBegin)); + } + + /// + /// Search for release group + /// + private void SearchForReleaseGroup() + { + for (int tokenBegin = 0, tokenEnd = tokenBegin; tokenBegin < Tokens.Count;) + { + // Find the first enclosed unknown token + tokenBegin = Token.FindToken(Tokens, tokenEnd, Tokens.Count, Token.TokenFlag.FlagEnclosed, + Token.TokenFlag.FlagUnknown); + if (!Token.InListRange(tokenBegin, Tokens)) return; + + // Continue until a bracket or identifier is found + tokenEnd = Token.FindToken(Tokens, tokenBegin, Tokens.Count, Token.TokenFlag.FlagBracket, + Token.TokenFlag.FlagIdentifier); + if (!Token.InListRange(tokenEnd, Tokens) || + Tokens[tokenEnd].Category != Token.TokenCategory.Bracket) continue; + + // Ignore if it's not the first non-delimiter token in group + int prevToken = Token.FindPrevToken(Tokens, tokenBegin, Token.TokenFlag.FlagNotDelimiter); + if (Token.InListRange(prevToken, Tokens) && + Tokens[prevToken].Category != Token.TokenCategory.Bracket) continue; + + ParseHelper.BuildElement(ElementCategory.ElementReleaseGroup, true, + Tokens.GetRange(tokenBegin, tokenEnd - tokenBegin)); + return; + } + } + + /// + /// Search for episode title + /// + private void SearchForEpisodeTitle() + { + int tokenBegin; + int tokenEnd = 0; + + do + { + // Find the first non-enclosed unknown token + tokenBegin = Token.FindToken(Tokens, tokenEnd, Tokens.Count, Token.TokenFlag.FlagNotEnclosed, + Token.TokenFlag.FlagUnknown); + if (!Token.InListRange(tokenBegin, Tokens)) return; + + // Continue until a bracket or identifier is found + tokenEnd = Token.FindToken(Tokens, tokenBegin, Tokens.Count, Token.TokenFlag.FlagBracket, + Token.TokenFlag.FlagIdentifier); + + // Ignore if it's only a dash + if (tokenEnd - tokenBegin <= 2 && ParserHelper.IsDashCharacter(Tokens[tokenBegin].Content[0])) continue; + //if (tokenBegin.Pos == null || tokenEnd.Pos == null) continue; + ParseHelper.BuildElement(ElementCategory.ElementEpisodeTitle, false, + Tokens.GetRange(tokenBegin, tokenEnd - tokenBegin)); + return; + } while (Token.InListRange(tokenBegin, Tokens)); + } + + /// + /// Search for isolated numbers + /// + private void SearchForIsolatedNumbers() + { + for (int i = 0; i < Tokens.Count; i++) + { + var token = Tokens[i]; + if (token.Category != Token.TokenCategory.Unknown || !StringHelper.IsNumericString(token.Content) || + !ParseHelper.IsTokenIsolated(i)) + { + continue; + } + + int number = StringHelper.StringToInt(token.Content); + + // Anime year + if (number >= ParserNumber.AnimeYearMin && number <= ParserNumber.AnimeYearMax) + { + if (Empty(ElementCategory.ElementAnimeYear)) + { + Elements.Add(new Element(ElementCategory.ElementAnimeYear, token.Content)); + token.Category = Token.TokenCategory.Identifier; + continue; + } + } + + // Video resolution + if (number != 480 && number != 720 && number != 1080) continue; + // If these numbers are isolated, it's more likely for them to be the + // video resolution rather than the episode number. Some fansub groups use these without the "p" suffix. + if (!Empty(ElementCategory.ElementVideoResolution)) continue; + Elements.Add(new Element(ElementCategory.ElementVideoResolution, token.Content)); + token.Category = Token.TokenCategory.Identifier; + } + } + + /// + /// Validate Elements + /// + private void ValidateElements() + { + if (Empty(ElementCategory.ElementAnimeType) || Empty(ElementCategory.ElementEpisodeTitle)) + { + return; + } + + string episodeTitle = Get(ElementCategory.ElementEpisodeTitle); + + for (int i = 0; i < Elements.Count;) + { + var el = Elements[i]; + + if (el.Category == ElementCategory.ElementAnimeType) + { + if (episodeTitle.Contains(el.Value)) + { + if (episodeTitle.Length == el.Value.Length) + { + Elements.RemoveAll(element => + element.Category == ElementCategory.ElementEpisodeTitle); // invalid episode title + } + else + { + string keyword = KeywordManager.Normalize(el.Value); + if (KeywordManager.Contains(ElementCategory.ElementAnimeType, keyword)) + { + i = Erase(el); // invalid anime type + continue; + } + } + } + } + + ++i; + } + } + + /// + /// Returns whether or not the parser contains this category + /// + /// + /// + private bool Empty(ElementCategory category) + { + return Elements.All(element => element.Category != category); + } + + /// + /// Returns the value of a particular category + /// + /// + /// + private string Get(ElementCategory category) + { + var foundElement = Elements.Find(element => element.Category == category); + + if (foundElement != null) return foundElement.Value; + Element e = new Element(category, ""); + Elements.Add(e); + foundElement = e; + + return foundElement.Value; + } + + /// + /// Deletes the first element with the same element.Category and returns the deleted element's position. + /// + private int Erase(Element element) + { + int removedIdx = -1; + for (int i = 0; i < Elements.Count; i++) + { + var currentElement = Elements[i]; + if (element.Category != currentElement.Category) continue; + removedIdx = i; + Elements.RemoveAt(i); + break; + } + + return removedIdx; + } +} diff --git a/Chiara/AnitomySharp/ParserHelper.cs b/Chiara/AnitomySharp/ParserHelper.cs new file mode 100644 index 0000000..cafef93 --- /dev/null +++ b/Chiara/AnitomySharp/ParserHelper.cs @@ -0,0 +1,281 @@ +/* + * Copyright (c) 2014-2017, Eren Okka + * Copyright (c) 2016-2017, Paul Miller + * Copyright (c) 2017-2018, Tyler Bratton + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. +*/ + +using System.Text; + +namespace AnitomySharp; + +/// +/// Utility class to assist in the parsing. +/// +public class ParserHelper(Parser parser) +{ + private static readonly System.Buffers.SearchValues s_myChars = System.Buffers.SearchValues.Create("xX\u00D7"); + private const string Dashes = "-\u2010\u2011\u2012\u2013\u2014\u2015"; + private const string DashesWithSpace = " -\u2010\u2011\u2012\u2013\u2014\u2015"; + + private static readonly Dictionary s_ordinals = new() + { + {"1st", "1"}, {"First", "1"}, + {"2nd", "2"}, {"Second", "2"}, + {"3rd", "3"}, {"Third", "3"}, + {"4th", "4"}, {"Fourth", "4"}, + {"5th", "5"}, {"Fifth", "5"}, + {"6th", "6"}, {"Sixth", "6"}, + {"7th", "7"}, {"Seventh", "7"}, + {"8th", "8"}, {"Eighth", "8"}, + {"9th", "9"}, {"Ninth", "9"} + }; + + /// + /// Returns whether or not the result matches the category. + /// + public bool IsTokenCategory(int result, Token.TokenCategory category) + { + return Token.InListRange(result, parser.Tokens) && parser.Tokens[result].Category == category; + } + + /// + /// Returns whether or not the str is a CRC string. + /// + public static bool IsCrc32(string str) + { + return str.Length == 8 && StringHelper.IsHexadecimalString(str); + } + + /// + /// Returns whether or not the character is a dash character + /// + public static bool IsDashCharacter(char c) + { + return Dashes.Contains(c.ToString()); + } + + /// + /// Returns a number from an original (e.g. 2nd) + /// + private static string GetNumberFromOrdinal(string str) + { + return string.IsNullOrEmpty(str) ? string.Empty : s_ordinals.GetValueOrDefault(str, ""); + } + + /// + /// Returns the index of the first digit in the str; -1 otherwise. + /// + public static int IndexOfFirstDigit(string str) + { + if (string.IsNullOrEmpty(str)) return -1; + for (int i = 0; i < str.Length; i++) + { + if (char.IsDigit(str, i)) + { + return i; + } + } + return -1; + } + + /// + /// Returns whether or not the str is a resolution. + /// + public static bool IsResolution(string str) + { + if (string.IsNullOrEmpty(str)) return false; + const int minWidthSize = 3; + const int minHeightSize = 3; + + switch (str.Length) + { + case >= minWidthSize + 1 + minHeightSize: + { + int pos = str.AsSpan().IndexOfAny(s_myChars); + if (pos == -1 || pos < minWidthSize || pos > str.Length - (minHeightSize + 1)) return false; + return !str.Where((t, i) => i != pos && !char.IsDigit(t)).Any(); + } + case < minHeightSize + 1: + return false; + default: + { + if (char.ToLower(str[^1]) != 'p') return false; + for (int i = 0; i < str.Length - 1; i++) + { + if (!char.IsDigit(str[i])) return false; + } + + return true; + } + } + } + + /// + /// Returns whether or not the category is searchable. + /// + public static bool IsElementCategorySearchable(ElementCategory category) + { + return category switch + { + ElementCategory.ElementAnimeSeasonPrefix or ElementCategory.ElementAnimeType + or ElementCategory.ElementAudioTerm or ElementCategory.ElementDeviceCompatibility + or ElementCategory.ElementEpisodePrefix or ElementCategory.ElementFileChecksum + or ElementCategory.ElementLanguage or ElementCategory.ElementOther + or ElementCategory.ElementReleaseGroup or ElementCategory.ElementReleaseInformation + or ElementCategory.ElementReleaseVersion or ElementCategory.ElementSource + or ElementCategory.ElementSubtitles or ElementCategory.ElementVideoResolution + or ElementCategory.ElementVideoTerm or ElementCategory.ElementVolumePrefix => true, + _ => false + }; + } + + /// + /// Returns whether the category is singular. + /// + public static bool IsElementCategorySingular(ElementCategory category) + { + return category switch + { + ElementCategory.ElementAnimeSeason or ElementCategory.ElementAnimeType or ElementCategory.ElementAudioTerm + or ElementCategory.ElementDeviceCompatibility or ElementCategory.ElementEpisodeNumber + or ElementCategory.ElementLanguage or ElementCategory.ElementOther + or ElementCategory.ElementReleaseInformation or ElementCategory.ElementSource + or ElementCategory.ElementVideoTerm => false, + _ => false + }; + } + + /// + /// Returns whether or not a token at the current pos is isolated(surrounded by braces). + /// + public bool IsTokenIsolated(int pos) + { + int prevToken = Token.FindPrevToken(parser.Tokens, pos, Token.TokenFlag.FlagNotDelimiter); + if (!IsTokenCategory(prevToken, Token.TokenCategory.Bracket)) return false; + int nextToken = Token.FindNextToken(parser.Tokens, pos, Token.TokenFlag.FlagNotDelimiter); + return IsTokenCategory(nextToken, Token.TokenCategory.Bracket); + } + + /// + /// Finds and sets the anime season keyword. + /// + public bool CheckAndSetAnimeSeasonKeyword(Token token, int currentTokenPos) + { + int previousToken = Token.FindPrevToken(parser.Tokens, currentTokenPos, Token.TokenFlag.FlagNotDelimiter); + if (Token.InListRange(previousToken, parser.Tokens)) + { + string number = GetNumberFromOrdinal(parser.Tokens[previousToken].Content); + if (!string.IsNullOrEmpty(number)) + { + SetAnimeSeason(parser.Tokens[previousToken], token, number); + return true; + } + } + + int nextToken = Token.FindNextToken(parser.Tokens, currentTokenPos, Token.TokenFlag.FlagNotDelimiter); + if (!Token.InListRange(nextToken, parser.Tokens) || + !StringHelper.IsNumericString(parser.Tokens[nextToken].Content)) return false; + SetAnimeSeason(token, parser.Tokens[nextToken], parser.Tokens[nextToken].Content); + return true; + + void SetAnimeSeason(Token first, Token second, string content) + { + parser.Elements.Add(new Element(ElementCategory.ElementAnimeSeason, content)); + first.Category = Token.TokenCategory.Identifier; + second.Category = Token.TokenCategory.Identifier; + } + } + + /// + /// A Method to find the correct volume/episode number when prefixed (i.e. Vol.4). + /// + /// the category we're searching for + /// the current token position + /// the token + /// true if we found the volume/episode number + public bool CheckExtentKeyword(ElementCategory category, int currentTokenPos, Token token) + { + int nToken = Token.FindNextToken(parser.Tokens, currentTokenPos, Token.TokenFlag.FlagNotDelimiter); + if (!IsTokenCategory(nToken, Token.TokenCategory.Unknown)) return false; + if (IndexOfFirstDigit(parser.Tokens[nToken].Content) != 0) return false; + switch (category) + { + case ElementCategory.ElementEpisodeNumber: + if (!parser.ParseNumber.MatchEpisodePatterns(parser.Tokens[nToken].Content, parser.Tokens[nToken])) + { + parser.ParseNumber.SetEpisodeNumber(parser.Tokens[nToken].Content, parser.Tokens[nToken], false); + } + break; + case ElementCategory.ElementVolumeNumber: + if (!parser.ParseNumber.MatchVolumePatterns(parser.Tokens[nToken].Content, parser.Tokens[nToken])) + { + parser.ParseNumber.SetVolumeNumber(parser.Tokens[nToken].Content, parser.Tokens[nToken], false); + } + break; + } + + token.Category = Token.TokenCategory.Identifier; + return true; + + } + + + public void BuildElement(ElementCategory category, bool keepDelimiters, List tokens) + { + var element = new StringBuilder(); + + for (int i = 0; i < tokens.Count; i++) + { + var token = tokens[i]; + switch (token.Category) + { + case Token.TokenCategory.Unknown: + element.Append(token.Content); + token.Category = Token.TokenCategory.Identifier; + break; + case Token.TokenCategory.Bracket: + element.Append(token.Content); + break; + case Token.TokenCategory.Delimiter: + string delimiter = ""; + if (!string.IsNullOrEmpty(token.Content)) + { + delimiter = token.Content[0].ToString(); + } + + if (keepDelimiters) + { + element.Append(delimiter); + } + else if (Token.InListRange(i, tokens)) + { + switch (delimiter) + { + case ",": + case "&": + element.Append(delimiter); + break; + default: + element.Append(' '); + break; + } + } + break; + } + } + + if (!keepDelimiters) + { + element = new StringBuilder(element.ToString().Trim(DashesWithSpace.ToCharArray())); + } + + if (!string.IsNullOrEmpty(element.ToString())) + { + parser.Elements.Add(new Element(category, element.ToString())); + } + } +} diff --git a/Chiara/AnitomySharp/ParserNumber.cs b/Chiara/AnitomySharp/ParserNumber.cs new file mode 100644 index 0000000..360436b --- /dev/null +++ b/Chiara/AnitomySharp/ParserNumber.cs @@ -0,0 +1,681 @@ +/* + * Copyright (c) 2014-2017, Eren Okka + * Copyright (c) 2016-2017, Paul Miller + * Copyright (c) 2017-2018, Tyler Bratton + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. +*/ + +using System.Text.RegularExpressions; + +namespace AnitomySharp; + +/// +/// A utility class to assist in number parsing. +/// +public partial class ParserNumber(Parser parser) +{ + public const int AnimeYearMin = 1900; + public const int AnimeYearMax = 2100; + private const int EpisodeNumberMax = AnimeYearMax - 1; + private const int VolumeNumberMax = 50; + private const string RegexMatchOnlyStart = @"\A(?:"; + private const string RegexMatchOnlyEnd = @")\z"; + + /// + /// Returns whether or not the number is a volume number + /// + private static bool IsValidVolumeNumber(string number) + { + return StringHelper.StringToInt(number) <= VolumeNumberMax; + } + + /// + /// Returns whether or not the number is a valid episode number. + /// + private static bool IsValidEpisodeNumber(string number) + { + // Eliminate non numeric portion of number, then parse as double. + string temp = ""; + for (int i = 0; i < number.Length && char.IsDigit(number[i]); i++) + { + temp += number[i]; + } + + return !string.IsNullOrEmpty(temp) && double.Parse(temp) <= EpisodeNumberMax; + } + + /// + /// Sets the alternative episode number. + /// + private void SetAlternativeEpisodeNumber(string number, Token token) + { + parser.Elements.Add(new Element(ElementCategory.ElementEpisodeNumberAlt, number)); + token.Category = Token.TokenCategory.Identifier; + } + + /// + /// Sets the volume number. + /// + /// the number + /// the token which contains the volume number + /// true if we should check if it's a valid number, false to disable verification + /// true if the volume number was set + public bool SetVolumeNumber(string number, Token token, bool validate) + { + if (validate && !IsValidVolumeNumber(number)) return false; + + parser.Elements.Add(new Element(ElementCategory.ElementVolumeNumber, number)); + token.Category = Token.TokenCategory.Identifier; + return true; + } + + /// + /// Sets the anime episode number. + /// + /// the episode number + /// the token which contains the volume number + /// true if we should check if it's a valid episode number; false to disable validation + /// true if the episode number was set + public bool SetEpisodeNumber(string number, Token token, bool validate) + { + if (validate && !IsValidEpisodeNumber(number)) return false; + token.Category = Token.TokenCategory.Identifier; + var category = ElementCategory.ElementEpisodeNumber; + + if (parser.IsEpisodeKeywordsFound) + { + foreach (var element in parser.Elements) + { + if (element.Category != ElementCategory.ElementEpisodeNumber) continue; + + int comparison = StringHelper.StringToInt(number) - StringHelper.StringToInt(element.Value); + switch (comparison) + { + case > 0: + category = ElementCategory.ElementEpisodeNumberAlt; + break; + case < 0: + element.Category = ElementCategory.ElementEpisodeNumberAlt; + break; + default: + return false; + } + + break; + } + } + + parser.Elements.Add(new Element(category, number)); + return true; + } + + /// + /// Checks if a number follows the specified token + /// + /// the category to set if a number follows the token + /// the token + /// true if a number follows the token; false otherwise + private bool NumberComesAfterPrefix(ElementCategory category, Token token) + { + int numberBegin = ParserHelper.IndexOfFirstDigit(token.Content); + string prefix = StringHelper.SubstringWithCheck(token.Content, 0, numberBegin).ToUpperInvariant(); + if (!KeywordManager.Contains(category, prefix)) return false; + string number = StringHelper.SubstringWithCheck(token.Content, numberBegin, token.Content.Length - numberBegin); + + switch (category) + { + case ElementCategory.ElementEpisodePrefix: + if (!MatchEpisodePatterns(number, token)) + { + SetEpisodeNumber(number, token, false); + } + return true; + case ElementCategory.ElementVolumePrefix: + if (!MatchVolumePatterns(number, token)) + { + SetVolumeNumber(number, token, false); + } + return true; + default: + return false; + } + } + + /// + /// Checks whether the number precedes the word "of" + /// + /// the token + /// the index of the token + /// true if the token precedes the word "of" + private bool NumberComesBeforeAnotherNumber(Token token, int currentTokenIdx) + { + int separatorToken = Token.FindNextToken(parser.Tokens, currentTokenIdx, Token.TokenFlag.FlagNotDelimiter); + + if (!Token.InListRange(separatorToken, parser.Tokens)) return false; + var separators = new List> + { + Tuple.Create("&", true), + Tuple.Create("of", false) + }; + + foreach (var separator in separators) + { + if (parser.Tokens[separatorToken].Content != separator.Item1) continue; + int otherToken = Token.FindNextToken(parser.Tokens, separatorToken, Token.TokenFlag.FlagNotDelimiter); + if (!Token.InListRange(otherToken, parser.Tokens) + || !StringHelper.IsNumericString(parser.Tokens[otherToken].Content)) continue; + SetEpisodeNumber(token.Content, token, false); + if (separator.Item2) + { + SetEpisodeNumber(parser.Tokens[otherToken].Content, parser.Tokens[otherToken], false); + } + + parser.Tokens[separatorToken].Category = Token.TokenCategory.Identifier; + parser.Tokens[otherToken].Category = Token.TokenCategory.Identifier; + return true; + } + + return false; + } + + // EPISODE MATCHERS + + /// + /// Attempts to find an episode/season inside a word + /// + /// the word + /// the token + /// true if the word was matched to an episode/season number + public bool MatchEpisodePatterns(string word, Token token) + { + if (StringHelper.IsNumericString(word)) return false; + + word = word.Trim(" -".ToCharArray()); + + bool numericFront = char.IsDigit(word[0]); + bool numericBack = char.IsDigit(word[^1]); + + if (numericFront && numericBack) + { + // e.g. "01v2" + if (MatchSingleEpisodePattern(word, token)) + { + return true; + } + // e.g. "01-02", "03-05v2" + + if (MatchMultiEpisodePattern(word, token)) + { + return true; + } + // e.g. "07.5" + + if (MatchFractionalEpisodePattern(word, token)) + { + return true; + } + } + + if (numericBack) + { + // e.g. "2x01", "S01E03", "S01-02xE001-150" + if (MatchSeasonAndEpisodePattern(word, token)) + { + return true; + } + // e.g. "#01", "#02-03v2" + + if (MatchNumberSignPattern(word, token)) + { + return true; + } + } + + switch (numericFront) + { + // e.g. "ED1", "OP4a", "OVA2" + case false when MatchTypeAndEpisodePattern(word, token): + // e.g. "4a", "111C" + case true when !numericBack && MatchPartialEpisodePattern(word, token): + return true; + default: + // U+8A71 is used as counter for stories, episodes of TV series, etc. + return numericFront && MatchJapaneseCounterPattern(word, token); + } + } + + /// + /// Match a single episode pattern. e.g. "01v2". + /// + /// the word + /// the token + /// true if the token matched + private bool MatchSingleEpisodePattern(string word, Token token) + { + var match = SingleEpisodeRegex().Match(word); + + if (!match.Success) return false; + + SetEpisodeNumber(match.Groups[1].Value, token, false); + parser.Elements.Add(new Element(ElementCategory.ElementReleaseVersion, match.Groups[2].Value)); + return true; + } + + /// + /// Match a multi episode pattern. e.g. "01-02", "03-05v2". + /// + /// the word + /// the token + /// true if the token matched + private bool MatchMultiEpisodePattern(string word, Token token) + { + var match = MultiEpisodeRegex().Match(word); + if (!match.Success) return false; + + string lowerBound = match.Groups[1].Value; + string upperBound = match.Groups[3].Value; + + if (StringHelper.StringToInt(lowerBound) >= StringHelper.StringToInt(upperBound)) return false; + if (!SetEpisodeNumber(lowerBound, token, true)) return false; + SetEpisodeNumber(upperBound, token, true); + if (!string.IsNullOrEmpty(match.Groups[2].Value)) + { + parser.Elements.Add(new Element(ElementCategory.ElementReleaseVersion, match.Groups[2].Value)); + } + if (!string.IsNullOrEmpty(match.Groups[4].Value)) + { + parser.Elements.Add(new Element(ElementCategory.ElementReleaseVersion, match.Groups[4].Value)); + } + return true; + + } + + /// + /// Match season and episode patterns. e.g. "2x01", "S01E03", "S01-02xE001-150". + /// + /// the word + /// the token + /// true if the token matched + private bool MatchSeasonAndEpisodePattern(string word, Token token) + { + var match = SeasonEpisodeRegex().Match(word); + if (!match.Success) return false; + + parser.Elements.Add(new Element(ElementCategory.ElementAnimeSeason, match.Groups[1].Value)); + if (!string.IsNullOrEmpty(match.Groups[2].Value)) + { + parser.Elements.Add(new Element(ElementCategory.ElementAnimeSeason, match.Groups[2].Value)); + } + SetEpisodeNumber(match.Groups[3].Value, token, false); + if (!string.IsNullOrEmpty(match.Groups[4].Value)) + { + SetEpisodeNumber(match.Groups[4].Value, token, false); + } + return true; + } + + /// + /// Match type and episode. e.g. "ED1", "OP4a", "OVA2". + /// + /// the word + /// the token + /// true if the token matched + private bool MatchTypeAndEpisodePattern(string word, Token token) + { + int numberBegin = ParserHelper.IndexOfFirstDigit(word); + string prefix = StringHelper.SubstringWithCheck(word, 0, numberBegin); + + var category = ElementCategory.ElementAnimeType; + var options = new KeywordOptions(); + + if (!KeywordManager.FindAndSet(KeywordManager.Normalize(prefix), ref category, ref options)) return false; + parser.Elements.Add(new Element(ElementCategory.ElementAnimeType, prefix)); + string number = word.Substring(numberBegin); + if (!MatchEpisodePatterns(number, token) && !SetEpisodeNumber(number, token, true)) return false; + int foundIdx = parser.Tokens.IndexOf(token); + if (foundIdx == -1) return true; + token.Content = number; + parser.Tokens.Insert(foundIdx, + new Token(options.Identifiable ? Token.TokenCategory.Identifier : Token.TokenCategory.Unknown, prefix, token.Enclosed)); + + return true; + + } + + /// + /// Match fractional episodes. e.g. "07.5" + /// + /// the word + /// the token + /// true if the token matched + private bool MatchFractionalEpisodePattern(string word, Token token) + { + if (string.IsNullOrEmpty(word)) + { + word = ""; + } + + const string regexPattern = RegexMatchOnlyStart + @"\d+\.5" + RegexMatchOnlyEnd; + var match = Regex.Match(word, regexPattern); + return match.Success && SetEpisodeNumber(word, token, true); + } + + /// + /// Match partial episodes. e.g. "4a", "111C". + /// + /// the word + /// the token + /// true if the token matched + private bool MatchPartialEpisodePattern(string word, Token token) + { + if (string.IsNullOrEmpty(word)) return false; + int foundIdx = Enumerable.Range(0, word.Length) + .DefaultIfEmpty(word.Length) + .FirstOrDefault(value => !char.IsDigit(word[value])); + int suffixLength = word.Length - foundIdx; + + return suffixLength == 1 && IsValidSuffix(word[foundIdx]) && SetEpisodeNumber(word, token, true); + + bool IsValidSuffix(int c) => c is >= 'A' and <= 'C' or >= 'a' and <= 'c'; + } + + /// + /// Match episodes with number signs. e.g. "#01", "#02-03v2" + /// + /// the word + /// the token + /// true if the token matched + private bool MatchNumberSignPattern(string word, Token token) + { + if (string.IsNullOrEmpty(word) || word[0] != '#') word = ""; + var match = NumberEpisodeRegex().Match(word); + if (!match.Success) return false; + + if (!SetEpisodeNumber(match.Groups[1].Value, token, true)) return false; + if (!string.IsNullOrEmpty(match.Groups[2].Value)) + { + SetEpisodeNumber(match.Groups[2].Value, token, false); + } + if (!string.IsNullOrEmpty(match.Groups[3].Value)) + { + parser.Elements.Add(new Element(ElementCategory.ElementReleaseVersion, match.Groups[3].Value)); + } + + return true; + + } + + /// + /// Match Japanese patterns. e.g. U+8A71 is used as counter for stories, episodes of TV series, etc. + /// + /// the word + /// the token + /// true if the token matched + private bool MatchJapaneseCounterPattern(string word, Token token) + { + if (string.IsNullOrEmpty(word) || word[^1] != '\u8A71') return false; + var match = JapaneseEpisodeRegex().Match(word); + if (!match.Success) return false; + SetEpisodeNumber(match.Groups[1].Value, token, false); + return true; + + } + + // VOLUME MATCHES + + /// + /// Attempts to find an episode/season inside a word + /// + /// the word + /// the token + /// true if the word was matched to an episode/season number + public bool MatchVolumePatterns(string word, Token token) + { + // All patterns contain at least one non-numeric character + if (StringHelper.IsNumericString(word)) return false; + + word = word.Trim(" -".ToCharArray()); + + bool numericFront = char.IsDigit(word[0]); + bool numericBack = char.IsDigit(word[^1]); + + if (numericFront && numericBack) + { + // e.g. "01v2" e.g. "01-02", "03-05v2" + return MatchSingleVolumePattern(word, token) || MatchMultiVolumePattern(word, token); + } + + return false; + } + + /// + /// Match single volume. e.g. "01v2" + /// + /// the word + /// the token + /// true if the token matched + private bool MatchSingleVolumePattern(string word, Token token) + { + if (string.IsNullOrEmpty(word)) word = ""; + var match = SingleVolumeRegex().Match(word); + if (!match.Success) return false; + + SetVolumeNumber(match.Groups[1].Value, token, false); + parser.Elements.Add(new Element(ElementCategory.ElementReleaseVersion, match.Groups[2].Value)); + return true; + } + + /// + /// Match multi-volume. e.g. "01-02", "03-05v2". + /// + /// the word + /// the token + /// true if the token matched + private bool MatchMultiVolumePattern(string word, Token token) + { + if (string.IsNullOrEmpty(word)) word = ""; + var match = MultiVolumeRegex().Match(word); + if (!match.Success) return false; + + string lowerBound = match.Groups[1].Value; + string upperBound = match.Groups[2].Value; + if (StringHelper.StringToInt(lowerBound) >= StringHelper.StringToInt(upperBound)) return false; + if (!SetVolumeNumber(lowerBound, token, true)) return false; + SetVolumeNumber(upperBound, token, false); + if (string.IsNullOrEmpty(match.Groups[3].Value)) + { + parser.Elements.Add(new Element(ElementCategory.ElementReleaseVersion, match.Groups[3].Value)); + } + return true; + + } + + // SEARCH + + /// + /// Searches for isolated numbers in a list of tokens. + /// + /// the list of tokens + /// true if an isolated number was found + public bool SearchForIsolatedNumbers(IEnumerable tokens) + { + return tokens + .Where(it => parser.Tokens[it].Enclosed && parser.ParseHelper.IsTokenIsolated(it)) + .Any(it => SetEpisodeNumber(parser.Tokens[it].Content, parser.Tokens[it], true)); + } + + /// + /// Searches for separated numbers in a list of tokens. + /// + /// the list of tokens + /// true fi a separated number was found + public bool SearchForSeparatedNumbers(List tokens) + { + foreach (int it in tokens) + { + int previousToken = Token.FindPrevToken(parser.Tokens, it, Token.TokenFlag.FlagNotDelimiter); + + // See if the number has a preceding "-" separator + if (!parser.ParseHelper.IsTokenCategory(previousToken, Token.TokenCategory.Unknown) + || !ParserHelper.IsDashCharacter(parser.Tokens[previousToken].Content[0])) continue; + if (!SetEpisodeNumber(parser.Tokens[it].Content, parser.Tokens[it], true)) continue; + parser.Tokens[previousToken].Category = Token.TokenCategory.Identifier; + return true; + } + + return false; + } + + /// + /// Searches for episode patterns in a list of tokens. + /// + /// the list of tokens + /// true if an episode number was found + public bool SearchForEpisodePatterns(List tokens) + { + foreach (int it in tokens) + { + bool numericFront = parser.Tokens[it].Content.Length > 0 && char.IsDigit(parser.Tokens[it].Content[0]); + + if (!numericFront) + { + // e.g. "EP.1", "Vol.1" + if (NumberComesAfterPrefix(ElementCategory.ElementEpisodePrefix, parser.Tokens[it])) + { + return true; + } + if (NumberComesAfterPrefix(ElementCategory.ElementVolumePrefix, parser.Tokens[it])) + { + continue; + } + } + else + { + // e.g. "8 & 10", "01 of 24" + if (NumberComesBeforeAnotherNumber(parser.Tokens[it], it)) + { + return true; + } + } + + // Look for other patterns + if (MatchEpisodePatterns(parser.Tokens[it].Content, parser.Tokens[it])) + { + return true; + } + } + + return false; + } + + /// + /// Searches for equivalent number in a list of tokens. e.g. 08(114) + /// + /// the list of tokens + /// true if an equivalent number was found + public bool SearchForEquivalentNumbers(List tokens) + { + foreach (int it in tokens) + { + // Find number must be isolated. + if (parser.ParseHelper.IsTokenIsolated(it) || !IsValidEpisodeNumber(parser.Tokens[it].Content)) + { + continue; + } + + // Find the first enclosed, non-delimiter token + int nextToken = Token.FindNextToken(parser.Tokens, it, Token.TokenFlag.FlagNotDelimiter); + if (!parser.ParseHelper.IsTokenCategory(nextToken, Token.TokenCategory.Bracket)) continue; + nextToken = Token.FindNextToken(parser.Tokens, nextToken, Token.TokenFlag.FlagEnclosed, + Token.TokenFlag.FlagNotDelimiter); + if (!parser.ParseHelper.IsTokenCategory(nextToken, Token.TokenCategory.Unknown)) continue; + + // Check if it's an isolated number + if (!parser.ParseHelper.IsTokenIsolated(nextToken) + || !StringHelper.IsNumericString(parser.Tokens[nextToken].Content) + || !IsValidEpisodeNumber(parser.Tokens[nextToken].Content)) + { + continue; + } + + var list = new List + { + parser.Tokens[it], parser.Tokens[nextToken] + }; + + list.Sort((o1, o2) => StringHelper.StringToInt(o1.Content) - StringHelper.StringToInt(o2.Content)); + SetEpisodeNumber(list[0].Content, list[0], false); + SetAlternativeEpisodeNumber(list[1].Content, list[1]); + return true; + } + + return false; + } + + /// + /// Searches for the last number token in a list of tokens + /// + /// the list of tokens + /// true if the last number token was found + public bool SearchForLastNumber(List tokens) + { + for (int i = tokens.Count - 1; i >= 0; i--) + { + int it = tokens[i]; + + // Assuming that episode number always comes after the title, + // the first token cannot be what we're looking for + if (it == 0) continue; + if (parser.Tokens[it].Enclosed) continue; + + // Ignore if it's the first non-enclosed, non-delimiter token + if (parser.Tokens.GetRange(0, it) + .All(r => r.Enclosed || r.Category == Token.TokenCategory.Delimiter)) + { + continue; + } + + int previousToken = Token.FindPrevToken(parser.Tokens, it, Token.TokenFlag.FlagNotDelimiter); + if (parser.ParseHelper.IsTokenCategory(previousToken, Token.TokenCategory.Unknown)) + { + if (parser.Tokens[previousToken].Content.Equals("Movie", StringComparison.InvariantCultureIgnoreCase) + || parser.Tokens[previousToken].Content.Equals("Part", StringComparison.InvariantCultureIgnoreCase)) + { + continue; + } + } + + // We'll use this number after all + if (SetEpisodeNumber(parser.Tokens[it].Content, parser.Tokens[it], true)) + { + return true; + } + } + + return false; + } + + [GeneratedRegex(@"\A(?:(\d{1,3})[vV](\d))\z")] + private static partial Regex SingleEpisodeRegex(); + + [GeneratedRegex(@"\A(?:(\d{1,3})(?:[vV](\d))?[-~&+](\d{1,3})(?:[vV](\d))?)\z")] + private static partial Regex MultiEpisodeRegex(); + + [GeneratedRegex(@"\A(?:S?(\d{1,2})(?:-S?(\d{1,2}))?(?:x|[ ._-x]?E)(\d{1,3})(?:-E?(\d{1,3}))?)\z")] + private static partial Regex SeasonEpisodeRegex(); + + [GeneratedRegex(@"\A(?:#(\d{1,3})(?:[-~&+](\d{1,3}))?(?:[vV](\d))?)\z")] + private static partial Regex NumberEpisodeRegex(); + + [GeneratedRegex(@"\A(?:(\d{1,3})話)\z")] + private static partial Regex JapaneseEpisodeRegex(); + + [GeneratedRegex(@"\A(?:(\d{1,2})[vV](\d))\z")] + private static partial Regex SingleVolumeRegex(); + + [GeneratedRegex(@"\A(?:(\d{1,2})[-~&+](\d{1,2})(?:[vV](\d))?)\z")] + private static partial Regex MultiVolumeRegex(); +} diff --git a/Chiara/AnitomySharp/StringHelper.cs b/Chiara/AnitomySharp/StringHelper.cs new file mode 100644 index 0000000..4e32353 --- /dev/null +++ b/Chiara/AnitomySharp/StringHelper.cs @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2014-2017, Eren Okka + * Copyright (c) 2016-2017, Paul Miller + * Copyright (c) 2017-2018, Tyler Bratton + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +namespace AnitomySharp; + +/// +/// A string helper class that is analogous to string.cpp of the original Anitomy, and StringHelper.java of AnitomyJ. +/// +public static class StringHelper +{ + + /// + /// Returns whether or not the character is alphanumeric + /// + public static bool IsAlphanumericChar(char c) + { + return c is >= '0' and <= '9' or >= 'A' and <= 'Z' or >= 'a' and <= 'z'; + } + + /// + /// Returns whether or not the character is a hex character. + /// + private static bool IsHexadecimalChar(char c) + { + return c is >= '0' and <= '9' or >= 'A' and <= 'F' or >= 'a' and <= 'f'; + } + + /// + /// Returns whether or not the character is a latin character + /// + private static bool IsLatinChar(char c) + { + // We're just checking until the end of the Latin Extended-B block, + // rather than all the blocks that belong to the Latin script. + return c <= '\u024F'; + } + + /// + /// Returns whether or not the str is a hex string. + /// + public static bool IsHexadecimalString(string str) + { + return !string.IsNullOrEmpty(str) && str.All(IsHexadecimalChar); + } + + /// + /// Returns whether or not the str is mostly a latin string. + /// + public static bool IsMostlyLatinString(string str) + { + double length = !string.IsNullOrEmpty(str) ? 1.0 : str.Length; + return str.Where(IsLatinChar).Count() / length >= 0.5; + } + + /// + /// Returns whether or not the str is a numeric string. + /// + public static bool IsNumericString(string str) + { + return str.All(char.IsDigit); + } + + /// + /// Returns the int value of the str; 0 otherwise. + /// + public static int StringToInt(string str) + { + try + { + return int.Parse(str); + } + catch (Exception ex) + { + Console.WriteLine(ex); + return 0; + } + } + + public static string SubstringWithCheck(string str, int start, int count) + { + if (start + count > str.Length) count = str.Length - start; + return str.Substring(start, count); + } +} diff --git a/Chiara/AnitomySharp/Token.cs b/Chiara/AnitomySharp/Token.cs new file mode 100644 index 0000000..ed42697 --- /dev/null +++ b/Chiara/AnitomySharp/Token.cs @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2014-2017, Eren Okka + * Copyright (c) 2016-2017, Paul Miller + * Copyright (c) 2017-2018, Tyler Bratton + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +namespace AnitomySharp; + +/// +/// An anime filename is tokenized into individual s. This class represents an individual token. +/// +public class Token +{ + /// + /// The category of the token. + /// + public enum TokenCategory + { + Unknown, + Bracket, + Delimiter, + Identifier, + Invalid + } + + /// + /// TokenFlag, used for searching specific token categories. This allows granular searching of TokenCategories. + /// + public enum TokenFlag + { + // None + FlagNone, + + // Categories + FlagBracket, + FlagNotBracket, + FlagDelimiter, + FlagNotDelimiter, + FlagIdentifier, + FlagNotIdentifier, + FlagUnknown, + FlagNotUnknown, + FlagValid, + FlagNotValid, + + // Enclosed (Meaning that it is enclosed in some bracket (e.g. [ ] )) + FlagEnclosed, + FlagNotEnclosed + } + + /// + /// Set of token category flags + /// + private static readonly List s_flagMaskCategories = + [ + TokenFlag.FlagBracket, TokenFlag.FlagNotBracket, + TokenFlag.FlagDelimiter, TokenFlag.FlagNotDelimiter, + TokenFlag.FlagIdentifier, TokenFlag.FlagNotIdentifier, + TokenFlag.FlagUnknown, TokenFlag.FlagNotUnknown, + TokenFlag.FlagValid, TokenFlag.FlagNotValid + ]; + + /// + /// Set of token enclosed flags + /// + private static readonly List s_flagMaskEnclosed = [TokenFlag.FlagEnclosed, TokenFlag.FlagNotEnclosed]; + + public TokenCategory Category { get; set; } + public string Content { get; set; } + public bool Enclosed { get; } + + /// + /// Constructs a new token + /// + /// the token category + /// the token content + /// whether or not the token is enclosed in braces + public Token(TokenCategory category, string content, bool enclosed) + { + Category = category; + Content = content; + Enclosed = enclosed; + } + + /// + /// Validates a token against the flags. The flags is used as a search parameter. + /// + /// the token + /// the flags the token must conform against + /// true if the token conforms to the set of flags; false otherwise + private static bool CheckTokenFlags(Token token, ICollection flags) + { + // Make sure token is the correct closure + if (flags.Any(f => s_flagMaskEnclosed.Contains(f))) + { + bool success = CheckFlag(TokenFlag.FlagEnclosed) == token.Enclosed; + if (!success) return false; // Not enclosed correctly (e.g. enclosed when we're looking for non-enclosed). + } + + // Make sure token is the correct category + if (!flags.Any(f => s_flagMaskCategories.Contains(f))) return true; + bool secondarySuccess = false; + + CheckCategory(TokenFlag.FlagBracket, TokenFlag.FlagNotBracket, TokenCategory.Bracket); + CheckCategory(TokenFlag.FlagDelimiter, TokenFlag.FlagNotDelimiter, TokenCategory.Delimiter); + CheckCategory(TokenFlag.FlagIdentifier, TokenFlag.FlagNotIdentifier, TokenCategory.Identifier); + CheckCategory(TokenFlag.FlagUnknown, TokenFlag.FlagNotUnknown, TokenCategory.Unknown); + CheckCategory(TokenFlag.FlagNotValid, TokenFlag.FlagValid, TokenCategory.Invalid); + return secondarySuccess; + + void CheckCategory(TokenFlag fe, TokenFlag fn, TokenCategory c) + { + if (secondarySuccess) return; + bool result = CheckFlag(fe) ? token.Category == c : CheckFlag(fn) && token.Category != c; + secondarySuccess = result; + } + + // Simple alias to check if flag is a part of the set + bool CheckFlag(TokenFlag flag) + { + return flags.Contains(flag); + } + } + + /// + /// Given a list of tokens, searches for any token token that matches the list of flags. + /// + /// the list of tokens + /// the search starting position. + /// the search ending position. + /// the search flags + /// the search result + public static int FindToken(List tokens, int begin, int end, params TokenFlag[] flags) + { + return FindTokenBase(tokens, begin, end, i => i < tokens.Count, i => i + 1, flags); + } + + /// + /// Given a list of tokens, searches for the next token in tokens that matches the list of flags. + /// + /// the list of tokens + /// the search starting position. + /// the search flags + /// the search result + public static int FindNextToken(List tokens, int first, params TokenFlag[] flags) + { + return FindTokenBase(tokens, first + 1, tokens.Count, i => i < tokens.Count, i => i + 1, flags); + } + + /// + /// Given a list of tokens, searches for the previous token in tokens that matches the list of flags. + /// + /// the list of tokens + /// the search starting position. Exclusive of position.Pos + /// the search flags + /// the search result + public static int FindPrevToken(List tokens, int begin, params TokenFlag[] flags) + { + return FindTokenBase(tokens, begin - 1, -1, i => i >= 0, i => i - 1, flags); + } + + /// + /// Given a list of tokens finds the first token that passes . + /// + /// the list of the tokens to search + /// the start index of the search. + /// the end index of the search. + /// a function that returns whether or not we should continue searching + /// a function that returns the next search index + /// the flags that each token should be validated against + /// the found token + private static int FindTokenBase( + List tokens, + int begin, + int end, + Func shouldContinue, + Func next, + params TokenFlag[] flags) + { + var find = new List(); + find.AddRange(flags); + + for (int i = begin; shouldContinue(i); i = next(i)) + { + var token = tokens[i]; + if (CheckTokenFlags(token, find)) + { + return i; + } + } + + return end; + } + + public static bool InListRange(int pos, List list) + { + return -1 < pos && pos < list.Count; + } + + public override bool Equals(object? o) + { + if (this == o) + return true; + if (o is not Token token) + return false; + return Enclosed == token.Enclosed && Category == token.Category && Equals(Content, token.Content); + } + + public override int GetHashCode() + { + int hashCode = -1776802967; + hashCode = hashCode * -1521134295 + Category.GetHashCode(); + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Content); + hashCode = hashCode * -1521134295 + Enclosed.GetHashCode(); + return hashCode; + } + + public override string ToString() + { + return $"Token{{category={Category}, content='{Content}', enclosed={Enclosed}}}"; + } +} diff --git a/Chiara/AnitomySharp/TokenRange.cs b/Chiara/AnitomySharp/TokenRange.cs new file mode 100644 index 0000000..7dd31e8 --- /dev/null +++ b/Chiara/AnitomySharp/TokenRange.cs @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2014-2017, Eren Okka + * Copyright (c) 2016-2017, Paul Miller + * Copyright (c) 2017-2018, Tyler Bratton + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +namespace AnitomySharp; + +public struct TokenRange(int offset, int size) +{ + public int Offset = offset; + public int Size = size; +} diff --git a/Chiara/AnitomySharp/Tokenizer.cs b/Chiara/AnitomySharp/Tokenizer.cs new file mode 100644 index 0000000..11a1d41 --- /dev/null +++ b/Chiara/AnitomySharp/Tokenizer.cs @@ -0,0 +1,322 @@ +/* + * Copyright (c) 2014-2017, Eren Okka + * Copyright (c) 2016-2017, Paul Miller + * Copyright (c) 2017-2018, Tyler Bratton + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. +*/ + +using System.Text; + +namespace AnitomySharp; + +/// +/// A class that will tokenize an anime filename. +/// +public class Tokenizer +{ + private readonly string _filename; + private readonly List _elements; + private readonly Options _options; + private readonly List _tokens; + private static readonly List> s_brackets = + [ + new Tuple("(", ")"), // U+0028-U+0029 + new Tuple("[", "]"), // U+005B-U+005D Square bracket + new Tuple("{", "}"), // U+007B-U+007D Curly bracket + new Tuple("\u300C", "\u300D"), // Corner bracket + new Tuple("\u300E", "\u300E"), // White corner bracket + new Tuple("\u3010", "\u3011"), // Black lenticular bracket + new Tuple("\uFF08", "\uFF09") + ]; + + /// + /// Tokenize a filename into s + /// + /// the filename + /// the list of elements where pre-identified tokens will be added + /// the parser options + /// the list of tokens where tokens will be added + public Tokenizer(string filename, List elements, Options options, List tokens) + { + _filename = filename; + _elements = elements; + _options = options; + _tokens = tokens; + } + + /// + /// Returns true if tokenization was successful; false otherwise. + /// + /// + public bool Tokenize() + { + TokenizeByBrackets(); + return _tokens.Count > 0; + } + + /// + /// Adds a token to the internal list of tokens + /// + /// the token category + /// whether or not the token is enclosed in braces + /// the token range + private void AddToken(Token.TokenCategory category, bool enclosed, TokenRange range) + { + _tokens.Add(new Token(category, StringHelper.SubstringWithCheck(_filename, range.Offset, range.Size), enclosed)); + } + + private string GetDelimiters(TokenRange range) + { + var delimiters = new StringBuilder(); + + foreach (var i in Enumerable.Range(range.Offset, Math.Min(_filename.Length, range.Offset + range.Size) - range.Offset) + .Where(value => IsDelimiter(_filename[value]))) + { + delimiters.Append(_filename[i]); + } + + return delimiters.ToString(); + + bool IsDelimiter(char c) + { + if (StringHelper.IsAlphanumericChar(c)) return false; + return _options.AllowedDelimiters.Contains(c.ToString()) && !delimiters.ToString().Contains(c.ToString()); + } + } + + /// + /// Tokenize by bracket. + /// + private void TokenizeByBrackets() + { + string matchingBracket = string.Empty; + + bool isBracketOpen = false; + for (int i = 0; i < _filename.Length; ) + { + int foundIdx = !isBracketOpen ? FindFirstBracket(i, _filename.Length) : _filename.IndexOf(matchingBracket, i, StringComparison.Ordinal); + + var range = new TokenRange(i, foundIdx == -1 ? _filename.Length : foundIdx - i); + if (range.Size > 0) + { + // Check if our range contains any known anime identifiers + TokenizeByPreIdentified(isBracketOpen, range); + } + + if (foundIdx != -1) + { + // mark as bracket + AddToken(Token.TokenCategory.Bracket, true, new TokenRange(range.Offset + range.Size, 1)); + isBracketOpen = !isBracketOpen; + i = foundIdx + 1; + } + else + { + break; + } + } + + return; + + int FindFirstBracket(int start, int end) + { + for (int i = start; i < end; i++) + { + foreach (var bracket in s_brackets) + { + if (!_filename[i].Equals(char.Parse(bracket.Item1))) continue; + matchingBracket = bracket.Item2; + return i; + } + } + + return -1; + } + } + + /// + /// Tokenize by looking for known anime identifiers + /// + /// whether or not the current range is enclosed in braces + /// the token range + private void TokenizeByPreIdentified(bool enclosed, TokenRange range) + { + var preIdentifiedTokens = new List(); + + // Find known anime identifiers + KeywordManager.PeekAndAdd(_filename, range, _elements, preIdentifiedTokens); + + int offset = range.Offset; + var subRange = new TokenRange(range.Offset, 0); + while (offset < range.Offset + range.Size) + { + foreach (var preIdentifiedToken in preIdentifiedTokens) + { + if (offset != preIdentifiedToken.Offset) continue; + if (subRange.Size > 0) + { + TokenizeByDelimiters(enclosed, subRange); + } + + AddToken(Token.TokenCategory.Identifier, enclosed, preIdentifiedToken); + subRange.Offset = preIdentifiedToken.Offset + preIdentifiedToken.Size; + offset = subRange.Offset - 1; // It's going to be incremented below + } + + subRange.Size = ++offset - subRange.Offset; + } + + // Either there was no preidentified token range, or we're now about to process the tail of our current range + if (subRange.Size > 0) + { + TokenizeByDelimiters(enclosed, subRange); + } + } + + /// + /// Tokenize by delimiters allowed in .AllowedDelimiters. + /// + /// whether or not the current range is enclosed in braces + /// the token range + private void TokenizeByDelimiters(bool enclosed, TokenRange range) + { + string delimiters = GetDelimiters(range); + + if (string.IsNullOrEmpty(delimiters)) + { + AddToken(Token.TokenCategory.Unknown, enclosed, range); + return; + } + + for (int i = range.Offset, end = range.Offset + range.Size; i < end;) + { + int found = Enumerable.Range(i, Math.Min(end, _filename.Length) - i) + .Where(c => delimiters.Contains(_filename[c].ToString())) + .DefaultIfEmpty(end) + .FirstOrDefault(); + + var subRange = new TokenRange(i, found - i); + if (subRange.Size > 0) + { + AddToken(Token.TokenCategory.Unknown, enclosed, subRange); + } + + if (found != end) + { + AddToken(Token.TokenCategory.Delimiter, enclosed, new TokenRange(subRange.Offset + subRange.Size, 1)); + i = found + 1; + } + else + { + break; + } + } + + ValidateDelimiterTokens(); + } + + /// + /// Validates tokens (make sure certain words delimited by certain tokens aren't split) + /// + private void ValidateDelimiterTokens() + { + for (int i = 0; i < _tokens.Count; i++) + { + var token = _tokens[i]; + if (token.Category != Token.TokenCategory.Delimiter) continue; + char delimiter = token.Content[0]; + + int prevToken = Token.FindPrevToken(_tokens, i, Token.TokenFlag.FlagValid); + int nextToken = Token.FindNextToken(_tokens, i, Token.TokenFlag.FlagValid); + + // Check for single-character tokens to prevent splitting group names, + // keywords, episode numbers, etc. + if (delimiter != ' ' && delimiter != '_') + { + + // Single character token + if (IsSingleCharacterToken(prevToken)) + { + AppendTokenTo(token, _tokens[prevToken]); + + while (IsUnknownToken(nextToken)) + { + AppendTokenTo(_tokens[nextToken], _tokens[prevToken]); + + nextToken = Token.FindNextToken(_tokens, i, Token.TokenFlag.FlagValid); + if (!IsDelimiterToken(nextToken) || _tokens[nextToken].Content[0] != delimiter) continue; + AppendTokenTo(_tokens[nextToken], _tokens[prevToken]); + nextToken = Token.FindNextToken(_tokens, nextToken, Token.TokenFlag.FlagValid); + } + + continue; + } + + if (IsSingleCharacterToken(nextToken)) + { + AppendTokenTo(token, _tokens[prevToken]); + AppendTokenTo(_tokens[nextToken], _tokens[prevToken]); + continue; + } + } + + // Check for adjacent delimiters + if (IsUnknownToken(prevToken) && IsDelimiterToken(nextToken)) + { + char nextDelimiter = _tokens[nextToken].Content[0]; + if (delimiter != nextDelimiter && delimiter != ',') + { + if (nextDelimiter is ' ' or '_') + { + AppendTokenTo(token, _tokens[prevToken]); + } + } + } + else if (IsDelimiterToken(prevToken) && IsDelimiterToken(nextToken)) + { + char prevDelimiter = _tokens[prevToken].Content[0]; + char nextDelimiter = _tokens[nextToken].Content[0]; + if (prevDelimiter == nextDelimiter && prevDelimiter != delimiter) + { + token.Category = Token.TokenCategory.Unknown; // e.g. "& in "_&_" + } + } + + // Check for other special cases + if (delimiter != '&' && delimiter != '+') continue; + if (!IsUnknownToken(prevToken) || !IsUnknownToken(nextToken)) continue; + if (!StringHelper.IsNumericString(_tokens[prevToken].Content) + || !StringHelper.IsNumericString(_tokens[nextToken].Content)) continue; + AppendTokenTo(token, _tokens[prevToken]); + AppendTokenTo(_tokens[nextToken], _tokens[prevToken]); // e.g. 01+02 + } + + // Remove invalid tokens + _tokens.RemoveAll(token => token.Category == Token.TokenCategory.Invalid); + return; + + void AppendTokenTo(Token src, Token dest) + { + dest.Content += src.Content; + src.Category = Token.TokenCategory.Invalid; + } + + bool IsUnknownToken(int it) + { + return Token.InListRange(it, _tokens) && _tokens[it].Category == Token.TokenCategory.Unknown; + } + + bool IsSingleCharacterToken(int it) + { + return IsUnknownToken(it) && _tokens[it].Content.Length == 1 && _tokens[it].Content[0] != '-'; + } + + bool IsDelimiterToken(int it) + { + return Token.InListRange(it, _tokens) && _tokens[it].Category == Token.TokenCategory.Delimiter; + } + } +} diff --git a/Chiara/Chiara.Tests/.gitignore b/Chiara/Chiara.Tests/.gitignore new file mode 100644 index 0000000..37d87d1 --- /dev/null +++ b/Chiara/Chiara.Tests/.gitignore @@ -0,0 +1,3 @@ +Data/ +*.m3u8 +*.ts diff --git a/Chiara/Chiara.Tests/AnitomySharpTests/DataTests.cs b/Chiara/Chiara.Tests/AnitomySharpTests/DataTests.cs new file mode 100644 index 0000000..6e91e7c --- /dev/null +++ b/Chiara/Chiara.Tests/AnitomySharpTests/DataTests.cs @@ -0,0 +1,91 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using AnitomySharp; + +namespace Chiara.Tests.AnitomySharpTests; + +public class TestCase +{ + [JsonPropertyName("file_name")] + public string FileName { get; init; } = string.Empty; + + [JsonPropertyName("ignore")] + public bool Ignore { get; init; } + + [JsonPropertyName("results")] + public Dictionary Results { get; init; } = []; +} + +public class DataTests(ITestOutputHelper helper) +{ + [Fact] + public void ValidateParsingResults() + { + string path = Path.Combine(Environment.CurrentDirectory, "test-cases.json"); + List? cases = JsonSerializer.Deserialize>(File.ReadAllText(path)); + Assert.NotNull(cases); + + helper.WriteLine($"Loaded {cases.Count} test cases."); + foreach (var testCase in cases) + { + Verify(testCase); + } + } + + private void Verify(TestCase entry) + { + string fileName = entry.FileName; + bool ignore = entry.Ignore; + Dictionary testCases = entry.Results; + + if (ignore || string.IsNullOrWhiteSpace(fileName) || testCases.Count == 0) + { + helper.WriteLine($"Ignoring [{fileName}] : {{ results: {testCases.Count} | explicit: {ignore}}}"); + return; + } + + helper.WriteLine($"Parsing: {fileName}"); + Dictionary> parseResults = ToTestCaseDict(fileName); + + foreach (KeyValuePair pair in testCases) + { + Assert.True(parseResults.TryGetValue(pair.Key, out List? value)); + Assert.NotNull(value); + + if (pair.Value.ValueKind == JsonValueKind.String) + { + Assert.Contains(pair.Value.GetString(), value); + } + + if (pair.Value.ValueKind != JsonValueKind.Array) + { + continue; + } + + List? exceptedArray = pair.Value.Deserialize>(); + Assert.NotNull(exceptedArray); + + Assert.Equal(exceptedArray, value); + } + } + + private static Dictionary> ToTestCaseDict(string filename) + { + var parseResults = Anitomy.Parse(filename); + var elements = new Dictionary>(); + + foreach (var e in parseResults) + { + if (elements.TryGetValue(e.Category.ToString(), out List? value)) + { + value.Add(e.Value); + } + else + { + elements.Add(e.Category.ToString(), [e.Value]); + } + } + + return elements; + } +} diff --git a/Chiara/Chiara.Tests/AnitomySharpTests/test-cases.json b/Chiara/Chiara.Tests/AnitomySharpTests/test-cases.json new file mode 100644 index 0000000..be8ecc1 --- /dev/null +++ b/Chiara/Chiara.Tests/AnitomySharpTests/test-cases.json @@ -0,0 +1,2380 @@ +[ { + "file_name" : "[TaigaSubs]_Toradora!_(2008)_-_01v2_-_Tiger_and_Dragon_[1280x720_H.264_FLAC][1234ABCD].mkv", + "id" : 4224, + "ignore" : false, + "results" : { + "ElementFileName" : "[TaigaSubs]_Toradora!_(2008)_-_01v2_-_Tiger_and_Dragon_[1280x720_H.264_FLAC][1234ABCD]", + "ElementAnimeTitle" : "Toradora!", + "ElementAnimeYear": "2008", + "ElementAudioTerm": "FLAC", + "ElementEpisodeNumber": "01", + "ElementEpisodeTitle": "Tiger and Dragon", + "ElementFileChecksum": "1234ABCD", + "ElementFileExtension": "mkv", + "ElementReleaseGroup": "TaigaSubs", + "ElementReleaseVersion": "2", + "ElementVideoResolution": "1280x720", + "ElementVideoTerm": "H.264" + } +}, { + "file_name" : "[ANBU]_Princess_Lover!_-_01_[2048A39A].mkv", + "id" : 6201, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Princess Lover!", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "2048A39A", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[ANBU]_Princess_Lover!_-_01_[2048A39A]", + "ElementReleaseGroup" : "ANBU" + } +}, { + "file_name" : "[ANBU-Menclave]_Canaan_-_01_[1024x576_H.264_AAC][12F00E89].mkv", + "id" : 5356, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Canaan", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "12F00E89", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[ANBU-Menclave]_Canaan_-_01_[1024x576_H.264_AAC][12F00E89]", + "ElementReleaseGroup" : "ANBU-Menclave", + "ElementVideoResolution" : "1024x576", + "ElementVideoTerm" : "H.264" + } +}, { + "file_name" : "[ANBU-umai]_Haiyoru!_Nyaru-Ani_[596DD8E6].mkv", + "id" : 7596, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Haiyoru! Nyaru-Ani", + "ElementFileChecksum" : "596DD8E6", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[ANBU-umai]_Haiyoru!_Nyaru-Ani_[596DD8E6]", + "ElementReleaseGroup" : "ANBU-umai" + } +}, { + "file_name" : "[BakaWolf-m.3.3.w] Special A 01 (H.264) [C83164B9].mkv", + "id" : 3470, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Special A", + "ElementAnimeType" : "Special", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "C83164B9", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[BakaWolf-m.3.3.w] Special A 01 (H.264) [C83164B9]", + "ElementReleaseGroup" : "BakaWolf-m.3.3.w", + "ElementVideoTerm" : "H.264" + } +}, { + "file_name" : "[chibi-Doki] Seikon no Qwaser - 13v0 (Uncensored Director's Cut) [988DB090].mkv", + "id" : 6500, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Seikon no Qwaser", + "ElementEpisodeNumber" : "13", + "ElementFileChecksum" : "988DB090", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[chibi-Doki] Seikon no Qwaser - 13v0 (Uncensored Director's Cut) [988DB090]", + "ElementOther" : "Uncensored", + "ElementReleaseGroup" : "chibi-Doki", + "ElementReleaseVersion" : "0" + } +}, { + "file_name" : "[Chihiro]_Kono_Aozora_ni_Yakusoku_Wo_10_v2_[DVD][h264][C83D206B].mkv", + "id" : 2155, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Kono Aozora ni Yakusoku Wo", + "ElementEpisodeNumber" : "10", + "ElementFileChecksum" : "C83D206B", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Chihiro]_Kono_Aozora_ni_Yakusoku_Wo_10_v2_[DVD][h264][C83D206B]", + "ElementReleaseGroup" : "Chihiro", + "ElementReleaseVersion" : "2", + "ElementSource" : "DVD", + "ElementVideoTerm" : "h264" + } +}, { + "file_name" : "[Coalgirls]_Toradora_ED2_(704x480_DVD_AAC)_[3B65D1E6].mkv", + "id" : 4224, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Toradora ED", + "ElementAnimeType" : "ED", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "2", + "ElementFileChecksum" : "3B65D1E6", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Coalgirls]_Toradora_ED2_(704x480_DVD_AAC)_[3B65D1E6]", + "ElementReleaseGroup" : "Coalgirls", + "ElementSource" : "DVD", + "ElementVideoResolution" : "704x480" + } +}, { + "file_name" : "[Conclave-Mendoi]_Mobile_Suit_Gundam_00_S2_-_01v2_[1280x720_H.264_AAC][4863FBE8].mkv", + "id" : 3927, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Mobile Suit Gundam 00 S2", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "4863FBE8", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Conclave-Mendoi]_Mobile_Suit_Gundam_00_S2_-_01v2_[1280x720_H.264_AAC][4863FBE8]", + "ElementReleaseGroup" : "Conclave-Mendoi", + "ElementReleaseVersion" : "2", + "ElementVideoResolution" : "1280x720", + "ElementVideoTerm" : "H.264" + } +}, { + "file_name" : "[DB]_Bleach_225_[C63D149C].avi", + "id" : 269, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Bleach", + "ElementEpisodeNumber" : "225", + "ElementFileChecksum" : "C63D149C", + "ElementFileExtension" : "avi", + "ElementFileName" : "[DB]_Bleach_225_[C63D149C]", + "ElementReleaseGroup" : "DB" + } +}, { + "file_name" : "[Frostii]_Nodame_Cantabile_Finale_-_00_[73AD0735].mkv", + "id" : 5690, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Nodame Cantabile Finale", + "ElementEpisodeNumber" : "00", + "ElementFileChecksum" : "73AD0735", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Frostii]_Nodame_Cantabile_Finale_-_00_[73AD0735]", + "ElementReleaseGroup" : "Frostii" + } +}, { + "file_name" : "[Hard-Boiled FS]FullMetalAlchemist_09.rmvb", + "id" : 121, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "FullMetalAlchemist", + "ElementEpisodeNumber" : "09", + "ElementFileExtension" : "rmvb", + "ElementFileName" : "[Hard-Boiled FS]FullMetalAlchemist_09", + "ElementReleaseGroup" : "Hard-Boiled FS" + } +}, { + "file_name" : "[HorribleSubs] Tower of Druaga - Sword of Uruk - 04 [480p].mkv", + "id" : 4726, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Tower of Druaga - Sword of Uruk", + "ElementEpisodeNumber" : "04", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[HorribleSubs] Tower of Druaga - Sword of Uruk - 04 [480p]", + "ElementReleaseGroup" : "HorribleSubs", + "ElementVideoResolution" : "480p" + } +}, { + "file_name" : "[Juuni.Kokki]-(Les.12.Royaumes)-[Ep.24]-[x264+OGG]-[JAP+FR+Sub.FR]-[Chap]-[AzF].mkv", + "id" : 153, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "(Les 12 Royaumes)", + "ElementAudioTerm" : "OGG", + "ElementEpisodeNumber" : "24", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Juuni.Kokki]-(Les.12.Royaumes)-[Ep.24]-[x264+OGG]-[JAP+FR+Sub.FR]-[Chap]-[AzF]", + "ElementLanguage" : "JAP", + "ElementReleaseGroup" : "Juuni.Kokki", + "ElementSubtitles" : "Sub", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "[KAF-TEAM]_One_Piece_Movie_9_vostfr_HD.avi", + "id" : 3848, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "One Piece Movie 9", + "ElementAnimeType" : "Movie", + "ElementFileExtension" : "avi", + "ElementFileName" : "[KAF-TEAM]_One_Piece_Movie_9_vostfr_HD", + "ElementLanguage" : "vostfr", + "ElementReleaseGroup" : "KAF-TEAM", + "ElementVideoTerm" : "HD" + } +}, { + "file_name" : "[kito].Nazca.episode.01.DVDRip.[x264.He-aac.{Jpn}+Sub{Fr}].mkv", + "id" : 1775, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Nazca", + "ElementEpisodeNumber" : "01", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[kito].Nazca.episode.01.DVDRip.[x264.He-aac.{Jpn}+Sub{Fr}]", + "ElementReleaseGroup" : "kito", + "ElementSource" : "DVDRip", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "[Lambda-Delta]_Umineko_no_Naku_Koro_ni_-_11_[848x480_H.264_AAC][943106AD].mkv", + "id" : 4896, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Umineko no Naku Koro ni", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "11", + "ElementFileChecksum" : "943106AD", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Lambda-Delta]_Umineko_no_Naku_Koro_ni_-_11_[848x480_H.264_AAC][943106AD]", + "ElementReleaseGroup" : "Lambda-Delta", + "ElementVideoResolution" : "848x480", + "ElementVideoTerm" : "H.264" + } +}, { + "file_name" : "[SS]_Kemono_no_Souja_Erin_-_12_(1280x720_h264)_[0F5F884F].mkv", + "id" : 5420, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Kemono no Souja Erin", + "ElementEpisodeNumber" : "12", + "ElementFileChecksum" : "0F5F884F", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[SS]_Kemono_no_Souja_Erin_-_12_(1280x720_h264)_[0F5F884F]", + "ElementReleaseGroup" : "SS", + "ElementVideoResolution" : "1280x720", + "ElementVideoTerm" : "h264" + } +}, { + "file_name" : "[Taka]_Fullmetal_Alchemist_(2009)_04_[720p][40F2A957].mp4", + "id" : 5114, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Fullmetal Alchemist", + "ElementAnimeYear" : "2009", + "ElementEpisodeNumber" : "04", + "ElementFileChecksum" : "40F2A957", + "ElementFileExtension" : "mp4", + "ElementFileName" : "[Taka]_Fullmetal_Alchemist_(2009)_04_[720p][40F2A957]", + "ElementReleaseGroup" : "Taka", + "ElementVideoResolution" : "720p" + } +}, { + "file_name" : "[UTW-TMD]_Summer_Wars_[BD][h264-720p][TrueHD5.1][9F311DAB].mkv", + "id" : 5681, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Summer Wars", + "ElementAudioTerm" : "TrueHD5.1", + "ElementFileChecksum" : "9F311DAB", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[UTW-TMD]_Summer_Wars_[BD][h264-720p][TrueHD5.1][9F311DAB]", + "ElementReleaseGroup" : "UTW-TMD", + "ElementSource" : "BD", + "ElementVideoResolution" : "720p", + "ElementVideoTerm" : "h264" + } +}, { + "file_name" : "[ValdikSS]_First_Squad_The_Morment_Of_Truth_[720x576_h264_dvdscr_eng_hardsub].mkv", + "id" : 5178, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "First Squad The Morment Of Truth", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[ValdikSS]_First_Squad_The_Morment_Of_Truth_[720x576_h264_dvdscr_eng_hardsub]", + "ElementLanguage" : "eng", + "ElementReleaseGroup" : "ValdikSS", + "ElementSubtitles" : "hardsub", + "ElementVideoResolution" : "720x576", + "ElementVideoTerm" : "h264" + } +}, { + "file_name" : "Code_Geass_R2_TV_[20_of_25]_[ru_jp]_[HDTV]_[Varies_&_Cuba77_&_AnimeReactor_RU].mkv", + "id" : 2904, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Code Geass R2 TV", + "ElementAnimeType" : "TV", + "ElementEpisodeNumber" : "20", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Code_Geass_R2_TV_[20_of_25]_[ru_jp]_[HDTV]_[Varies_&_Cuba77_&_AnimeReactor_RU]", + "ElementReleaseGroup" : "ru_jp", + "ElementSource" : "HDTV" + } +}, { + "file_name" : "Evangelion_1.11_You_Are_(Not)_Alone_(2009)_[1080p,BluRay,x264,DTS-ES]_-_THORA.mkv", + "id" : 2759, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Evangelion 1.11 You Are (Not) Alone", + "ElementAnimeYear" : "2009", + "ElementAudioTerm" : "DTS-ES", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Evangelion_1.11_You_Are_(Not)_Alone_(2009)_[1080p,BluRay,x264,DTS-ES]_-_THORA", + "ElementReleaseGroup" : "THORA", + "ElementSource" : "BluRay", + "ElementVideoResolution" : "1080p", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "Evangelion_1.11_You_Are_(Not)_Alone_[1080p,BluRay,x264,DTS-ES]_-_THORA.mkv", + "id" : 2759, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Evangelion 1.11 You Are (Not) Alone", + "ElementAudioTerm" : "DTS-ES", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Evangelion_1.11_You_Are_(Not)_Alone_[1080p,BluRay,x264,DTS-ES]_-_THORA", + "ElementReleaseGroup" : "THORA", + "ElementSource" : "BluRay", + "ElementVideoResolution" : "1080p", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "Eve no Jikan 2 [88F4F7F0].mkv", + "id" : 3167, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Eve no Jikan", + "ElementEpisodeNumber" : "2", + "ElementFileChecksum" : "88F4F7F0", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Eve no Jikan 2 [88F4F7F0]" + } +}, { + "file_name" : "Gin'iro_no_Kami_no_Agito_(2006)_[1080p,BluRay,x264,DTS]_-_THORA.mkv", + "id" : 1140, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Gin'iro no Kami no Agito", + "ElementAnimeYear" : "2006", + "ElementAudioTerm" : "DTS", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Gin'iro_no_Kami_no_Agito_(2006)_[1080p,BluRay,x264,DTS]_-_THORA", + "ElementReleaseGroup" : "THORA", + "ElementSource" : "BluRay", + "ElementVideoResolution" : "1080p", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "Magical Girl Lyrical Nanoha A's - 01.DVD[H264.AAC][DGz][7A8A7769].mkv", + "id" : 77, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Magical Girl Lyrical Nanoha A's", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "7A8A7769", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Magical Girl Lyrical Nanoha A's - 01.DVD[H264.AAC][DGz][7A8A7769]", + "ElementReleaseGroup" : "DGz", + "ElementSource" : "DVD", + "ElementVideoTerm" : "H264" + } +}, { + "file_name" : "Mobile_Suit_Gundam_00_Season_2_Ep07_A_Reunion_and_a_Parting_[1080p,BluRay,x264]_-_THORA.mkv", + "id" : 3927, + "ignore" : false, + "results" : { + "ElementAnimeSeason" : "2", + "ElementAnimeTitle" : "Mobile Suit Gundam 00", + "ElementEpisodeNumber" : "07", + "ElementEpisodeTitle" : "A Reunion and a Parting", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Mobile_Suit_Gundam_00_Season_2_Ep07_A_Reunion_and_a_Parting_[1080p,BluRay,x264]_-_THORA", + "ElementReleaseGroup" : "THORA", + "ElementSource" : "BluRay", + "ElementVideoResolution" : "1080p", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "Noein_[01_of_24]_[ru_jp]_[bodlerov_&_torrents_ru].mkv", + "id" : 584, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Noein", + "ElementEpisodeNumber" : "01", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Noein_[01_of_24]_[ru_jp]_[bodlerov_&_torrents_ru]", + "ElementReleaseGroup" : "ru_jp" + } +}, { + "file_name" : "ponyo_on_the_cliff_by_the_sea[h264.dts][niizk].mkv", + "id" : 2890, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "ponyo on the cliff by the sea", + "ElementAudioTerm" : "dts", + "ElementFileExtension" : "mkv", + "ElementFileName" : "ponyo_on_the_cliff_by_the_sea[h264.dts][niizk]", + "ElementReleaseGroup" : "niizk", + "ElementVideoTerm" : "h264" + } +}, { + "file_name" : "[Seto_Otaku]_AIKa_ZERO_OVA_-_01_[BD][1920x1080_H264-Flac][6730D40A].mkv", + "id" : 6443, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "AIKa ZERO OVA", + "ElementAnimeType" : "OVA", + "ElementAudioTerm" : "Flac", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "6730D40A", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Seto_Otaku]_AIKa_ZERO_OVA_-_01_[BD][1920x1080_H264-Flac][6730D40A]", + "ElementReleaseGroup" : "Seto_Otaku", + "ElementSource" : "BD", + "ElementVideoResolution" : "1920x1080", + "ElementVideoTerm" : "H264" + } +}, { + "file_name" : "[a4e]R.O.D_the_TV_01[divx5.2.1].mkv", + "id" : 209, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "R.O.D the TV", + "ElementAnimeType" : "TV", + "ElementEpisodeNumber" : "01", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[a4e]R.O.D_the_TV_01[divx5.2.1]", + "ElementReleaseGroup" : "a4e" + } +}, { + "file_name" : "Ghost_in_the_Shell_Stand_Alone_Complex_2nd_GIG_Ep05v2_EXCAVATION_[720p,HDTV,x264,AAC_5.1]_-_THORA.mkv", + "id" : 801, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Ghost in the Shell Stand Alone Complex 2nd GIG", + "ElementAudioTerm" : [ "AAC", "5.1" ], + "ElementEpisodeNumber" : "05", + "ElementEpisodeTitle" : "EXCAVATION", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Ghost_in_the_Shell_Stand_Alone_Complex_2nd_GIG_Ep05v2_EXCAVATION_[720p,HDTV,x264,AAC_5.1]_-_THORA", + "ElementReleaseGroup" : "THORA", + "ElementReleaseVersion" : "2", + "ElementSource" : "HDTV", + "ElementVideoResolution" : "720p", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "Ghost_in_the_Shell_Stand_Alone_Complex_2nd_GIG_Ep06_Pu239_[720p,HDTV,x264,AAC_5.1]_-_THORA.mkv", + "id" : 801, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Ghost in the Shell Stand Alone Complex 2nd GIG", + "ElementAudioTerm" : [ "AAC", "5.1" ], + "ElementEpisodeNumber" : "06", + "ElementEpisodeTitle" : "Pu239", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Ghost_in_the_Shell_Stand_Alone_Complex_2nd_GIG_Ep06_Pu239_[720p,HDTV,x264,AAC_5.1]_-_THORA", + "ElementReleaseGroup" : "THORA", + "ElementSource" : "HDTV", + "ElementVideoResolution" : "720p", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "Fate_Stay_Night_Ep05_The_Two_Magi_Part1_[720p,BluRay,x264]_-_THORA.mkv", + "id" : 356, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Fate Stay Night", + "ElementEpisodeNumber" : "05", + "ElementEpisodeTitle" : "The Two Magi Part1", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Fate_Stay_Night_Ep05_The_Two_Magi_Part1_[720p,BluRay,x264]_-_THORA", + "ElementReleaseGroup" : "THORA", + "ElementSource" : "BluRay", + "ElementVideoResolution" : "720p", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "[RaX]Mezzo(DSA)_-_05_-_[x264_ogg]_[585d9971].mkv", + "id" : 222, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Mezzo(DSA)", + "ElementAudioTerm" : "ogg", + "ElementEpisodeNumber" : "05", + "ElementFileChecksum" : "585d9971", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[RaX]Mezzo(DSA)_-_05_-_[x264_ogg]_[585d9971]", + "ElementReleaseGroup" : "RaX", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "[AKH-SWE]_Fullmetal_Alchemist_(2009)_02v2_[H.264.AAC][7B2C5E8B].mkv", + "id" : 5114, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Fullmetal Alchemist", + "ElementAnimeYear" : "2009", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "02", + "ElementFileChecksum" : "7B2C5E8B", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[AKH-SWE]_Fullmetal_Alchemist_(2009)_02v2_[H.264.AAC][7B2C5E8B]", + "ElementReleaseGroup" : "AKH-SWE", + "ElementReleaseVersion" : "2", + "ElementVideoTerm" : "H.264" + } +}, { + "file_name" : "[FuktLogik][Sayonara_Zetsubou_Sensei][01][DVDRip][x264_AC3].mkv", + "id" : 2605, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Sayonara Zetsubou Sensei", + "ElementAudioTerm" : "AC3", + "ElementEpisodeNumber" : "01", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[FuktLogik][Sayonara_Zetsubou_Sensei][01][DVDRip][x264_AC3]", + "ElementReleaseGroup" : "FuktLogik", + "ElementSource" : "DVDRip", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "[Ayu]_Kiddy_Grade_2_-_Pilot_[H264_AC3][650B731B].mkv", + "id" : -1, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Kiddy Grade", + "ElementAudioTerm" : "AC3", + "ElementEpisodeNumber" : "2", + "ElementEpisodeTitle" : "Pilot", + "ElementFileChecksum" : "650B731B", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Ayu]_Kiddy_Grade_2_-_Pilot_[H264_AC3][650B731B]", + "ElementReleaseGroup" : "Ayu", + "ElementVideoTerm" : "H264" + } +}, { + "file_name" : "[Darksoul-Subs] Tatakau Shisho - The Book of Bantorra [848x480 XVID_MP3].mkv", + "id" : 6758, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Tatakau Shisho - The Book of Bantorra", + "ElementAudioTerm" : "MP3", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Darksoul-Subs] Tatakau Shisho - The Book of Bantorra [848x480 XVID_MP3]", + "ElementReleaseGroup" : "Darksoul-Subs", + "ElementVideoResolution" : "848x480", + "ElementVideoTerm" : "XVID" + } +}, { + "file_name" : "[ACX]Neon_Genesis_Evangelion_-_Platinum_-_06_-_Showdown_in_Tokyo_3_[SaintDeath]_[CBDB8577].mkv", + "id" : 30, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Neon Genesis Evangelion - Platinum", + "ElementEpisodeNumber" : "06", + "ElementEpisodeTitle" : "Showdown in Tokyo 3", + "ElementFileChecksum" : "CBDB8577", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[ACX]Neon_Genesis_Evangelion_-_Platinum_-_06_-_Showdown_in_Tokyo_3_[SaintDeath]_[CBDB8577]", + "ElementReleaseGroup" : "ACX" + } +}, { + "file_name" : "[Himatsubushi]_Sora_no_Woto_-_01_-_H264_-_720p_-_E83AD672.mkv", + "id" : 6802, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Sora no Woto", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "E83AD672", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Himatsubushi]_Sora_no_Woto_-_01_-_H264_-_720p_-_E83AD672", + "ElementReleaseGroup" : "Himatsubushi", + "ElementVideoResolution" : "720p", + "ElementVideoTerm" : "H264" + } +}, { + "file_name" : "[EroGaKi-Team]_Nurse_Witch_Komugi-chan_Magikarte_02.5_[902BB314].mkv", + "id" : 920, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Nurse Witch Komugi-chan Magikarte", + "ElementEpisodeNumber" : "02.5", + "ElementFileChecksum" : "902BB314", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[EroGaKi-Team]_Nurse_Witch_Komugi-chan_Magikarte_02.5_[902BB314]", + "ElementReleaseGroup" : "EroGaKi-Team" + } +}, { + "file_name" : "Ookiku Furikabutte S2 - 09 (Central Anime) [BD841253].mkv", + "id" : 7720, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Ookiku Furikabutte S2", + "ElementEpisodeNumber" : "09", + "ElementFileChecksum" : "BD841253", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Ookiku Furikabutte S2 - 09 (Central Anime) [BD841253]", + "ElementReleaseGroup" : "Central Anime" + } +}, { + "file_name" : "[HorribleSubs] HEROMAN - 10_(XviD_AnimeSenshi).mkv", + "id" : 4334, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "HEROMAN", + "ElementEpisodeNumber" : "10", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[HorribleSubs] HEROMAN - 10_(XviD_AnimeSenshi)", + "ElementReleaseGroup" : "HorribleSubs", + "ElementVideoTerm" : "XviD" + } +}, { + "file_name" : "Detective Conan - 316-317 [DCTP][2411959B].mkv", + "id" : 235, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Detective Conan", + "ElementEpisodeNumber" : [ "316", "317" ], + "ElementFileChecksum" : "2411959B", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Detective Conan - 316-317 [DCTP][2411959B]", + "ElementReleaseGroup" : "DCTP" + } +}, { + "file_name" : "[N LogN Fansubs] Angel Beats (9).mkv", + "id" : 6547, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Angel Beats", + "ElementEpisodeNumber" : "9", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[N LogN Fansubs] Angel Beats (9)", + "ElementReleaseGroup" : "N LogN Fansubs" + } +}, { + "file_name" : "To_Aru_Kagaku_no_Railgun_13-15_[BD_1080p][AtsA]", + "id" : 6213, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "To Aru Kagaku no Railgun", + "ElementEpisodeNumber" : [ "13", "15" ], + "ElementFileName" : "To_Aru_Kagaku_no_Railgun_13-15_[BD_1080p][AtsA]", + "ElementReleaseGroup" : "AtsA", + "ElementSource" : "BD", + "ElementVideoResolution" : "1080p" + } +}, { + "file_name" : "Juuousei_-_01_[Black_Sheep][HDTV_H264_AAC][803DA487].mkv", + "id" : 953, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Juuousei", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "803DA487", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Juuousei_-_01_[Black_Sheep][HDTV_H264_AAC][803DA487]", + "ElementReleaseGroup" : "Black_Sheep", + "ElementSource" : "HDTV", + "ElementVideoTerm" : "H264" + } +}, { + "file_name" : "[RNA]_Sakura_Taisen_New_York_NY_Ep_2_[1590D378].avi", + "id" : 2168, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Sakura Taisen New York NY", + "ElementEpisodeNumber" : "2", + "ElementFileChecksum" : "1590D378", + "ElementFileExtension" : "avi", + "ElementFileName" : "[RNA]_Sakura_Taisen_New_York_NY_Ep_2_[1590D378]", + "ElementReleaseGroup" : "RNA" + } +}, { + "file_name" : "Hayate no Gotoku 2nd Season 24 (Blu-Ray 1080p) [Chihiro]", + "id" : 4192, + "ignore" : false, + "results" : { + "ElementAnimeSeason" : "2", + "ElementAnimeTitle" : "Hayate no Gotoku", + "ElementEpisodeNumber" : "24", + "ElementFileName" : "Hayate no Gotoku 2nd Season 24 (Blu-Ray 1080p) [Chihiro]", + "ElementReleaseGroup" : "Chihiro", + "ElementSource" : "Blu-Ray", + "ElementVideoResolution" : "1080p" + } +}, { + "file_name" : "[BluDragon] Blue Submarine No.6 (DVD, R2, Dual Audio) V3", + "id" : 1051, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Blue Submarine No.6", + "ElementAudioTerm" : "Dual Audio", + "ElementFileName" : "[BluDragon] Blue Submarine No.6 (DVD, R2, Dual Audio) V3", + "ElementReleaseGroup" : "BluDragon", + "ElementReleaseVersion" : "3", + "ElementSource" : "DVD" + } +}, { + "file_name" : "Chrono Crusade ep. 1-5", + "id" : 60, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Chrono Crusade", + "ElementEpisodeNumber" : [ "1", "5" ], + "ElementFileName" : "Chrono Crusade ep. 1-5" + } +}, { + "file_name" : "[gg]_Kimi_ni_Todoke_2nd_Season_-_00_[BF735BC4].mkv", + "id" : 9656, + "ignore" : false, + "results" : { + "ElementAnimeSeason" : "2", + "ElementAnimeTitle" : "Kimi ni Todoke", + "ElementEpisodeNumber" : "00", + "ElementFileChecksum" : "BF735BC4", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[gg]_Kimi_ni_Todoke_2nd_Season_-_00_[BF735BC4]", + "ElementReleaseGroup" : "gg" + } +}, { + "file_name" : "K-ON!_Ep03_Training!_[1080p,BluRay,x264]_-_THORA.mkv", + "id" : 5680, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "K-ON!", + "ElementEpisodeNumber" : "03", + "ElementEpisodeTitle" : "Training!", + "ElementFileExtension" : "mkv", + "ElementFileName" : "K-ON!_Ep03_Training!_[1080p,BluRay,x264]_-_THORA", + "ElementReleaseGroup" : "THORA", + "ElementSource" : "BluRay", + "ElementVideoResolution" : "1080p", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "K-ON!!_Ep08_Career_Plan!_[1080p,BluRay,x264]_-_THORA.mkv", + "id" : 7791, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "K-ON!!", + "ElementEpisodeNumber" : "08", + "ElementEpisodeTitle" : "Career Plan!", + "ElementFileExtension" : "mkv", + "ElementFileName" : "K-ON!!_Ep08_Career_Plan!_[1080p,BluRay,x264]_-_THORA", + "ElementReleaseGroup" : "THORA", + "ElementSource" : "BluRay", + "ElementVideoResolution" : "1080p", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "[SFW]_Queen's_Blade_S2", + "id" : 6633, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Queen's Blade S2", + "ElementFileName" : "[SFW]_Queen's_Blade_S2", + "ElementReleaseGroup" : "SFW" + } +}, { + "file_name" : "Evangelion_1.0_You_Are_[Not]_Alone_(1080p)_[@Home]", + "id" : 2759, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Evangelion 1.0 You Are [Not] Alone", + "ElementFileName" : "Evangelion_1.0_You_Are_[Not]_Alone_(1080p)_[@Home]", + "ElementReleaseGroup" : "@Home", + "ElementVideoResolution" : "1080p" + } +}, { + "file_name" : "[Ayako]_Infinite_Stratos_-_IS_-_01v2_[XVID][400p][29675B71].avi", + "id" : 9041, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Infinite Stratos - IS", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "29675B71", + "ElementFileExtension" : "avi", + "ElementFileName" : "[Ayako]_Infinite_Stratos_-_IS_-_01v2_[XVID][400p][29675B71]", + "ElementReleaseGroup" : "Ayako", + "ElementReleaseVersion" : "2", + "ElementVideoResolution" : "400p", + "ElementVideoTerm" : "XVID" + } +}, { + "file_name" : "[E-HARO Raws] Kore wa Zombie desu ka - 03 (TV 1280x720 h264 AAC) [888E4991].mkv", + "id" : 8841, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Kore wa Zombie desu ka", + "ElementAnimeType" : "TV", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "03", + "ElementFileChecksum" : "888E4991", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[E-HARO Raws] Kore wa Zombie desu ka - 03 (TV 1280x720 h264 AAC) [888E4991]", + "ElementReleaseGroup" : "E-HARO Raws", + "ElementVideoResolution" : "1280x720", + "ElementVideoTerm" : "h264" + } +}, { + "file_name" : "[Edomae Subs] Kore wa Zombie desu ka Episode 2.mkv", + "id" : 8841, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Kore wa Zombie desu ka", + "ElementEpisodeNumber" : "2", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Edomae Subs] Kore wa Zombie desu ka Episode 2", + "ElementReleaseGroup" : "Edomae Subs" + } +}, { + "file_name" : "Juuni.Kokki.Ep.5.avi", + "id" : 153, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Juuni Kokki", + "ElementEpisodeNumber" : "5", + "ElementFileExtension" : "avi", + "ElementFileName" : "Juuni.Kokki.Ep.5" + } +}, { + "file_name" : "Juuni Kokki Ep.5.avi", + "id" : 153, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Juuni Kokki", + "ElementEpisodeNumber" : "5", + "ElementFileExtension" : "avi", + "ElementFileName" : "Juuni Kokki Ep.5" + } +}, { + "file_name" : "[Keroro].148.[Xvid.mp3].[FE68D5F1].avi", + "id" : 516, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "148", + "ElementAudioTerm" : "mp3", + "ElementFileChecksum" : "FE68D5F1", + "ElementFileExtension" : "avi", + "ElementFileName" : "[Keroro].148.[Xvid.mp3].[FE68D5F1]", + "ElementReleaseGroup" : "Keroro", + "ElementVideoTerm" : "Xvid" + } +}, { + "file_name" : "5_centimeters_per_second[1904x1072.h264.flac][niizk].mkv", + "id" : 1689, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "5 centimeters per second", + "ElementAudioTerm" : "flac", + "ElementFileExtension" : "mkv", + "ElementFileName" : "5_centimeters_per_second[1904x1072.h264.flac][niizk]", + "ElementReleaseGroup" : "niizk", + "ElementVideoResolution" : "1904x1072", + "ElementVideoTerm" : "h264" + } +}, { + "file_name" : "[Yoroshiku]_009-1_-_02_(H264)_[36D2444D].mkv", + "id" : 1583, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "009-1", + "ElementEpisodeNumber" : "02", + "ElementFileChecksum" : "36D2444D", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Yoroshiku]_009-1_-_02_(H264)_[36D2444D]", + "ElementReleaseGroup" : "Yoroshiku", + "ElementVideoTerm" : "H264" + } +}, { + "file_name" : "After War Gundam X - 1x03 - My Mount is Fierce!.mkv", + "id" : 92, + "ignore" : false, + "results" : { + "ElementAnimeSeason" : "1", + "ElementAnimeTitle" : "After War Gundam X", + "ElementEpisodeNumber" : "03", + "ElementEpisodeTitle" : "My Mount is Fierce!", + "ElementFileExtension" : "mkv", + "ElementFileName" : "After War Gundam X - 1x03 - My Mount is Fierce!" + } +}, { + "file_name" : "[HorribleSubs] The World God Only Knows 2 - 03 [720p].mkv", + "id" : 10080, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "The World God Only Knows 2", + "ElementEpisodeNumber" : "03", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[HorribleSubs] The World God Only Knows 2 - 03 [720p]", + "ElementReleaseGroup" : "HorribleSubs", + "ElementVideoResolution" : "720p" + } +}, { + "file_name" : "Macross Frontier - Sayonara no Tsubasa (Central Anime, 720p) [46B35E25].mkv", + "id" : 7222, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Macross Frontier - Sayonara no Tsubasa", + "ElementFileChecksum" : "46B35E25", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Macross Frontier - Sayonara no Tsubasa (Central Anime, 720p) [46B35E25]", + "ElementVideoResolution" : "720p" + } +}, { + "file_name" : "[Nubles] Space Battleship Yamato 2199 (2012) episode 18 (720p 8 bit AAC)[BA70BA9C]", + "id" : 12029, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Space Battleship Yamato 2199", + "ElementAnimeYear" : "2012", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "18", + "ElementFileChecksum" : "BA70BA9C", + "ElementFileName" : "[Nubles] Space Battleship Yamato 2199 (2012) episode 18 (720p 8 bit AAC)[BA70BA9C]", + "ElementReleaseGroup" : "Nubles", + "ElementVideoResolution" : "720p" + } +}, { + "file_name" : "[Nubles] Space Battleship Yamato 2199 (2012) episode 18 (720p 10 bit AAC)[1F56D642]", + "id" : 12029, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Space Battleship Yamato 2199", + "ElementAnimeYear" : "2012", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "18", + "ElementFileChecksum" : "1F56D642", + "ElementFileName" : "[Nubles] Space Battleship Yamato 2199 (2012) episode 18 (720p 10 bit AAC)[1F56D642]", + "ElementReleaseGroup" : "Nubles", + "ElementVideoResolution" : "720p" + } +}, { + "file_name" : "[FFF] Red Data Girl - 10v0 [29EA865B].mkv", + "id" : 14921, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Red Data Girl", + "ElementEpisodeNumber" : "10", + "ElementFileChecksum" : "29EA865B", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[FFF] Red Data Girl - 10v0 [29EA865B]", + "ElementReleaseGroup" : "FFF", + "ElementReleaseVersion" : "0" + } +}, { + "file_name" : "[CMS] Magical☆Star Kanon 100% OVA[DVD][E9F43685].mkv", + "id" : 17725, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Magical☆Star Kanon 100% OVA", + "ElementAnimeType" : "OVA", + "ElementFileChecksum" : "E9F43685", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[CMS] Magical☆Star Kanon 100% OVA[DVD][E9F43685]", + "ElementReleaseGroup" : "CMS", + "ElementSource" : "DVD" + } +}, { + "file_name" : "[Doremi].Ro-Kyu-Bu!.SS.01.[C1B5CE5D].mkv", + "id" : 16051, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Ro-Kyu-Bu! SS", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "C1B5CE5D", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Doremi].Ro-Kyu-Bu!.SS.01.[C1B5CE5D]", + "ElementReleaseGroup" : "Doremi" + } +}, { + "file_name" : "[Raizel] Persona 4 The Animation Episode 13 - A Stormy Summer Vacation Part 1 [BD_1080p_Dual_Audio_FLAC_Hi10p][8A45634B].mkv", + "id" : 10588, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Persona 4 The Animation", + "ElementAudioTerm" : "FLAC", + "ElementEpisodeNumber" : "13", + "ElementEpisodeTitle" : "A Stormy Summer Vacation Part 1", + "ElementFileChecksum" : "8A45634B", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Raizel] Persona 4 The Animation Episode 13 - A Stormy Summer Vacation Part 1 [BD_1080p_Dual_Audio_FLAC_Hi10p][8A45634B]", + "ElementReleaseGroup" : "Raizel", + "ElementSource" : "BD", + "ElementVideoResolution" : "1080p", + "ElementVideoTerm" : "Hi10p" + } +}, { + "file_name" : "[Hien] Kotoura-san - Special Short Anime 'Haruka's Room' - 01 [BD 1080p H.264 10-bit AAC][6B6BE015].mkv", + "id" : 16636, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Kotoura-san - Special Short Anime 'Haruka's Room'", + "ElementAnimeType" : "Special", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "6B6BE015", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Hien] Kotoura-san - Special Short Anime 'Haruka's Room' - 01 [BD 1080p H.264 10-bit AAC][6B6BE015]", + "ElementReleaseGroup" : "Hien", + "ElementSource" : "BD", + "ElementVideoResolution" : "1080p", + "ElementVideoTerm" : [ "H.264", "10-bit" ] + } +}, { + "file_name" : "[R-R] Diebuster.EP1 (720p.Hi10p.AC3) [82E36A36].mkv", + "id" : 1002, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Diebuster", + "ElementAudioTerm" : "AC3", + "ElementEpisodeNumber" : "1", + "ElementFileChecksum" : "82E36A36", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[R-R] Diebuster.EP1 (720p.Hi10p.AC3) [82E36A36]", + "ElementReleaseGroup" : "R-R", + "ElementVideoResolution" : "720p", + "ElementVideoTerm" : "Hi10p" + } +}, { + "file_name" : "Aim_For_The_Top!_Gunbuster-ep1.BD(H264.FLAC.10bit)[KAA][69ECCDCF].mkv", + "id" : 949, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Aim For The Top! Gunbuster-ep1", + "ElementAudioTerm" : "FLAC", + "ElementFileChecksum" : "69ECCDCF", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Aim_For_The_Top!_Gunbuster-ep1.BD(H264.FLAC.10bit)[KAA][69ECCDCF]", + "ElementReleaseGroup" : "KAA", + "ElementSource" : "BD", + "ElementVideoTerm" : [ "H264", "10bit" ] + } +}, { + "file_name" : "[Rakuda].Gift.~eternal.rainbow~.01.dvd.h.264.vorbis.mkv", + "id" : 1581, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Gift ~eternal rainbow~", + "ElementAudioTerm" : "vorbis", + "ElementEpisodeNumber" : "01", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Rakuda].Gift.~eternal.rainbow~.01.dvd.h.264.vorbis", + "ElementReleaseGroup" : "Rakuda", + "ElementSource" : "dvd", + "ElementVideoTerm" : "h.264" + } +}, { + "file_name" : "[Jumonji-Giri]_[Shinsen-Subs][ASF]_D.C.II_Da_Capo_II_Ep01_(a1fc58a7).mkv", + "id" : 2595, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "D.C.II Da Capo II", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "a1fc58a7", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Jumonji-Giri]_[Shinsen-Subs][ASF]_D.C.II_Da_Capo_II_Ep01_(a1fc58a7)", + "ElementReleaseGroup" : "Jumonji-Giri" + } +}, { + "file_name" : "[Mobile Suit Gundam Seed Destiny HD REMASTER][07][Big5][720p][AVC_AAC][encoded by SEED].mp4", + "id" : 94, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "encoded by SEED", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "07", + "ElementFileExtension" : "mp4", + "ElementFileName" : "[Mobile Suit Gundam Seed Destiny HD REMASTER][07][Big5][720p][AVC_AAC][encoded by SEED]", + "ElementOther" : "REMASTER", + "ElementSubtitles" : "Big5", + "ElementVideoResolution" : "720p", + "ElementVideoTerm" : [ "HD", "AVC" ] + } +}, { + "file_name" : "「K」 Image Blu-ray WHITE & BLACK - Main (BD 1280x720 AVC AAC).mp4", + "id" : 14467, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Image", + "ElementAudioTerm" : "AAC", + "ElementFileExtension" : "mp4", + "ElementFileName" : "「K」 Image Blu-ray WHITE & BLACK - Main (BD 1280x720 AVC AAC)", + "ElementReleaseGroup" : "K", + "ElementSource" : [ "Blu-ray", "BD" ], + "ElementVideoResolution" : "1280x720", + "ElementVideoTerm" : "AVC" + } +}, { + "file_name" : "[[Zero-Raws] Shingeki no Kyojin - 05 (MBS 1280x720 x264 AAC).mp4", + "id" : 16498, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Shingeki no Kyojin", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "05", + "ElementFileExtension" : "mp4", + "ElementFileName" : "[[Zero-Raws] Shingeki no Kyojin - 05 (MBS 1280x720 x264 AAC)", + "ElementReleaseGroup" : "[Zero-Raws", + "ElementVideoResolution" : "1280x720", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "[52wy][SlamDunk][001][Jpn_Chs_Cht][x264_aac][DVDRip][7FE2C873].mkv", + "id" : 170, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "SlamDunk", + "ElementAudioTerm" : "aac", + "ElementEpisodeNumber" : "001", + "ElementFileChecksum" : "7FE2C873", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[52wy][SlamDunk][001][Jpn_Chs_Cht][x264_aac][DVDRip][7FE2C873]", + "ElementReleaseGroup" : "52wy", + "ElementSource" : "DVDRip", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "[Commie] Last Exile ~Fam, The Silver Wing~ - 13 [AFF9E530].mkv", + "id" : 10336, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Last Exile ~Fam, The Silver Wing~", + "ElementEpisodeNumber" : "13", + "ElementFileChecksum" : "AFF9E530", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Commie] Last Exile ~Fam, The Silver Wing~ - 13 [AFF9E530]", + "ElementReleaseGroup" : "Commie" + } +}, { + "file_name" : "[Hakugetsu&Speed&MGRT][Dragon_Ball_Z_Battle_of_Gods][BDRIP][BIG5][1280x720].mp4", + "id" : 14837, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Dragon Ball Z Battle of Gods", + "ElementFileExtension" : "mp4", + "ElementFileName" : "[Hakugetsu&Speed&MGRT][Dragon_Ball_Z_Battle_of_Gods][BDRIP][BIG5][1280x720]", + "ElementReleaseGroup" : "Hakugetsu&Speed&MGRT", + "ElementSource" : "BDRIP", + "ElementSubtitles" : "BIG5", + "ElementVideoResolution" : "1280x720" + } +}, { + "file_name" : "[Hakugetsu&MGRT][Evangelion 3.0 You Can (Not) Redo][480P][V0].mp4", + "id" : 3785, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Evangelion 3.0 You Can (Not) Redo", + "ElementFileExtension" : "mp4", + "ElementFileName" : "[Hakugetsu&MGRT][Evangelion 3.0 You Can (Not) Redo][480P][V0]", + "ElementReleaseGroup" : "Hakugetsu&MGRT", + "ElementReleaseVersion" : "0", + "ElementVideoResolution" : "480P" + } +}, { + "file_name" : "[TV-J] Kidou Senshi Gundam UC Unicorn - episode.02 [BD 1920x1080 h264+AAC(5.1ch JP+EN) +Sub(JP-EN-SP-FR-CH) Chap].mp4", + "id" : 6336, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Kidou Senshi Gundam UC Unicorn", + "ElementEpisodeNumber" : "02", + "ElementFileExtension" : "mp4", + "ElementFileName" : "[TV-J] Kidou Senshi Gundam UC Unicorn - episode.02 [BD 1920x1080 h264+AAC(5.1ch JP+EN) +Sub(JP-EN-SP-FR-CH) Chap]", + "ElementReleaseGroup" : "TV-J", + "ElementSource" : "BD", + "ElementVideoResolution" : "1920x1080", + "ElementVideoTerm" : "h264" + } +}, { + "file_name" : "[UTW]_Fate_Zero_-_01_[BD][h264-720p_AC3][02A0491D].mkv", + "id" : 10087, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Fate Zero", + "ElementAudioTerm" : "AC3", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "02A0491D", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[UTW]_Fate_Zero_-_01_[BD][h264-720p_AC3][02A0491D]", + "ElementReleaseGroup" : "UTW", + "ElementSource" : "BD", + "ElementVideoResolution" : "720p", + "ElementVideoTerm" : "h264" + } +}, { + "file_name" : "[UTW-THORA] Evangelion 3.33 You Can (Not) Redo [BD][1080p,x264,flac][F2060CF5].mkv", + "id" : 3785, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Evangelion 3.33 You Can (Not) Redo", + "ElementAudioTerm" : "flac", + "ElementFileChecksum" : "F2060CF5", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[UTW-THORA] Evangelion 3.33 You Can (Not) Redo [BD][1080p,x264,flac][F2060CF5]", + "ElementReleaseGroup" : "UTW-THORA", + "ElementSource" : "BD", + "ElementVideoResolution" : "1080p", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "[Zero-Raws] Shingeki no Kyojin - 25 END (MBS 1280x720 x264 AAC).mp4", + "id" : 16498, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Shingeki no Kyojin", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "25", + "ElementEpisodeTitle" : "END", + "ElementFileExtension" : "mp4", + "ElementFileName" : "[Zero-Raws] Shingeki no Kyojin - 25 END (MBS 1280x720 x264 AAC)", + "ElementReleaseGroup" : "Zero-Raws", + "ElementReleaseInformation" : "END", + "ElementVideoResolution" : "1280x720", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "Bakemonogatari - 01 (BD 1280x720 AVC AACx2).mp4", + "id" : 5081, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Bakemonogatari", + "ElementAudioTerm" : "AACx2", + "ElementEpisodeNumber" : "01", + "ElementFileExtension" : "mp4", + "ElementFileName" : "Bakemonogatari - 01 (BD 1280x720 AVC AACx2)", + "ElementSource" : "BD", + "ElementVideoResolution" : "1280x720", + "ElementVideoTerm" : "AVC" + } +}, { + "file_name" : "Evangelion Shin Gekijouban Q (BDrip 1920x1080 x264 FLACx2 5.1ch)-ank.mkv", + "id" : 3785, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Evangelion Shin Gekijouban Q", + "ElementAnimeType" : "Gekijouban", + "ElementAudioTerm" : [ "FLACx2", "5.1ch" ], + "ElementFileExtension" : "mkv", + "ElementFileName" : "Evangelion Shin Gekijouban Q (BDrip 1920x1080 x264 FLACx2 5.1ch)-ank", + "ElementSource" : "BDrip", + "ElementVideoResolution" : "1920x1080", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "Evangelion The New Movie Q (BD 1280x720 AVC AACx2 [5.1+2.0]).mp4", + "id" : 3785, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Evangelion The New Movie Q", + "ElementAnimeType" : "Movie", + "ElementAudioTerm" : "AACx2", + "ElementFileExtension" : "mp4", + "ElementFileName" : "Evangelion The New Movie Q (BD 1280x720 AVC AACx2 [5.1+2.0])", + "ElementSource" : "BD", + "ElementVideoResolution" : "1280x720", + "ElementVideoTerm" : "AVC" + } +}, { + "file_name" : "Howl's_Moving_Castle_(2004)_[1080p,BluRay,flac,dts,x264]_-_THORA v2.mkv", + "id" : 431, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Howl's Moving Castle", + "ElementAnimeYear" : "2004", + "ElementAudioTerm" : [ "flac", "dts" ], + "ElementFileExtension" : "mkv", + "ElementFileName" : "Howl's_Moving_Castle_(2004)_[1080p,BluRay,flac,dts,x264]_-_THORA v2", + "ElementReleaseGroup" : "THORA", + "ElementReleaseVersion" : "2", + "ElementSource" : "BluRay", + "ElementVideoResolution" : "1080p", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "Kotonoha no Niwa (BD 1280x720 AVC AACx3 [5.1+2.0+2.0] Subx3).mp4", + "id" : 16782, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Kotonoha no Niwa", + "ElementAudioTerm" : "AACx3", + "ElementFileExtension" : "mp4", + "ElementFileName" : "Kotonoha no Niwa (BD 1280x720 AVC AACx3 [5.1+2.0+2.0] Subx3)", + "ElementSource" : "BD", + "ElementVideoResolution" : "1280x720", + "ElementVideoTerm" : "AVC" + } +}, { + "file_name" : "Queen's Blade Utsukushiki Toushi-tachi - OVA_01 (BD 1280x720 AVC AAC).mp4", + "id" : 8456, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Queen's Blade Utsukushiki Toushi-tachi - OVA", + "ElementAnimeType" : "OVA", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "01", + "ElementFileExtension" : "mp4", + "ElementFileName" : "Queen's Blade Utsukushiki Toushi-tachi - OVA_01 (BD 1280x720 AVC AAC)", + "ElementSource" : "BD", + "ElementVideoResolution" : "1280x720", + "ElementVideoTerm" : "AVC" + } +}, { + "file_name" : "[FFF] Futsuu no Joshikousei ga [Locodol] Yatte Mita. - 01 [BAD09C76].mkv", + "id" : 22189, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Futsuu no Joshikousei ga [Locodol] Yatte Mita.", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "BAD09C76", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[FFF] Futsuu no Joshikousei ga [Locodol] Yatte Mita. - 01 [BAD09C76]", + "ElementReleaseGroup" : "FFF" + } +}, { + "file_name" : "[異域字幕組][漆黑的子彈][Black Bullet][11][1280x720][繁体].mp4", + "id" : 20787, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Black Bullet", + "ElementEpisodeNumber" : "11", + "ElementFileExtension" : "mp4", + "ElementFileName" : "[異域字幕組][漆黑的子彈][Black Bullet][11][1280x720][繁体]", + "ElementReleaseGroup" : "異域字幕組", + "ElementVideoResolution" : "1280x720" + } +}, { + "file_name" : "[AoJiaoZero][Mangaka-san to Assistant-san to the Animation] 02 [BIG][X264_AAC][720P].mp4", + "id" : 21863, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "02", + "ElementAudioTerm" : "AAC", + "ElementFileExtension" : "mp4", + "ElementFileName" : "[AoJiaoZero][Mangaka-san to Assistant-san to the Animation] 02 [BIG][X264_AAC][720P]", + "ElementReleaseGroup" : "AoJiaoZero", + "ElementVideoResolution" : "720P", + "ElementVideoTerm" : "X264" + } +}, { + "file_name" : "Vol.01", + "id" : -1, + "ignore" : false, + "results" : { + "ElementFileName" : "Vol.01", + "ElementVolumeNumber" : "01" + } +}, { + "file_name" : "[Asenshi] Rozen Maiden 3 - PV [CA57F300].mkv", + "id" : 18041, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Rozen Maiden", + "ElementAnimeType" : "PV", + "ElementEpisodeNumber" : "3", + "ElementFileChecksum" : "CA57F300", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Asenshi] Rozen Maiden 3 - PV [CA57F300]", + "ElementReleaseGroup" : "Asenshi" + } +}, { + "file_name" : "Mary Bell (DVD) - 01v2 [h-b].mkv", + "id" : 2804, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Mary Bell", + "ElementEpisodeNumber" : "01", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Mary Bell (DVD) - 01v2 [h-b]", + "ElementReleaseGroup" : "h-b", + "ElementReleaseVersion" : "2", + "ElementSource" : "DVD" + } +}, { + "file_name" : "Mary Bell (DVD) - 02 [h-b].mkv", + "id" : 2804, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Mary Bell", + "ElementEpisodeNumber" : "02", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Mary Bell (DVD) - 02 [h-b]", + "ElementReleaseGroup" : "h-b", + "ElementSource" : "DVD" + } +}, { + "file_name" : "Attack on Titan - Episode 3 - A Dim Light Amid Despair / Humanity's Comeback, Part 1", + "id" : 16498, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Attack on Titan", + "ElementEpisodeNumber" : "3", + "ElementEpisodeTitle" : "A Dim Light Amid Despair / Humanity's Comeback, Part 1", + "ElementFileName" : "Attack on Titan - Episode 3 - A Dim Light Amid Despair / Humanity's Comeback, Part 1" + } +}, { + "file_name" : "The Irregular at Magic High School - S01E01- Enrollment Part I.mkv", + "id" : 20785, + "ignore" : false, + "results" : { + "ElementAnimeSeason" : "01", + "ElementAnimeTitle" : "The Irregular at Magic High School", + "ElementEpisodeNumber" : "01", + "ElementEpisodeTitle" : "Enrollment Part I", + "ElementFileExtension" : "mkv", + "ElementFileName" : "The Irregular at Magic High School - S01E01- Enrollment Part I" + } +}, { + "file_name" : "[Mezashite] Aikatsu! ‒ 100 [D035A39F].mkv", + "id" : 15061, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Aikatsu!", + "ElementEpisodeNumber" : "100", + "ElementFileChecksum" : "D035A39F", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Mezashite] Aikatsu! ‒ 100 [D035A39F]", + "ElementReleaseGroup" : "Mezashite" + } +}, { + "file_name" : "DRAMAtical Murder Episode 1 - Data_01_Login", + "id" : 23333, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "DRAMAtical Murder", + "ElementEpisodeNumber" : "1", + "ElementEpisodeTitle" : "Data 01 Login", + "ElementFileName" : "DRAMAtical Murder Episode 1 - Data_01_Login" + } +}, { + "file_name" : "[Triad]_Today_in_Class_5-2_-_04.avi", + "id" : 837, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Today in Class 5-2", + "ElementEpisodeNumber" : "04", + "ElementFileExtension" : "avi", + "ElementFileName" : "[Triad]_Today_in_Class_5-2_-_04", + "ElementReleaseGroup" : "Triad" + } +}, { + "file_name" : "__BLUE DROP 10 (1).avi", + "id" : 2964, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "BLUE DROP", + "ElementEpisodeNumber" : "1", + "ElementEpisodeNumberAlt" : "10", + "ElementFileExtension" : "avi", + "ElementFileName" : "__BLUE DROP 10 (1)" + } +}, { + "file_name" : "37 [Ruberia]_Death_Note_-_37v2_[FINAL]_[XviD][6FA7D273].avi", + "id" : 1535, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "37 [Ruberia] Death Note", + "ElementEpisodeNumber" : "37", + "ElementFileChecksum" : "6FA7D273", + "ElementFileExtension" : "avi", + "ElementFileName" : "37 [Ruberia]_Death_Note_-_37v2_[FINAL]_[XviD][6FA7D273]", + "ElementReleaseGroup" : "FINAL", + "ElementReleaseInformation" : "FINAL", + "ElementReleaseVersion" : "2", + "ElementVideoTerm" : "XviD" + } +}, { + "file_name" : "[UTW]_Accel_World_-_EX01_[BD][h264-720p_AAC][3E56EE18].mkv", + "id" : 13939, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Accel World - EX01", + "ElementAudioTerm" : "AAC", + "ElementFileChecksum" : "3E56EE18", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[UTW]_Accel_World_-_EX01_[BD][h264-720p_AAC][3E56EE18]", + "ElementReleaseGroup" : "UTW", + "ElementSource" : "BD", + "ElementVideoResolution" : "720p", + "ElementVideoTerm" : "h264" + } +}, { + "file_name" : "[HorribleSubs] Tsukimonogatari - (01-04) [1080p].mkv", + "id" : 28025, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Tsukimonogatari", + "ElementEpisodeNumber" : [ "01", "04" ], + "ElementFileExtension" : "mkv", + "ElementFileName" : "[HorribleSubs] Tsukimonogatari - (01-04) [1080p]", + "ElementReleaseGroup" : "HorribleSubs", + "ElementVideoResolution" : "1080p" + } +}, { + "file_name" : "[Urusai]_Bokura_Ga_Ita_01_[DVD_h264_AC3]_[BFCE1627][Fixed].mkv", + "id" : 1222, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Bokura Ga Ita", + "ElementAudioTerm" : "AC3", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "BFCE1627", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Urusai]_Bokura_Ga_Ita_01_[DVD_h264_AC3]_[BFCE1627][Fixed]", + "ElementLanguage" : "Ita", + "ElementReleaseGroup" : "Urusai", + "ElementSource" : "DVD", + "ElementVideoTerm" : "h264" + } +}, { + "file_name" : "[Coalgirls]_White_Album_1-13_(1280×720_Blu-Ray_FLAC)", + "id" : 4720, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "White Album", + "ElementAudioTerm" : "FLAC", + "ElementEpisodeNumber" : [ "1", "13" ], + "ElementFileName" : "[Coalgirls]_White_Album_1-13_(1280×720_Blu-Ray_FLAC)", + "ElementReleaseGroup" : "Coalgirls", + "ElementSource" : "Blu-Ray", + "ElementVideoResolution" : "1280×720" + } +}, { + "file_name" : "[Coalgirls]_Bakemonogatari_OP4a_(1280x720_Blu-Ray_FLAC)_[327A2375].mkv", + "id" : 5081, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Bakemonogatari OP", + "ElementAnimeType" : "OP", + "ElementAudioTerm" : "FLAC", + "ElementEpisodeNumber" : "4a", + "ElementFileChecksum" : "327A2375", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Coalgirls]_Bakemonogatari_OP4a_(1280x720_Blu-Ray_FLAC)_[327A2375]", + "ElementReleaseGroup" : "Coalgirls", + "ElementSource" : "Blu-Ray", + "ElementVideoResolution" : "1280x720" + } +}, { + "file_name" : "[Ruri]No.6 01 [720p][H264][A956075C].mkv", + "id" : 10161, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "No.6", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "A956075C", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Ruri]No.6 01 [720p][H264][A956075C]", + "ElementReleaseGroup" : "Ruri", + "ElementVideoResolution" : "720p", + "ElementVideoTerm" : "H264" + } +}, { + "file_name" : "[CH] Sword Art Online Extra Edition Dual Audio [BD 480p][10bitH.264+Vorbis]", + "id" : 20021, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Sword Art Online Extra Edition", + "ElementAudioTerm" : [ "Dual Audio", "Vorbis" ], + "ElementFileName" : "[CH] Sword Art Online Extra Edition Dual Audio [BD 480p][10bitH.264+Vorbis]", + "ElementReleaseGroup" : "CH", + "ElementSource" : "BD", + "ElementVideoResolution" : "480p", + "ElementVideoTerm" : [ "H.264", "10bit" ] + } +}, { + "file_name" : "EvoBot.[Watakushi]_Akuma_no_Riddle_-_01v2_[720p][69A307A2].mkv", + "id" : 19429, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "EvoBot [Watakushi] Akuma no Riddle", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "69A307A2", + "ElementFileExtension" : "mkv", + "ElementFileName" : "EvoBot.[Watakushi]_Akuma_no_Riddle_-_01v2_[720p][69A307A2]", + "ElementReleaseVersion" : "2", + "ElementVideoResolution" : "720p" + } +}, { + "file_name" : "01 - Land of Visible Pain.mkv", + "id" : -1, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "01 - Land of Visible Pain", + "ElementFileExtension" : "mkv", + "ElementFileName" : "01 - Land of Visible Pain" + } +}, { + "file_name" : "Episode 14 Ore no Imouto ga Konnani Kawaii Wake ga Nai. (saison 2) VOSTFR", + "id" : 13659, + "ignore" : false, + "results" : { + "ElementAnimeSeason" : "2", + "ElementAnimeTitle" : "Ore no Imouto ga Konnani Kawaii Wake ga Nai.", + "ElementEpisodeNumber" : "14", + "ElementFileName" : "Episode 14 Ore no Imouto ga Konnani Kawaii Wake ga Nai. (saison 2) VOSTFR", + "ElementLanguage" : "VOSTFR" + } +}, { + "file_name" : "[Zom-B] Machine-Doll wa Kizutsukanai - 01 - Facing ''Cannibal Candy'' I (kuroi, FFF remux) [B99C8DED].mkv", + "id" : 17247, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Machine-Doll wa Kizutsukanai", + "ElementEpisodeNumber" : "01", + "ElementEpisodeTitle" : "Facing ''Cannibal Candy'' I", + "ElementFileChecksum" : "B99C8DED", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Zom-B] Machine-Doll wa Kizutsukanai - 01 - Facing ''Cannibal Candy'' I (kuroi, FFF remux) [B99C8DED]", + "ElementReleaseGroup" : "Zom-B", + "ElementReleaseInformation" : "remux" + } +}, { + "file_name" : "The iDOLM@STER 765 Pro to Iu Monogatari.mkv", + "id" : 11889, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "The iDOLM@STER", + "ElementEpisodeNumber" : "765", + "ElementEpisodeTitle" : "Pro to Iu Monogatari", + "ElementFileExtension" : "mkv", + "ElementFileName" : "The iDOLM@STER 765 Pro to Iu Monogatari" + } +}, { + "file_name" : "[Yuurisan-Subs]_Darker_than_Black_-_Gemini_of_the_Meteor_-_01v2_[65274FDE].patch.7z", + "id" : 6573, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Darker than Black - Gemini of the Meteor", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "65274FDE", + "ElementFileExtension" : "7z", + "ElementFileName" : "[Yuurisan-Subs]_Darker_than_Black_-_Gemini_of_the_Meteor_-_01v2_[65274FDE].patch", + "ElementReleaseGroup" : "Yuurisan-Subs", + "ElementReleaseInformation" : "patch", + "ElementReleaseVersion" : "2" + } +}, { + "file_name" : "[Coalgirls]_Fate_Zero_OVA3.5_(1280x720_Blu-ray_FLAC)_[5F5AD026].mkv", + "id" : 10087, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Fate Zero OVA", + "ElementAnimeType" : "OVA", + "ElementAudioTerm" : "FLAC", + "ElementEpisodeNumber" : "3.5", + "ElementFileChecksum" : "5F5AD026", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Coalgirls]_Fate_Zero_OVA3.5_(1280x720_Blu-ray_FLAC)_[5F5AD026]", + "ElementReleaseGroup" : "Coalgirls", + "ElementSource" : "Blu-ray", + "ElementVideoResolution" : "1280x720" + } +}, { + "file_name" : "[GrimRipper] Koi Kaze [Dual Audio] Ep01 (c13cefe0).mkv", + "id" : 634, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Koi Kaze", + "ElementAudioTerm" : "Dual Audio", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "c13cefe0", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[GrimRipper] Koi Kaze [Dual Audio] Ep01 (c13cefe0)", + "ElementReleaseGroup" : "GrimRipper" + } +}, { + "file_name" : "[HorribleSubs] Gintama - 111C [1080p].mkv", + "id" : 918, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Gintama", + "ElementEpisodeNumber" : "111C", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[HorribleSubs] Gintama - 111C [1080p]", + "ElementReleaseGroup" : "HorribleSubs", + "ElementVideoResolution" : "1080p" + } +}, { + "file_name" : "[SpoonSubs]_Hidamari_Sketch_x365_-_04.1_(DVD)[B6CE8458].mkv", + "id" : 3604, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Hidamari Sketch x365 - 04.1", + "ElementFileChecksum" : "B6CE8458", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[SpoonSubs]_Hidamari_Sketch_x365_-_04.1_(DVD)[B6CE8458]", + "ElementReleaseGroup" : "SpoonSubs", + "ElementSource" : "DVD" + } +}, { + "file_name" : "Ep. 01 - The Boy in the Iceberg", + "id" : -1, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "The Boy in the Iceberg", + "ElementEpisodeNumber" : "01", + "ElementFileName" : "Ep. 01 - The Boy in the Iceberg" + } +}, { + "file_name" : "[Hatsuyuki]_Kuroko_no_Basuke_S3_-_01_(51)_[720p][10bit][619C57A0].mkv", + "id" : 24415, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Kuroko no Basuke S3", + "ElementEpisodeNumber" : "01", + "ElementEpisodeNumberAlt" : "51", + "ElementFileChecksum" : "619C57A0", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Hatsuyuki]_Kuroko_no_Basuke_S3_-_01_(51)_[720p][10bit][619C57A0]", + "ElementReleaseGroup" : "Hatsuyuki", + "ElementVideoResolution" : "720p", + "ElementVideoTerm" : "10bit" + } +}, { + "file_name" : "[Elysium]Sora.no.Woto.EP07.5(BD.720p.AAC)[C37580F8].mkv", + "id" : 6802, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Sora no Woto", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "07.5", + "ElementFileChecksum" : "C37580F8", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Elysium]Sora.no.Woto.EP07.5(BD.720p.AAC)[C37580F8]", + "ElementReleaseGroup" : "Elysium", + "ElementSource" : "BD", + "ElementVideoResolution" : "720p" + } +}, { + "file_name" : "[Zurako] Sora no Woto - 07.5 - Drinking Party - Fortress Battle (BD 1080p AAC) [F7DF16F7].mkv", + "id" : 6802, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Sora no Woto", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "07.5", + "ElementEpisodeTitle" : "Drinking Party - Fortress Battle", + "ElementFileChecksum" : "F7DF16F7", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Zurako] Sora no Woto - 07.5 - Drinking Party - Fortress Battle (BD 1080p AAC) [F7DF16F7]", + "ElementReleaseGroup" : "Zurako", + "ElementSource" : "BD", + "ElementVideoResolution" : "1080p" + } +}, { + "file_name" : "[Hiryuu] Maji de Watashi ni Koi Shinasai!! - 02 [720].mkv", + "id" : 10213, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Maji de Watashi ni Koi Shinasai!!", + "ElementEpisodeNumber" : "02", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Hiryuu] Maji de Watashi ni Koi Shinasai!! - 02 [720]", + "ElementReleaseGroup" : "Hiryuu", + "ElementVideoResolution" : "720" + } +}, { + "file_name" : "[Kira-Fansub] Uchuu no Stellvia ep 14 (BD H264 1280x960 24fps AAC) [06EE7355].mkv", + "id" : 113, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Uchuu no Stellvia", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "14", + "ElementFileChecksum" : "06EE7355", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Kira-Fansub] Uchuu no Stellvia ep 14 (BD H264 1280x960 24fps AAC) [06EE7355]", + "ElementReleaseGroup" : "Kira-Fansub", + "ElementSource" : "BD", + "ElementVideoResolution" : "1280x960", + "ElementVideoTerm" : [ "H264", "24fps" ] + } +}, { + "file_name" : "[ANE] Yosuga no Sora - Ep01 Preview (Yorihime ver) [BDRip 1080p x264 FLAC].mkv", + "id" : 8861, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Yosuga no Sora", + "ElementAnimeType" : "Preview", + "ElementAudioTerm" : "FLAC", + "ElementEpisodeNumber" : "01", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[ANE] Yosuga no Sora - Ep01 Preview (Yorihime ver) [BDRip 1080p x264 FLAC]", + "ElementReleaseGroup" : "ANE", + "ElementSource" : "BDRip", + "ElementVideoResolution" : "1080p", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "[B-G_&_m.3.3.w]_Myself_Yourself_12.DVD(H.264_DD2.0)_[CB2B37F1].mkv", + "id" : 2926, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Myself Yourself", + "ElementEpisodeNumber" : "12", + "ElementFileChecksum" : "CB2B37F1", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[B-G_&_m.3.3.w]_Myself_Yourself_12.DVD(H.264_DD2.0)_[CB2B37F1]", + "ElementReleaseGroup" : "B-G_&_m.3.3.w", + "ElementSource" : "DVD", + "ElementVideoTerm" : "H.264" + } +}, { + "file_name" : "The.Animatrix.08.A.Detective.Story.720p.BluRay.DTS.x264-ESiR.mkv", + "id" : 1303, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "The Animatrix 08.A Detective Story", + "ElementAudioTerm" : "DTS", + "ElementFileExtension" : "mkv", + "ElementFileName" : "The.Animatrix.08.A.Detective.Story.720p.BluRay.DTS.x264-ESiR", + "ElementSource" : "BluRay", + "ElementVideoResolution" : "720p" + } +}, { + "file_name" : "[DmonHiro] Oreshura #01v2 - The Start Of High School Life Is A War Zone [BD, 720p] [211375E6].mkv", + "id" : 14749, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Oreshura", + "ElementEpisodeNumber" : "01", + "ElementEpisodeTitle" : "The Start Of High School Life Is A War Zone", + "ElementFileChecksum" : "211375E6", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[DmonHiro] Oreshura #01v2 - The Start Of High School Life Is A War Zone [BD, 720p] [211375E6]", + "ElementReleaseGroup" : "DmonHiro", + "ElementReleaseVersion" : "2", + "ElementSource" : "BD", + "ElementVideoResolution" : "720p" + } +}, { + "file_name" : "[모에-Raws] Abarenbou Rikishi!! Matsutarou #04 (ABC 1280x720 x264 AAC).mp4", + "id" : 22831, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Abarenbou Rikishi!! Matsutarou", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "04", + "ElementFileExtension" : "mp4", + "ElementFileName" : "[모에-Raws] Abarenbou Rikishi!! Matsutarou #04 (ABC 1280x720 x264 AAC)", + "ElementReleaseGroup" : "모에-Raws", + "ElementVideoResolution" : "1280x720", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "[바카-Raws] Nekomonogatari (Black) #1-4 (BS11 1280x720 x264 AAC).mp4", + "id" : 15689, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Nekomonogatari (Black)", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : [ "1", "4" ], + "ElementFileExtension" : "mp4", + "ElementFileName" : "[바카-Raws] Nekomonogatari (Black) #1-4 (BS11 1280x720 x264 AAC)", + "ElementReleaseGroup" : "바카-Raws", + "ElementVideoResolution" : "1280x720", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "[NinjaPanda] Tiger & Bunny #01 All's well that ends well. (v3, 1080p Hi10P, DA AAC) [4A9AB85F].mkv", + "id" : 9941, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Tiger & Bunny", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "01", + "ElementEpisodeTitle" : "All's well that ends well.", + "ElementFileChecksum" : "4A9AB85F", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[NinjaPanda] Tiger & Bunny #01 All's well that ends well. (v3, 1080p Hi10P, DA AAC) [4A9AB85F]", + "ElementReleaseGroup" : "NinjaPanda", + "ElementReleaseVersion" : "3", + "ElementVideoResolution" : "1080p", + "ElementVideoTerm" : "Hi10P" + } +}, { + "file_name" : "Neko no Ongaeshi - [HQR.remux-DualAudio][NTV.1280x692.h264](0CDC2145).mkv", + "id" : 597, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Neko no Ongaeshi", + "ElementFileChecksum" : "0CDC2145", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Neko no Ongaeshi - [HQR.remux-DualAudio][NTV.1280x692.h264](0CDC2145)", + "ElementReleaseGroup" : "HQR.remux-DualAudio", + "ElementVideoResolution" : "1280x692", + "ElementVideoTerm" : "h264" + } +}, { + "file_name" : "[ReDone] Memories Off 3.5 - 04 (DVD 10-bit).mkv", + "id" : 363, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Memories Off", + "ElementEpisodeNumber" : "3.5", + "ElementEpisodeTitle" : "04", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[ReDone] Memories Off 3.5 - 04 (DVD 10-bit)", + "ElementReleaseGroup" : "ReDone", + "ElementSource" : "DVD", + "ElementVideoTerm" : "10-bit" + } +}, { + "file_name" : "[FFF] Seirei Tsukai no Blade Dance - SP01 [BD][720p-AAC][F1FF8588].mkv", + "id" : 25285, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Seirei Tsukai no Blade Dance - SP", + "ElementAnimeType" : "SP", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "F1FF8588", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[FFF] Seirei Tsukai no Blade Dance - SP01 [BD][720p-AAC][F1FF8588]", + "ElementReleaseGroup" : "FFF", + "ElementSource" : "BD", + "ElementVideoResolution" : "720p" + } +}, { + "file_name" : "Byousoku 5 Centimeter [Blu-Ray][1920x1080 H.264][2.0ch AAC][SOFTSUBS]", + "id" : 1689, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Byousoku", + "ElementAudioTerm" : [ "2.0ch", "AAC" ], + "ElementEpisodeNumber" : "5", + "ElementEpisodeTitle" : "Centimeter", + "ElementFileName" : "Byousoku 5 Centimeter [Blu-Ray][1920x1080 H.264][2.0ch AAC][SOFTSUBS]", + "ElementSource" : "Blu-Ray", + "ElementSubtitles" : "SOFTSUBS", + "ElementVideoResolution" : "1920x1080", + "ElementVideoTerm" : "H.264" + } +}, { + "file_name" : "[SubDESU-H] Swing out Sisters Complete Version (720p x264 8bit AC3) [3ABD57E6].mp4", + "id" : 12143, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Swing out Sisters", + "ElementAudioTerm" : "AC3", + "ElementFileChecksum" : "3ABD57E6", + "ElementFileExtension" : "mp4", + "ElementFileName" : "[SubDESU-H] Swing out Sisters Complete Version (720p x264 8bit AC3) [3ABD57E6]", + "ElementReleaseGroup" : "SubDESU-H", + "ElementReleaseInformation" : "Complete", + "ElementVideoResolution" : "720p", + "ElementVideoTerm" : [ "x264", "8bit" ] + } +}, { + "file_name" : "Cyborg 009 (1968) [TSHS] episode 06 [30C15D62].mp4", + "id" : 8394, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Cyborg 009", + "ElementAnimeYear" : "1968", + "ElementEpisodeNumber" : "06", + "ElementFileChecksum" : "30C15D62", + "ElementFileExtension" : "mp4", + "ElementFileName" : "Cyborg 009 (1968) [TSHS] episode 06 [30C15D62]", + "ElementReleaseGroup" : "TSHS" + } +}, { + "file_name" : "[Hatsuyuki] Dragon Ball Kai (2014) - 002 (100) [1280x720][DD66AFB7].mkv", + "id" : 22777, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Dragon Ball Kai", + "ElementAnimeYear" : "2014", + "ElementEpisodeNumber" : "002", + "ElementEpisodeNumberAlt" : "100", + "ElementFileChecksum" : "DD66AFB7", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Hatsuyuki] Dragon Ball Kai (2014) - 002 (100) [1280x720][DD66AFB7]", + "ElementReleaseGroup" : "Hatsuyuki", + "ElementVideoResolution" : "1280x720" + } +}, { + "file_name" : "[Deep] Tegami Bachi (REVERSE) - Letter Bee - 29 (04) [5203142B].mkv", + "id" : 8311, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Tegami Bachi (REVERSE) - Letter Bee", + "ElementEpisodeNumber" : "04", + "ElementEpisodeNumberAlt" : "29", + "ElementFileChecksum" : "5203142B", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Deep] Tegami Bachi (REVERSE) - Letter Bee - 29 (04) [5203142B]", + "ElementReleaseGroup" : "Deep" + } +}, { + "file_name" : "[FFF] Love Live! The School Idol Movie - PV [D1A15D2C].mkv", + "id" : 24997, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Love Live! The School Idol Movie - PV", + "ElementAnimeType" : [ "Movie", "PV" ], + "ElementFileChecksum" : "D1A15D2C", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[FFF] Love Live! The School Idol Movie - PV [D1A15D2C]", + "ElementReleaseGroup" : "FFF" + } +}, { + "file_name" : "[Nishi-Taku] Tamayura ~graduation photo~ Movie Part 1 [BD][720p][98965607].mkv", + "id" : 25729, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Tamayura ~graduation photo~ Movie Part 1", + "ElementAnimeType" : "Movie", + "ElementFileChecksum" : "98965607", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Nishi-Taku] Tamayura ~graduation photo~ Movie Part 1 [BD][720p][98965607]", + "ElementReleaseGroup" : "Nishi-Taku", + "ElementSource" : "BD", + "ElementVideoResolution" : "720p" + } +}, { + "file_name" : "[LRL] 1001 Nights (1998) [DVD]", + "id" : 3914, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "1001 Nights", + "ElementAnimeYear" : "1998", + "ElementFileName" : "[LRL] 1001 Nights (1998) [DVD]", + "ElementReleaseGroup" : "LRL", + "ElementSource" : "DVD" + } +}, { + "file_name" : "[TardRaws] 0 [640x360].mkv", + "id" : 20707, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "0", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[TardRaws] 0 [640x360]", + "ElementReleaseGroup" : "TardRaws", + "ElementVideoResolution" : "640x360" + } +}, { + "file_name" : "[FB] Crayon Shin-Chan Movie 2 The Secret of Buri Buri Kingdom [DivX5 AC3] 1994 [852X480] V2.avi", + "id" : 3745, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Crayon Shin-Chan Movie 2 The Secret of Buri Buri Kingdom", + "ElementAnimeType" : "Movie", + "ElementAnimeYear" : "1994", + "ElementAudioTerm" : "AC3", + "ElementFileExtension" : "avi", + "ElementFileName" : "[FB] Crayon Shin-Chan Movie 2 The Secret of Buri Buri Kingdom [DivX5 AC3] 1994 [852X480] V2", + "ElementReleaseGroup" : "FB", + "ElementReleaseVersion" : "2", + "ElementVideoResolution" : "852X480", + "ElementVideoTerm" : "DivX5" + } +}, { + "file_name" : "[Hatsuyuki-Kaitou]_Fairy_Tail_2_-_52_(227)_[720p][10bit][9DF6B8D5].mkv", + "id" : 22043, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Fairy Tail 2", + "ElementEpisodeNumber" : "52", + "ElementEpisodeNumberAlt" : "227", + "ElementFileChecksum" : "9DF6B8D5", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[Hatsuyuki-Kaitou]_Fairy_Tail_2_-_52_(227)_[720p][10bit][9DF6B8D5]", + "ElementReleaseGroup" : "Hatsuyuki-Kaitou", + "ElementVideoResolution" : "720p", + "ElementVideoTerm" : "10bit" + } +}, { + "file_name" : "[FBI] Baby Princess 3D Paradise Love 01v0 [BD][720p-AAC][457CC066].mkv", + "id" : 10196, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Baby Princess 3D Paradise Love", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : "01", + "ElementFileChecksum" : "457CC066", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[FBI] Baby Princess 3D Paradise Love 01v0 [BD][720p-AAC][457CC066]", + "ElementReleaseGroup" : "FBI", + "ElementReleaseVersion" : "0", + "ElementSource" : "BD", + "ElementVideoResolution" : "720p" + } +}, { + "file_name" : "[Shinsen-Subs]_Macross_Frontier_-_01b_[4D5EC315].avi", + "id" : 3572, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Macross Frontier", + "ElementEpisodeNumber" : "01b", + "ElementFileChecksum" : "4D5EC315", + "ElementFileExtension" : "avi", + "ElementFileName" : "[Shinsen-Subs]_Macross_Frontier_-_01b_[4D5EC315]", + "ElementReleaseGroup" : "Shinsen-Subs" + } +}, { + "file_name" : "[NamaeNai] Hidamari Sketch x365 - 09a (DVD) [49874745].mkv", + "id" : 3604, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Hidamari Sketch x365", + "ElementEpisodeNumber" : "09a", + "ElementFileChecksum" : "49874745", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[NamaeNai] Hidamari Sketch x365 - 09a (DVD) [49874745]", + "ElementReleaseGroup" : "NamaeNai", + "ElementSource" : "DVD" + } +}, { + "file_name" : "[KLF]_D.Gray-man_04V2.avi", + "id" : 1482, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "D.Gray-man", + "ElementEpisodeNumber" : "04", + "ElementFileExtension" : "avi", + "ElementFileName" : "[KLF]_D.Gray-man_04V2", + "ElementReleaseGroup" : "KLF", + "ElementReleaseVersion" : "2" + } +}, { + "file_name" : "[FaggotryRaws] Bakuman - 01 (NHK E 848x480).mkv", + "id" : 7674, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Bakuman", + "ElementEpisodeNumber" : "01", + "ElementEpisodePrefix" : "E", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[FaggotryRaws] Bakuman - 01 (NHK E 848x480)", + "ElementReleaseGroup" : "FaggotryRaws", + "ElementVideoResolution" : "848x480" + } +}, { + "file_name" : "[5F] RWBY 14 Forever Fall Part 2 pt-BR.mp4", + "id" : 0, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "RWBY", + "ElementEpisodeNumber" : "14", + "ElementEpisodeTitle" : "Forever Fall Part 2", + "ElementFileExtension" : "mp4", + "ElementFileName" : "[5F] RWBY 14 Forever Fall Part 2 pt-BR", + "ElementLanguage" : "pt-BR", + "ElementReleaseGroup" : "5F" + } +}, { + "file_name" : "Dragon.Ball.KAI.-.01.-.1080p.BluRay.x264.DHD.mkv", + "id" : 6033, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Dragon Ball KAI", + "ElementEpisodeNumber" : "01", + "ElementFileExtension" : "mkv", + "ElementFileName" : "Dragon.Ball.KAI.-.01.-.1080p.BluRay.x264.DHD", + "ElementSource" : "BluRay", + "ElementVideoResolution" : "1080p", + "ElementVideoTerm" : "x264" + } +}, { + "file_name" : "[AnimeRG] Ushio to Tora (TV) - 02 [720p] [Xcelent].mkv", + "id" : 29854, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Ushio to Tora (TV)", + "ElementAnimeType" : "TV", + "ElementEpisodeNumber" : "02", + "ElementFileExtension" : "mkv", + "ElementFileName" : "[AnimeRG] Ushio to Tora (TV) - 02 [720p] [Xcelent]", + "ElementReleaseGroup" : "AnimeRG", + "ElementVideoResolution" : "720p" + } +}, { + "file_name" : "[Anime", + "id" : -1, + "ignore" : false, + "results" : { + "ElementFileName" : "[Anime" + } +}, { + "file_name" : "Gekkan Shoujo Nozaki-kun [HorribleSubs] (1080p)", + "id" : 23289, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Gekkan Shoujo Nozaki-kun", + "ElementFileName" : "Gekkan Shoujo Nozaki-kun [HorribleSubs] (1080p)", + "ElementReleaseGroup" : "HorribleSubs", + "ElementVideoResolution" : "1080p" + } +}, { + "file_name" : "[BM&T] Toradora! - 07v2 - Pool Opening [720p Hi10 ] [BD] [8F59F2BA]", + "id" : 23289, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Toradora!", + "ElementEpisodeNumber" : "07", + "ElementEpisodeTitle" : "Pool Opening", + "ElementFileChecksum" : "8F59F2BA", + "ElementFileName" : "[BM&T] Toradora! - 07v2 - Pool Opening [720p Hi10 ] [BD] [8F59F2BA]", + "ElementReleaseGroup" : "BM&T", + "ElementReleaseVersion" : "2", + "ElementSource" : "BD", + "ElementVideoResolution" : "720p" + } +}, { + "file_name" : "[EveTaku] AKB0048 Vol.03 - Making of Kibou-ni-Tsuite Music Video (BDRip 1080i H.264-Hi10P FLAC)[C09462E2]", + "id" : 12149, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "AKB0048", + "ElementAudioTerm" : "FLAC", + "ElementFileChecksum" : "C09462E2", + "ElementFileName" : "[EveTaku] AKB0048 Vol.03 - Making of Kibou-ni-Tsuite Music Video (BDRip 1080i H.264-Hi10P FLAC)[C09462E2]", + "ElementReleaseGroup" : "EveTaku", + "ElementSource" : "BDRip", + "ElementVideoTerm" : [ "H.264", "Hi10P" ], + "ElementVolumeNumber" : "03" + } +}, { + "file_name" : "[DmonHiro] Magi - The Labyrinth Of Magic - Vol.1v2 (BD, 720p)", + "id" : 14513, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Magi - The Labyrinth Of Magic", + "ElementFileName" : "[DmonHiro] Magi - The Labyrinth Of Magic - Vol.1v2 (BD, 720p)", + "ElementReleaseGroup" : "DmonHiro", + "ElementReleaseVersion" : "2", + "ElementSource" : "BD", + "ElementVideoResolution" : "720p", + "ElementVolumeNumber" : "1" + } +}, { + "file_name" : "[tlacatlc6] Natsume Yuujinchou Shi Vol. 1v2 & Vol. 2 (BD 1280x720 x264 AAC)", + "id" : 11665, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Natsume Yuujinchou Shi", + "ElementAudioTerm" : "AAC", + "ElementFileName" : "[tlacatlc6] Natsume Yuujinchou Shi Vol. 1v2 & Vol. 2 (BD 1280x720 x264 AAC)", + "ElementReleaseGroup" : "tlacatlc6", + "ElementReleaseVersion" : "2", + "ElementSource" : "BD", + "ElementVideoResolution" : "1280x720", + "ElementVideoTerm" : "x264", + "ElementVolumeNumber" : [ "1", "2" ] + } +}, { + "file_name" : "[Tsundere] Hyouka - 01v2-04 [BDRip h264 1920x1080 10bit FLAC]", + "id" : 12189, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Hyouka", + "ElementAudioTerm" : "FLAC", + "ElementEpisodeNumber" : [ "01", "04" ], + "ElementFileName" : "[Tsundere] Hyouka - 01v2-04 [BDRip h264 1920x1080 10bit FLAC]", + "ElementReleaseGroup" : "Tsundere", + "ElementReleaseVersion" : "2", + "ElementSource" : "BDRip", + "ElementVideoResolution" : "1920x1080", + "ElementVideoTerm" : [ "h264", "10bit" ] + } +}, { + "file_name" : "[Doki] Nogizaka Haruka no Himitsu - Purezza - 01v2-03v2 (1280x720 h264 AAC)", + "id" : 6023, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Nogizaka Haruka no Himitsu - Purezza", + "ElementAudioTerm" : "AAC", + "ElementEpisodeNumber" : [ "01", "03" ], + "ElementFileName" : "[Doki] Nogizaka Haruka no Himitsu - Purezza - 01v2-03v2 (1280x720 h264 AAC)", + "ElementReleaseGroup" : "Doki", + "ElementReleaseVersion" : [ "2", "2" ], + "ElementVideoResolution" : "1280x720", + "ElementVideoTerm" : "h264" + } +}, { + "file_name" : "Fairy Tail - S06E32 - Tartaros Arc Iron Fist of the Fire Dragon [Episode 83]", + "id" : 6702, + "ignore" : false, + "results" : { + "ElementAnimeSeason" : "06", + "ElementAnimeTitle" : "Fairy Tail", + "ElementEpisodeNumber" : "32", + "ElementEpisodeNumberAlt" : "83", + "ElementEpisodeTitle" : "Tartaros Arc Iron Fist of the Fire Dragon", + "ElementFileName" : "Fairy Tail - S06E32 - Tartaros Arc Iron Fist of the Fire Dragon [Episode 83]" + } +}, { + "file_name" : "Noragami - S02E06 - What Must Be Done [Episode 6]", + "id" : 30503, + "ignore" : false, + "results" : { + "ElementAnimeSeason" : "02", + "ElementAnimeTitle" : "Noragami", + "ElementEpisodeNumber" : "6", + "ElementEpisodeTitle" : "What Must Be Done", + "ElementFileName" : "Noragami - S02E06 - What Must Be Done [Episode 6]" + } +}, { + "file_name" : "[Harunatsu] Classroom Crisis - Vol.1 [BD 720p-AAC]", + "id" : 30383, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Classroom Crisis", + "ElementAudioTerm" : "AAC", + "ElementFileName" : "[Harunatsu] Classroom Crisis - Vol.1 [BD 720p-AAC]", + "ElementReleaseGroup" : "Harunatsu", + "ElementSource" : "BD", + "ElementVideoResolution" : "720p", + "ElementVolumeNumber" : "1" + } +}, { + "file_name" : "[GS] Classroom Crisis Vol.1&2 (BD 1080p 10bit FLAC)", + "id" : 30383, + "ignore" : false, + "results" : { + "ElementAnimeTitle" : "Classroom Crisis", + "ElementAudioTerm" : "FLAC", + "ElementFileName" : "[GS] Classroom Crisis Vol.1&2 (BD 1080p 10bit FLAC)", + "ElementReleaseGroup" : "GS", + "ElementSource" : "BD", + "ElementVideoResolution" : "1080p", + "ElementVideoTerm" : "10bit", + "ElementVolumeNumber" : [ "1", "2"] + } +}, { + "file_name": "[Infantjedi] Norn9 - Norn + Nonetto - 12", + "id": 31452, + "ignore": false, + "results": { + "ElementAnimeTitle": "Norn9 - Norn + Nonetto", + "ElementEpisodeNumber": "12", + "ElementReleaseGroup": "Infantjedi" + } +}, { + "file_name": "Dragon_Ball_Z_Movies_8_&_10_[720p,BluRay,DTS,x264]_-_THORA", + "id": [ + 901, + 903 + ], + "results": { + "ElementAnimeTitle": "Dragon Ball Z Movies", + "ElementAudioTerm": "DTS", + "ElementReleaseGroup": "THORA", + "ElementSource": "BluRay", + "ElementVideoResolution": "720p", + "ElementVideoTerm": "x264", + "ElementEpisodeNumber": [ + "8", + "10" + ] + } +}, { + "file_name": "[HorribleSubs] Momokuri - 01+02 [720p]", + "results": { + "ElementReleaseGroup": "HorribleSubs", + "ElementAnimeTitle": "Momokuri", + "ElementEpisodeNumber": [ + "01", + "02" + ], + "ElementVideoResolution": "720p" + } +} ] \ No newline at end of file diff --git a/Chiara/Chiara.Tests/Chiara.Tests.csproj b/Chiara/Chiara.Tests/Chiara.Tests.csproj new file mode 100644 index 0000000..4ead628 --- /dev/null +++ b/Chiara/Chiara.Tests/Chiara.Tests.csproj @@ -0,0 +1,34 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + + diff --git a/Chiara/Chiara.Tests/GlobalUsings.cs b/Chiara/Chiara.Tests/GlobalUsings.cs new file mode 100644 index 0000000..f91cba5 --- /dev/null +++ b/Chiara/Chiara.Tests/GlobalUsings.cs @@ -0,0 +1,3 @@ +global using Xunit; +global using Xunit.Abstractions; +global using Moq; diff --git a/Chiara/Chiara.Tests/Services/MediaRepositoryScannerTests.cs b/Chiara/Chiara.Tests/Services/MediaRepositoryScannerTests.cs new file mode 100644 index 0000000..34c3e79 --- /dev/null +++ b/Chiara/Chiara.Tests/Services/MediaRepositoryScannerTests.cs @@ -0,0 +1,27 @@ +using Chiara.Abstractions; +using Chiara.Models; +using Chiara.Services; +using Chiara.Tests.Utils; +using Microsoft.Extensions.Logging; + +namespace Chiara.Tests.Services; + +public class MediaRepositoryScannerTests +{ + private readonly DefaultMediaRepositoryScanner _scanner = new( + MockCreator.CreateEmptyMock(), + MockCreator.CreateEmptyMock>()); + + [Fact] + public async Task ScanTest() + { + MediaRepository repository = new() { Path = "/home/ricardo/Documents/Code/CSharp/Chiara/Chiara.Tests/Data" }; + + List albums = (await _scanner.ScanAlbumAsync(repository)).ToList(); + + Assert.Single(albums); + Assert.Contains(albums, a => a.Title == "Genshin Impact - Jade Moon Upon a Sea of Clouds"); + Assert.Contains(albums, a => a.Arist == "Yu-Peng Chen, HOYO-MiX"); + Assert.Contains(albums, a => a.Songs.Count == 69); + } +} diff --git a/Chiara/Chiara.Tests/Utils/MockCreator.cs b/Chiara/Chiara.Tests/Utils/MockCreator.cs new file mode 100644 index 0000000..6be8620 --- /dev/null +++ b/Chiara/Chiara.Tests/Utils/MockCreator.cs @@ -0,0 +1,20 @@ +using Chiara.Services; +using Microsoft.Extensions.Logging; + +namespace Chiara.Tests.Utils; + +public static class MockCreator +{ + public static ILogger CreateNoOutputLogger() + { + Mock> mock = new(); + + return mock.Object; + } + + public static T CreateEmptyMock() where T : class + { + Mock mock = new(); + return mock.Object; + } +} diff --git a/Chiara/Chiara.sln b/Chiara/Chiara.sln new file mode 100644 index 0000000..03e2abd --- /dev/null +++ b/Chiara/Chiara.sln @@ -0,0 +1,47 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chiara", "Chiara\Chiara.csproj", "{06FB2F9E-6C0A-4D73-A1B0-D60B116348FB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chiara.Tests", "Chiara.Tests\Chiara.Tests.csproj", "{DD3DCD44-D661-4DE1-B2FD-170D5504361A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Utils", "Utils", "{E6D11D0F-E915-41B5-86D4-CCEA8C6CF3A3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AnitomySharp", "AnitomySharp\AnitomySharp.csproj", "{4893AB7B-D50D-4C06-9267-E14F28B510E9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".gitea", ".gitea", "{38E1A429-AC02-4C7A-AF97-338D9FF30A0B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{DB9235C8-F148-47B8-A205-BCF978750D73}" + ProjectSection(SolutionItems) = preProject + .gitea\workflows\build.yaml = .gitea\workflows\build.yaml + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {06FB2F9E-6C0A-4D73-A1B0-D60B116348FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {06FB2F9E-6C0A-4D73-A1B0-D60B116348FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {06FB2F9E-6C0A-4D73-A1B0-D60B116348FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {06FB2F9E-6C0A-4D73-A1B0-D60B116348FB}.Release|Any CPU.Build.0 = Release|Any CPU + {DD3DCD44-D661-4DE1-B2FD-170D5504361A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DD3DCD44-D661-4DE1-B2FD-170D5504361A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DD3DCD44-D661-4DE1-B2FD-170D5504361A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DD3DCD44-D661-4DE1-B2FD-170D5504361A}.Release|Any CPU.Build.0 = Release|Any CPU + {4893AB7B-D50D-4C06-9267-E14F28B510E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4893AB7B-D50D-4C06-9267-E14F28B510E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4893AB7B-D50D-4C06-9267-E14F28B510E9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4893AB7B-D50D-4C06-9267-E14F28B510E9}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {4893AB7B-D50D-4C06-9267-E14F28B510E9} = {E6D11D0F-E915-41B5-86D4-CCEA8C6CF3A3} + {DB9235C8-F148-47B8-A205-BCF978750D73} = {38E1A429-AC02-4C7A-AF97-338D9FF30A0B} + EndGlobalSection +EndGlobal diff --git a/Chiara/Chiara/Abstractions/IFile.cs b/Chiara/Chiara/Abstractions/IFile.cs new file mode 100644 index 0000000..70ee4ed --- /dev/null +++ b/Chiara/Chiara/Abstractions/IFile.cs @@ -0,0 +1,10 @@ +namespace Chiara.Abstractions; + +public interface IFile +{ + public Guid FileId { get; } + + public string ContentType { get; } + + public Stream OpenRead(); +} diff --git a/Chiara/Chiara/Abstractions/IFileStore.cs b/Chiara/Chiara/Abstractions/IFileStore.cs new file mode 100644 index 0000000..3869954 --- /dev/null +++ b/Chiara/Chiara/Abstractions/IFileStore.cs @@ -0,0 +1,12 @@ +using Chiara.Models; + +namespace Chiara.Abstractions; + +public interface IFileStore +{ + public Task UploadFileAsync(ReadOnlyMemory buffer, string contentType); + + public Task ClarifyLocalFileAsync(string path, string contentType); + + public Task GetFileAsync(Guid guid); +} diff --git a/Chiara/Chiara/Abstractions/IMediaItem.cs b/Chiara/Chiara/Abstractions/IMediaItem.cs new file mode 100644 index 0000000..c37cd05 --- /dev/null +++ b/Chiara/Chiara/Abstractions/IMediaItem.cs @@ -0,0 +1,10 @@ +namespace Chiara.Abstractions; + +public interface IMediaItem +{ + public string Title { get; } + + public string Arist { get; } + + public string Path { get; } +} diff --git a/Chiara/Chiara/Abstractions/IMediaRepositoryScanner.cs b/Chiara/Chiara/Abstractions/IMediaRepositoryScanner.cs new file mode 100644 index 0000000..f14a71b --- /dev/null +++ b/Chiara/Chiara/Abstractions/IMediaRepositoryScanner.cs @@ -0,0 +1,12 @@ +using Chiara.Models; + +namespace Chiara.Abstractions; + +public interface IMediaRepositoryScanner +{ + public Task> ScanAlbumAsync(MediaRepository repository, + CancellationToken cancellationToken = default); + + public Task> ScanShowAsync(MediaRepository repository, + CancellationToken cancellationToken = default); +} diff --git a/Chiara/Chiara/Chiara.csproj b/Chiara/Chiara/Chiara.csproj new file mode 100644 index 0000000..6be5d68 --- /dev/null +++ b/Chiara/Chiara/Chiara.csproj @@ -0,0 +1,34 @@ + + + + net8.0 + enable + enable + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + + + + + + + + + + + diff --git a/Chiara/Chiara/Controllers/AlbumController.cs b/Chiara/Chiara/Controllers/AlbumController.cs new file mode 100644 index 0000000..4241734 --- /dev/null +++ b/Chiara/Chiara/Controllers/AlbumController.cs @@ -0,0 +1,40 @@ +using Chiara.DataTransferObjects; +using Chiara.Models; +using Chiara.Services; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace Chiara.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class AlbumController(ChiaraDbContext dbContext) : ControllerBase +{ + [HttpGet] + [ProducesResponseType>(200)] + public async Task GetAllAlbums() + { + IQueryable albumResponses = from item in dbContext.Albums.AsNoTracking() + select new AlbumResponse(item); + + return Ok(await albumResponses.ToListAsync()); + } + + [HttpGet("{id}")] + [ProducesResponseType(200)] + [ProducesResponseType(404)] + public async Task GetAlbum([FromRoute] int id) + { + Album? album = await (from item in dbContext.Albums.AsNoTracking() + .Include(a => a.Songs) + where item.Id == id + select item).FirstOrDefaultAsync(); + + if (album is null) + { + return NotFound(); + } + + return Ok(new AlbumResponse(album)); + } +} diff --git a/Chiara/Chiara/Controllers/FileController.cs b/Chiara/Chiara/Controllers/FileController.cs new file mode 100644 index 0000000..e52ed72 --- /dev/null +++ b/Chiara/Chiara/Controllers/FileController.cs @@ -0,0 +1,28 @@ +using Chiara.Abstractions; +using Microsoft.AspNetCore.Mvc; + +namespace Chiara.Controllers; + +[Route("api/[controller]")] +[ApiController] +public class FileController(IFileStore fileStore) : ControllerBase +{ + [HttpGet("{key}")] + [ProducesResponseType(200)] + public async Task DownloadFile([FromRoute] string key) + { + if (!Guid.TryParse(key, out Guid guid)) + { + return BadRequest(); + } + + IFile? file = await fileStore.GetFileAsync(guid); + + if (file is null) + { + return NotFound(); + } + + return File(file.OpenRead(), file.ContentType); + } +} diff --git a/Chiara/Chiara/Controllers/HlsController.cs b/Chiara/Chiara/Controllers/HlsController.cs new file mode 100644 index 0000000..2df3b17 --- /dev/null +++ b/Chiara/Chiara/Controllers/HlsController.cs @@ -0,0 +1,152 @@ +using System.Net.Mime; +using Chiara.DataTransferObjects; +using Chiara.Models; +using Chiara.Services; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; + +namespace Chiara.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class HlsController( + FfmpegService ffmpegService, + ChiaraDbContext dbContext, + ILogger logger, + IOptions chiaraOptions) : ControllerBase +{ + private readonly DirectoryInfo _cacheDirectory = new(chiaraOptions.Value.TemporaryDirectory); + + [HttpGet("{file}")] + public IActionResult File([FromRoute] string file) + { + FileInfo fileInfo = new(Path.Combine(_cacheDirectory.FullName, file)); + + if (!fileInfo.Exists) + { + return NotFound(); + } + + if (file.EndsWith("m3u8")) + { + return File(fileInfo.OpenRead(), "application/x-mpegURL"); + } + + if (file.EndsWith("ts")) + { + return File(fileInfo.OpenRead(), "video/MP2T"); + } + + return File(fileInfo.OpenRead(), MediaTypeNames.Text.Plain); + } + + [HttpPost("start/{episodeId}")] + [ProducesResponseType(200)] + [ProducesResponseType(404)] + public async Task Start([FromRoute] int episodeId) + { + Episode? episode = await (from item in dbContext.Episodes.AsNoTracking() + where item.Id == episodeId + select item).FirstOrDefaultAsync(); + + if (episode is null) + { + return NotFound(); + } + + if (ffmpegService.CurrentConversion is not null) + { + logger.LogWarning("Stop running transaction rudely."); + try + { + await ffmpegService.CurrentConversion.RunningTask; + ffmpegService.CurrentConversion = null; + } + catch (Exception e) + { + logger.LogInformation("Stop transaction encounter: {}.", e); + } + } + + logger.LogInformation("Start transaction of {}.", episode.Title); + + FileInfo videoFile = new(episode.Path); + string name = Guid.NewGuid().ToString(); + CancellationTokenSource source = new(); + + VideoConversion conversion = new( + ffmpegService.StartConversion(videoFile, _cacheDirectory, name, source.Token), + _cacheDirectory, + name, + source); + + ffmpegService.CurrentConversion = conversion; + + using PeriodicTimer time = new(TimeSpan.FromSeconds(1)); + + while (!_cacheDirectory.EnumerateFiles().Any(f => f.Name.StartsWith(name))) + { + await time.WaitForNextTickAsync(); + } + + return Ok(new VideoPlayingResponse { PlayList = $"/api/hls/{name}.m3u8" }); + } + + [HttpPost("stop")] + [ProducesResponseType(200)] + public async Task Stop() + { + if (ffmpegService.CurrentConversion is null || ffmpegService.CurrentConversion.RunningTask.IsCanceled) + { + if (ffmpegService.CurrentConversion is not null) + { + logger.LogInformation("Stop finished video transaction."); + try + { + await ffmpegService.CurrentConversion.RunningTask; + } + catch (Exception e) + { + logger.LogInformation("Video encounter: {}.", e); + } + + ffmpegService.CurrentConversion = null; + } + + return Ok(); + } + + logger.LogInformation("Stop running video transaction."); + await ffmpegService.CurrentConversion.CancellationTokenSource.CancelAsync(); + + try + { + await ffmpegService.CurrentConversion.RunningTask; + ffmpegService.CurrentConversion = null; + } + catch (Exception e) + { + logger.LogInformation("Video encounter: {}.", e); + } + + ClearCacheDirectory(); + + return Ok(); + } + + private void ClearCacheDirectory() + { + IEnumerable temporaryFiles = from file in _cacheDirectory.EnumerateFiles() + where file.Extension is ".m3u8" or ".ts" + select file; + + foreach (FileInfo file in temporaryFiles) + { + if (file.Exists) + { + file.Delete(); + } + } + } +} diff --git a/Chiara/Chiara/Controllers/MediaRepositoryController.cs b/Chiara/Chiara/Controllers/MediaRepositoryController.cs new file mode 100644 index 0000000..8206d5e --- /dev/null +++ b/Chiara/Chiara/Controllers/MediaRepositoryController.cs @@ -0,0 +1,74 @@ +using Chiara.DataTransferObjects; +using Chiara.Models; +using Chiara.Services; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace Chiara.Controllers; + +[Route("api/[controller]")] +[ApiController] +public class MediaRepositoryController(RefreshService refreshService, ChiaraDbContext dbContext) : ControllerBase +{ + [HttpGet] + [ProducesResponseType>(200)] + public async Task ListRepositories() + { + return Ok(await (from item in dbContext.Repositories.AsNoTracking() + select new MediaRepositoryResponse(item)).ToListAsync()); + } + + [HttpGet("{id}")] + [ProducesResponseType(200)] + [ProducesResponseType(404)] + public async Task GetRepository([FromRoute] int id) + { + MediaRepository? repository = await (from item in dbContext.Repositories.AsNoTracking() + .Include(m => m.Albums) + .Include(m => m.Seasons) + where item.Id == id + select item).FirstOrDefaultAsync(); + + if (repository is null) + { + return NotFound(); + } + + return Ok(new MediaRepositoryResponse(repository)); + } + + [HttpPost] + [ProducesResponseType(201)] + public async Task CreateRepository([FromBody] CreateMediaRepositoryRequest request) + { + MediaRepository repository = new() { Name = request.Name, Path = request.Path }; + + await dbContext.Repositories.AddAsync(repository); + await dbContext.SaveChangesAsync(); + + return Created($"api/MediaRepository/{repository.Id}", new MediaRepositoryResponse(repository)); + } + + [HttpPost("{id}")] + [ProducesResponseType(200)] + [ProducesResponseType(404)] + public async Task RefreshRepository([FromRoute] int id) + { + IQueryable mediaRepositoryQuery = from item in dbContext.Repositories + .Include(m => m.Albums) + .Include(m => m.Seasons) + where item.Id == id + select item; + + MediaRepository? repository = await mediaRepositoryQuery.FirstOrDefaultAsync(); + + if (repository is null) + { + return NotFound(); + } + + await refreshService.Refresh(repository); + + return Ok(new MediaRepositoryResponse(await mediaRepositoryQuery.AsNoTracking().FirstAsync())); + } +} diff --git a/Chiara/Chiara/Controllers/SeasonController.cs b/Chiara/Chiara/Controllers/SeasonController.cs new file mode 100644 index 0000000..43f9e16 --- /dev/null +++ b/Chiara/Chiara/Controllers/SeasonController.cs @@ -0,0 +1,38 @@ +using Chiara.DataTransferObjects; +using Chiara.Services; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace Chiara.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class SeasonController(ChiaraDbContext dbContext) : ControllerBase +{ + [HttpGet] + [ProducesResponseType>(200)] + public async Task ListSeasons() + { + return Ok(await (from item in dbContext.Seasons.AsNoTracking() + select new ShowSeasonResponse(item)).ToListAsync()); + } + + [HttpGet("{id}")] + [ProducesResponseType(200)] + [ProducesResponseType(404)] + public async Task GetSeason([FromRoute] int id) + { + ShowSeasonResponse? response = await (from item in dbContext.Seasons.AsNoTracking() + .Include(s => s.Episodes + .OrderBy(e => e.EpisodeNumber)) + where item.Id == id + select new ShowSeasonResponse(item)).FirstOrDefaultAsync(); + + if (response is null) + { + return NotFound(); + } + + return Ok(response); + } +} diff --git a/Chiara/Chiara/Controllers/SongController.cs b/Chiara/Chiara/Controllers/SongController.cs new file mode 100644 index 0000000..559269b --- /dev/null +++ b/Chiara/Chiara/Controllers/SongController.cs @@ -0,0 +1,39 @@ +using Chiara.DataTransferObjects; +using Chiara.Models; +using Chiara.Services; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace Chiara.Controllers; + +[Route("api/[controller]")] +[ApiController] +public class SongController(ChiaraDbContext dbContext) : ControllerBase +{ + [HttpGet] + [ProducesResponseType>(200)] + public IActionResult ListSongs() + { + IEnumerable response = from item in dbContext.Songs.AsNoTracking() + select new SongResponse(item); + + return Ok(response); + } + + [HttpGet("{id}")] + [ProducesResponseType(200)] + [ProducesResponseType(404)] + public async Task GetSong([FromRoute] int id) + { + Song? song = await (from item in dbContext.Songs.AsNoTracking() + where item.Id == id + select item).FirstOrDefaultAsync(); + + if (song is null) + { + return NotFound(); + } + + return Ok(new SongResponse(song)); + } +} diff --git a/Chiara/Chiara/DataTransferObjects/AlbumResponse.cs b/Chiara/Chiara/DataTransferObjects/AlbumResponse.cs new file mode 100644 index 0000000..2a169fc --- /dev/null +++ b/Chiara/Chiara/DataTransferObjects/AlbumResponse.cs @@ -0,0 +1,36 @@ +using System.ComponentModel.DataAnnotations; +using Chiara.Models; + +namespace Chiara.DataTransferObjects; + +public class AlbumResponse +{ + [Required] + public int Id { get; set; } + + [Required] + public string Title { get; set; } = string.Empty; + + [Required] + public string Arist { get; set; } = string.Empty; + + [Required] + public string CoverImageUrl { get; set; } = string.Empty; + + [Required] + public List Songs { get; set; } = []; + + public AlbumResponse() + { + + } + + public AlbumResponse(Album album) + { + Id = album.Id; + Title = album.Title; + Arist = album.Arist; + CoverImageUrl = album.CoverImageUrl; + Songs = album.Songs.Select(s => new SongResponse(s)).ToList(); + } +} diff --git a/Chiara/Chiara/DataTransferObjects/CreateMediaRepositoryRequest.cs b/Chiara/Chiara/DataTransferObjects/CreateMediaRepositoryRequest.cs new file mode 100644 index 0000000..ebcef03 --- /dev/null +++ b/Chiara/Chiara/DataTransferObjects/CreateMediaRepositoryRequest.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Chiara.DataTransferObjects; + +public class CreateMediaRepositoryRequest +{ + [Required] + public string Name { get; set; } = string.Empty; + + [Required] + public string Path { get; set; } = string.Empty; +} diff --git a/Chiara/Chiara/DataTransferObjects/EpisodeResponse.cs b/Chiara/Chiara/DataTransferObjects/EpisodeResponse.cs new file mode 100644 index 0000000..249ed46 --- /dev/null +++ b/Chiara/Chiara/DataTransferObjects/EpisodeResponse.cs @@ -0,0 +1,32 @@ +using System.ComponentModel.DataAnnotations; +using Chiara.Models; + +namespace Chiara.DataTransferObjects; + +public class EpisodeResponse +{ + [Required] + public int Id { get; set; } + + [Required] + public string Title { get; set; } = string.Empty; + + [Required] + public string EpisodeNumber { get; set; } = string.Empty; + + [Required] + public int ShowSeasonId { get; set; } + + public EpisodeResponse() + { + + } + + public EpisodeResponse(Episode episode) + { + Id = episode.Id; + Title = episode.Title; + EpisodeNumber = episode.EpisodeNumber; + ShowSeasonId = episode.ShowSeasonId; + } +} diff --git a/Chiara/Chiara/DataTransferObjects/MediaRepositoryResponse.cs b/Chiara/Chiara/DataTransferObjects/MediaRepositoryResponse.cs new file mode 100644 index 0000000..c6d5421 --- /dev/null +++ b/Chiara/Chiara/DataTransferObjects/MediaRepositoryResponse.cs @@ -0,0 +1,30 @@ +using Chiara.Models; + +namespace Chiara.DataTransferObjects; + +public class MediaRepositoryResponse +{ + public int Id { get; set; } + + public string Path { get; set; } = string.Empty; + + public string Name { get; set; } = string.Empty; + + public List AlbumResponses { get; set; } = []; + + public List ShowSeasonResponses { get; set; } = []; + + public MediaRepositoryResponse() + { + + } + + public MediaRepositoryResponse(MediaRepository repository) + { + Id = repository.Id; + Path = repository.Path; + Name = repository.Name; + AlbumResponses.AddRange(repository.Albums.Select(a => new AlbumResponse(a))); + ShowSeasonResponses.AddRange(repository.Seasons.Select(s => new ShowSeasonResponse(s))); + } +} diff --git a/Chiara/Chiara/DataTransferObjects/ShowSeasonResponse.cs b/Chiara/Chiara/DataTransferObjects/ShowSeasonResponse.cs new file mode 100644 index 0000000..120504f --- /dev/null +++ b/Chiara/Chiara/DataTransferObjects/ShowSeasonResponse.cs @@ -0,0 +1,28 @@ +using System.ComponentModel.DataAnnotations; +using Chiara.Models; + +namespace Chiara.DataTransferObjects; + +public class ShowSeasonResponse +{ + [Required] + public int Id { get; set; } + + [Required] + public string Title { get; set; } = string.Empty; + + [Required] + public List Episodes { get; set; } = []; + + public ShowSeasonResponse() + { + + } + + public ShowSeasonResponse(ShowSeason showSeason) + { + Id = showSeason.Id; + Title = showSeason.Title; + Episodes.AddRange(showSeason.Episodes.Select(e => new EpisodeResponse(e))); + } +} diff --git a/Chiara/Chiara/DataTransferObjects/SongResponse.cs b/Chiara/Chiara/DataTransferObjects/SongResponse.cs new file mode 100644 index 0000000..fd8f73a --- /dev/null +++ b/Chiara/Chiara/DataTransferObjects/SongResponse.cs @@ -0,0 +1,36 @@ +using System.ComponentModel.DataAnnotations; +using Chiara.Models; + +namespace Chiara.DataTransferObjects; + +public class SongResponse +{ + [Required] + public int Id { get; set; } + + [Required] + public string Title { get; set; } = string.Empty; + + [Required] + public string Arist { get; set; } = string.Empty; + + [Required] + public string CoverImageUrl { get; set; } = string.Empty; + + [Required] + public string Url { get; set; } = string.Empty; + + public SongResponse() + { + + } + + public SongResponse(Song song) + { + Id = song.Id; + Title = song.Title; + Arist = song.Arist; + CoverImageUrl = song.CoverImageUrl; + Url = song.Url; + } +} diff --git a/Chiara/Chiara/DataTransferObjects/VideoPlayingResponse.cs b/Chiara/Chiara/DataTransferObjects/VideoPlayingResponse.cs new file mode 100644 index 0000000..02bfe69 --- /dev/null +++ b/Chiara/Chiara/DataTransferObjects/VideoPlayingResponse.cs @@ -0,0 +1,9 @@ +using System.ComponentModel.DataAnnotations; + +namespace Chiara.DataTransferObjects; + +public class VideoPlayingResponse +{ + [Required] + public string PlayList { get; set; } = string.Empty; +} diff --git a/Chiara/Chiara/Dockerfile b/Chiara/Chiara/Dockerfile new file mode 100644 index 0000000..a7b086f --- /dev/null +++ b/Chiara/Chiara/Dockerfile @@ -0,0 +1,8 @@ +FROM mcr.microsoft.com/dotnet/aspnet:8.0 + +RUN sed -i "s?http://deb.debian.org?https://mirrors.cernet.edu.cn?g" /etc/apt/sources.list.d/debian.sources +RUN apt update && apt upgrade -y && apt install -y ffmpeg + +WORKDIR /App +COPY bin/Release/net8.0/publish /App +ENTRYPOINT ["dotnet", "/App/Chiara.dll"] diff --git a/Chiara/Chiara/Extensions/ServiceCollectionExtensions.cs b/Chiara/Chiara/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..e5afb34 --- /dev/null +++ b/Chiara/Chiara/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,19 @@ +using Chiara.Abstractions; +using Chiara.Services; + +namespace Chiara.Extensions; + +public static class ServiceCollectionExtensions +{ + public static void AddChiaraService(this IServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(provider => provider.GetRequiredService()); + serviceCollection.AddTransient(); + serviceCollection.AddTransient(); + serviceCollection.AddHostedService(); + serviceCollection.AddHostedService(provider => provider.GetRequiredService()); + serviceCollection.AddSingleton(); + } +} diff --git a/Chiara/Chiara/Extensions/WebApplicationBuilderExtensions.cs b/Chiara/Chiara/Extensions/WebApplicationBuilderExtensions.cs new file mode 100644 index 0000000..a20690b --- /dev/null +++ b/Chiara/Chiara/Extensions/WebApplicationBuilderExtensions.cs @@ -0,0 +1,12 @@ +using Chiara.Models; + +namespace Chiara.Extensions; + +public static class WebApplicationBuilderExtensions +{ + public static WebApplicationBuilder AddChiaraOptions(this WebApplicationBuilder builder) + { + builder.Services.Configure(builder.Configuration.GetSection(ChiaraOptions.OptionName)); + return builder; + } +} diff --git a/Chiara/Chiara/Migrations/20240521123215_CreateDatabase.Designer.cs b/Chiara/Chiara/Migrations/20240521123215_CreateDatabase.Designer.cs new file mode 100644 index 0000000..dc02fcf --- /dev/null +++ b/Chiara/Chiara/Migrations/20240521123215_CreateDatabase.Designer.cs @@ -0,0 +1,58 @@ +// +using Chiara.Services; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Chiara.Migrations +{ + [DbContext(typeof(ChiaraDbContext))] + [Migration("20240521123215_CreateDatabase")] + partial class CreateDatabase + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Author") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Url") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Songs"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Chiara/Chiara/Migrations/20240521123215_CreateDatabase.cs b/Chiara/Chiara/Migrations/20240521123215_CreateDatabase.cs new file mode 100644 index 0000000..9752519 --- /dev/null +++ b/Chiara/Chiara/Migrations/20240521123215_CreateDatabase.cs @@ -0,0 +1,38 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Chiara.Migrations +{ + /// + public partial class CreateDatabase : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Songs", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Title = table.Column(type: "text", nullable: false), + Author = table.Column(type: "text", nullable: false), + Url = table.Column(type: "text", nullable: false), + CoverImageUrl = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Songs", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Songs"); + } + } +} diff --git a/Chiara/Chiara/Migrations/20240529140720_AddAlbum.Designer.cs b/Chiara/Chiara/Migrations/20240529140720_AddAlbum.Designer.cs new file mode 100644 index 0000000..136c375 --- /dev/null +++ b/Chiara/Chiara/Migrations/20240529140720_AddAlbum.Designer.cs @@ -0,0 +1,131 @@ +// +using System; +using Chiara.Services; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Chiara.Migrations +{ + [DbContext(typeof(ChiaraDbContext))] + [Migration("20240529140720_AddAlbum")] + partial class AddAlbum + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Albums"); + }); + + modelBuilder.Entity("Chiara.Models.DatabaseFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Content") + .IsRequired() + .HasColumnType("bytea"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("text"); + + b.Property("ForeignId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ForeignId"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AlbumId") + .HasColumnType("integer"); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("AlbumId"); + + b.ToTable("Songs"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.HasOne("Chiara.Models.Album", "Album") + .WithMany("Songs") + .HasForeignKey("AlbumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Album"); + }); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Navigation("Songs"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Chiara/Chiara/Migrations/20240529140720_AddAlbum.cs b/Chiara/Chiara/Migrations/20240529140720_AddAlbum.cs new file mode 100644 index 0000000..dcf8018 --- /dev/null +++ b/Chiara/Chiara/Migrations/20240529140720_AddAlbum.cs @@ -0,0 +1,113 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Chiara.Migrations +{ + /// + public partial class AddAlbum : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "Url", + table: "Songs", + newName: "Path"); + + migrationBuilder.RenameColumn( + name: "Author", + table: "Songs", + newName: "Arist"); + + migrationBuilder.AddColumn( + name: "AlbumId", + table: "Songs", + type: "integer", + nullable: false, + defaultValue: 0); + + migrationBuilder.CreateTable( + name: "Albums", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Title = table.Column(type: "text", nullable: false), + Arist = table.Column(type: "text", nullable: false), + Path = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Albums", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Files", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + ForeignId = table.Column(type: "uuid", nullable: false), + Content = table.Column(type: "bytea", nullable: false), + ContentType = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Files", x => x.Id); + }); + + migrationBuilder.CreateIndex( + name: "IX_Songs_AlbumId", + table: "Songs", + column: "AlbumId"); + + migrationBuilder.CreateIndex( + name: "IX_Files_ForeignId", + table: "Files", + column: "ForeignId"); + + migrationBuilder.AddForeignKey( + name: "FK_Songs_Albums_AlbumId", + table: "Songs", + column: "AlbumId", + principalTable: "Albums", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Songs_Albums_AlbumId", + table: "Songs"); + + migrationBuilder.DropTable( + name: "Albums"); + + migrationBuilder.DropTable( + name: "Files"); + + migrationBuilder.DropIndex( + name: "IX_Songs_AlbumId", + table: "Songs"); + + migrationBuilder.DropColumn( + name: "AlbumId", + table: "Songs"); + + migrationBuilder.RenameColumn( + name: "Path", + table: "Songs", + newName: "Url"); + + migrationBuilder.RenameColumn( + name: "Arist", + table: "Songs", + newName: "Author"); + } + } +} diff --git a/Chiara/Chiara/Migrations/20240530030313_AddSongUrl.Designer.cs b/Chiara/Chiara/Migrations/20240530030313_AddSongUrl.Designer.cs new file mode 100644 index 0000000..da4394c --- /dev/null +++ b/Chiara/Chiara/Migrations/20240530030313_AddSongUrl.Designer.cs @@ -0,0 +1,135 @@ +// +using System; +using Chiara.Services; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Chiara.Migrations +{ + [DbContext(typeof(ChiaraDbContext))] + [Migration("20240530030313_AddSongUrl")] + partial class AddSongUrl + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Albums"); + }); + + modelBuilder.Entity("Chiara.Models.DatabaseFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Content") + .IsRequired() + .HasColumnType("bytea"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("text"); + + b.Property("ForeignId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ForeignId"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AlbumId") + .HasColumnType("integer"); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Url") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("AlbumId"); + + b.ToTable("Songs"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.HasOne("Chiara.Models.Album", "Album") + .WithMany("Songs") + .HasForeignKey("AlbumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Album"); + }); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Navigation("Songs"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Chiara/Chiara/Migrations/20240530030313_AddSongUrl.cs b/Chiara/Chiara/Migrations/20240530030313_AddSongUrl.cs new file mode 100644 index 0000000..796c3ed --- /dev/null +++ b/Chiara/Chiara/Migrations/20240530030313_AddSongUrl.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Chiara.Migrations +{ + /// + public partial class AddSongUrl : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "Url", + table: "Songs", + type: "text", + nullable: false, + defaultValue: ""); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Url", + table: "Songs"); + } + } +} diff --git a/Chiara/Chiara/Migrations/20240601063131_UnifyFile.Designer.cs b/Chiara/Chiara/Migrations/20240601063131_UnifyFile.Designer.cs new file mode 100644 index 0000000..17f0266 --- /dev/null +++ b/Chiara/Chiara/Migrations/20240601063131_UnifyFile.Designer.cs @@ -0,0 +1,135 @@ +// +using System; +using Chiara.Services; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Chiara.Migrations +{ + [DbContext(typeof(ChiaraDbContext))] + [Migration("20240601063131_UnifyFile")] + partial class UnifyFile + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Albums"); + }); + + modelBuilder.Entity("Chiara.Models.DatabaseFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Content") + .IsRequired() + .HasColumnType("bytea"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("text"); + + b.Property("FileId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("FileId"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AlbumId") + .HasColumnType("integer"); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Url") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("AlbumId"); + + b.ToTable("Songs"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.HasOne("Chiara.Models.Album", "Album") + .WithMany("Songs") + .HasForeignKey("AlbumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Album"); + }); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Navigation("Songs"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Chiara/Chiara/Migrations/20240601063131_UnifyFile.cs b/Chiara/Chiara/Migrations/20240601063131_UnifyFile.cs new file mode 100644 index 0000000..ff092a5 --- /dev/null +++ b/Chiara/Chiara/Migrations/20240601063131_UnifyFile.cs @@ -0,0 +1,38 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Chiara.Migrations +{ + /// + public partial class UnifyFile : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "ForeignId", + table: "Files", + newName: "FileId"); + + migrationBuilder.RenameIndex( + name: "IX_Files_ForeignId", + table: "Files", + newName: "IX_Files_FileId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "FileId", + table: "Files", + newName: "ForeignId"); + + migrationBuilder.RenameIndex( + name: "IX_Files_FileId", + table: "Files", + newName: "IX_Files_ForeignId"); + } + } +} diff --git a/Chiara/Chiara/Migrations/20240601065653_AlbumCoverImageUrl.Designer.cs b/Chiara/Chiara/Migrations/20240601065653_AlbumCoverImageUrl.Designer.cs new file mode 100644 index 0000000..ed0bf36 --- /dev/null +++ b/Chiara/Chiara/Migrations/20240601065653_AlbumCoverImageUrl.Designer.cs @@ -0,0 +1,139 @@ +// +using System; +using Chiara.Services; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Chiara.Migrations +{ + [DbContext(typeof(ChiaraDbContext))] + [Migration("20240601065653_AlbumCoverImageUrl")] + partial class AlbumCoverImageUrl + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Albums"); + }); + + modelBuilder.Entity("Chiara.Models.DatabaseFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Content") + .IsRequired() + .HasColumnType("bytea"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("text"); + + b.Property("FileId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("FileId"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AlbumId") + .HasColumnType("integer"); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Url") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("AlbumId"); + + b.ToTable("Songs"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.HasOne("Chiara.Models.Album", "Album") + .WithMany("Songs") + .HasForeignKey("AlbumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Album"); + }); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Navigation("Songs"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Chiara/Chiara/Migrations/20240601065653_AlbumCoverImageUrl.cs b/Chiara/Chiara/Migrations/20240601065653_AlbumCoverImageUrl.cs new file mode 100644 index 0000000..638c89e --- /dev/null +++ b/Chiara/Chiara/Migrations/20240601065653_AlbumCoverImageUrl.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Chiara.Migrations +{ + /// + public partial class AlbumCoverImageUrl : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "CoverImageUrl", + table: "Albums", + type: "text", + nullable: false, + defaultValue: ""); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "CoverImageUrl", + table: "Albums"); + } + } +} diff --git a/Chiara/Chiara/Migrations/20240607080833_AddHashValue.Designer.cs b/Chiara/Chiara/Migrations/20240607080833_AddHashValue.Designer.cs new file mode 100644 index 0000000..154529b --- /dev/null +++ b/Chiara/Chiara/Migrations/20240607080833_AddHashValue.Designer.cs @@ -0,0 +1,144 @@ +// +using System; +using Chiara.Services; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Chiara.Migrations +{ + [DbContext(typeof(ChiaraDbContext))] + [Migration("20240607080833_AddHashValue")] + partial class AddHashValue + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Albums"); + }); + + modelBuilder.Entity("Chiara.Models.DatabaseFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Content") + .IsRequired() + .HasColumnType("bytea"); + + b.Property("ContentType") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("FileId") + .HasColumnType("uuid"); + + b.Property("HashValue") + .IsRequired() + .HasColumnType("bytea"); + + b.HasKey("Id"); + + b.HasIndex("FileId"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AlbumId") + .HasColumnType("integer"); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Url") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("AlbumId"); + + b.ToTable("Songs"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.HasOne("Chiara.Models.Album", "Album") + .WithMany("Songs") + .HasForeignKey("AlbumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Album"); + }); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Navigation("Songs"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Chiara/Chiara/Migrations/20240607080833_AddHashValue.cs b/Chiara/Chiara/Migrations/20240607080833_AddHashValue.cs new file mode 100644 index 0000000..77bfd2c --- /dev/null +++ b/Chiara/Chiara/Migrations/20240607080833_AddHashValue.cs @@ -0,0 +1,47 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Chiara.Migrations +{ + /// + public partial class AddHashValue : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "ContentType", + table: "Files", + type: "character varying(20)", + maxLength: 20, + nullable: false, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AddColumn( + name: "HashValue", + table: "Files", + type: "bytea", + nullable: false, + defaultValue: new byte[0]); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "HashValue", + table: "Files"); + + migrationBuilder.AlterColumn( + name: "ContentType", + table: "Files", + type: "text", + nullable: false, + oldClrType: typeof(string), + oldType: "character varying(20)", + oldMaxLength: 20); + } + } +} diff --git a/Chiara/Chiara/Migrations/20240608144941_ShowSeasonAndEpisodeAndMediaRepository.Designer.cs b/Chiara/Chiara/Migrations/20240608144941_ShowSeasonAndEpisodeAndMediaRepository.Designer.cs new file mode 100644 index 0000000..77db573 --- /dev/null +++ b/Chiara/Chiara/Migrations/20240608144941_ShowSeasonAndEpisodeAndMediaRepository.Designer.cs @@ -0,0 +1,275 @@ +// +using System; +using Chiara.Services; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Chiara.Migrations +{ + [DbContext(typeof(ChiaraDbContext))] + [Migration("20240608144941_ShowSeasonAndEpisodeAndMediaRepository")] + partial class ShowSeasonAndEpisodeAndMediaRepository + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("ParentRepositoryId") + .HasColumnType("integer"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ParentRepositoryId"); + + b.ToTable("Albums"); + }); + + modelBuilder.Entity("Chiara.Models.DatabaseFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Content") + .IsRequired() + .HasColumnType("bytea"); + + b.Property("ContentType") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("FileId") + .HasColumnType("uuid"); + + b.Property("HashValue") + .IsRequired() + .HasColumnType("bytea"); + + b.HasKey("Id"); + + b.HasIndex("FileId"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("Chiara.Models.Episode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("ShowSeasonId") + .HasColumnType("integer"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ShowSeasonId"); + + b.ToTable("Episodes"); + }); + + modelBuilder.Entity("Chiara.Models.MediaRepository", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Repositories"); + }); + + modelBuilder.Entity("Chiara.Models.ShowSeason", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("ParentRepositoryId") + .HasColumnType("integer"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ParentRepositoryId"); + + b.ToTable("Seasons"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AlbumId") + .HasColumnType("integer"); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Url") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("AlbumId"); + + b.ToTable("Songs"); + }); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.HasOne("Chiara.Models.MediaRepository", "ParentRepository") + .WithMany("Albums") + .HasForeignKey("ParentRepositoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ParentRepository"); + }); + + modelBuilder.Entity("Chiara.Models.Episode", b => + { + b.HasOne("Chiara.Models.ShowSeason", "Season") + .WithMany("Episodes") + .HasForeignKey("ShowSeasonId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Season"); + }); + + modelBuilder.Entity("Chiara.Models.ShowSeason", b => + { + b.HasOne("Chiara.Models.MediaRepository", "ParentRepository") + .WithMany("Seasons") + .HasForeignKey("ParentRepositoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ParentRepository"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.HasOne("Chiara.Models.Album", "Album") + .WithMany("Songs") + .HasForeignKey("AlbumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Album"); + }); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Navigation("Songs"); + }); + + modelBuilder.Entity("Chiara.Models.MediaRepository", b => + { + b.Navigation("Albums"); + + b.Navigation("Seasons"); + }); + + modelBuilder.Entity("Chiara.Models.ShowSeason", b => + { + b.Navigation("Episodes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Chiara/Chiara/Migrations/20240608144941_ShowSeasonAndEpisodeAndMediaRepository.cs b/Chiara/Chiara/Migrations/20240608144941_ShowSeasonAndEpisodeAndMediaRepository.cs new file mode 100644 index 0000000..ceef58d --- /dev/null +++ b/Chiara/Chiara/Migrations/20240608144941_ShowSeasonAndEpisodeAndMediaRepository.cs @@ -0,0 +1,128 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Chiara.Migrations +{ + /// + public partial class ShowSeasonAndEpisodeAndMediaRepository : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ParentRepositoryId", + table: "Albums", + type: "integer", + nullable: false, + defaultValue: 0); + + migrationBuilder.CreateTable( + name: "Repositories", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column(type: "text", nullable: false), + Path = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Repositories", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Seasons", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Title = table.Column(type: "text", nullable: false), + Arist = table.Column(type: "text", nullable: false), + Path = table.Column(type: "text", nullable: false), + ParentRepositoryId = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Seasons", x => x.Id); + table.ForeignKey( + name: "FK_Seasons_Repositories_ParentRepositoryId", + column: x => x.ParentRepositoryId, + principalTable: "Repositories", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Episodes", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Title = table.Column(type: "text", nullable: false), + Arist = table.Column(type: "text", nullable: false), + Path = table.Column(type: "text", nullable: false), + ShowSeasonId = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Episodes", x => x.Id); + table.ForeignKey( + name: "FK_Episodes_Seasons_ShowSeasonId", + column: x => x.ShowSeasonId, + principalTable: "Seasons", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Albums_ParentRepositoryId", + table: "Albums", + column: "ParentRepositoryId"); + + migrationBuilder.CreateIndex( + name: "IX_Episodes_ShowSeasonId", + table: "Episodes", + column: "ShowSeasonId"); + + migrationBuilder.CreateIndex( + name: "IX_Seasons_ParentRepositoryId", + table: "Seasons", + column: "ParentRepositoryId"); + + migrationBuilder.AddForeignKey( + name: "FK_Albums_Repositories_ParentRepositoryId", + table: "Albums", + column: "ParentRepositoryId", + principalTable: "Repositories", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Albums_Repositories_ParentRepositoryId", + table: "Albums"); + + migrationBuilder.DropTable( + name: "Episodes"); + + migrationBuilder.DropTable( + name: "Seasons"); + + migrationBuilder.DropTable( + name: "Repositories"); + + migrationBuilder.DropIndex( + name: "IX_Albums_ParentRepositoryId", + table: "Albums"); + + migrationBuilder.DropColumn( + name: "ParentRepositoryId", + table: "Albums"); + } + } +} diff --git a/Chiara/Chiara/Migrations/20240609065607_AddEpisodeNumber.Designer.cs b/Chiara/Chiara/Migrations/20240609065607_AddEpisodeNumber.Designer.cs new file mode 100644 index 0000000..6693253 --- /dev/null +++ b/Chiara/Chiara/Migrations/20240609065607_AddEpisodeNumber.Designer.cs @@ -0,0 +1,278 @@ +// +using System; +using Chiara.Services; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Chiara.Migrations +{ + [DbContext(typeof(ChiaraDbContext))] + [Migration("20240609065607_AddEpisodeNumber")] + partial class AddEpisodeNumber + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("ParentRepositoryId") + .HasColumnType("integer"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ParentRepositoryId"); + + b.ToTable("Albums"); + }); + + modelBuilder.Entity("Chiara.Models.DatabaseFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Content") + .IsRequired() + .HasColumnType("bytea"); + + b.Property("ContentType") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("FileId") + .HasColumnType("uuid"); + + b.Property("HashValue") + .IsRequired() + .HasColumnType("bytea"); + + b.HasKey("Id"); + + b.HasIndex("FileId"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("Chiara.Models.Episode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("EpisodeNumber") + .HasColumnType("integer"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("ShowSeasonId") + .HasColumnType("integer"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ShowSeasonId"); + + b.ToTable("Episodes"); + }); + + modelBuilder.Entity("Chiara.Models.MediaRepository", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Repositories"); + }); + + modelBuilder.Entity("Chiara.Models.ShowSeason", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("ParentRepositoryId") + .HasColumnType("integer"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ParentRepositoryId"); + + b.ToTable("Seasons"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AlbumId") + .HasColumnType("integer"); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Url") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("AlbumId"); + + b.ToTable("Songs"); + }); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.HasOne("Chiara.Models.MediaRepository", "ParentRepository") + .WithMany("Albums") + .HasForeignKey("ParentRepositoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ParentRepository"); + }); + + modelBuilder.Entity("Chiara.Models.Episode", b => + { + b.HasOne("Chiara.Models.ShowSeason", "Season") + .WithMany("Episodes") + .HasForeignKey("ShowSeasonId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Season"); + }); + + modelBuilder.Entity("Chiara.Models.ShowSeason", b => + { + b.HasOne("Chiara.Models.MediaRepository", "ParentRepository") + .WithMany("Seasons") + .HasForeignKey("ParentRepositoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ParentRepository"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.HasOne("Chiara.Models.Album", "Album") + .WithMany("Songs") + .HasForeignKey("AlbumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Album"); + }); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Navigation("Songs"); + }); + + modelBuilder.Entity("Chiara.Models.MediaRepository", b => + { + b.Navigation("Albums"); + + b.Navigation("Seasons"); + }); + + modelBuilder.Entity("Chiara.Models.ShowSeason", b => + { + b.Navigation("Episodes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Chiara/Chiara/Migrations/20240609065607_AddEpisodeNumber.cs b/Chiara/Chiara/Migrations/20240609065607_AddEpisodeNumber.cs new file mode 100644 index 0000000..13a4494 --- /dev/null +++ b/Chiara/Chiara/Migrations/20240609065607_AddEpisodeNumber.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Chiara.Migrations +{ + /// + public partial class AddEpisodeNumber : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "EpisodeNumber", + table: "Episodes", + type: "integer", + nullable: false, + defaultValue: 0); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "EpisodeNumber", + table: "Episodes"); + } + } +} diff --git a/Chiara/Chiara/Migrations/20240611062733_UpdateEpisodeType.Designer.cs b/Chiara/Chiara/Migrations/20240611062733_UpdateEpisodeType.Designer.cs new file mode 100644 index 0000000..80c42e0 --- /dev/null +++ b/Chiara/Chiara/Migrations/20240611062733_UpdateEpisodeType.Designer.cs @@ -0,0 +1,279 @@ +// +using System; +using Chiara.Services; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Chiara.Migrations +{ + [DbContext(typeof(ChiaraDbContext))] + [Migration("20240611062733_UpdateEpisodeType")] + partial class UpdateEpisodeType + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("ParentRepositoryId") + .HasColumnType("integer"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ParentRepositoryId"); + + b.ToTable("Albums"); + }); + + modelBuilder.Entity("Chiara.Models.DatabaseFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Content") + .IsRequired() + .HasColumnType("bytea"); + + b.Property("ContentType") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("FileId") + .HasColumnType("uuid"); + + b.Property("HashValue") + .IsRequired() + .HasColumnType("bytea"); + + b.HasKey("Id"); + + b.HasIndex("FileId"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("Chiara.Models.Episode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("EpisodeNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("ShowSeasonId") + .HasColumnType("integer"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ShowSeasonId"); + + b.ToTable("Episodes"); + }); + + modelBuilder.Entity("Chiara.Models.MediaRepository", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Repositories"); + }); + + modelBuilder.Entity("Chiara.Models.ShowSeason", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("ParentRepositoryId") + .HasColumnType("integer"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ParentRepositoryId"); + + b.ToTable("Seasons"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AlbumId") + .HasColumnType("integer"); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Url") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("AlbumId"); + + b.ToTable("Songs"); + }); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.HasOne("Chiara.Models.MediaRepository", "ParentRepository") + .WithMany("Albums") + .HasForeignKey("ParentRepositoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ParentRepository"); + }); + + modelBuilder.Entity("Chiara.Models.Episode", b => + { + b.HasOne("Chiara.Models.ShowSeason", "Season") + .WithMany("Episodes") + .HasForeignKey("ShowSeasonId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Season"); + }); + + modelBuilder.Entity("Chiara.Models.ShowSeason", b => + { + b.HasOne("Chiara.Models.MediaRepository", "ParentRepository") + .WithMany("Seasons") + .HasForeignKey("ParentRepositoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ParentRepository"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.HasOne("Chiara.Models.Album", "Album") + .WithMany("Songs") + .HasForeignKey("AlbumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Album"); + }); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Navigation("Songs"); + }); + + modelBuilder.Entity("Chiara.Models.MediaRepository", b => + { + b.Navigation("Albums"); + + b.Navigation("Seasons"); + }); + + modelBuilder.Entity("Chiara.Models.ShowSeason", b => + { + b.Navigation("Episodes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Chiara/Chiara/Migrations/20240611062733_UpdateEpisodeType.cs b/Chiara/Chiara/Migrations/20240611062733_UpdateEpisodeType.cs new file mode 100644 index 0000000..1ccb964 --- /dev/null +++ b/Chiara/Chiara/Migrations/20240611062733_UpdateEpisodeType.cs @@ -0,0 +1,34 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Chiara.Migrations +{ + /// + public partial class UpdateEpisodeType : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "EpisodeNumber", + table: "Episodes", + type: "text", + nullable: false, + oldClrType: typeof(int), + oldType: "integer"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "EpisodeNumber", + table: "Episodes", + type: "integer", + nullable: false, + oldClrType: typeof(string), + oldType: "text"); + } + } +} diff --git a/Chiara/Chiara/Migrations/ChiaraDbContextModelSnapshot.cs b/Chiara/Chiara/Migrations/ChiaraDbContextModelSnapshot.cs new file mode 100644 index 0000000..2bf7ddf --- /dev/null +++ b/Chiara/Chiara/Migrations/ChiaraDbContextModelSnapshot.cs @@ -0,0 +1,276 @@ +// +using System; +using Chiara.Services; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Chiara.Migrations +{ + [DbContext(typeof(ChiaraDbContext))] + partial class ChiaraDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("ParentRepositoryId") + .HasColumnType("integer"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ParentRepositoryId"); + + b.ToTable("Albums"); + }); + + modelBuilder.Entity("Chiara.Models.DatabaseFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Content") + .IsRequired() + .HasColumnType("bytea"); + + b.Property("ContentType") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("FileId") + .HasColumnType("uuid"); + + b.Property("HashValue") + .IsRequired() + .HasColumnType("bytea"); + + b.HasKey("Id"); + + b.HasIndex("FileId"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("Chiara.Models.Episode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("EpisodeNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("ShowSeasonId") + .HasColumnType("integer"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ShowSeasonId"); + + b.ToTable("Episodes"); + }); + + modelBuilder.Entity("Chiara.Models.MediaRepository", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Repositories"); + }); + + modelBuilder.Entity("Chiara.Models.ShowSeason", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("ParentRepositoryId") + .HasColumnType("integer"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ParentRepositoryId"); + + b.ToTable("Seasons"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AlbumId") + .HasColumnType("integer"); + + b.Property("Arist") + .IsRequired() + .HasColumnType("text"); + + b.Property("CoverImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Url") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("AlbumId"); + + b.ToTable("Songs"); + }); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.HasOne("Chiara.Models.MediaRepository", "ParentRepository") + .WithMany("Albums") + .HasForeignKey("ParentRepositoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ParentRepository"); + }); + + modelBuilder.Entity("Chiara.Models.Episode", b => + { + b.HasOne("Chiara.Models.ShowSeason", "Season") + .WithMany("Episodes") + .HasForeignKey("ShowSeasonId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Season"); + }); + + modelBuilder.Entity("Chiara.Models.ShowSeason", b => + { + b.HasOne("Chiara.Models.MediaRepository", "ParentRepository") + .WithMany("Seasons") + .HasForeignKey("ParentRepositoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ParentRepository"); + }); + + modelBuilder.Entity("Chiara.Models.Song", b => + { + b.HasOne("Chiara.Models.Album", "Album") + .WithMany("Songs") + .HasForeignKey("AlbumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Album"); + }); + + modelBuilder.Entity("Chiara.Models.Album", b => + { + b.Navigation("Songs"); + }); + + modelBuilder.Entity("Chiara.Models.MediaRepository", b => + { + b.Navigation("Albums"); + + b.Navigation("Seasons"); + }); + + modelBuilder.Entity("Chiara.Models.ShowSeason", b => + { + b.Navigation("Episodes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Chiara/Chiara/Models/Album.cs b/Chiara/Chiara/Models/Album.cs new file mode 100644 index 0000000..e61bf84 --- /dev/null +++ b/Chiara/Chiara/Models/Album.cs @@ -0,0 +1,42 @@ +using Chiara.Abstractions; + +namespace Chiara.Models; + +public class Album : IMediaItem, IEquatable +{ + public int Id { get; set; } + + public string Title { get; init; } = string.Empty; + + public string Arist { get; init; } = string.Empty; + + public string Path { get; init; } = string.Empty; + + public string CoverImageUrl { get; set; } = string.Empty; + + public List Songs { get; set; } = []; + + public int ParentRepositoryId { get; set; } + + public required MediaRepository ParentRepository { get; set; } + + public bool Equals(Album? other) + { + if (other is null) + { + return false; + } + + return Title == other.Title && Arist == other.Arist; + } + + public override bool Equals(object? obj) + { + return obj is Album other && Equals(other); + } + + public override int GetHashCode() + { + return Title.GetHashCode() ^ Arist.GetHashCode(); + } +} diff --git a/Chiara/Chiara/Models/ChiaraOptions.cs b/Chiara/Chiara/Models/ChiaraOptions.cs new file mode 100644 index 0000000..ac207c8 --- /dev/null +++ b/Chiara/Chiara/Models/ChiaraOptions.cs @@ -0,0 +1,8 @@ +namespace Chiara.Models; + +public class ChiaraOptions +{ + public const string OptionName = "Chiara"; + + public string TemporaryDirectory { get; set; } = string.Empty; +} diff --git a/Chiara/Chiara/Models/DatabaseFile.cs b/Chiara/Chiara/Models/DatabaseFile.cs new file mode 100644 index 0000000..ae67daa --- /dev/null +++ b/Chiara/Chiara/Models/DatabaseFile.cs @@ -0,0 +1,24 @@ +using System.ComponentModel.DataAnnotations; +using Chiara.Abstractions; + +namespace Chiara.Models; + +public class DatabaseFile : IFile +{ + public int Id { get; set; } + + public Guid FileId { get; set; } + + public byte[] Content { get; set; } = []; + + public byte[] HashValue { get; set; } = []; + + [MaxLength(20)] + public string ContentType { get; set; } = string.Empty; + + public Stream OpenRead() + { + MemoryStream stream = new(Content); + return stream; + } +} diff --git a/Chiara/Chiara/Models/Episode.cs b/Chiara/Chiara/Models/Episode.cs new file mode 100644 index 0000000..8d96812 --- /dev/null +++ b/Chiara/Chiara/Models/Episode.cs @@ -0,0 +1,37 @@ +using Chiara.Abstractions; + +namespace Chiara.Models; + +public class Episode : IMediaItem, IEquatable +{ + public int Id { get; set; } + + public string Title { get; init; } = string.Empty; + + public string Arist { get; init; } = string.Empty; + + public string EpisodeNumber { get; init; } = string.Empty; + + public string Path { get; init; } = string.Empty; + + public int ShowSeasonId { get; set; } + + public required ShowSeason Season { get; set; } + + public bool Equals(Episode? other) + { + if (other is null) + { + return false; + } + + return Title == other.Title && Arist == other.Arist && EpisodeNumber == other.EpisodeNumber; + } + + public override bool Equals(object? obj) + { + return obj is Episode other && Equals(other); + } + + public override int GetHashCode() => Title.GetHashCode() ^ Arist.GetHashCode() ^ EpisodeNumber.GetHashCode(); +} diff --git a/Chiara/Chiara/Models/LocalFile.cs b/Chiara/Chiara/Models/LocalFile.cs new file mode 100644 index 0000000..3fa8f13 --- /dev/null +++ b/Chiara/Chiara/Models/LocalFile.cs @@ -0,0 +1,17 @@ +using Chiara.Abstractions; + +namespace Chiara.Models; + +public class LocalFile(string path, string contentType) : IFile +{ + public Guid FileId { get; } = Guid.NewGuid(); + + public FileInfo File { get; } = new(path); + + public string ContentType { get; } = contentType; + + public Stream OpenRead() + { + return File.OpenRead(); + } +} diff --git a/Chiara/Chiara/Models/MediaItemTypes.cs b/Chiara/Chiara/Models/MediaItemTypes.cs new file mode 100644 index 0000000..d4983c3 --- /dev/null +++ b/Chiara/Chiara/Models/MediaItemTypes.cs @@ -0,0 +1,16 @@ +namespace Chiara.Models; + +public static class MediaItemTypes +{ + public static readonly HashSet MusicTypes = + [ + ".mp3", + ".flac" + ]; + + public static readonly HashSet VideoTypes = + [ + ".mp4", + ".mkv" + ]; +} diff --git a/Chiara/Chiara/Models/MediaRepository.cs b/Chiara/Chiara/Models/MediaRepository.cs new file mode 100644 index 0000000..df7ad9e --- /dev/null +++ b/Chiara/Chiara/Models/MediaRepository.cs @@ -0,0 +1,14 @@ +namespace Chiara.Models; + +public class MediaRepository +{ + public int Id { get; set; } + + public string Name { get; set; } = string.Empty; + + public string Path { get; set; } = string.Empty; + + public List Albums { get; set; } = []; + + public List Seasons { get; set; } = []; +} diff --git a/Chiara/Chiara/Models/ShowSeason.cs b/Chiara/Chiara/Models/ShowSeason.cs new file mode 100644 index 0000000..7d9ea98 --- /dev/null +++ b/Chiara/Chiara/Models/ShowSeason.cs @@ -0,0 +1,34 @@ +using Chiara.Abstractions; + +namespace Chiara.Models; + +public class ShowSeason : IMediaItem, IEquatable +{ + public int Id { get; set; } + + public string Title { get; init; } = string.Empty; + + public string Arist { get; init; } = string.Empty; + + public string Path { get; init; } = string.Empty; + + public List Episodes { get; set; } = []; + + public int ParentRepositoryId { get; set; } + + public required MediaRepository ParentRepository { get; set; } + + public bool Equals(ShowSeason? other) + { + if (other is null) + { + return false; + } + + return Title == other.Title && Arist == other.Arist; + } + + public override bool Equals(object? obj) => obj is ShowSeason other && Equals(other); + + public override int GetHashCode() => Title.GetHashCode() ^ Title.GetHashCode(); +} diff --git a/Chiara/Chiara/Models/Song.cs b/Chiara/Chiara/Models/Song.cs new file mode 100644 index 0000000..a9deb83 --- /dev/null +++ b/Chiara/Chiara/Models/Song.cs @@ -0,0 +1,22 @@ +using Chiara.Abstractions; + +namespace Chiara.Models; + +public class Song : IMediaItem +{ + public int Id { get; set; } + + public string Title { get; init; } = string.Empty; + + public string Arist { get; init; } = string.Empty; + + public string Path { get; init; } = string.Empty; + + public string CoverImageUrl { get; init; } = string.Empty; + + public string Url { get; init; } = string.Empty; + + public int AlbumId { get; set; } + + public required Album Album { get; set; } +} diff --git a/Chiara/Chiara/Program.cs b/Chiara/Chiara/Program.cs new file mode 100644 index 0000000..cd43b48 --- /dev/null +++ b/Chiara/Chiara/Program.cs @@ -0,0 +1,35 @@ +using Chiara.Extensions; +using Chiara.Services; +using Microsoft.EntityFrameworkCore; + +WebApplicationBuilder builder = WebApplication.CreateBuilder(); + +builder.AddChiaraOptions(); +builder.Services.AddSwaggerGen(); +builder.Services.AddControllers(); + +builder.Services.AddDbContext(options => +{ + string? connectionString = builder.Configuration.GetConnectionString("Postgres"); + if (connectionString is null) + { + throw new InvalidOperationException("Failed to get postgres connection string."); + } + + options.UseNpgsql(connectionString); +}); +builder.Services.AddChiaraService(); + +WebApplication application = builder.Build(); + +if (application.Environment.IsDevelopment()) +{ + application.UseSwagger(); + application.UseSwaggerUI(); +} + +application.UseStaticFiles(); + +application.MapControllers(); + +await application.RunAsync(); diff --git a/Chiara/Chiara/Properties/launchSettings.json b/Chiara/Chiara/Properties/launchSettings.json new file mode 100644 index 0000000..303b889 --- /dev/null +++ b/Chiara/Chiara/Properties/launchSettings.json @@ -0,0 +1,23 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:6716", + "sslPort": 44314 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "launchUrl": "swagger", + "applicationUrl": "http://0.0.0.0:5078", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Chiara/Chiara/Services/ChiaraDbContext.cs b/Chiara/Chiara/Services/ChiaraDbContext.cs new file mode 100644 index 0000000..3c3576f --- /dev/null +++ b/Chiara/Chiara/Services/ChiaraDbContext.cs @@ -0,0 +1,49 @@ +using Chiara.Models; +using Microsoft.EntityFrameworkCore; + +namespace Chiara.Services; + +public class ChiaraDbContext(DbContextOptions options) : DbContext(options) +{ + public DbSet Songs { get; init; } + + public DbSet Albums { get; init; } + + public DbSet Files { get; init; } + + public DbSet Seasons { get; init; } + + public DbSet Episodes { get; init; } + + public DbSet Repositories { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity() + .HasMany(e => e.Songs) + .WithOne(e => e.Album) + .HasForeignKey(e => e.AlbumId) + .IsRequired(); + + modelBuilder.Entity() + .HasMany(s => s.Episodes) + .WithOne(e => e.Season) + .HasForeignKey(e => e.ShowSeasonId) + .IsRequired(); + + modelBuilder.Entity() + .HasMany(m => m.Albums) + .WithOne(a => a.ParentRepository) + .HasForeignKey(a => a.ParentRepositoryId) + .IsRequired(); + + modelBuilder.Entity() + .HasMany(m => m.Seasons) + .WithOne(s => s.ParentRepository) + .HasForeignKey(s => s.ParentRepositoryId) + .IsRequired(); + + modelBuilder.Entity() + .HasIndex(f => f.FileId); + } +} diff --git a/Chiara/Chiara/Services/DefaultMediaRepositoryScanner.cs b/Chiara/Chiara/Services/DefaultMediaRepositoryScanner.cs new file mode 100644 index 0000000..d446717 --- /dev/null +++ b/Chiara/Chiara/Services/DefaultMediaRepositoryScanner.cs @@ -0,0 +1,229 @@ +using System.Collections.Concurrent; +using AnitomySharp; +using Chiara.Abstractions; +using Chiara.Models; +using TagLib; + +namespace Chiara.Services; + +public class DefaultMediaRepositoryScanner( + IFileStore fileStore, + ILogger logger) : IMediaRepositoryScanner +{ + public async Task> ScanAlbumAsync(MediaRepository mediaRepository, + CancellationToken cancellationToken = default) + { + DirectoryInfo rootDirectory = new(mediaRepository.Path); + + if (!rootDirectory.Exists) + { + throw new InvalidOperationException(); + } + + Dictionary> albums = []; + + foreach (Song song in await ScanSongAsync(rootDirectory, cancellationToken)) + { + if (albums.TryGetValue(song.Album, out List? songs)) + { + songs.Add(song); + } + else + { + albums.Add(song.Album, [song]); + } + } + + return albums.Select(pair => + { + pair.Value.ForEach(s => s.Album = pair.Key); + + pair.Key.Songs = pair.Value; + pair.Key.CoverImageUrl = + Random.Shared.GetItems(pair.Key.Songs.Select(s => s.CoverImageUrl).ToArray(), 1)[0]; + + return pair.Key; + }); + } + + public async Task> ScanShowAsync(MediaRepository repository, + CancellationToken cancellationToken = default) + { + DirectoryInfo rootDirectory = new(repository.Path); + + if (!rootDirectory.Exists) + { + throw new InvalidOperationException(); + } + + Dictionary> shows = []; + + foreach (Episode episode in await ScanVideoAsync(rootDirectory, cancellationToken)) + { + if (shows.TryGetValue(episode.Season, out List? episodes)) + { + episodes.Add(episode); + } + else + { + shows.Add(episode.Season, [episode]); + } + } + + return shows.Select(pair => + { + pair.Value.ForEach(e => + { + e.Season = pair.Key; + }); + + pair.Key.Episodes = pair.Value; + return pair.Key; + }); + } + + private async Task> ScanSongAsync(DirectoryInfo directory, CancellationToken cancellationToken) + { + ConcurrentBag songs = []; + + await Parallel.ForEachAsync(directory.EnumerateDirectories(), cancellationToken, async (info, token) => + { + foreach (Song song in await ScanSongAsync(info, token)) + { + songs.Add(song); + } + }); + + await Parallel.ForEachAsync(directory.EnumerateFiles(), cancellationToken, async (f, _) => + { + if (!MediaItemTypes.MusicTypes.Contains(f.Extension)) + { + return; + } + + try + { + TagLib.File tagFile = TagLib.File.Create(f.FullName); + + IPicture? picture = tagFile.Tag.Pictures.FirstOrDefault(); + string? coverImageUrl = null; + if (picture is not null) + { + coverImageUrl = "/api/file/" + await fileStore.UploadFileAsync(picture.Data.Data, picture.MimeType); + } + + Song song = new() + { + Title = tagFile.Tag.Title ?? f.Name, + Arist = tagFile.Tag.FirstPerformer ?? "Default Arist", + Path = f.FullName, + Url = $"/api/file/{await fileStore.ClarifyLocalFileAsync(f.FullName, tagFile.MimeType)}", + CoverImageUrl = coverImageUrl ?? string.Empty, + Album = new Album + { + // 避免空应用错误 + Title = tagFile.Tag.Album ?? "Default Album", + Arist = tagFile.Tag.FirstAlbumArtist ?? "Default Artist", + Path = f.Directory is null ? string.Empty : f.Directory.FullName, + ParentRepository = new MediaRepository() + } + }; + + songs.Add(song); + } + catch (UnsupportedFormatException e) + { + logger.LogInformation("Failed to parser file {}: {}.", f.Name, e); + } + }); + + return songs; + } + + private async Task> ScanVideoAsync(DirectoryInfo directory, + CancellationToken cancellationToken) + { + ConcurrentBag episodes = []; + + await Parallel.ForEachAsync(directory.EnumerateDirectories(), cancellationToken, async (d, token) => + { + foreach (Episode episode in await ScanVideoAsync(d, token)) + { + episodes.Add(episode); + } + }); + + await Parallel.ForEachAsync(directory.EnumerateFiles(), cancellationToken, async (f, _) => + { + if (!MediaItemTypes.VideoTypes.Contains(f.Extension)) + { + return; + } + + List elements = Anitomy.Parse(f.Name).ToList(); + + Element? titleElement = (from item in elements + where item.Category == ElementCategory.ElementAnimeTitle + select item).FirstOrDefault(); + + if (titleElement is null) + { + return; + } + + Element? episodeNumberElement = (from item in elements + where item.Category == ElementCategory.ElementEpisodeNumber + select item).FirstOrDefault(); + + if (episodeNumberElement is null) + { + return; + } + + Element? episodeTitleElement = (from item in elements + where item.Category == ElementCategory.ElementEpisodeTitle + select item).FirstOrDefault(); + + if (episodeTitleElement is null) + { + Episode episode = new() + { + Title = $"{titleElement.Value} E{episodeNumberElement.Value}", + Arist = string.Empty, + Path = f.FullName, + EpisodeNumber = episodeNumberElement.Value, + Season = new ShowSeason + { + Title = titleElement.Value, + Arist = string.Empty, + Path = f.Directory?.FullName ?? string.Empty, + ParentRepository = new MediaRepository() + } + }; + + episodes.Add(episode); + } + else + { + Episode episode = new() + { + Title = episodeTitleElement.Value, + Arist = string.Empty, + Path = f.FullName, + EpisodeNumber = episodeNumberElement.Value, + Season = new ShowSeason + { + Title = titleElement.Value, + Arist = string.Empty, + Path = f.Directory?.FullName ?? string.Empty, + ParentRepository = new MediaRepository() + } + }; + + episodes.Add(episode); + } + }); + + return episodes; + } +} diff --git a/Chiara/Chiara/Services/FfmpegService.cs b/Chiara/Chiara/Services/FfmpegService.cs new file mode 100644 index 0000000..bd890ad --- /dev/null +++ b/Chiara/Chiara/Services/FfmpegService.cs @@ -0,0 +1,30 @@ +using Xabe.FFmpeg; + +namespace Chiara.Services; + +public record VideoConversion(Task RunningTask, + DirectoryInfo CacheDirectory, + string Name, + CancellationTokenSource CancellationTokenSource); + +public class FfmpegService +{ + public VideoConversion? CurrentConversion { get; set; } + + public async Task StartConversion(FileInfo video, DirectoryInfo cacheDirectory, string name, + CancellationToken cancellationToken) + { + IMediaInfo inputVideo = await FFmpeg.GetMediaInfo(video.FullName, cancellationToken); + + IConversion conversion = FFmpeg.Conversions.New() + .AddStream(inputVideo.Streams) + .AddParameter("-re", ParameterPosition.PreInput) + .AddParameter("-c:v h264 -f hls") + .AddParameter("-profile:v high10") + .AddParameter("-hls_list_size 10 -hls_time 10 -hls_base_url /api/hls/") + .AddParameter("-hls_flags delete_segments") + .SetOutput(Path.Combine(cacheDirectory.FullName, $"{name}.m3u8")); + + return await conversion.Start(cancellationToken); + } +} diff --git a/Chiara/Chiara/Services/FileService.cs b/Chiara/Chiara/Services/FileService.cs new file mode 100644 index 0000000..22df5fc --- /dev/null +++ b/Chiara/Chiara/Services/FileService.cs @@ -0,0 +1,88 @@ +using System.Security.Cryptography; +using System.Threading.Channels; +using Chiara.Abstractions; +using Chiara.Models; +using Microsoft.EntityFrameworkCore; + +namespace Chiara.Services; + +public sealed class FileService( + IServiceProvider serviceProvider, + LocalFileService localFileService, + ILogger logger) + : BackgroundService, IFileStore +{ + private readonly Channel _channel = Channel.CreateUnbounded(new UnboundedChannelOptions + { + SingleReader = true + }); + + public async Task UploadFileAsync(ReadOnlyMemory buffer, string contentType) + { + using IServiceScope scope = serviceProvider.CreateScope(); + await using ChiaraDbContext dbContent = scope.ServiceProvider.GetRequiredService(); + + await using Stream stream = new MemoryStream(); + await stream.WriteAsync(buffer); + stream.Position = 0; + + using HMACSHA256 hmacsha256 = new([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + byte[] hash = await hmacsha256.ComputeHashAsync(stream); + + DatabaseFile? existedFile = await (from item in dbContent.Files.AsNoTracking() + where item.HashValue == hash && item.ContentType == contentType + select item).FirstOrDefaultAsync(); + + if (existedFile is not null) + { + return existedFile.FileId.ToString(); + } + + DatabaseFile file = new() + { + FileId = Guid.NewGuid(), Content = buffer.ToArray(), ContentType = contentType, HashValue = hash + }; + + await _channel.Writer.WriteAsync(file); + + return file.FileId.ToString(); + } + + public Task ClarifyLocalFileAsync(string path, string contentType) + => localFileService.ClarifyFile(path, contentType); + + public async Task GetFileAsync(Guid guid) + { + using IServiceScope scope = serviceProvider.CreateScope(); + await using ChiaraDbContext dbContext = scope.ServiceProvider.GetRequiredService(); + + DatabaseFile? file = await (from item in dbContext.Files.AsNoTracking() + where item.FileId == guid + select item).FirstOrDefaultAsync(); + + if (file is not null) + { + return file; + } + + return localFileService.ReadFile(guid); + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + using IServiceScope scope = serviceProvider.CreateScope(); + await using ChiaraDbContext dbContext = scope.ServiceProvider.GetRequiredService(); + + while (await _channel.Reader.WaitToReadAsync(stoppingToken)) + { + if (!_channel.Reader.TryRead(out DatabaseFile? file)) + { + continue; + } + + logger.LogInformation("Receive file from channel: {}.", file.FileId); + await dbContext.Files.AddAsync(file, stoppingToken); + await dbContext.SaveChangesAsync(stoppingToken); + } + } +} diff --git a/Chiara/Chiara/Services/LocalFileService.cs b/Chiara/Chiara/Services/LocalFileService.cs new file mode 100644 index 0000000..6e5b167 --- /dev/null +++ b/Chiara/Chiara/Services/LocalFileService.cs @@ -0,0 +1,36 @@ +using System.Collections.Concurrent; +using Chiara.Models; + +namespace Chiara.Services; + +public class LocalFileService +{ + private readonly ConcurrentDictionary _idMap = []; + + private readonly ConcurrentDictionary _pathMap = []; + + public Task ClarifyFile(string path, string contentType) + { + LocalFile localFile = new(path, contentType); + + if (!localFile.File.Exists) + { + throw new InvalidOperationException(); + } + + if (_pathMap.TryGetValue(localFile.File.FullName, out LocalFile? existedFile)) + { + return Task.FromResult(existedFile.FileId.ToString()); + } + + _idMap.TryAdd(localFile.FileId, localFile); + _pathMap.TryAdd(localFile.File.FullName, localFile); + + return Task.FromResult(localFile.FileId.ToString()); + } + + public LocalFile? ReadFile(Guid guid) + { + return _idMap.GetValueOrDefault(guid); + } +} diff --git a/Chiara/Chiara/Services/MigrationService.cs b/Chiara/Chiara/Services/MigrationService.cs new file mode 100644 index 0000000..510962c --- /dev/null +++ b/Chiara/Chiara/Services/MigrationService.cs @@ -0,0 +1,44 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage; + +namespace Chiara.Services; + +public class MigrationService(IServiceProvider serviceProvider) : BackgroundService +{ + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + using IServiceScope scope = serviceProvider.CreateScope(); + ChiaraDbContext dbContext = scope.ServiceProvider.GetRequiredService(); + + await EnsureDatabaseAsync(dbContext, stoppingToken); + await RunMigrationAsync(dbContext, stoppingToken); + } + + private static async Task EnsureDatabaseAsync(ChiaraDbContext dbContext, CancellationToken cancellationToken) + { + IRelationalDatabaseCreator creator = dbContext.GetService(); + IExecutionStrategy strategy = dbContext.Database.CreateExecutionStrategy(); + + await strategy.ExecuteAsync(async () => + { + if (!await creator.ExistsAsync(cancellationToken)) + { + await creator.CreateAsync(cancellationToken); + } + }); + } + + private static async Task RunMigrationAsync(ChiaraDbContext dbContext, CancellationToken cancellationToken) + { + IExecutionStrategy strategy = dbContext.Database.CreateExecutionStrategy(); + + await strategy.ExecuteAsync(async () => + { + await using IDbContextTransaction transaction = + await dbContext.Database.BeginTransactionAsync(cancellationToken); + await dbContext.Database.MigrateAsync(cancellationToken); + await transaction.CommitAsync(cancellationToken); + }); + } +} diff --git a/Chiara/Chiara/Services/RefreshService.cs b/Chiara/Chiara/Services/RefreshService.cs new file mode 100644 index 0000000..f1451fb --- /dev/null +++ b/Chiara/Chiara/Services/RefreshService.cs @@ -0,0 +1,45 @@ +using Chiara.Abstractions; +using Chiara.Models; + +namespace Chiara.Services; + +public class RefreshService( + ChiaraDbContext dbContext, + IMediaRepositoryScanner scanner) +{ + public async Task Refresh(MediaRepository repository) + { + dbContext.Albums.RemoveRange(repository.Albums); + dbContext.Seasons.RemoveRange(repository.Seasons); + await dbContext.SaveChangesAsync(); + + IEnumerable albums = await scanner.ScanAlbumAsync(repository); + + foreach (Album album in albums) + { + List songs = album.Songs; + album.Songs = []; + repository.Albums.Add(album); + await dbContext.SaveChangesAsync(); + + songs.ForEach(s => s.AlbumId = album.Id); + + await dbContext.Songs.AddRangeAsync(songs); + await dbContext.SaveChangesAsync(); + } + + IEnumerable seasons = await scanner.ScanShowAsync(repository); + + foreach (ShowSeason season in seasons) + { + List episodes = season.Episodes; + season.Episodes = []; + repository.Seasons.Add(season); + await dbContext.SaveChangesAsync(); + + episodes.ForEach(s => s.ShowSeasonId = season.Id); + await dbContext.Episodes.AddRangeAsync(episodes); + await dbContext.SaveChangesAsync(); + } + } +} diff --git a/Chiara/Chiara/appsettings.Development.json b/Chiara/Chiara/appsettings.Development.json new file mode 100644 index 0000000..f3d9860 --- /dev/null +++ b/Chiara/Chiara/appsettings.Development.json @@ -0,0 +1,14 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "ConnectionStrings": { + "Postgres": "Host=localhost;Database=chiara;Username=postgres;Password=12345678" + }, + "Repository": { + "Path": "/home/ricardo/Documents/Code/CSharp/Chiara/Chiara.Tests/Data" + } +} diff --git a/Chiara/Chiara/appsettings.json b/Chiara/Chiara/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/Chiara/Chiara/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/Chiara/Chiara/docker-compose.yaml b/Chiara/Chiara/docker-compose.yaml new file mode 100644 index 0000000..a938fa3 --- /dev/null +++ b/Chiara/Chiara/docker-compose.yaml @@ -0,0 +1,28 @@ +version: "3.9" + +services: + db: + image: postgres:15 + container_name: chiara-db + environment: + POSTGRES_PASSWORD: 12345678 + + chiara: + image: chiara:latest + container_name: chiara-app + depends_on: + - db + environment: + TZ: "Asia/Shanghai" + ASPNETCORE_ENVIRONMENT: Development + ConnectionStrings__Postgres: "Host=db;Database=chiara;Username=postgres;Password=12345678" + Repository__Path: "/data" + Chiara__TemporaryDirectory: "/tmp/" + volumes: + - /home/ricardo/Documents/Code/CSharp/Chiara/Chiara.Tests/Data:/data/music + labels: + - "traefik.enable=true" + - "traefik.http.routers.chiara.rule=Host(`chiara.jackfiled.icu`)" + - "traefik.http.services.chiara.loadbalancer.server.port=8080" + - "com.centurylinklabs.watchtower.enable=true" + diff --git a/Chiara/Chiara/wwwroot/.gitkeep b/Chiara/Chiara/wwwroot/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ChiaraAndroid/.gitignore b/ChiaraAndroid/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/ChiaraAndroid/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/ChiaraAndroid/.idea/.gitignore b/ChiaraAndroid/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/ChiaraAndroid/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/ChiaraAndroid/.idea/.name b/ChiaraAndroid/.idea/.name new file mode 100644 index 0000000..4561065 --- /dev/null +++ b/ChiaraAndroid/.idea/.name @@ -0,0 +1 @@ +Chiara \ No newline at end of file diff --git a/ChiaraAndroid/.idea/compiler.xml b/ChiaraAndroid/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/ChiaraAndroid/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ChiaraAndroid/.idea/deploymentTargetSelector.xml b/ChiaraAndroid/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..6f71a76 --- /dev/null +++ b/ChiaraAndroid/.idea/deploymentTargetSelector.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/ChiaraAndroid/.idea/gradle.xml b/ChiaraAndroid/.idea/gradle.xml new file mode 100644 index 0000000..0897082 --- /dev/null +++ b/ChiaraAndroid/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/ChiaraAndroid/.idea/inspectionProfiles/Project_Default.xml b/ChiaraAndroid/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..44ca2d9 --- /dev/null +++ b/ChiaraAndroid/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,41 @@ + + + + \ No newline at end of file diff --git a/ChiaraAndroid/.idea/kotlinc.xml b/ChiaraAndroid/.idea/kotlinc.xml new file mode 100644 index 0000000..fdf8d99 --- /dev/null +++ b/ChiaraAndroid/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/ChiaraAndroid/.idea/migrations.xml b/ChiaraAndroid/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/ChiaraAndroid/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/ChiaraAndroid/.idea/misc.xml b/ChiaraAndroid/.idea/misc.xml new file mode 100644 index 0000000..8978d23 --- /dev/null +++ b/ChiaraAndroid/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/ChiaraAndroid/.idea/vcs.xml b/ChiaraAndroid/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/ChiaraAndroid/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ChiaraAndroid/app/.gitignore b/ChiaraAndroid/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/ChiaraAndroid/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/ChiaraAndroid/app/build.gradle.kts b/ChiaraAndroid/app/build.gradle.kts new file mode 100644 index 0000000..9108174 --- /dev/null +++ b/ChiaraAndroid/app/build.gradle.kts @@ -0,0 +1,152 @@ +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.jetbrains.kotlin.android) + alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.hilt.android) + alias(libs.plugins.kotlin.ksp) + alias(libs.plugins.openapi.generator) + id("kotlin-kapt") +} + +val openapiOutputDir: String = layout.buildDirectory.dir("generated/api").get().asFile.path + +android { + namespace = "top.rrricardo.chiara" + compileSdk = 34 + + defaultConfig { + applicationId = "top.rrricardo.chiara" + minSdk = 28 + targetSdk = 34 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } + + sourceSets["main"].kotlin { + srcDir("$openapiOutputDir/src/main/kotlin") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.5.1" + } + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } +} + +dependencies { + + // Default + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.androidx.material3) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.ui.test.junit4) + debugImplementation(libs.androidx.ui.tooling) + debugImplementation(libs.androidx.ui.test.manifest) + + // ViewModel + implementation(libs.androidx.lifecycle.viewmodel.ktx) + // ViewModel utilities for Compose + implementation(libs.androidx.lifecycle.viewmodel.compose) + // LiveData + implementation(libs.androidx.lifecycle.livedata.ktx) + // Lifecycles only (without ViewModel or LiveData) + implementation(libs.androidx.lifecycle.runtime.ktx) + // Lifecycle utilities for Compose + implementation(libs.androidx.lifecycle.runtime.compose) + + // Saved state module for ViewModel + implementation(libs.androidx.lifecycle.viewmodel.savedstate) + + // Annotation processor + kapt(libs.androidx.lifecycle.compiler) + + // Navigation Controller + implementation(libs.androidx.navigation.compose) + + // Palette + implementation(libs.androidx.palette) + + // Media Exo Player + implementation(libs.media3.exoplayer) + implementation(libs.media3.session) + implementation(libs.media3.ui) + implementation(libs.media3.hls) + + // Hilt + implementation(libs.hilt.android) + implementation(libs.hilt.navigation.compose) + kapt(libs.hilt.android.compiler) + + // Constraint Layout + implementation(libs.constraintlayout.compose) + + // Coil + implementation(libs.coil) + + // openapi + implementation(libs.okhttp3) + implementation(libs.retrofit.retrofit) + implementation(libs.retrofit.converter.scalars) + implementation(libs.retrofit.serialization.converter) + implementation(libs.kotlinx.serialization) +} + + +openApiGenerate { + generatorName.set("kotlin") + inputSpec.set("$rootDir/app/src/main/openapi/chiara.json") + outputDir.set(openapiOutputDir) + apiPackage.set("top.rrricardo.chiara.openapi.api") + modelPackage.set("top.rrricardo.chiara.openapi.model") + packageName.set("top.rrricardo.chiara.openapi.client") + generateApiTests.set(false) + generateModelTests.set(false) + configOptions.set( + mapOf( + "dataLibrary" to "java8" + ) + ) + additionalProperties.set( + mapOf( + "library" to "jvm-retrofit2", + "serializationLibrary" to "kotlinx_serialization", + "useCoroutines" to "true", + ) + ) +} \ No newline at end of file diff --git a/ChiaraAndroid/app/proguard-rules.pro b/ChiaraAndroid/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/ChiaraAndroid/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/ChiaraAndroid/app/src/androidTest/java/top/rrricardo/chiara/ExampleInstrumentedTest.kt b/ChiaraAndroid/app/src/androidTest/java/top/rrricardo/chiara/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..73f9c32 --- /dev/null +++ b/ChiaraAndroid/app/src/androidTest/java/top/rrricardo/chiara/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package top.rrricardo.chiara + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("top.rrricardo.chiara", appContext.packageName) + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/AndroidManifest.xml b/ChiaraAndroid/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..de7b56b --- /dev/null +++ b/ChiaraAndroid/app/src/main/AndroidManifest.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/ic_login-playstore.png b/ChiaraAndroid/app/src/main/ic_login-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..ead2d141747eff7bd2411fc925021062e01068a2 GIT binary patch literal 14476 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 i?f<>}Uwt3?$TXeCi?yc4-{9N = emptyList(), + val selectedSeason : ShowSeasonResponse? = null, + val seasons: List = emptyList(), +) diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/MusicControllerState.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/MusicControllerState.kt new file mode 100644 index 0000000..861a69f --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/MusicControllerState.kt @@ -0,0 +1,11 @@ +package top.rrricardo.chiara.model + +import top.rrricardo.chiara.openapi.model.SongResponse + +data class MusicControllerState( + val playerState: PlayerState= PlayerState.STOPPED, + val currentSong: SongResponse? = null, + val currentPosition: Long = 0L, + val totalDuration: Long = 0L, + val repeatState : RepeatState = RepeatState.Sequence +) diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/PlayerState.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/PlayerState.kt new file mode 100644 index 0000000..da7608b --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/PlayerState.kt @@ -0,0 +1,7 @@ +package top.rrricardo.chiara.model + +enum class PlayerState { + PLAYING, + PAUSED, + STOPPED +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/RepeatState.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/RepeatState.kt new file mode 100644 index 0000000..cc3b025 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/RepeatState.kt @@ -0,0 +1,7 @@ +package top.rrricardo.chiara.model + +enum class RepeatState { + Sequence, + RepeatOne, + Shuffle +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/ShowPageState.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/ShowPageState.kt new file mode 100644 index 0000000..6f09e49 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/ShowPageState.kt @@ -0,0 +1,8 @@ +package top.rrricardo.chiara.model + +import top.rrricardo.chiara.openapi.model.ShowSeasonResponse + +data class ShowPageState( + val loading: Boolean = false, + val showSeason: ShowSeasonResponse? = null +) diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/VideoPageState.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/VideoPageState.kt new file mode 100644 index 0000000..06d3685 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/model/VideoPageState.kt @@ -0,0 +1,11 @@ +package top.rrricardo.chiara.model + +import top.rrricardo.chiara.openapi.model.EpisodeResponse +import top.rrricardo.chiara.openapi.model.ShowSeasonResponse + +data class VideoPageState( + val loading: Boolean = false, + val playing: Boolean = false, + val showSeasonResponse: ShowSeasonResponse? = null, + val episodeResponse: EpisodeResponse? = null +) diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/service/MusicController.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/service/MusicController.kt new file mode 100644 index 0000000..22e7ef4 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/service/MusicController.kt @@ -0,0 +1,103 @@ +package top.rrricardo.chiara.service + +import androidx.media3.common.MediaItem +import androidx.media3.common.PlaybackException +import androidx.media3.common.Player +import top.rrricardo.chiara.model.PlayerState +import top.rrricardo.chiara.model.RepeatState +import top.rrricardo.chiara.openapi.model.SongResponse + +interface MusicController { + var mediaControllerCallback: ( + ( + playerState: PlayerState, + currentMusic: SongResponse?, + currentPosition: Long, + totalDuration: Long, + repeatState: RepeatState + ) -> Unit + )? + + var mediaControllerReadyCallback: ((Player) -> Unit)? + + var mediaControllerErrorCallback: ((PlaybackException) -> Unit)? + + var player: Player? + + /** + * 获得当前播放器的播放列表 + */ + fun getPlayList(): List + + /** + * 添加一首曲目到播放列表中 + */ + fun addSong(song: SongResponse) + + /** + * 添加一系列曲目到播放列表中 + */ + fun addSongRange(songs: Iterable) + + /** + * 清空播放列表 + */ + fun clearPlayList() + + /** + * 删除播放列表中的指定曲目 + */ + fun remove(songId: Int) + + /** + * 播放播放列表中的指定曲目 + */ + fun play(songId: Int) + + /** + * 恢复播放 + */ + fun resume() + + /** + * 暂停 + */ + fun pause() + + /** + * 获得当前播放歌曲的位置 + */ + fun getCurrentPosition(): Long + + fun destroy() + + /** + * 跳转到下一首曲目 + */ + fun skipToNextSong() + + /** + * 跳转到上一首曲目 + */ + fun skipToPreviousSong() + + /** + * 获得当前正在播放的曲目 + */ + fun getCurrentSong(): SongResponse? + + /** + * 跳转到指定位置 + */ + fun seekTo(position: Long) + + fun setSequenceRepeat() + + fun setRepeatOne() + + fun setShuffleRepeat() + + fun playVideo(mediaItem: MediaItem) + + fun stopVideo() +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/service/impl/MusicControllerImpl.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/service/impl/MusicControllerImpl.kt new file mode 100644 index 0000000..12f2f08 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/service/impl/MusicControllerImpl.kt @@ -0,0 +1,229 @@ +package top.rrricardo.chiara.service.impl + +import android.content.ComponentName +import android.content.Context +import android.net.Uri +import androidx.media3.common.MediaItem +import androidx.media3.common.MediaMetadata +import androidx.media3.common.PlaybackException +import androidx.media3.common.Player +import androidx.media3.session.MediaController +import androidx.media3.session.SessionToken +import com.google.common.util.concurrent.ListenableFuture +import com.google.common.util.concurrent.MoreExecutors +import top.rrricardo.chiara.model.PlayerState +import top.rrricardo.chiara.model.RepeatState +import top.rrricardo.chiara.openapi.model.SongResponse +import top.rrricardo.chiara.service.MusicController + +class MusicControllerImpl(context: Context) : MusicController { + private var mediaControllerFuture: ListenableFuture + + private val mediaController: MediaController? + get() = if (mediaControllerFuture.isDone) mediaControllerFuture.get() else null + + private val playList = HashMap() + private val mediaIdMap = HashMap() + private val songUrlMap = HashMap() + + init { + val sessionToken = + SessionToken(context, ComponentName(context, MusicService::class.java)) + + mediaControllerFuture = MediaController.Builder(context, sessionToken).buildAsync() + mediaControllerFuture.addListener({ + controllerListener() + mediaController?.let { + mediaControllerReadyCallback?.invoke(it) + player = it + } + }, MoreExecutors.directExecutor()) + } + + override var mediaControllerCallback: ( + ( + playerState: PlayerState, + currentMusic: SongResponse?, + currentPosition: Long, + totalDuration: Long, + repeatState: RepeatState + ) + -> Unit)? = null + + override var mediaControllerReadyCallback: ((Player) -> Unit)? = null + + override var mediaControllerErrorCallback: ((PlaybackException) -> Unit)? = null + + override var player: Player? = mediaController + + override fun clearPlayList() { + mediaController?.stop() + playList.clear() + } + + override fun getPlayList(): List = playList.values.toList() + + override fun addSong(song: SongResponse) { + playList[song.id] = song + + refreshMediaItems() + } + + override fun addSongRange(songs: Iterable) { + songs.map { + playList[it.id] = it + } + + refreshMediaItems() + } + + override fun remove(songId: Int) { + playList.remove(songId) + } + + override fun play(songId: Int) { + mediaController?.apply { + mediaIdMap[songId]?.let { + seekToDefaultPosition(it) + prepare() + play() + } + } + } + + override fun resume() { + mediaController?.play() + } + + override fun pause() { + mediaController?.pause() + } + + override fun getCurrentSong(): SongResponse? { + mediaController?.currentMediaItem?.let { + return songUrlMap[it.mediaId] + } + + return null + } + + override fun getCurrentPosition(): Long = mediaController?.currentPosition ?: 0L + + override fun seekTo(position: Long) { + mediaController?.seekTo(position) + } + + override fun destroy() { + MediaController.releaseFuture(mediaControllerFuture) + mediaControllerCallback = null + } + + override fun skipToNextSong() { + mediaController?.seekToNext() + } + + override fun skipToPreviousSong() { + mediaController?.seekToPrevious() + } + + override fun setSequenceRepeat() { + mediaController?.shuffleModeEnabled = false + mediaController?.repeatMode = Player.REPEAT_MODE_ALL + } + + override fun setRepeatOne() { + mediaController?.shuffleModeEnabled = false + mediaController?.repeatMode = Player.REPEAT_MODE_ONE + } + + override fun setShuffleRepeat() { + mediaController?.repeatMode = Player.REPEAT_MODE_ALL + mediaController?.shuffleModeEnabled = true + } + + override fun playVideo(mediaItem: MediaItem) { + mediaController?.setMediaItem(mediaItem) + mediaController?.apply { + prepare() + play() + } + } + + override fun stopVideo() { + mediaController?.apply { + stop() + clearMediaItems() + } + } + + private fun controllerListener() { + mediaController?.addListener(object : Player.Listener { + override fun onEvents(player: Player, events: Player.Events) { + super.onEvents(player, events) + + with(player) { + val repeatState = if (shuffleModeEnabled) { + RepeatState.Shuffle + } else { + if (repeatMode == Player.REPEAT_MODE_ONE) { + RepeatState.RepeatOne + } else { + RepeatState.Sequence + } + } + + mediaControllerCallback?.invoke( + playbackState.toPlayerState(isPlaying), + currentMediaItem?.let { + songUrlMap[it.mediaId] + }, + currentPosition.coerceAtLeast(0L), + duration.coerceAtLeast(0L), + repeatState + ) + } + } + + override fun onPlayerError(error: PlaybackException) { + super.onPlayerError(error) + mediaControllerErrorCallback?.invoke(error) + } + }) + } + + private fun Int.toPlayerState(isPlaying: Boolean) = + when (this) { + Player.STATE_IDLE -> PlayerState.STOPPED + Player.STATE_ENDED -> PlayerState.STOPPED + else -> if (isPlaying) { + PlayerState.PLAYING + } else { + PlayerState.PAUSED + } + } + + private fun refreshMediaItems() { + mediaIdMap.clear() + songUrlMap.clear() + + val mediaItems = playList.values.mapIndexed { i, song -> + mediaIdMap[song.id] = i + songUrlMap[song.url] = song + + MediaItem.Builder() + .setUri(song.url) + .setMediaId(song.url) + .setMediaMetadata( + MediaMetadata.Builder() + .setTitle(song.title) + .setSubtitle(song.arist) + .setArtist(song.arist) + .setArtworkUri(Uri.parse(song.coverImageUrl)) + .build() + ) + .build() + } + + mediaController?.setMediaItems(mediaItems) + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/service/impl/MusicService.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/service/impl/MusicService.kt new file mode 100644 index 0000000..d5bca27 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/service/impl/MusicService.kt @@ -0,0 +1,38 @@ +package top.rrricardo.chiara.service.impl + +import androidx.media3.common.MediaItem +import androidx.media3.exoplayer.ExoPlayer +import androidx.media3.session.MediaSession +import androidx.media3.session.MediaSessionService +import com.google.common.util.concurrent.Futures +import com.google.common.util.concurrent.ListenableFuture +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +@AndroidEntryPoint +class MusicService : MediaSessionService() { + private var mediaSession: MediaSession? = null + + @Inject + lateinit var exoPlayer: ExoPlayer + + override fun onCreate() { + super.onCreate() + + mediaSession = MediaSession.Builder(this, exoPlayer) + .build() + } + + override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaSession? { + return mediaSession + } + + override fun onDestroy() { + mediaSession?.run { + player.release() + release() + mediaSession = null + } + super.onDestroy() + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/ChiaraApp.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/ChiaraApp.kt new file mode 100644 index 0000000..f7f2336 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/ChiaraApp.kt @@ -0,0 +1,160 @@ +package top.rrricardo.chiara.ui + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.autoSaver +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.navigation.NavType +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import androidx.navigation.navArgument +import top.rrricardo.chiara.ui.page.AlbumPage +import top.rrricardo.chiara.ui.page.HomePage +import top.rrricardo.chiara.ui.page.PlayListPage +import top.rrricardo.chiara.ui.page.ShowPage +import top.rrricardo.chiara.ui.page.SongPage +import top.rrricardo.chiara.ui.page.SplashPage +import top.rrricardo.chiara.ui.page.VideoPage +import top.rrricardo.chiara.ui.viewmodel.AlbumPageViewModel +import top.rrricardo.chiara.ui.viewmodel.HomePageViewModel +import top.rrricardo.chiara.ui.viewmodel.MainViewModel +import top.rrricardo.chiara.ui.viewmodel.ShowPageViewModel +import top.rrricardo.chiara.ui.viewmodel.VideoPageViewModel + +@Composable +fun ChiaraApp(mainViewModel: MainViewModel) { + val navController = rememberNavController() + + NavHost(navController = navController, startDestination = Navigation.SPLASH_SCREEN) { + composable(route = Navigation.SPLASH_SCREEN) { + SplashPage(mainViewModel = mainViewModel, navController = navController) + } + + composable(route = Navigation.HOME) { + val homePageViewModel: HomePageViewModel = hiltViewModel() + val isInitialized = rememberSaveable(stateSaver = autoSaver()) { + mutableStateOf(false) + } + + if (!isInitialized.value) { + LaunchedEffect(key1 = Unit) { + homePageViewModel.fetchRemoteData() + isInitialized.value = true + } + } + + HomePage( + mainViewModel = mainViewModel, + homePageViewModel = homePageViewModel, + navController = navController + ) + } + + composable( + "${Navigation.ALBUM_SCREEN}/{albumId}", + arguments = listOf(navArgument("albumId") { + type = NavType.IntType + }) + ) { backStackEntry -> + val albumId = backStackEntry.arguments?.getInt("albumId") + val albumPageViewModel: AlbumPageViewModel = hiltViewModel() + val isInitialized = rememberSaveable(stateSaver = autoSaver()) { + mutableStateOf(false) + } + + if (!isInitialized.value) { + LaunchedEffect(key1 = Unit) { + albumId?.let { + albumPageViewModel.fetchAlbum(it) + } + isInitialized.value = true + } + } + + AlbumPage( + mainViewModel = mainViewModel, + albumPageViewModel = albumPageViewModel, + navController = navController + ) + } + + composable(route = Navigation.SONG_SCREEN) { + SongPage(mainViewModel = mainViewModel, navController = navController) + } + + composable(route = Navigation.PLAYLIST_SCREEN) { + PlayListPage(mainViewModel = mainViewModel, navController = navController) + } + + composable( + route = "${Navigation.SHOW_SCREEN}/{showId}", arguments = listOf( + navArgument("showId") { + type = NavType.IntType + } + ) + ) { backStackEntry -> + val seasonId = backStackEntry.arguments?.getInt("showId") + val showPageViewModel: ShowPageViewModel = hiltViewModel() + val isInitialized = rememberSaveable(stateSaver = autoSaver()) { + mutableStateOf(false) + } + + if (!isInitialized.value) { + LaunchedEffect(key1 = Unit) { + seasonId?.let { + showPageViewModel.fetchShowSeason(it) + } + isInitialized.value = true + } + } + + ShowPage(showPageViewModel = showPageViewModel, navController = navController) + } + + composable(route = "${Navigation.VIDEO_SCREEN}?videoId={videoId}&showId={showId}", + arguments = listOf( + navArgument("videoId") { + type = NavType.IntType + }, + navArgument("showId") { + type = NavType.IntType + } + )) { backStackEntry -> + val videoId = backStackEntry.arguments?.getInt("videoId") + val showId = backStackEntry.arguments?.getInt("showId") + val videoPageViewModel: VideoPageViewModel = hiltViewModel() + val isInitialized = rememberSaveable(stateSaver = autoSaver()) { + mutableStateOf(false) + } + + if (!isInitialized.value) { + LaunchedEffect(key1 = Unit) { + videoId?.let {videoId -> + videoPageViewModel.fetchAndPlay(videoId) + + showId?.let { + videoPageViewModel.fetchShow(it, videoId) + } + } + + isInitialized.value = true + } + } + + VideoPage(videoPageViewModel = videoPageViewModel, navController = navController) + } + } +} + +object Navigation { + const val SPLASH_SCREEN = "splashScreen" + const val HOME = "home" + const val ALBUM_SCREEN = "albumScreen" + const val SONG_SCREEN = "songScreen" + const val PLAYLIST_SCREEN = "playlistScreen" + const val SHOW_SCREEN = "showScreen" + const val VIDEO_SCREEN = "videoScreen" +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/AnimatedVinyl.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/AnimatedVinyl.kt new file mode 100644 index 0000000..5ab17c9 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/AnimatedVinyl.kt @@ -0,0 +1,133 @@ +package top.rrricardo.chiara.ui.component + +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.LinearEasing +import androidx.compose.animation.core.RepeatMode +import androidx.compose.animation.core.infiniteRepeatable +import androidx.compose.animation.core.tween +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.rotate +import androidx.compose.ui.geometry.Rect +import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.Outline +import androidx.compose.ui.graphics.Path +import androidx.compose.ui.graphics.PathOperation +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.Density +import androidx.compose.ui.unit.LayoutDirection +import top.rrricardo.chiara.R + +val roundedShape = object : Shape { + override fun createOutline( + size: Size, + layoutDirection: LayoutDirection, + density: Density + ): Outline { + val p1 = Path().apply { + addOval(Rect(4f, 3f, size.width - 1, size.height - 1)) + } + val thickness = size.height / 2.10f + val p2 = Path().apply { + addOval( + Rect( + thickness, + thickness, + size.width - thickness, + size.height - thickness + ) + ) + } + val p3 = Path() + p3.op(p1, p2, PathOperation.Difference) + + return Outline.Generic(p3) + } +} + +@Composable +fun AnimatedVinyl( + modifier: Modifier = Modifier, + isSongPlaying: Boolean = false, + painter: Painter +) { + var currentRotation by remember { + mutableFloatStateOf(0f) + } + + val rotation = remember { + Animatable(currentRotation) + } + + LaunchedEffect(isSongPlaying) { + if (isSongPlaying) { + rotation.animateTo( + targetValue = currentRotation + 360f, animationSpec = infiniteRepeatable( + animation = tween(3000, easing = LinearEasing), + repeatMode = RepeatMode.Restart + ) + ) { + currentRotation = value + } + } else { + if (currentRotation > 0f) { + rotation.animateTo( + targetValue = currentRotation + 50f, animationSpec = tween( + 1250, easing = LinearEasing + ) + ) { + currentRotation = value + } + } + } + } + + Vinyl(modifier = modifier, painter = painter, rotationDegrees = rotation.value) +} + +@Composable +fun Vinyl( + modifier: Modifier = Modifier, + rotationDegrees: Float = 0f, + painter: Painter +) { + Box( + modifier = modifier + .aspectRatio(1f) + .clip(roundedShape) + ) { + // Vinyl background + Image( + modifier = Modifier + .fillMaxSize() + .rotate(rotationDegrees), + painter = painterResource(id = R.drawable.vinyl_background), + contentDescription = "Vinyl background" + ) + + // Vinyl song cover + Image( + modifier = Modifier + .fillMaxSize(0.5f) + .rotate(rotationDegrees) + .aspectRatio(1f) + .align(Alignment.Center) + .clip(roundedShape), + painter = painter, + contentDescription = "Song Cover" + ) + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/ChiaraAppBar.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/ChiaraAppBar.kt new file mode 100644 index 0000000..2f6879f --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/ChiaraAppBar.kt @@ -0,0 +1,83 @@ +package top.rrricardo.chiara.ui.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBars +import androidx.compose.foundation.layout.windowInsetsTopHeight +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.rounded.ArrowBack +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import top.rrricardo.chiara.ui.theme.ChiaraTheme + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun ChiaraAppBar( + modifier: Modifier = Modifier, + title: String, + showNavigationIcon: Boolean = false, + onNavigateUp: () -> Unit = {}, + actions: @Composable (RowScope.() -> Unit) = {} +) { + val appBarColor = MaterialTheme.colorScheme.surface.copy(alpha = 0.7f) + + Spacer( + modifier = Modifier + .fillMaxWidth() + .background(appBarColor) + .windowInsetsTopHeight(WindowInsets.statusBars) + ) + TopAppBar(title = { + Row { + Text( + text = title, + maxLines = 2, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.padding(start = 8.dp) + ) + } + }, navigationIcon = { + CompositionLocalProvider(LocalContentColor provides LocalContentColor.current.copy(alpha = 0.4f)) { + if (showNavigationIcon) { + Icon(imageVector = Icons.AutoMirrored.Rounded.ArrowBack, + contentDescription = "Close", + tint = MaterialTheme.colorScheme.onBackground, + modifier = Modifier + .size(32.dp) + .clickable { + onNavigateUp() + } + ) + } + } + }, actions = actions, modifier = modifier.background(appBarColor) + ) +} + +@Preview(showBackground = true) +@Composable +fun ChiaraAppBarPreview() { + ChiaraTheme { + ChiaraAppBar( + title = "Genshin Impact - Jade Moon Upon a Sea of Clouds", + showNavigationIcon = true + ) + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/HomeBottomBar.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/HomeBottomBar.kt new file mode 100644 index 0000000..2f3eccb --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/HomeBottomBar.kt @@ -0,0 +1,268 @@ +package top.rrricardo.chiara.ui.component + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.gestures.detectDragGestures +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.rounded.List +import androidx.compose.material.icons.rounded.List +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import coil.compose.rememberAsyncImagePainter +import coil.request.ImageRequest +import top.rrricardo.chiara.R +import top.rrricardo.chiara.model.PlayerState +import top.rrricardo.chiara.openapi.model.SongResponse +import top.rrricardo.chiara.service.MusicController +import top.rrricardo.chiara.ui.Navigation +import top.rrricardo.chiara.ui.viewmodel.MainViewModel + +@Composable +fun HomeBottomBar( + modifier: Modifier = Modifier, + mainViewModel: MainViewModel, + navController: NavController +) { + var offsetX by remember { + mutableFloatStateOf(0f) + } + val musicControllerState = mainViewModel.musicControllerState + val musicController = mainViewModel.musicController + + AnimatedVisibility( + visible = true, + modifier = modifier + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .pointerInput(Unit) { + detectDragGestures( + onDragEnd = { + when { + offsetX > 0 -> { + musicController.skipToPreviousSong() + } + + offsetX < 0 -> { + musicController.skipToNextSong() + } + } + }, + onDrag = { change, dragAmount -> + change.consume() + offsetX = dragAmount.x + } + ) + } + .background( + if (!isSystemInDarkTheme()) { + Color.LightGray + } else { + Color.DarkGray + } + ), + ) { + if (musicControllerState.currentSong != null) { + HomeBottomBarItem( + song = musicControllerState.currentSong, + musicController = musicController, + playerState = musicControllerState.playerState, + navController = navController + ) + } else { + NonPlayingHomeBar(navController = navController) + } + } + } +} + +@Composable +fun HomeBottomBarItem( + song: SongResponse, + musicController: MusicController, + playerState: PlayerState, + navController: NavController +) { + Box( + modifier = Modifier + .height(64.dp) + .clickable(onClick = { + navController.navigate(Navigation.SONG_SCREEN) + }) + ) { + val context = LocalContext.current + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxWidth() + ) { + Image( + painter = rememberAsyncImagePainter( + model = ImageRequest.Builder(context) + .data(song.coverImageUrl) + .crossfade(true).build() + ), + contentDescription = song.title, + contentScale = ContentScale.Crop, + modifier = Modifier + .size(48.dp) + .offset(16.dp) + ) + Column( + verticalArrangement = Arrangement.Center, + modifier = Modifier + .weight(1f) + .fillMaxHeight() + .padding(vertical = 8.dp, horizontal = 32.dp), + ) { + Text( + song.title, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onBackground, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + + Text( + song.arist, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onBackground, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier + .graphicsLayer { + alpha = 0.60f + } + + ) + } + val painter = rememberAsyncImagePainter( + if (playerState == PlayerState.PLAYING) { + R.drawable.ic_round_pause + } else { + R.drawable.ic_round_play_arrow + } + ) + + Image( + painter = painter, + contentDescription = "Music", + contentScale = ContentScale.Crop, + modifier = Modifier + .padding(horizontal = 8.dp) + .size(48.dp) + .clickable( + interactionSource = remember { + MutableInteractionSource() + }, + indication = rememberRipple( + bounded = false, + radius = 24.dp + ) + ) { + if (playerState == PlayerState.PLAYING) { + musicController.pause() + } else { + musicController.resume() + } + }, + ) + + Icon( + imageVector = Icons.AutoMirrored.Rounded.List, + contentDescription = "播放列表", + tint = MaterialTheme.colorScheme.surface, + modifier = Modifier + .padding(horizontal = 8.dp) + .size(36.dp) + .clickable { + navController.navigate(Navigation.PLAYLIST_SCREEN) + } + ) + } + } +} + +@Composable +fun NonPlayingHomeBar(navController: NavController) { + Box( + modifier = Modifier + .height(64.dp) + .fillMaxWidth() + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxWidth() + ) { + Image( + painter = painterResource(id = R.drawable.ic_image), + contentDescription = "Music", + contentScale = ContentScale.Crop, + modifier = Modifier + .padding(horizontal = 8.dp) + .size(48.dp) + ) + + Column( + verticalArrangement = Arrangement.Center, + modifier = Modifier + .weight(1f) + .fillMaxHeight() + .padding(vertical = 8.dp, horizontal = 32.dp), + ) { + Text( + text = "未在播放", + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onBackground + ) + } + + Icon( + imageVector = Icons.AutoMirrored.Rounded.List, + contentDescription = "播放列表", + tint = MaterialTheme.colorScheme.surface, + modifier = Modifier + .padding(horizontal = 8.dp) + .size(36.dp) + .clickable { + navController.navigate(Navigation.PLAYLIST_SCREEN) + } + ) + } + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/MusicItem.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/MusicItem.kt new file mode 100644 index 0000000..86d0eec --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/MusicItem.kt @@ -0,0 +1,154 @@ +package top.rrricardo.chiara.ui.component + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.size +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.constraintlayout.compose.ConstraintLayout +import androidx.constraintlayout.compose.Dimension +import coil.compose.rememberAsyncImagePainter +import coil.request.ImageRequest +import top.rrricardo.chiara.Configuration +import top.rrricardo.chiara.R +import top.rrricardo.chiara.ui.theme.ChiaraTheme + +@Composable +fun MusicItem( + title: String, + artist: String, + coverImageUrl: String, + playing: Boolean = false, + onClick: () -> Unit +) { + val backgroundColor = if (playing) { + MaterialTheme.colorScheme.surface + } else { + MaterialTheme.colorScheme.background + } + + ConstraintLayout( + modifier = Modifier + .background(MaterialTheme.colorScheme.background) + .clickable { + onClick() + } + .background(backgroundColor) + .fillMaxWidth() + ) { + val ( + dividerRef, titleRef, artistRef, imageRef + ) = createRefs() + + HorizontalDivider(Modifier.constrainAs(dividerRef) { + top.linkTo(parent.top) + centerHorizontallyTo(parent) + width = Dimension.fillToConstraints + }) + + val coverImage = if (coverImageUrl == Configuration.SERVER_ADDRESS) { + painterResource(id = R.drawable.ic_round_album) + } else { + rememberAsyncImagePainter(ImageRequest + .Builder(LocalContext.current).data(coverImageUrl) + .crossfade(true).build()) + } + + Image( + painter = coverImage, + contentDescription = null, + contentScale = ContentScale.Crop, + modifier = Modifier + .size(80.dp) + .clip(MaterialTheme.shapes.medium) + .constrainAs(imageRef) { + end.linkTo(parent.end, 16.dp) + top.linkTo(parent.top, 16.dp) + bottom.linkTo(parent.bottom, 16.dp) + } + ) + + val textColor = if (playing) { + MaterialTheme.colorScheme.primary + } else { + MaterialTheme.colorScheme.onBackground + } + + Text( + text = title, + maxLines = 2, + style = MaterialTheme.typography.bodyLarge, + color = textColor, + modifier = Modifier.constrainAs(titleRef) { + linkTo( + start = parent.start, + end = imageRef.start, + startMargin = 24.dp, + endMargin = 16.dp, + bias = 0f + ) + top.linkTo(parent.top, 16.dp) + start.linkTo(parent.start, 16.dp) + width = Dimension.preferredWrapContent + } + ) + + CompositionLocalProvider(LocalContentColor provides LocalContentColor.current.copy(alpha = 0.4f)) { + Text( + text = artist, + maxLines = 2, + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.constrainAs(artistRef) { + linkTo( + start = parent.start, + end = imageRef.start, + startMargin = 24.dp, + endMargin = 16.dp, + bias = 0f + ) + top.linkTo(titleRef.bottom, 6.dp) + start.linkTo(parent.start, 16.dp) + width = Dimension.preferredWrapContent + } + ) + } + } +} + +@Preview +@Composable +fun MusicItemPreview() { + ChiaraTheme { + Column { + MusicItem( + title = "Genshin Impact - Jade Moon Upon a Sea of Clouds", + artist = "Yu-Peng Chen, HOYO-MiX", + coverImageUrl = "http://10.29.155.159:5078/api/file/b1c6a383-f860-4391-82ff-9507851603cc" + ) { + + } + MusicItem( + title = "Genshin Impact - Jade Moon Upon a Sea of Clouds", + artist = "Yu-Peng Chen, HOYO-MiX", + coverImageUrl = "http://10.29.155.159:5078/api/file/b1c6a383-f860-4391-82ff-9507851603cc", + playing = true + ) { + + } + } + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/VideoItem.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/VideoItem.kt new file mode 100644 index 0000000..2ca313e --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/component/VideoItem.kt @@ -0,0 +1,91 @@ +package top.rrricardo.chiara.ui.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import top.rrricardo.chiara.openapi.model.EpisodeResponse +import top.rrricardo.chiara.openapi.model.ShowSeasonResponse + +@Composable +fun SeasonItem(season: ShowSeasonResponse, onClick: () -> Unit) { + Column(modifier = Modifier + .background(MaterialTheme.colorScheme.background) + .clickable { + onClick() + } + .fillMaxWidth() + .height(80.dp)) { + HorizontalDivider() + + Text( + text = season.title, + maxLines = 2, + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onBackground + ) + } +} + +@Composable +fun EpisodeItem(episode: EpisodeResponse, onClick: () -> Unit) { + Column(modifier = Modifier + .background(MaterialTheme.colorScheme.background) + .clickable { + onClick() + } + .fillMaxWidth() + .height(80.dp)) { + HorizontalDivider() + + Text( + text = episode.title, + maxLines = 2, + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onBackground + ) + + CompositionLocalProvider(LocalContentColor provides LocalContentColor.current.copy(alpha = 0.4f)) { + Text( + text = episode.episodeNumber, + style = MaterialTheme.typography.bodySmall, + ) + } + } +} + +@Preview(showBackground = true) +@Composable +fun SeasonItemPreview() { + Column { + SeasonItem( + season = ShowSeasonResponse( + id = 1, + title = "Tonikaku Kawaii S2", + episodes = emptyList() + ) + ) { + + } + + EpisodeItem( + episode = EpisodeResponse( + id = 1, + title = "Tonikaku Kawaii S2 E1", + episodeNumber = "1", + showSeasonId = 1 + ) + ) { + } + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/AlbumPage.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/AlbumPage.kt new file mode 100644 index 0000000..3ff3c97 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/AlbumPage.kt @@ -0,0 +1,90 @@ +package top.rrricardo.chiara.ui.page + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import top.rrricardo.chiara.ui.component.ChiaraAppBar +import top.rrricardo.chiara.ui.component.HomeBottomBar +import top.rrricardo.chiara.ui.component.MusicItem +import top.rrricardo.chiara.ui.viewmodel.AlbumPageViewModel +import top.rrricardo.chiara.ui.viewmodel.MainViewModel + +@Composable +fun AlbumPage( + mainViewModel: MainViewModel, + albumPageViewModel: AlbumPageViewModel, + navController: NavController +) { + Surface(modifier = Modifier.fillMaxSize()) { + Column(modifier = Modifier.fillMaxSize()) { + ChiaraAppBar( + title = albumPageViewModel.albumPageState.album?.title ?: "音乐播放器", + showNavigationIcon = true, + onNavigateUp = { + navController.navigateUp() + } + ) + + with(albumPageViewModel.albumPageState) { + when { + loading -> { + Box(modifier = Modifier.fillMaxSize()) { + CircularProgressIndicator( + color = MaterialTheme.colorScheme.onBackground, + modifier = Modifier + .width(100.dp) + .fillMaxHeight() + .align(Alignment.Center) + .padding( + top = 16.dp, start = 16.dp, end = 16.dp, bottom = 16.dp + ) + ) + } + } + + !loading -> { + album?.songs?.let { songs -> + LazyColumn( + modifier = Modifier + .weight(1f) + .fillMaxWidth() + .background(MaterialTheme.colorScheme.background) + ) { + items(songs) { + MusicItem( + title = it.title, + artist = it.arist, + coverImageUrl = it.coverImageUrl, + playing = albumPageViewModel.albumPageState.selectedSong?.id == it.id + ) { + albumPageViewModel.selectSong(it) + albumPageViewModel.playSong() + } + } + } + } + } + + else -> {} + } + } + + HomeBottomBar(mainViewModel = mainViewModel, navController = navController) + } + } +} diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/HomePage.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/HomePage.kt new file mode 100644 index 0000000..a281f2b --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/HomePage.kt @@ -0,0 +1,225 @@ +package top.rrricardo.chiara.ui.page + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Refresh +import androidx.compose.material3.BottomAppBar +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import androidx.navigation.NavHostController +import top.rrricardo.chiara.R +import top.rrricardo.chiara.ui.Navigation +import top.rrricardo.chiara.ui.component.ChiaraAppBar +import top.rrricardo.chiara.ui.component.HomeBottomBar +import top.rrricardo.chiara.ui.component.MusicItem +import top.rrricardo.chiara.ui.component.SeasonItem +import top.rrricardo.chiara.ui.viewmodel.HomePageViewModel +import top.rrricardo.chiara.ui.viewmodel.MainViewModel + +@Composable +fun HomePage( + mainViewModel: MainViewModel, + homePageViewModel: HomePageViewModel, + navController: NavHostController +) { + Scaffold(topBar = { + ChiaraAppBar(title = "Chiara播放器", actions = { + Icon(imageVector = Icons.Rounded.Refresh, + contentDescription = "Refresh", + modifier = Modifier + .size(32.dp) + .clickable { + homePageViewModel.fetchRemoteData() + } + ) + }) + }, bottomBar = { + BottomAppBar( + containerColor = MaterialTheme.colorScheme.primaryContainer, + contentColor = MaterialTheme.colorScheme.primary, + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceAround + ) { + IconButton(onClick = { + homePageViewModel.changeToMusicPage() + }) { + Icon( + painter = painterResource(id = R.drawable.ic_round_library_music), + contentDescription = "Music library", + modifier = Modifier + .size(32.dp) + ) + } + + IconButton(onClick = { + homePageViewModel.changeToVideoPage() + }) { + Icon( + painter = painterResource(id = R.drawable.ic_round_video_library), + contentDescription = "Video library", + modifier = Modifier + .size(32.dp) + ) + } + } + } + }) { padding -> + Box( + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + with(homePageViewModel.homePageState) { + when { + loading -> { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.BottomCenter + ) { + CircularProgressIndicator( + color = MaterialTheme.colorScheme.onBackground, + modifier = Modifier + .width(100.dp) + .fillMaxHeight() + .align(Alignment.Center) + .padding( + top = 16.dp, + start = 16.dp, + end = 16.dp, + bottom = 16.dp + ) + ) + } + } + + !loading && isMusicPage -> { + MusicList( + mainViewModel = mainViewModel, + homePageViewModel = homePageViewModel, + navController = navController + ) + } + + !loading && !isMusicPage -> { + VideoList( + homePageViewModel = homePageViewModel, + navController = navController + ) + } + } + } + } + } +} + +@Composable +fun MusicList( + mainViewModel: MainViewModel, + homePageViewModel: HomePageViewModel, + navController: NavController +) { + Column(modifier = Modifier.fillMaxSize()) { + LazyColumn( + modifier = Modifier + .weight(1f) + .fillMaxWidth() + .background(MaterialTheme.colorScheme.background) + ) { + items(homePageViewModel.homePageState.albums) { + MusicItem( + title = it.title, + artist = it.arist, + coverImageUrl = it.coverImageUrl + ) { + homePageViewModel.selectAlbum(it) + navController.navigate( + "${Navigation.ALBUM_SCREEN}/${it.id}" + ) + } + } + } + + HomeBottomBar(mainViewModel = mainViewModel, navController = navController) + } +} + +@Composable +fun VideoList(homePageViewModel: HomePageViewModel, navController: NavController) { + Column(modifier = Modifier.fillMaxSize()) { + LazyColumn( + modifier = Modifier + .weight(1f) + .fillMaxWidth() + .background(MaterialTheme.colorScheme.background) + ) { + items(homePageViewModel.homePageState.seasons) { + SeasonItem(season = it) { + navController.navigate("${Navigation.SHOW_SCREEN}/${it.id}") + } + } + } + } +} + +@Preview(showBackground = true) +@Composable +fun NavigationBarPreview() { + Scaffold(bottomBar = { + BottomAppBar( + containerColor = MaterialTheme.colorScheme.primaryContainer, + contentColor = MaterialTheme.colorScheme.primary, + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceAround + ) { + IconButton(onClick = { + }) { + Icon( + painter = painterResource(id = R.drawable.ic_round_library_music), + contentDescription = "Music library", + modifier = Modifier + .size(32.dp) + ) + } + + IconButton(onClick = { + }) { + Icon( + painter = painterResource(id = R.drawable.ic_round_video_library), + contentDescription = "Video library", + modifier = Modifier + .size(32.dp) + ) + } + } + } + }) { + Box(modifier = Modifier.padding(it)) + } +} diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/PlayListPage.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/PlayListPage.kt new file mode 100644 index 0000000..4131758 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/PlayListPage.kt @@ -0,0 +1,114 @@ +package top.rrricardo.chiara.ui.page + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Delete +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import top.rrricardo.chiara.ui.component.ChiaraAppBar +import top.rrricardo.chiara.ui.component.HomeBottomBar +import top.rrricardo.chiara.ui.component.MusicItem +import top.rrricardo.chiara.ui.viewmodel.MainViewModel + +@Composable +fun PlayListPage( + modifier: Modifier = Modifier, + mainViewModel: MainViewModel, + navController: NavController +) { + Scaffold(modifier = modifier, topBar = { + ChiaraAppBar( + title = "播放列表", + showNavigationIcon = true, + onNavigateUp = { + navController.navigateUp() + } + ) + }, floatingActionButton = { + FloatingActionButton(onClick = { + mainViewModel.musicController.clearPlayList() + mainViewModel.refreshPlayList() + }) { + Icon(imageVector = Icons.Rounded.Delete, contentDescription = "Delete") + } + }, bottomBar = { + HomeBottomBar(mainViewModel = mainViewModel, navController = navController) + }) { padding -> + Surface( + modifier + .fillMaxSize() + .padding(padding) + ) { + mainViewModel.refreshPlayList() + Column(modifier = Modifier.fillMaxSize()) { + with(mainViewModel) { + if (playList.isEmpty()) { + NoSongHint() + } else { + LazyColumn( + modifier = Modifier + .weight(1f) + .fillMaxWidth() + .background(MaterialTheme.colorScheme.onBackground) + ) { + items(playList) { + MusicItem( + title = it.title, + artist = it.arist, + coverImageUrl = it.coverImageUrl, + playing = it.id == mainViewModel.musicControllerState.currentSong?.id + ) { + mainViewModel.musicController.play(it.id) + } + } + } + } + } + } + } + } +} + +@Composable +fun NoSongHint() { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Spacer( + modifier = Modifier + .fillMaxWidth() + .height(64.dp) + ) + + Text( + text = "还没有任何歌曲呢", + color = MaterialTheme.colorScheme.primary, + style = MaterialTheme.typography.bodyMedium + ) + } +} + +@Preview(showBackground = true) +@Composable +fun NoSongHitPreview() { + NoSongHint() +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/ShowPage.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/ShowPage.kt new file mode 100644 index 0000000..9d62f17 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/ShowPage.kt @@ -0,0 +1,74 @@ +package top.rrricardo.chiara.ui.page + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import top.rrricardo.chiara.ui.Navigation +import top.rrricardo.chiara.ui.component.ChiaraAppBar +import top.rrricardo.chiara.ui.component.EpisodeItem +import top.rrricardo.chiara.ui.viewmodel.ShowPageViewModel + +@Composable +fun ShowPage( + showPageViewModel: ShowPageViewModel, + navController: NavController +) { + Surface(modifier = Modifier.fillMaxSize()) { + Column(modifier = Modifier.fillMaxSize()) { + ChiaraAppBar(title = showPageViewModel.showPageState.showSeason?.title ?: "Video") + + with(showPageViewModel.showPageState) { + when { + loading -> { + Box(modifier = Modifier.fillMaxSize()) { + CircularProgressIndicator( + color = MaterialTheme.colorScheme.onBackground, + modifier = Modifier + .width(100.dp) + .fillMaxHeight() + .align(Alignment.Center) + .padding( + top = 16.dp, start = 16.dp, end = 16.dp, bottom = 16.dp + ) + ) + } + } + + !loading -> { + showSeason?.episodes?.let { + LazyColumn( + modifier = Modifier + .fillMaxWidth() + .weight(1f) + .background(MaterialTheme.colorScheme.background) + ) { + items(it) { + EpisodeItem(episode = it) { + navController.navigate( + "${Navigation.VIDEO_SCREEN}?videoId=${it.id}&showId=${it.showSeasonId}" + ) + } + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/SongPage.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/SongPage.kt new file mode 100644 index 0000000..b5ce476 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/SongPage.kt @@ -0,0 +1,338 @@ +package top.rrricardo.chiara.ui.page + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.systemBarsPadding +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.rounded.KeyboardArrowLeft +import androidx.compose.material.icons.automirrored.rounded.KeyboardArrowRight +import androidx.compose.material.icons.automirrored.rounded.List +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Slider +import androidx.compose.material3.SliderDefaults +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import coil.compose.rememberAsyncImagePainter +import coil.request.ImageRequest +import top.rrricardo.chiara.R +import top.rrricardo.chiara.extension.toTime +import top.rrricardo.chiara.model.PlayerState +import top.rrricardo.chiara.model.RepeatState +import top.rrricardo.chiara.openapi.model.SongResponse +import top.rrricardo.chiara.ui.Navigation +import top.rrricardo.chiara.ui.component.AnimatedVinyl +import top.rrricardo.chiara.ui.theme.ChiaraTheme +import top.rrricardo.chiara.ui.viewmodel.MainViewModel + +@Composable +fun SongPage( + mainViewModel: MainViewModel, + navController: NavController +) { + mainViewModel.musicControllerState.currentSong?.let { + Box( + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.background) + ) { + SongScreenContent( + song = it, + mainViewModel = mainViewModel, + navController = navController + ) + } + } +} + +@Composable +fun SongScreenContent( + song: SongResponse, + mainViewModel: MainViewModel, + navController: NavController +) { + val musicControllerState = mainViewModel.musicControllerState + + val dominantColor by remember { mutableStateOf(Color.Transparent) } + val gradientColors = if (isSystemInDarkTheme()) { + listOf( + dominantColor, MaterialTheme.colorScheme.background + ) + } else { + listOf( + MaterialTheme.colorScheme.background, MaterialTheme.colorScheme.background + ) + } + + val sliderColors = if (isSystemInDarkTheme()) { + SliderDefaults.colors( + thumbColor = MaterialTheme.colorScheme.onBackground, + activeTrackColor = MaterialTheme.colorScheme.onBackground, + inactiveTrackColor = MaterialTheme.colorScheme.onBackground.copy( + alpha = 0.1f + ), + ) + } else SliderDefaults.colors( + thumbColor = dominantColor, + activeTrackColor = dominantColor, + inactiveTrackColor = dominantColor.copy( + alpha = 0.1f + ), + ) + + Box( + modifier = Modifier.fillMaxSize() + ) { + Surface { + Box( + modifier = Modifier + .background( + Brush.verticalGradient( + colors = gradientColors, + endY = LocalConfiguration.current.screenHeightDp.toFloat() * LocalDensity.current.density + ) + ) + .fillMaxSize() + .systemBarsPadding() + ) { + Column { + IconButton( + onClick = { + navController.navigateUp() + } + ) { + Image( + imageVector = Icons.AutoMirrored.Rounded.KeyboardArrowLeft, + contentDescription = "Close", + colorFilter = ColorFilter.tint(LocalContentColor.current) + ) + } + Column( + modifier = Modifier.padding(horizontal = 24.dp) + ) { + Box( + modifier = Modifier + .padding(vertical = 32.dp) + .clip(MaterialTheme.shapes.medium) + .weight(1f, fill = false) + .aspectRatio(1f) + + ) { + val imagePainter = rememberAsyncImagePainter( + model = ImageRequest.Builder(LocalContext.current) + .data(song.coverImageUrl) + .crossfade(true).build() + ) + + AnimatedVinyl( + painter = imagePainter, + isSongPlaying = musicControllerState.playerState == PlayerState.PLAYING + ) + } + + Text( + text = song.title, + style = MaterialTheme.typography.titleSmall, + color = MaterialTheme.colorScheme.onBackground, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + + Text(song.arist, + style = MaterialTheme.typography.labelLarge, + color = MaterialTheme.colorScheme.onBackground, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.graphicsLayer { + alpha = 0.60f + }) + + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 24.dp) + ) { + + Slider( + value = musicControllerState.currentPosition.toFloat(), + modifier = Modifier.fillMaxWidth(), + valueRange = 0f..musicControllerState.totalDuration.toFloat(), + colors = sliderColors, + onValueChange = { + mainViewModel.musicController.seekTo(it.toLong()) + }, + ) + CompositionLocalProvider( + LocalContentColor provides LocalContentColor.current.copy( + alpha = 0.4f + ) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + musicControllerState.currentPosition.toTime(), + style = MaterialTheme.typography.bodyMedium + ) + Text( + musicControllerState.totalDuration.toTime(), + style = MaterialTheme.typography.bodyMedium + ) + } + } + } + Row( + horizontalArrangement = Arrangement.SpaceAround, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 8.dp), + ) { + Icon( + imageVector = Icons.AutoMirrored.Rounded.KeyboardArrowLeft, + contentDescription = "Skip Previous", + modifier = Modifier + .clip(CircleShape) + .clickable(onClick = { + mainViewModel.musicController.skipToPreviousSong() + }) + .padding(12.dp) + .size(32.dp) + ) + val playPauseIcon = + if (musicControllerState.playerState == PlayerState.PLAYING) { + R.drawable.ic_round_pause + } else { + R.drawable.ic_round_play_arrow + } + + Icon( + painter = painterResource(playPauseIcon), + contentDescription = "Play", + tint = MaterialTheme.colorScheme.background, + modifier = Modifier + .clip(CircleShape) + .background(MaterialTheme.colorScheme.onBackground) + .clickable(onClick = { + if (musicControllerState.playerState == PlayerState.PLAYING) { + mainViewModel.musicController.pause() + } else { + mainViewModel.musicController.resume() + } + }) + .size(64.dp) + .padding(8.dp) + ) + Icon( + imageVector = Icons.AutoMirrored.Rounded.KeyboardArrowRight, + contentDescription = "Skip Next", + modifier = Modifier + .clip(CircleShape) + .clickable(onClick = { + mainViewModel.musicController.skipToNextSong() + }) + .padding(12.dp) + .size(32.dp) + ) + } + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 8.dp, horizontal = 20.dp) + ) { + val repeatIcon = when (musicControllerState.repeatState) { + RepeatState.Sequence -> R.drawable.ic_round_repeat + RepeatState.RepeatOne -> R.drawable.ic_round_repeat_one + RepeatState.Shuffle -> R.drawable.ic_round_shuffle + } + + Icon( + painter = painterResource(id = repeatIcon), + contentDescription = "RepeatState", + tint = MaterialTheme.colorScheme.primary, + modifier = Modifier + .clip(CircleShape) + .background(MaterialTheme.colorScheme.background) + .clickable(onClick = { + when (musicControllerState.repeatState) { + RepeatState.Sequence -> { + mainViewModel.musicController.setRepeatOne() + } + + RepeatState.RepeatOne -> { + mainViewModel.musicController.setShuffleRepeat() + } + + RepeatState.Shuffle -> { + mainViewModel.musicController.setSequenceRepeat() + } + } + }) + .padding(12.dp) + .size(32.dp) + ) + + Icon( + imageVector = Icons.AutoMirrored.Rounded.List, + contentDescription = "PlayList", + tint = MaterialTheme.colorScheme.primary, + modifier = Modifier + .padding(12.dp) + .size(32.dp) + .clickable { + navController.navigate(Navigation.PLAYLIST_SCREEN) + } + ) + } + } + } + } + } + } +} + +@Preview(showBackground = true) +@Composable +fun ColorPreview() { + ChiaraTheme { + Text(text = "测试测试测试测试测试测试测试", color = MaterialTheme.colorScheme.primary) + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/SplashPage.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/SplashPage.kt new file mode 100644 index 0000000..68cff88 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/SplashPage.kt @@ -0,0 +1,76 @@ +package top.rrricardo.chiara.ui.page + +import android.view.animation.OvershootInterpolator +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.tween +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.size +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.scale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import top.rrricardo.chiara.R +import top.rrricardo.chiara.ui.Navigation +import top.rrricardo.chiara.ui.viewmodel.MainViewModel + +@Composable +fun SplashPage(mainViewModel: MainViewModel, navController: NavController) { + LaunchedEffect(key1 = Unit) { + mainViewModel.musicController.mediaControllerReadyCallback = { + navController.navigate(Navigation.HOME) { + popUpTo(0) + } + } + } + + SplashScreenContent() +} + +@Composable +private fun SplashScreenContent() { + val scale = remember { + Animatable(0f) + } + + // AnimationEffect + LaunchedEffect(key1 = true) { + scale.animateTo( + targetValue = 1f, + animationSpec = tween( + durationMillis = 1000, + easing = { + OvershootInterpolator(4f).getInterpolation(it) + } + ) + ) + } + + // Image + Box( + contentAlignment = Alignment.Center, + modifier = Modifier.fillMaxSize() + ) { + + Image( + painter = painterResource(id = R.drawable.ic_login_foreground), + contentDescription = "Logo", + modifier = Modifier + .size(200.dp) + .scale(scale.value) + ) + } +} + +@Preview(showBackground = true) +@Composable +fun SplashScreenPreview() { + SplashScreenContent() +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/VideoPage.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/VideoPage.kt new file mode 100644 index 0000000..184fb85 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/page/VideoPage.kt @@ -0,0 +1,171 @@ +package top.rrricardo.chiara.ui.page + +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView +import androidx.media3.ui.PlayerView +import androidx.navigation.NavController +import top.rrricardo.chiara.openapi.model.EpisodeResponse +import top.rrricardo.chiara.openapi.model.ShowSeasonResponse +import top.rrricardo.chiara.ui.component.ChiaraAppBar +import top.rrricardo.chiara.ui.component.EpisodeItem +import top.rrricardo.chiara.ui.viewmodel.VideoPageViewModel + +@Composable +fun VideoPage(videoPageViewModel: VideoPageViewModel, navController: NavController) { + Scaffold(topBar = { + with(videoPageViewModel.videoPageState) { + ChiaraAppBar(title = episodeResponse?.title ?: "视频", + showNavigationIcon = true, onNavigateUp = { + videoPageViewModel.stopTransaction() + navController.popBackStack() + } + ) + } + }, snackbarHost = { + SnackbarHost(hostState = videoPageViewModel.snackBarHostState) + }) { padding -> + Surface( + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + BackHandler(enabled = true) { + videoPageViewModel.stopTransaction() + navController.popBackStack() + } + + Column(modifier = Modifier.fillMaxSize()) { + with(videoPageViewModel.videoPageState) { + when { + loading -> Box( + modifier = Modifier + .fillMaxWidth() + .height(300.dp), + contentAlignment = Alignment.BottomCenter + ) { + CircularProgressIndicator( + color = MaterialTheme.colorScheme.onBackground, + modifier = Modifier + .width(100.dp) + .fillMaxHeight() + .align(Alignment.Center) + .padding( + top = 16.dp, + start = 16.dp, + end = 16.dp, + bottom = 16.dp + ) + ) + } + + !loading -> { + PlayerSurface( + modifier = Modifier + .height(300.dp) + .fillMaxWidth() + ) { + it.player = videoPageViewModel.getPlayer() + } + } + } + + showSeasonResponse?.let { showSeasonResponse -> + episodeResponse?.let { + NextEpisodeList( + showSeasonResponse = showSeasonResponse, + episodeResponse = it + ) + } + } + } + } + } + } +} + +@Composable +fun PlayerSurface(modifier: Modifier = Modifier, onPlayerViewReady: (PlayerView) -> Unit) { + AndroidView(factory = { + PlayerView(it).apply { + useController = true + onPlayerViewReady(this) + } + }, modifier = modifier) +} + +@Composable +fun NextEpisodeList( + modifier: Modifier = Modifier, + showSeasonResponse: ShowSeasonResponse, + episodeResponse: EpisodeResponse +) { + Column(modifier.fillMaxSize()) { + Text(text = "接下来:") + + LazyColumn( + modifier = Modifier + .fillMaxWidth() + .background(MaterialTheme.colorScheme.background) + ) { + items(showSeasonResponse.episodes.filter { + it.id != episodeResponse.id + }) { + EpisodeItem(episode = it) { + + } + } + } + } +} + +@Preview(showBackground = true) +@Composable +fun NextEpisodeListPreview() { + NextEpisodeList( + showSeasonResponse = ShowSeasonResponse( + id = 0, + title = "TestTestTest", + episodes = listOf( + EpisodeResponse( + id = 1, + title = "E01", + episodeNumber = "1", + showSeasonId = 0 + ), + EpisodeResponse( + id = 2, + title = "E02", + episodeNumber = "2", + showSeasonId = 0 + ) + ) + ), episodeResponse = EpisodeResponse( + id = 1, + title = "E01", + episodeNumber = "1", + showSeasonId = 0 + ) + ) +} diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/theme/Color.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/theme/Color.kt new file mode 100644 index 0000000..e38db7f --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/theme/Color.kt @@ -0,0 +1,11 @@ +package top.rrricardo.chiara.ui.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFFEFB8C8) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFF7D5260) \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/theme/Theme.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/theme/Theme.kt new file mode 100644 index 0000000..a389d91 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/theme/Theme.kt @@ -0,0 +1,59 @@ +package top.rrricardo.chiara.ui.theme + +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext + +private val DarkColorScheme = darkColorScheme( + primary = Purple80, + secondary = PurpleGrey80, + tertiary = Pink80 +) + +private val LightColorScheme = lightColorScheme( + primary = Color(0xFFFFCCBC), + secondary = PurpleGrey40, + tertiary = Pink40, + surface = Color(0xFFB3E5FC), + background = Color(0xFFE3F2FD), + + /* Other default colors to override + surface = Color(0xFFFFFBFE), + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = Color(0xFF1C1B1F), + onSurface = Color(0xFF1C1B1F), + */ +) + +@Composable +fun ChiaraTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = true, + content: @Composable () -> Unit +) { + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/theme/Type.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/theme/Type.kt new file mode 100644 index 0000000..e018fd2 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/theme/Type.kt @@ -0,0 +1,34 @@ +package top.rrricardo.chiara.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ +) \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/AlbumPageViewModel.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/AlbumPageViewModel.kt new file mode 100644 index 0000000..2921136 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/AlbumPageViewModel.kt @@ -0,0 +1,77 @@ +package top.rrricardo.chiara.ui.viewmodel + +import android.util.Log +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import top.rrricardo.chiara.Configuration +import top.rrricardo.chiara.model.AlbumPageState +import top.rrricardo.chiara.openapi.api.AlbumApi +import top.rrricardo.chiara.openapi.client.infrastructure.ApiClient +import top.rrricardo.chiara.openapi.model.SongResponse +import top.rrricardo.chiara.service.MusicController +import javax.inject.Inject + +@HiltViewModel +class AlbumPageViewModel @Inject constructor( + apiClient: ApiClient, + private val musicController: MusicController +) : ViewModel() { + var albumPageState by mutableStateOf(AlbumPageState()) + private set + + private val albumApi = apiClient.createService(AlbumApi::class.java) + + fun fetchAlbum(albumId: Int) { + albumPageState = albumPageState.copy( + loading = true + ) + + viewModelScope.launch { + val albumResponse = albumApi.apiAlbumIdGet(albumId) + var album = albumResponse.body() + + if (albumResponse.isSuccessful && album != null) { + album = album.copy( + coverImageUrl = Configuration.SERVER_ADDRESS + album.coverImageUrl, + songs = album.songs.map { + it.copy( + coverImageUrl = Configuration.SERVER_ADDRESS + it.coverImageUrl, + url = Configuration.SERVER_ADDRESS + it.url + ) + } + ) + + albumPageState = albumPageState.copy( + loading = false, + album = album + ) + } else { + albumPageState = albumPageState.copy( + loading = false, + errorMessage = "网络错误" + ) + } + } + } + + fun selectSong(song: SongResponse) { + albumPageState = albumPageState.copy( + selectedSong = song + ) + } + + fun playSong() { + albumPageState.album?.let { + musicController.addSongRange(it.songs) + } + + albumPageState.selectedSong?.let { + musicController.play(it.id) + } + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/HomePageViewModel.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/HomePageViewModel.kt new file mode 100644 index 0000000..8b61e76 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/HomePageViewModel.kt @@ -0,0 +1,106 @@ +package top.rrricardo.chiara.ui.viewmodel + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.launch +import top.rrricardo.chiara.Configuration +import top.rrricardo.chiara.model.HomePageState +import top.rrricardo.chiara.openapi.api.AlbumApi +import top.rrricardo.chiara.openapi.api.SeasonApi +import top.rrricardo.chiara.openapi.client.infrastructure.ApiClient +import top.rrricardo.chiara.openapi.model.AlbumResponse +import javax.inject.Inject + +@HiltViewModel +class HomePageViewModel @Inject constructor( + private val apiClient: ApiClient +) : ViewModel() { + + var homePageState by mutableStateOf(HomePageState()) + private set + + + fun changeToMusicPage() { + homePageState = homePageState.copy( + isMusicPage = true + ) + } + + fun changeToVideoPage() { + homePageState = homePageState.copy( + isMusicPage = false + ) + } + + fun fetchRemoteData() { + if (homePageState.loading) { + return + } + + homePageState = homePageState.copy( + loading = true, + selectedAlbum = null, + selectedSeason = null, + ) + + val albumApi = apiClient.createService(AlbumApi::class.java) + val seasonApi = apiClient.createService(SeasonApi::class.java) + viewModelScope.launch(CoroutineExceptionHandler { _, _ -> + run { + homePageState = homePageState.copy( + loading = false, + errorMessage = "网络错误" + ) + } + }) { + val albumResponse = albumApi.apiAlbumGet() + val albums = albumResponse.body() + + homePageState = if (albumResponse.isSuccessful && albums != null) { + homePageState.copy( + loading = false, + albums = albums.map { + it.copy( + coverImageUrl = Configuration.SERVER_ADDRESS + it.coverImageUrl + ) + } + ) + } else { + homePageState.copy( + loading = false, + errorMessage = "网络错误" + ) + } + + val seasonResponse = seasonApi.apiSeasonGet() + val seasons = seasonResponse.body() + + homePageState = if (seasonResponse.isSuccessful && seasons != null) { + homePageState.copy( + loading = false, + seasons = seasons + ) + } else { + homePageState.copy( + loading = false, + errorMessage = "网络错误" + ) + } + } + } + + fun selectAlbum(selectedAlbum: AlbumResponse) { + if (selectedAlbum == homePageState.selectedAlbum) { + return + } + + homePageState = homePageState.copy( + selectedAlbum = selectedAlbum + ) + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/MainViewModel.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/MainViewModel.kt new file mode 100644 index 0000000..edba467 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/MainViewModel.kt @@ -0,0 +1,62 @@ +package top.rrricardo.chiara.ui.viewmodel + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import top.rrricardo.chiara.model.MusicControllerState +import top.rrricardo.chiara.model.PlayerState +import top.rrricardo.chiara.openapi.model.SongResponse +import top.rrricardo.chiara.service.MusicController +import javax.inject.Inject +import kotlin.time.Duration.Companion.seconds + +@HiltViewModel +class MainViewModel @Inject constructor( + val musicController: MusicController +) : ViewModel() { + var musicControllerState by mutableStateOf(MusicControllerState()) + private set + + var playList: List by mutableStateOf(emptyList()) + private set + + init { + musicController.mediaControllerCallback = { playerState, + currentMusic, + currentPosition, + totalDuration, + repeatState -> + musicControllerState = musicControllerState.copy( + playerState = playerState, + currentSong = currentMusic, + currentPosition = currentPosition, + totalDuration = totalDuration, + repeatState = repeatState + ) + + if (playerState == PlayerState.PLAYING) { + viewModelScope.launch { + while (true) { + // 每秒钟更新一次播放器的状态 + delay(1.seconds) + musicControllerState = musicControllerState.copy( + currentPosition = musicController.getCurrentPosition() + ) + } + } + } + } + } + + fun destroyMediaController() = musicController.destroy() + + fun refreshPlayList() { + playList = musicController.getPlayList() + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/ShowPageViewModel.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/ShowPageViewModel.kt new file mode 100644 index 0000000..c531f82 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/ShowPageViewModel.kt @@ -0,0 +1,50 @@ +package top.rrricardo.chiara.ui.viewmodel + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import top.rrricardo.chiara.model.ShowPageState +import top.rrricardo.chiara.openapi.api.SeasonApi +import top.rrricardo.chiara.openapi.client.infrastructure.ApiClient +import top.rrricardo.chiara.openapi.model.EpisodeResponse +import javax.inject.Inject + +@HiltViewModel +class ShowPageViewModel @Inject constructor( + apiClient: ApiClient +) : ViewModel() { + private val showSeasonApi = apiClient.createService(SeasonApi::class.java) + + var showPageState by mutableStateOf(ShowPageState()) + private set + + fun fetchShowSeason(id: Int) { + showPageState = showPageState.copy( + loading = true + ) + + viewModelScope.launch { + val response = showSeasonApi.apiSeasonIdGet(id) + val showSeason = response.body() + + showPageState = if (response.isSuccessful && showSeason != null) { + showPageState.copy( + loading = false, + showSeason = showSeason + ) + } else { + showPageState.copy( + loading = false + ) + } + } + } + + fun selectEpisode(selectedEpisode: EpisodeResponse) { + + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/SongViewModel.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/SongViewModel.kt new file mode 100644 index 0000000..97096a5 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/SongViewModel.kt @@ -0,0 +1,22 @@ +package top.rrricardo.chiara.ui.viewmodel + +import android.graphics.Bitmap +import androidx.compose.ui.graphics.Color +import androidx.lifecycle.ViewModel +import androidx.palette.graphics.Palette +import dagger.hilt.android.lifecycle.HiltViewModel +import top.rrricardo.chiara.service.MusicController +import javax.inject.Inject + +@HiltViewModel +class SongViewModel @Inject constructor( + val musicController: MusicController +) : ViewModel() { + fun calculateColorPalette(drawable: Bitmap, onFinish: (Color) -> Unit) { + Palette.from(drawable).generate { palette -> + palette?.dominantSwatch?.rgb?.let { + onFinish(Color(it)) + } + } + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/VideoPageViewModel.kt b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/VideoPageViewModel.kt new file mode 100644 index 0000000..ce30bb5 --- /dev/null +++ b/ChiaraAndroid/app/src/main/java/top/rrricardo/chiara/ui/viewmodel/VideoPageViewModel.kt @@ -0,0 +1,101 @@ +package top.rrricardo.chiara.ui.viewmodel + +import android.util.Log +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import androidx.media3.common.MediaItem +import androidx.media3.common.PlaybackException +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import top.rrricardo.chiara.Configuration +import top.rrricardo.chiara.model.VideoPageState +import top.rrricardo.chiara.openapi.api.HlsApi +import top.rrricardo.chiara.openapi.api.SeasonApi +import top.rrricardo.chiara.openapi.client.infrastructure.ApiClient +import top.rrricardo.chiara.service.MusicController +import javax.inject.Inject + +@HiltViewModel +class VideoPageViewModel @Inject constructor( + val musicController: MusicController, + apiClient: ApiClient +) : ViewModel() { + private val hlsApi = apiClient.createService(HlsApi::class.java) + private val showSeasonApi = apiClient.createService(SeasonApi::class.java) + + var videoPageState by mutableStateOf(VideoPageState()) + private set + + val snackBarHostState = SnackbarHostState() + + fun fetchAndPlay(id: Int) { + videoPageState = videoPageState.copy( + loading = true + ) + musicController.mediaControllerErrorCallback = { + showPlayerException(it) + } + + viewModelScope.launch { + val response = hlsApi.apiHlsStartEpisodeIdPost(id) + val playList = response.body() + + if (response.isSuccessful && playList != null) { + videoPageState = videoPageState.copy( + loading = false, + playing = true + ) + + val mediaItem = MediaItem.Builder() + .setMediaId(Configuration.SERVER_ADDRESS + playList.playList) + .setUri(Configuration.SERVER_ADDRESS + playList.playList) + .build() + Log.i("Video Player", Configuration.SERVER_ADDRESS + playList.playList) + musicController.playVideo(mediaItem) + } else { + videoPageState = videoPageState.copy( + loading = false + ) + } + } + } + + fun fetchShow(showId: Int, videoId: Int) { + viewModelScope.launch { + val response = showSeasonApi.apiSeasonIdGet(showId) + val showSeasonResponse = response.body() + + if (response.isSuccessful && showSeasonResponse != null) { + videoPageState = videoPageState.copy( + showSeasonResponse = showSeasonResponse, + episodeResponse = showSeasonResponse.episodes.find { + it.id == videoId + } + ) + } + } + } + + fun stopTransaction() { + musicController.mediaControllerErrorCallback = null + + if (videoPageState.playing) { + musicController.stopVideo() + viewModelScope.launch { + hlsApi.apiHlsStopPost() + } + } + } + + fun getPlayer() = musicController.player + + private fun showPlayerException(exception: PlaybackException) { + viewModelScope.launch { + snackBarHostState.showSnackbar("设备不支持此类型视频!") + } + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/openapi/chiara.json b/ChiaraAndroid/app/src/main/openapi/chiara.json new file mode 100644 index 0000000..24e7f30 --- /dev/null +++ b/ChiaraAndroid/app/src/main/openapi/chiara.json @@ -0,0 +1,864 @@ +{ + "openapi": "3.0.1", + "info": { + "title": "Chiara", + "version": "1.0" + }, + "paths": { + "/api/Album": { + "get": { + "tags": [ + "Album" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "text/plain": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AlbumResponse" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AlbumResponse" + } + } + }, + "text/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AlbumResponse" + } + } + } + } + } + } + } + }, + "/api/Album/{id}": { + "get": { + "tags": [ + "Album" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/AlbumResponse" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlbumResponse" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/AlbumResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/api/File/{key}": { + "get": { + "tags": [ + "File" + ], + "parameters": [ + { + "name": "key", + "in": "path", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "text/plain": { + "schema": { + "type": "string", + "format": "binary" + } + }, + "application/json": { + "schema": { + "type": "string", + "format": "binary" + } + }, + "text/json": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + } + } + }, + "/api/Hls/{file}": { + "get": { + "tags": [ + "Hls" + ], + "parameters": [ + { + "name": "file", + "in": "path", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/api/Hls/start/{episodeId}": { + "post": { + "tags": [ + "Hls" + ], + "parameters": [ + { + "name": "episodeId", + "in": "path", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/VideoPlayingResponse" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/VideoPlayingResponse" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/VideoPlayingResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/api/Hls/stop": { + "post": { + "tags": [ + "Hls" + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/api/MediaRepository": { + "get": { + "tags": [ + "MediaRepository" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "text/plain": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MediaRepositoryResponse" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MediaRepositoryResponse" + } + } + }, + "text/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MediaRepositoryResponse" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "MediaRepository" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateMediaRepositoryRequest" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/CreateMediaRepositoryRequest" + } + }, + "application/*+json": { + "schema": { + "$ref": "#/components/schemas/CreateMediaRepositoryRequest" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/MediaRepositoryResponse" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/MediaRepositoryResponse" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/MediaRepositoryResponse" + } + } + } + } + } + } + }, + "/api/MediaRepository/{id}": { + "get": { + "tags": [ + "MediaRepository" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/MediaRepositoryResponse" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/MediaRepositoryResponse" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/MediaRepositoryResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + }, + "post": { + "tags": [ + "MediaRepository" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/MediaRepositoryResponse" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/MediaRepositoryResponse" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/MediaRepositoryResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/api/Season": { + "get": { + "tags": [ + "Season" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "text/plain": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ShowSeasonResponse" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ShowSeasonResponse" + } + } + }, + "text/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ShowSeasonResponse" + } + } + } + } + } + } + } + }, + "/api/Season/{id}": { + "get": { + "tags": [ + "Season" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/ShowSeasonResponse" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShowSeasonResponse" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/ShowSeasonResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/api/Song": { + "get": { + "tags": [ + "Song" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "text/plain": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SongResponse" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SongResponse" + } + } + }, + "text/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SongResponse" + } + } + } + } + } + } + } + }, + "/api/Song/{id}": { + "get": { + "tags": [ + "Song" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/SongResponse" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/SongResponse" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/SongResponse" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "text/plain": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + }, + "text/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "AlbumResponse": { + "required": [ + "arist", + "coverImageUrl", + "id", + "songs", + "title" + ], + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "arist": { + "minLength": 1, + "type": "string" + }, + "coverImageUrl": { + "minLength": 1, + "type": "string" + }, + "songs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SongResponse" + } + } + }, + "additionalProperties": false + }, + "CreateMediaRepositoryRequest": { + "required": [ + "name", + "path" + ], + "type": "object", + "properties": { + "name": { + "minLength": 1, + "type": "string" + }, + "path": { + "minLength": 1, + "type": "string" + } + }, + "additionalProperties": false + }, + "EpisodeResponse": { + "required": [ + "episodeNumber", + "id", + "showSeasonId", + "title" + ], + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "episodeNumber": { + "minLength": 1, + "type": "string" + }, + "showSeasonId": { + "type": "integer", + "format": "int32" + } + }, + "additionalProperties": false + }, + "MediaRepositoryResponse": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "path": { + "type": "string", + "nullable": true + }, + "name": { + "type": "string", + "nullable": true + }, + "albumResponses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AlbumResponse" + }, + "nullable": true + }, + "showSeasonResponses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ShowSeasonResponse" + }, + "nullable": true + } + }, + "additionalProperties": false + }, + "ProblemDetails": { + "type": "object", + "properties": { + "type": { + "type": "string", + "nullable": true + }, + "title": { + "type": "string", + "nullable": true + }, + "status": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "detail": { + "type": "string", + "nullable": true + }, + "instance": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": { } + }, + "ShowSeasonResponse": { + "required": [ + "episodes", + "id", + "title" + ], + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "episodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EpisodeResponse" + } + } + }, + "additionalProperties": false + }, + "SongResponse": { + "required": [ + "arist", + "coverImageUrl", + "id", + "title", + "url" + ], + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "arist": { + "minLength": 1, + "type": "string" + }, + "coverImageUrl": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "additionalProperties": false + }, + "VideoPlayingResponse": { + "required": [ + "playList" + ], + "type": "object", + "properties": { + "playList": { + "minLength": 1, + "type": "string" + } + }, + "additionalProperties": false + } + } + } +} \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/res/drawable/ic_image.xml b/ChiaraAndroid/app/src/main/res/drawable/ic_image.xml new file mode 100644 index 0000000..a017884 --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/drawable/ic_image.xml @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/res/drawable/ic_login_foreground.xml b/ChiaraAndroid/app/src/main/res/drawable/ic_login_foreground.xml new file mode 100644 index 0000000..86355c3 --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/drawable/ic_login_foreground.xml @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/res/drawable/ic_music.xml b/ChiaraAndroid/app/src/main/res/drawable/ic_music.xml new file mode 100644 index 0000000..ee2abc5 --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/drawable/ic_music.xml @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/res/drawable/ic_round_album.xml b/ChiaraAndroid/app/src/main/res/drawable/ic_round_album.xml new file mode 100644 index 0000000..97dc066 --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/drawable/ic_round_album.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ChiaraAndroid/app/src/main/res/drawable/ic_round_library_music.xml b/ChiaraAndroid/app/src/main/res/drawable/ic_round_library_music.xml new file mode 100644 index 0000000..ac94896 --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/drawable/ic_round_library_music.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ChiaraAndroid/app/src/main/res/drawable/ic_round_pause.xml b/ChiaraAndroid/app/src/main/res/drawable/ic_round_pause.xml new file mode 100644 index 0000000..a5e498b --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/drawable/ic_round_pause.xml @@ -0,0 +1,9 @@ + + + diff --git a/ChiaraAndroid/app/src/main/res/drawable/ic_round_play_arrow.xml b/ChiaraAndroid/app/src/main/res/drawable/ic_round_play_arrow.xml new file mode 100644 index 0000000..78fbfbb --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/drawable/ic_round_play_arrow.xml @@ -0,0 +1,9 @@ + + + diff --git a/ChiaraAndroid/app/src/main/res/drawable/ic_round_repeat.xml b/ChiaraAndroid/app/src/main/res/drawable/ic_round_repeat.xml new file mode 100644 index 0000000..51a8533 --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/drawable/ic_round_repeat.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ChiaraAndroid/app/src/main/res/drawable/ic_round_repeat_one.xml b/ChiaraAndroid/app/src/main/res/drawable/ic_round_repeat_one.xml new file mode 100644 index 0000000..3f125ec --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/drawable/ic_round_repeat_one.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ChiaraAndroid/app/src/main/res/drawable/ic_round_shuffle.xml b/ChiaraAndroid/app/src/main/res/drawable/ic_round_shuffle.xml new file mode 100644 index 0000000..8f6a666 --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/drawable/ic_round_shuffle.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ChiaraAndroid/app/src/main/res/drawable/ic_round_video_library.xml b/ChiaraAndroid/app/src/main/res/drawable/ic_round_video_library.xml new file mode 100644 index 0000000..2807edc --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/drawable/ic_round_video_library.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ChiaraAndroid/app/src/main/res/drawable/vinyl_background.png b/ChiaraAndroid/app/src/main/res/drawable/vinyl_background.png new file mode 100644 index 0000000000000000000000000000000000000000..bf03bcca6774316aeebc54724dd9a8be88b664f7 GIT binary patch literal 561966 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�P|(t61A5+k@oWJKm@q{*zX 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 z°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%0A5-KY_m%lT<`N6&mQAqN07f<+LGF1(`a2W`+9d26 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%0D2q;v$nujsr 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�jD}9i{eU%0Zh4g4G)ymIYmFxIF{ppWD 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 z z`_A^E=i7JQQTK!-r{~+xH?@yH-@ee^zdhd$=sVjXeOLR;19~Che5wX)(P8Ox@$j9UH%I$lfah)4qDMVWZEMNom^5r#0K$M)kZ?dPAjZ+^M$|5w^} zzTDn@slE1PI}?sSO8aZc{=B{RmG;H2*#6V(%WWHvM&$WA@#)TFnqfQz_)nVn#C$A; zB3lSMD5rqLM4foD(U- z>ML|%&Lje$orm1@kTIV*Rik^nfuu7Rb$aq=7>JL143iHuj4t&?$b{OtZ+Lwa_U>Je z3LHaRNA~;l;MfXeF<@zFa0c^Iu*m3sWlk7(h&pb7*N1){JqGoTuZai>LRGWGexB%g zht9by3QJWklP6i$4U1_V?Ks)fNOME%Dil$y7g5gp;qkEy`UCi}9kGFJ%GHcbz-_9N z-r=<0$VX@4M?U`9x_!p&M&3%1G5pgE6N|sD{qm%93X9{hbG(yQ3I6+YBh7zD$k+4( zfE|HD~_L;MmWTxdi@wdzzV$ zu3gF?8~#rC7w_udLK;=#z*ExRTDh>Um8#b7@Bv;UJ8=n{w(WP$kWH6vwskr5Oww1K z$h31^SN(yTxzbv%;yisG#wSfI2@Obm`Atl~gkRIoE9_OwT{)}w`#eHcm9f^Rt_XOW z#a-R{uX}M&HN)=nxwdo49e)3lzGZ!W>-_WEmj1N7y;CFY{I;_;xBp$+{I)v(p72ay zTYh2g_ujV^^Rk~WueGziF1GCN_w?Hnx4vI;efxn|Gq;_5pAlWRZ0|SO+PDmJ|EG4h9d-M{=j3*Pbn+kVUb-=e>N(xMgqC$&3ly}Ywn<5vC4*Kfa0zx-~p zp#A0W+u{4m)Wo)`iv4_@+Z>-Coo#>F{8rt*JN5ND_x|6i>=mtXTcl9o*r`-er(KHg zl{R)NmOb(EkC__le8=ELir=b~Tc*lNCO_uQdGP;XPG0GwR~A1lON%337vE#Mvu0}L z+e-iYPRSO_eJ7nVuF%}e@!(+>VT(0AXZ!9M--!QT!)W5wsc41IC1_5FtJ zr(!OJCT`Z5^l-}ypP)Sxb5>4yA&}zy^EH?3p(6!LE^ck8UZpPkA~cCXT|KUovz^m6 z)J0LRdOBkO%MQLdN$RCa+r*u0o+w+cuod$RUb?r~aPoob6W34ddVcN3vW@#qiYHx| z;V<;n!SK$+Q)$hwW!_s}v{T>VE+dvIdhMUhuAjCm@9buBJ)_B+Dbu?zA!|0x zP!Dp`=iPVQDXXUOKtV(r8~>u&;&PQISUqqnd$e_Bb^ zr5UOZKRwxTjq|K*{M)vpt9cLZI%c}Aus1vAvDEb)U}m*){PG7d4pe+<1414mBs2j@ z3l5=hrXpm6L8>r?yc|%i&yL|df#xDCLfVWw(cO(Hq^bb*65OdQPtZJOx(-7K)33)c ng)qF2=`k#R-D>l1J_9pD?AoB0FAVwI8Gyjk)z4*}Q$iB}X+ks- literal 0 HcmV?d00001 diff --git a/ChiaraAndroid/app/src/main/res/mipmap-anydpi-v26/ic_login.xml b/ChiaraAndroid/app/src/main/res/mipmap-anydpi-v26/ic_login.xml new file mode 100644 index 0000000..039ed6f --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/mipmap-anydpi-v26/ic_login.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/res/mipmap-anydpi-v26/ic_login_round.xml b/ChiaraAndroid/app/src/main/res/mipmap-anydpi-v26/ic_login_round.xml new file mode 100644 index 0000000..039ed6f --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/mipmap-anydpi-v26/ic_login_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/res/mipmap-hdpi/ic_login.webp b/ChiaraAndroid/app/src/main/res/mipmap-hdpi/ic_login.webp new file mode 100644 index 0000000000000000000000000000000000000000..e896f7c6fa30573b55abab337e2ea4a1802046c3 GIT binary patch literal 1064 zcmV+@1lRjgNk&E>1ONb6MM6+kP&iBz1ONapN5ByfPX{@YB-cvT?*GUCZvyZg_b@?= zr<`yjNs`oLak~Wn{~jKeY{fv1B*|4()w7Gn2hLmx{I>v0;A<@hZf)DDs(Bvn&NsKM1)XUrotgfiHO3%h=w5&7Ko5R>9`So5tNtt z|0TNx8HuZqAq^i34uA7iEPltoe!Kj{f>;pz3%N{xoZ1Y(4^|g@mzPKQe{(6l-=6>b zk7=3oHBp_kn9Lk_`SZ8=o7c(j{BIXuQ;0>Qb5X_rynlZDAGV)e2g~nqeRIs~b3S|h z4kPSA4FUoJ3TQwT0?M2oUQmJNpPvHW&bI$2%Y^#8*29cHgS2bg49V$5_1d-_+qSc@ zZQFLTW;hwecCr)OwvFGBovO-P(Z~0V=>G(0|KFdKDM=D+nxZx#n}+-L?%J~(H168F zPeYr4O*^&IN+$TU4t$OW zO^T4=iX)%%Ayv$V%gzFa)ww8gRGssGZCjU(8rW~xj7^Fy?Ow^lRVN}>x75tV>P%@8 zpfgVLZ#+$n>^1>RIH-ND0#hq6snutL8yCeS$4&w^IfDJHOThTKpw^|aa-+j^F|1n% z$k>9F-(X%tS234PfF}Cc+h76iqO;MGt%G6BS_ zHr{-CPbkr1xMfVb&V!YK6u3!1T-(Z*#|y|<7b&=DOdN;X8W{a_Ifywez3k|tVf0|K z&^SKE&Hxy_pjpa-^orH-W;*NwSirntbzL`X=4NQ6X0NQ6j)ghYr$NO<$^y$A1Je$fOS iK0JT@<}LU)`0TTT2;%#1A3uTr_zg9w4hm}jQvm?xtNWDz literal 0 HcmV?d00001 diff --git a/ChiaraAndroid/app/src/main/res/mipmap-hdpi/ic_login_round.webp b/ChiaraAndroid/app/src/main/res/mipmap-hdpi/ic_login_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..0e0031ec9bc124e8bd5216bd6252a561c90e4d33 GIT binary patch literal 2922 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 Uy2dQe=(sJnyz-l#98I9k0N{ni9smFU literal 0 HcmV?d00001 diff --git a/ChiaraAndroid/app/src/main/res/mipmap-mdpi/ic_login.webp b/ChiaraAndroid/app/src/main/res/mipmap-mdpi/ic_login.webp new file mode 100644 index 0000000000000000000000000000000000000000..72358ace88e6753f922b9c58227a01620395380c GIT binary patch literal 784 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 literal 0 HcmV?d00001 diff --git a/ChiaraAndroid/app/src/main/res/mipmap-xxhdpi/ic_login.webp b/ChiaraAndroid/app/src/main/res/mipmap-xxhdpi/ic_login.webp new file mode 100644 index 0000000000000000000000000000000000000000..efb2054e52b488fbbe1d45f168b1f5fbd62e7ff7 GIT binary patch literal 2426 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 YEmP!j$9B?E744KtRmh~2&Bk}G2vNZn3IG5A literal 0 HcmV?d00001 diff --git a/ChiaraAndroid/app/src/main/res/mipmap-xxxhdpi/ic_login.webp b/ChiaraAndroid/app/src/main/res/mipmap-xxxhdpi/ic_login.webp new file mode 100644 index 0000000000000000000000000000000000000000..755bdf4a58fabbf912284059e681bfd03e28c3cf GIT binary patch literal 3140 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 literal 0 HcmV?d00001 diff --git a/ChiaraAndroid/app/src/main/res/mipmap-xxxhdpi/ic_login_round.webp b/ChiaraAndroid/app/src/main/res/mipmap-xxxhdpi/ic_login_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..bc62aab25a1d93695e9a9dc41a10e7c4c13fd248 GIT binary patch literal 8646 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 literal 0 HcmV?d00001 diff --git a/ChiaraAndroid/app/src/main/res/values/colors.xml b/ChiaraAndroid/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..f8c6127 --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/res/values/ic_login_background.xml b/ChiaraAndroid/app/src/main/res/values/ic_login_background.xml new file mode 100644 index 0000000..1e88920 --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/values/ic_login_background.xml @@ -0,0 +1,4 @@ + + + #1672FF + \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/res/values/strings.xml b/ChiaraAndroid/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..497cbb0 --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Chiara + \ No newline at end of file diff --git a/ChiaraAndroid/app/src/main/res/values/themes.xml b/ChiaraAndroid/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..201cc2c --- /dev/null +++ b/ChiaraAndroid/app/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ + + + +