Skip to content

Commit 9c7c23c

Browse files
committed
rewrite: Progress on Anime Server Selection Dialog
1 parent 6ff470e commit 9c7c23c

18 files changed

Lines changed: 242 additions & 111 deletions

lib/application/cubits/anime_advanced_search_cubit.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class AnimeAdvancedSearchCubit extends Cubit<AnimeAdvancedSearchState>
7373
}
7474

7575
void navigateToAnimeDetails(BuildContext context, Anime anime, MediaList mediaList) {
76-
_logger.i("Navigating to Anime Details of ${anime.title}");
76+
_logger.i("Navigating to Anime Details of ${anime.title.userPreferred}");
7777
_selectedAnimeNotifier.updateSelectedAnime(anime);
7878
_selectedMediaListNotifier.updateSelectedMediaList(mediaList);
7979
bool hasAnimeDetailsInStack = AutoRouter.of(context).stackData.any(

lib/application/cubits/anime_cubit.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class AnimeCubit extends Cubit<AnimeState> with EffectMixin<AnimeState> {
9090
}
9191

9292
void navigateToAnimeDetails(Anime anime, MediaList mediaList) {
93-
_logger.i("Navigating to Anime Details of ${anime.title}");
93+
_logger.i("Navigating to Anime Details of ${anime.title.userPreferred}");
9494
_selectedAnimeNotifier.updateSelectedAnime(anime);
9595
_selectedMediaListNotifier.updateSelectedMediaList(mediaList);
9696
pushRouteEffect(path: "/animedetails");

lib/application/cubits/anime_details_cubit.dart

Lines changed: 117 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import 'package:awesome_snackbar_content/awesome_snackbar_content.dart';
55
import 'package:collection/collection.dart';
66
import 'package:flutter/material.dart';
77
import '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';
810
import 'package:logger/logger.dart';
911
import 'package:unyo/application/cubits/effect_mixin.dart';
1012
import '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
}

lib/application/cubits/calendar_cubit.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class CalendarCubit extends Cubit<CalendarState> with EffectMixin<CalendarState>
5757
}
5858

5959
void navigateToAnimeDetails(Anime anime, MediaList mediaList) {
60-
_logger.i("Navigating to Anime Details of ${anime.title}");
60+
_logger.i("Navigating to Anime Details of ${anime.title.userPreferred}");
6161
_selectedAnimeNotifier.updateSelectedAnime(anime);
6262
_selectedMediaListNotifier.updateSelectedMediaList(mediaList);
6363
pushRouteEffect(path: "/animedetails");

lib/application/cubits/manga_advanced_search_cubit.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class MangaAdvancedSearchCubit extends Cubit<MangaAdvancedSearchState>
7373
}
7474

7575
void navigateToMangaDetails(BuildContext context, Manga manga, MediaList mediaList) {
76-
_logger.i("Navigating to Manga Details of ${manga.title}");
76+
_logger.i("Navigating to Manga Details of ${manga.title.userPreferred}");
7777
_selectedMangaNotifier.updateSelectedManga(manga);
7878
_selectedMediaListNotifier.updateSelectedMediaList(mediaList);
7979
bool hasMangaDetailsInStack = AutoRouter.of(context).stackData.any(

lib/application/cubits/manga_details_cubit.dart

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ class MangaDetailsCubit extends Cubit<MangaDetailsState> with EffectMixin<MangaD
118118
}
119119

120120
void navigateToMangaDetails(Manga manga, MediaList mediaList) {
121-
_logger.i("Navigating to Manga Details of ${manga.title}");
121+
_logger.i("Navigating to Manga Details of ${manga.title.userPreferred}");
122122
_selectedMangaNotifier.updateSelectedManga(manga);
123123
_selectedMediaListNotifier.updateSelectedMediaList(mediaList);
124124
}
@@ -170,7 +170,7 @@ class MangaDetailsCubit extends Cubit<MangaDetailsState> with EffectMixin<MangaD
170170
try {
171171
switch (loggedUser.settings.service) {
172172
case Service.anilist:
173-
_logger.i("Fetching Manga Details from AniList for ${state.selectedManga.title}");
173+
_logger.i("Fetching Manga Details from AniList for ${state.selectedManga.title.userPreferred}");
174174
(bool, MangaDetails) mangaDetails = await _mangaRepositoryAnilist.getMangaDetails(
175175
selectedManga,
176176
loggedUser,
@@ -190,13 +190,13 @@ class MangaDetailsCubit extends Cubit<MangaDetailsState> with EffectMixin<MangaD
190190
emit(state.copyWith(recommendations: (trendingMangas.$1, trendingMangas.$2.shuffled(Random()))));
191191
}
192192
case Service.mal:
193-
_logger.i("Fetching Manga Details from MyMangaList for ${state.selectedManga.title}");
193+
_logger.i("Fetching Manga Details from MyMangaList for ${state.selectedManga.title.userPreferred}");
194194
case Service.shikimori:
195-
_logger.i("Fetching Manga Details from Shikimori for ${state.selectedManga.title}");
195+
_logger.i("Fetching Manga Details from Shikimori for ${state.selectedManga.title.userPreferred}");
196196
case Service.kitsu:
197-
_logger.i("Fetching Manga Details from Kitsu for ${state.selectedManga.title}");
197+
_logger.i("Fetching Manga Details from Kitsu for ${state.selectedManga.title.userPreferred}");
198198
case Service.simkl:
199-
_logger.i("Fetching Manga Details from Simkl for ${state.selectedManga.title}");
199+
_logger.i("Fetching Manga Details from Simkl for ${state.selectedManga.title.userPreferred}");
200200
}
201201
} on HttpServerException catch (e, stackTrace) {
202202
handleError("Error fetching Manga details:", responseBody: e.message, stackTrace: stackTrace);
@@ -268,17 +268,17 @@ class MangaDetailsCubit extends Cubit<MangaDetailsState> with EffectMixin<MangaD
268268
try {
269269
switch (loggedUser.settings.service) {
270270
case Service.anilist:
271-
_logger.i("Fetching Manga Banners from AniList for ${state.selectedManga.title}");
271+
_logger.i("Fetching Manga Banners from AniList for ${state.selectedManga.title.userPreferred}");
272272
List<String> banners = await _mangaRepositoryAnilist.getMediaCoverImages(loggedUser);
273273
emit(state.copyWith(banners: banners));
274274
case Service.mal:
275-
_logger.i("Fetching Manga Banners from MyMangaList for ${state.selectedManga.title}");
275+
_logger.i("Fetching Manga Banners from MyMangaList for ${state.selectedManga.title.userPreferred}");
276276
case Service.shikimori:
277-
_logger.i("Fetching Manga Banners from Shikimori for ${state.selectedManga.title}");
277+
_logger.i("Fetching Manga Banners from Shikimori for ${state.selectedManga.title.userPreferred}");
278278
case Service.kitsu:
279-
_logger.i("Fetching Manga Banners from Kitsu for ${state.selectedManga.title}");
279+
_logger.i("Fetching Manga Banners from Kitsu for ${state.selectedManga.title.userPreferred}");
280280
case Service.simkl:
281-
_logger.i("Fetching Manga Banners from Simkl for ${state.selectedManga.title}");
281+
_logger.i("Fetching Manga Banners from Simkl for ${state.selectedManga.title.userPreferred}");
282282
}
283283
} on HttpServerException catch (e, stackTrace) {
284284
handleError("Error fetching Manga banners:", responseBody: e.message, stackTrace: stackTrace);

lib/application/states/anime_details_state.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ abstract class AnimeDetailsState with _$AnimeDetailsState implements HasEffects{
2828
required String alternateImage,
2929
required Set<Extension> installedExtensions,
3030
required bool userLoaded,
31+
required bool animeServerDialogReady,
3132
required Extension? selectedExtension,
3233
// relations
3334
// voice actors

0 commit comments

Comments
 (0)