From f13ff6fc9fe10ba42181c7eec4e61641c957027c Mon Sep 17 00:00:00 2001 From: omkar Date: Sat, 11 Jan 2025 11:08:41 +0530 Subject: [PATCH] fix: trakt ids conflicts for some series --- .../types/stremio/stremio_base.types.dart | 3 - .../stremio/stremio_season_selector.dart | 6 +- .../doc_viewer/container/video_viewer.dart | 1 + lib/features/trakt/service/trakt.service.dart | 76 ++++++++++++------- 4 files changed, 54 insertions(+), 32 deletions(-) diff --git a/lib/features/connections/types/stremio/stremio_base.types.dart b/lib/features/connections/types/stremio/stremio_base.types.dart index 49c4229..c70faf7 100644 --- a/lib/features/connections/types/stremio/stremio_base.types.dart +++ b/lib/features/connections/types/stremio/stremio_base.types.dart @@ -338,9 +338,6 @@ class Meta extends LibraryItem { return episode.tvdbId == episodeExternalIds['tvdb']; } - print(episode.tvdbId); - print(episodeExternalIds?['tvdb']); - return nextEpisode == episode.episode && nextSeason == episode.season; }, ); diff --git a/lib/features/connections/widget/stremio/stremio_season_selector.dart b/lib/features/connections/widget/stremio/stremio_season_selector.dart index 903cc58..65ca9d0 100644 --- a/lib/features/connections/widget/stremio/stremio_season_selector.dart +++ b/lib/features/connections/widget/stremio/stremio_season_selector.dart @@ -138,7 +138,11 @@ class _StremioItemSeasonSelectorState extends State ), body: RenderStreamList( service: widget.service!, - id: meta, + id: meta.copyWith( + episodeExternalIds: { + "tvdb": episode.tvdbId, + }, + ), season: currentSeason.toString(), episode: episode.number?.toString(), shouldPop: widget.shouldPop, diff --git a/lib/features/doc_viewer/container/video_viewer.dart b/lib/features/doc_viewer/container/video_viewer.dart index ab31bf0..66c6334 100644 --- a/lib/features/doc_viewer/container/video_viewer.dart +++ b/lib/features/doc_viewer/container/video_viewer.dart @@ -405,6 +405,7 @@ class _VideoViewerState extends State { TraktService.instance!.stopScrobbling( meta: widget.meta as types.Meta, progress: currentProgressInPercentage, + shouldClearCache: true, ); } diff --git a/lib/features/trakt/service/trakt.service.dart b/lib/features/trakt/service/trakt.service.dart index 1fd8b92..c4c4d9a 100644 --- a/lib/features/trakt/service/trakt.service.dart +++ b/lib/features/trakt/service/trakt.service.dart @@ -22,10 +22,6 @@ class TraktService { static const String _baseUrl = 'https://api.trakt.tv'; static const String _apiVersion = '2'; - static const int _authedPostLimit = 100; - static const int _authedGetLimit = 1000; - static const Duration _rateLimitWindow = Duration(minutes: 5); - final refetchKey = BehaviorSubject>(); static const Duration _cacheRevalidationInterval = Duration(hours: 1); @@ -34,10 +30,6 @@ class TraktService { static TraktService? get instance => _instance; static BaseConnectionService? stremioService; - int _postRequestCount = 0; - int _getRequestCount = 0; - DateTime _lastRateLimitReset = DateTime.now(); - Map _cache = {}; saveCacheToDisk() { @@ -82,7 +74,6 @@ class TraktService { _instance?._cache = result?.data ?? {}; - // Start cache revalidation timer _instance!._startCacheRevalidation(); } @@ -103,7 +94,8 @@ class TraktService { final connection = ConnectionResponse( connection: Connection.fromRecord(model_), connectionTypeRecord: ConnectionTypeRecord.fromRecord( - model_.get("expand.type")), + model_.get("expand.type"), + ), ); stremioService = BaseConnectionService.connectionById(connection); @@ -192,18 +184,40 @@ class TraktService { 'year': meta.year, 'ids': { 'imdb': meta.imdbId ?? meta.id, - ...(meta.episodeExternalIds ?? {}), + if (meta.tvdbId != null) 'tvdb': meta.tvdbId, }, }, }; } else { + final Map episodeExternalIds = + meta.episodeExternalIds ?? {}; + + final isEmpty = episodeExternalIds.keys.isEmpty; + + if (!isEmpty) { + return { + "episode": { + "ids": meta.episodeExternalIds, + }, + }; + } + + if (meta.currentVideo?.id != null) { + return { + "episode": { + "ids": { + "imdb": meta.currentVideo?.id, + }, + }, + }; + } + return { "show": { "title": meta.name, "year": meta.year, "ids": { "imdb": meta.imdbId ?? meta.id, - ...(meta.episodeExternalIds ?? {}), } }, "episode": { @@ -629,8 +643,6 @@ class TraktService { try { _logger.info('Starting scrobbling for ${meta.type} with ID: ${meta.id}'); - print(_buildObjectForMeta(meta)); - final response = await http.post( Uri.parse('$_baseUrl/scrobble/start'), headers: headers, @@ -640,6 +652,12 @@ class TraktService { }), ); + if (response.statusCode == 404) { + _logger.severe('Failed to start scrobbling: ${response.statusCode}'); + _logger.severe("${_buildObjectForMeta(meta)}"); + return; + } + if (response.statusCode != 201) { _logger.severe('Failed to start scrobbling: ${response.statusCode}'); throw Exception('Failed to start scrobbling'); @@ -663,8 +681,6 @@ class TraktService { return; } - print(_buildObjectForMeta(meta)); - final cacheKey = '${meta.id}_pauseScrobbling'; _activeScrobbleRequests[cacheKey]?.completeError('Cancelled'); @@ -703,7 +719,9 @@ class TraktService { body: json.encode(body), ); - if (response.statusCode == 201) { + if (response.statusCode == 404) { + _logger.warning('could not find episode'); + } else if (response.statusCode == 201) { _logger.info('POST request successful'); return; } else if (response.statusCode == 429) { @@ -735,6 +753,7 @@ class TraktService { Future stopScrobbling({ required Meta meta, required double progress, + bool shouldClearCache = false, }) async { if (!isEnabled()) { _logger.info('Trakt integration is not enabled'); @@ -758,19 +777,20 @@ class TraktService { }, ); - _cache.remove('$_baseUrl/sync/watched/shows'); - _cache.remove('$_baseUrl/sync/playback'); + if (shouldClearCache) { + _cache.remove('$_baseUrl/sync/watched/shows'); + _cache.remove('$_baseUrl/sync/playback'); - final keys = [ - "continue_watching", - if (meta.type == "series") "up_next_series", - ]; + final keys = [ + "continue_watching", + if (meta.type == "series") "up_next_series", + ]; + refetchKey.add(keys); - refetchKey.add(keys); - - _logger.info( - "pushing refetch key ${keys.join(", ")} still in cache ${_cache.keys.join(", ")}", - ); + _logger.info( + "pushing refetch key ${keys.join(", ")} still in cache ${_cache.keys.join(", ")}", + ); + } } catch (e, stack) { _logger.severe('Error stopping scrobbling: $e', stack); rethrow;