@@ -173,6 +173,8 @@ def to_representation(self, instance):
173173 many = True ,
174174 )
175175
176+ item = instance .get ("item" )
177+
176178 return {
177179 "id" : user_medias [0 ].item_id if user_medias else None ,
178180 "media_id" : (
@@ -192,6 +194,9 @@ def to_representation(self, instance):
192194 "genres" : media_metadata .get ("genres" , []),
193195 "score" : float (episode .get ("vote_average" )),
194196 "score_count" : episode .get ("vote_count" ),
197+ # FORK: IMDb rating alongside TMDB-based score
198+ "imdb_rating" : getattr (item , "imdb_rating" , None ),
199+ "imdb_rating_count" : getattr (item , "imdb_rating_count" , None ),
195200 "details" : {
196201 "air_date" : episode .get ("air_date" ),
197202 "episode_number" : episode .get ("episode_number" ),
@@ -224,6 +229,18 @@ def _process_seasons(self, media_metadata, seasons_by_number=None):
224229 ):
225230 media_metadata ["related" ]["seasons" ] = []
226231
232+ # FORK: look up already-synced season Items (e.g. IMDb ratings) for
233+ # untracked seasons instead of always building an ephemeral in-memory
234+ # Item, one batched query for the whole show rather than per-season.
235+ existing_items_by_season = {
236+ existing_item .season_number : existing_item
237+ for existing_item in Item .objects .filter (
238+ media_id = str (media_metadata .get ("media_id" ) or "" ),
239+ source = media_metadata .get ("source" ),
240+ media_type = MediaTypes .SEASON .value ,
241+ )
242+ }
243+
227244 processed_seasons = []
228245 for season in media_metadata ["related" ]["seasons" ]:
229246 season_number = season .get ("season_number" )
@@ -232,6 +249,8 @@ def _process_seasons(self, media_metadata, seasons_by_number=None):
232249 )
233250
234251 item = getattr (tracked_season , "item" , None )
252+ if item is None :
253+ item = existing_items_by_season .get (season_number )
235254 if item is None :
236255 item = Item (
237256 media_id = str (
@@ -279,10 +298,23 @@ def _process_episodes(self, media_metadata, episodes_by_number=None):
279298 media_metadata ["related" ]["episodes" ] = []
280299
281300 episodes = media_metadata .pop ("episodes" , [])
301+ # FORK: look up already-synced episode Items (e.g. IMDb ratings) for
302+ # untracked episodes instead of always building an ephemeral in-memory
303+ # Item, one batched query for the whole season rather than per-episode.
304+ existing_items_by_episode = {
305+ existing_item .episode_number : existing_item
306+ for existing_item in Item .objects .filter (
307+ media_id = str (media_metadata .get ("media_id" ) or "" ),
308+ source = media_metadata .get ("source" ),
309+ media_type = MediaTypes .EPISODE .value ,
310+ season_number = media_metadata .get ("season_number" ),
311+ )
312+ }
282313 serializer = EpisodeSerializer (
283314 context = {
284315 "source" : media_metadata .get ("source" ),
285316 "tracked_episodes" : episodes_by_number or {},
317+ "existing_items_by_episode" : existing_items_by_episode ,
286318 },
287319 )
288320 processed_episodes = [
@@ -370,6 +402,11 @@ def to_representation(self, instance):
370402 "score_count" : int (media_metadata .get ("score_count" ))
371403 if media_metadata .get ("score_count" ) is not None
372404 else None ,
405+ # FORK: IMDb rating alongside TMDB-based score
406+ "imdb_rating" : getattr (instance .get ("item" ), "imdb_rating" , None ),
407+ "imdb_rating_count" : getattr (
408+ instance .get ("item" ), "imdb_rating_count" , None ,
409+ ),
373410 "cast" : media_metadata .get ("cast" ) or [],
374411 "crew" : media_metadata .get ("crew" ) or [],
375412 "details" : details ,
@@ -433,23 +470,28 @@ def to_representation(self, instance):
433470 if hasattr (episode , "item" ):
434471 item = getattr (episode , "item" , None )
435472 else :
436- image = (
437- "https://image.tmdb.org/t/p/original" + instance .get ("still_path" )
438- if instance .get ("still_path" )
439- else None
440- )
441- item = Item (
442- media_id = media_id ,
443- source = context .get ("source" ),
444- media_type = MediaTypes .EPISODE .value ,
445- title = instance .get ("name" ) or "" ,
446- image = image ,
447- season_number = season_number ,
448- episode_number = episode_number ,
449- release_datetime = app_helpers .extract_release_datetime (
450- {"release_date" : instance .get ("air_date" )},
451- ),
452- )
473+ # FORK: reuse an already-synced episode Item (e.g. IMDb ratings)
474+ # instead of always building an ephemeral in-memory Item.
475+ existing_items_by_episode = context .get ("existing_items_by_episode" , {})
476+ item = existing_items_by_episode .get (episode_number )
477+ if item is None :
478+ image = (
479+ "https://image.tmdb.org/t/p/original" + instance .get ("still_path" )
480+ if instance .get ("still_path" )
481+ else None
482+ )
483+ item = Item (
484+ media_id = media_id ,
485+ source = context .get ("source" ),
486+ media_type = MediaTypes .EPISODE .value ,
487+ title = instance .get ("name" ) or "" ,
488+ image = image ,
489+ season_number = season_number ,
490+ episode_number = episode_number ,
491+ release_datetime = app_helpers .extract_release_datetime (
492+ {"release_date" : instance .get ("air_date" )},
493+ ),
494+ )
453495
454496 if hasattr (episode , "lists" ):
455497 lists = episode .lists
0 commit comments