@@ -5,6 +5,8 @@ import 'package:awesome_snackbar_content/awesome_snackbar_content.dart';
55import 'package:collection/collection.dart' ;
66import 'package:flutter/material.dart' ;
77import 'package:k3vinb5_aniyomi_bridge/jmodels/jsanime.dart' ;
8+ import 'package:k3vinb5_aniyomi_bridge/jmodels/jsepisode.dart' ;
9+ import 'package:k3vinb5_aniyomi_bridge/jmodels/jvideo.dart' ;
810import 'package:logger/logger.dart' ;
911import 'package:unyo/application/cubits/effect_mixin.dart' ;
1012import 'package:unyo/application/effects/app_effects.dart' ;
@@ -77,6 +79,7 @@ class AnimeDetailsCubit extends Cubit<AnimeDetailsState> with EffectMixin<AnimeD
7779 installedExtensions: {},
7880 selectedExtension: null ,
7981 userLoaded: false ,
82+ animeServerDialogReady: false ,
8083 extensionAnimeResults: [],
8184 extensionEpisodeResults: [],
8285 extensionVideoResults: [],
@@ -127,7 +130,7 @@ class AnimeDetailsCubit extends Cubit<AnimeDetailsState> with EffectMixin<AnimeD
127130 }
128131
129132 void navigateToAnimeDetails (Anime anime, MediaList mediaList) {
130- _logger.i ("Navigating to Anime Details of ${anime .title }" );
133+ _logger.i ("Navigating to Anime Details of ${anime .title . userPreferred }" );
131134 _selectedAnimeNotifier.updateSelectedAnime (anime);
132135 _selectedMediaListNotifier.updateSelectedMediaList (mediaList);
133136 }
@@ -152,6 +155,7 @@ class AnimeDetailsCubit extends Cubit<AnimeDetailsState> with EffectMixin<AnimeD
152155 .where ((extension ) => selectedAnimeExtensionName == extension .name)
153156 .firstOrNull;
154157 if (selectedExtension != null ) {
158+ emit (state.copyWith (selectedExtension: selectedExtension));
155159 switch (state.loggedUser) {
156160 case AnilistUserModel anilistUserModel:
157161 SettingsModel userSettings = anilistUserModel.settings as SettingsModel ;
@@ -179,8 +183,13 @@ class AnimeDetailsCubit extends Cubit<AnimeDetailsState> with EffectMixin<AnimeD
179183 showWidgetDialogEffect (dialog: AnimeDetailsMediaEntryDialog (cubit: this ));
180184 }
181185
182- void openAnimeServerSelectionDialog (BuildContext context) {
186+ Future <void > openAnimeServerSelectionDialog (BuildContext context) async {
187+ emit (state.copyWith (animeServerDialogReady: false ));
188+ bool canOpenDialog = await _getEpisodesFromSelectedExtension (state.selectedExtension, state.extensionAnimeResults.firstOrNull);
189+ if (! canOpenDialog) return ;
183190 showWidgetDialogEffect (dialog: AnimeServerSelectionDialog (cubit: this ));
191+ await _getVideosFromSelectedExtension (state.selectedExtension, state.extensionEpisodeResults.firstOrNull);
192+ emit (state.copyWith (animeServerDialogReady: true ));
184193 }
185194
186195 Future <void > updateMediaListEntry (BuildContext context) async {
@@ -288,7 +297,7 @@ class AnimeDetailsCubit extends Cubit<AnimeDetailsState> with EffectMixin<AnimeD
288297 try {
289298 switch (loggedUser.settings.service) {
290299 case Service .anilist:
291- _logger.i ("Fetching Anime Details from AniList for ${state .selectedAnime .title }" );
300+ _logger.i ("Fetching Anime Details from AniList for ${state .selectedAnime .title . userPreferred }" );
292301 (bool , AnimeDetails ) animeDetails = await _animeRepositoryAnilist.getAnimeDetails (
293302 selectedAnime,
294303 loggedUser,
@@ -312,13 +321,13 @@ class AnimeDetailsCubit extends Cubit<AnimeDetailsState> with EffectMixin<AnimeD
312321 }
313322 _getAlternativeImage (loggedUser, selectedAnime);
314323 case Service .mal:
315- _logger.i ("Fetching Anime Details from MyAnimeList for ${state .selectedAnime .title }" );
324+ _logger.i ("Fetching Anime Details from MyAnimeList for ${state .selectedAnime .title . userPreferred }" );
316325 case Service .shikimori:
317- _logger.i ("Fetching Anime Details from Shikimori for ${state .selectedAnime .title }" );
326+ _logger.i ("Fetching Anime Details from Shikimori for ${state .selectedAnime .title . userPreferred }" );
318327 case Service .kitsu:
319- _logger.i ("Fetching Anime Details from Kitsu for ${state .selectedAnime .title }" );
328+ _logger.i ("Fetching Anime Details from Kitsu for ${state .selectedAnime .title . userPreferred }" );
320329 case Service .simkl:
321- _logger.i ("Fetching Anime Details from Simkl for ${state .selectedAnime .title }" );
330+ _logger.i ("Fetching Anime Details from Simkl for ${state .selectedAnime .title . userPreferred }" );
322331 }
323332 } on HttpServerException catch (e, stackTrace) {
324333 handleError ("Error fetching Anime details:" , responseBody: e.message, stackTrace: stackTrace);
@@ -377,11 +386,103 @@ class AnimeDetailsCubit extends Cubit<AnimeDetailsState> with EffectMixin<AnimeD
377386 }
378387 }
379388
389+ Future <bool > _getEpisodesFromSelectedExtension (Extension ? selectedExtension, JSAnime ? selectedJSAnime) async {
390+ if (selectedExtension == null ) {
391+ _logger.w ("No extension selected to fetch episodes." );
392+ showSnackBarEffect (
393+ "No Extension Selected" ,
394+ message: "Select an extension to fetch episodes." ,
395+ contentType: ContentType .warning,
396+ );
397+ return false ;
398+ } else if (selectedJSAnime == null ) {
399+ _logger.w ("No JSAnime selected to fetch episodes." );
400+ showSnackBarEffect (
401+ "No Anime Selected" ,
402+ message: "Select an anime to fetch episodes." ,
403+ contentType: ContentType .warning,
404+ );
405+ return false ;
406+ }
407+ try {
408+ _logger.i (
409+ "Fetching Episodes Info from extension ${selectedExtension .name } for ${state .selectedAnime .title .userPreferred }" ,
410+ );
411+ List <JSEpisode > episodeResults = await _extensionRepositoryAniyomi.getAnimeEpisodeList (
412+ selectedJSAnime,
413+ selectedExtension,
414+ );
415+ emit (state.copyWith (extensionEpisodeResults: episodeResults));
416+ if (episodeResults.isNotEmpty) {
417+ showSnackBarEffect (
418+ selectedExtension.name,
419+ message: "Found ${episodeResults .length } episodes for ${state .selectedAnime .title .userPreferred }" ,
420+ contentType: ContentType .success
421+ );
422+ } else {
423+ showSnackBarEffect (
424+ selectedExtension.name,
425+ message: "No episodes found in ${selectedExtension .name } for ${state .selectedAnime .title .userPreferred }" ,
426+ contentType: ContentType .warning,
427+ );
428+ }
429+ } catch (e, stackTrace) {
430+ handleError ("Error fetching Episodes Info from selected extension: $e " , stackTrace: stackTrace);
431+ return false ;
432+ }
433+ return true ;
434+ }
435+
436+ Future <void > _getVideosFromSelectedExtension (Extension ? selectedExtension, JSEpisode ? selectedJSEpisode) async {
437+ if (selectedExtension == null ) {
438+ _logger.w ("No extension selected to fetch videos." );
439+ showSnackBarEffect (
440+ "No Extension Selected" ,
441+ message: "Select an extension to fetch videos." ,
442+ contentType: ContentType .warning,
443+ );
444+ return ;
445+ } else if (selectedJSEpisode == null ) {
446+ _logger.w ("No JSEpisode selected to fetch videos." );
447+ showSnackBarEffect (
448+ "No Episode Selected" ,
449+ message: "Select an episode to fetch videos." ,
450+ contentType: ContentType .warning,
451+ );
452+ return ;
453+ }
454+ try {
455+ _logger.i (
456+ "Fetching Videos Info from extension ${selectedExtension .name } for ${state .selectedAnime .title .userPreferred }" ,
457+ );
458+ List <JVideo > videoResults = await _extensionRepositoryAniyomi.getAnimeVideoList (
459+ selectedJSEpisode,
460+ selectedExtension,
461+ );
462+ emit (state.copyWith (extensionVideoResults: videoResults));
463+ if (videoResults.isNotEmpty) {
464+ showSnackBarEffect (
465+ selectedExtension.name,
466+ message: "Found ${videoResults .length } video links for ${state .selectedAnime .title .userPreferred }" ,
467+ contentType: ContentType .success
468+ );
469+ } else {
470+ showSnackBarEffect (
471+ selectedExtension.name,
472+ message: "No video links found in ${selectedExtension .name } for ${state .selectedAnime .title .userPreferred }" ,
473+ contentType: ContentType .warning,
474+ );
475+ }
476+ } catch (e, stackTrace) {
477+ handleError ("Error fetching Videos Info from selected extension: $e " , stackTrace: stackTrace);
478+ }
479+ }
480+
380481 Future <void > _getAlternativeImage (User loggedUser, Anime selectedAnime) async {
381482 try {
382483 switch (loggedUser.settings.episodeService) {
383484 case EpisodeService .anizip:
384- _logger.i ("Fetching Alternative Image from Anizip for ${state .selectedAnime .title }" );
485+ _logger.i ("Fetching Alternative Image from Anizip for ${state .selectedAnime .title . userPreferred }" );
385486 late String alternateImage;
386487 if (loggedUser.settings.service == Service .anilist) {
387488 alternateImage = await _episodeRepositoryAnizip.getAlternativeImage (
@@ -396,7 +497,7 @@ class AnimeDetailsCubit extends Cubit<AnimeDetailsState> with EffectMixin<AnimeD
396497 }
397498 emit (state.copyWith (alternateImage: alternateImage));
398499 case EpisodeService .kitsu:
399- _logger.i ("Fetching Alternative Image from Kitsu for ${state .selectedAnime .title }" );
500+ _logger.i ("Fetching Alternative Image from Kitsu for ${state .selectedAnime .title . userPreferred }" );
400501 }
401502 } on HttpServerException catch (e, stackTrace) {
402503 handleError ("Error fetching Alternative Image:" , responseBody: e.message, stackTrace: stackTrace);
@@ -409,7 +510,7 @@ class AnimeDetailsCubit extends Cubit<AnimeDetailsState> with EffectMixin<AnimeD
409510 try {
410511 switch (loggedUser.settings.episodeService) {
411512 case EpisodeService .anizip:
412- _logger.i ("Fetching Episodes Details from Anizip for ${state .selectedAnime .title }" );
513+ _logger.i ("Fetching Episodes Details from Anizip for ${state .selectedAnime .title . userPreferred }" );
413514 late List <EpisodeInfo > episodesInfo;
414515 if (loggedUser.settings.service == Service .anilist) {
415516 episodesInfo = await _episodeRepositoryAnizip.getEpisodeInfo (
@@ -424,7 +525,7 @@ class AnimeDetailsCubit extends Cubit<AnimeDetailsState> with EffectMixin<AnimeD
424525 }
425526 emit (state.copyWith (episodesInfo: episodesInfo));
426527 case EpisodeService .kitsu:
427- _logger.i ("Fetching Episodes Details from Kitsu for ${state .selectedAnime .title }" );
528+ _logger.i ("Fetching Episodes Details from Kitsu for ${state .selectedAnime .title . userPreferred }" );
428529 }
429530 } on HttpServerException catch (e, stackTrace) {
430531 handleError ("Error fetching Episodes details:" , responseBody: e.message, stackTrace: stackTrace);
@@ -437,17 +538,17 @@ class AnimeDetailsCubit extends Cubit<AnimeDetailsState> with EffectMixin<AnimeD
437538 try {
438539 switch (loggedUser.settings.service) {
439540 case Service .anilist:
440- _logger.i ("Fetching Anime Banners from AniList for ${state .selectedAnime .title }" );
541+ _logger.i ("Fetching Anime Banners from AniList for ${state .selectedAnime .title . userPreferred }" );
441542 List <String > banners = await _animeRepositoryAnilist.getMediaCoverImages (loggedUser);
442543 emit (state.copyWith (banners: banners));
443544 case Service .mal:
444- _logger.i ("Fetching Anime Banners from MyAnimeList for ${state .selectedAnime .title }" );
545+ _logger.i ("Fetching Anime Banners from MyAnimeList for ${state .selectedAnime .title . userPreferred }" );
445546 case Service .shikimori:
446- _logger.i ("Fetching Anime Banners from Shikimori for ${state .selectedAnime .title }" );
547+ _logger.i ("Fetching Anime Banners from Shikimori for ${state .selectedAnime .title . userPreferred }" );
447548 case Service .kitsu:
448- _logger.i ("Fetching Anime Banners from Kitsu for ${state .selectedAnime .title }" );
549+ _logger.i ("Fetching Anime Banners from Kitsu for ${state .selectedAnime .title . userPreferred }" );
449550 case Service .simkl:
450- _logger.i ("Fetching Anime Banners from Simkl for ${state .selectedAnime .title }" );
551+ _logger.i ("Fetching Anime Banners from Simkl for ${state .selectedAnime .title . userPreferred }" );
451552 }
452553 } on HttpServerException catch (e, stackTrace) {
453554 handleError ("Error fetching Anime banners:" , responseBody: e.message, stackTrace: stackTrace);
@@ -464,7 +565,6 @@ class AnimeDetailsCubit extends Cubit<AnimeDetailsState> with EffectMixin<AnimeD
464565 Extension ? selectedExtension = userSettings.mediaExtensionConfigs[selectedAnime.id.toString ()];
465566 if (selectedExtension != null ) {
466567 selectAnimeExtension (selectedExtension.name);
467- emit (state.copyWith (selectedExtension: selectedExtension));
468568 }
469569 case LocalUserModel localUserModel:
470570 }
0 commit comments