From 2f97406c6b5dc5049a86149fb27f49ad0316d10d Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 8 Jan 2023 00:32:25 -0500 Subject: [PATCH] force all douban tv to be seasons to speed up migration --- catalog/common/models.py | 1 - catalog/common/sites.py | 40 +++++++++++------- catalog/sites/douban_movie.py | 2 +- legacy/management/commands/migrate_catalog.py | 41 +++++++++++-------- 4 files changed, 51 insertions(+), 33 deletions(-) diff --git a/catalog/common/models.py b/catalog/common/models.py index f0d45683..c9e7614d 100644 --- a/catalog/common/models.py +++ b/catalog/common/models.py @@ -243,7 +243,6 @@ class Item(SoftDeleteMixin, PolymorphicModel): IdType.ISRC, IdType.MusicBrainz, IdType.Feed, - IdType.TMDB_TVSeason, IdType.IMDB, ] for t in best_id_types: diff --git a/catalog/common/sites.py b/catalog/common/sites.py index 6306e699..463f427f 100644 --- a/catalog/common/sites.py +++ b/catalog/common/sites.py @@ -89,8 +89,16 @@ class AbstractSite: data = ResourceContent() return data - @staticmethod - def match_existing_item(resource, model=Item) -> Item | None: + @classmethod + def get_model_for_resource(cls, resource): + model = resource.get_preferred_model() + return model or cls.DEFAULT_MODEL + + @classmethod + def match_existing_item_for_resource(cls, resource) -> Item | None: + model = cls.get_model_for_resource(resource) + if not model: + return None t, v = model.get_best_lookup_id(resource.get_all_lookup_ids()) matched = None if t is not None: @@ -108,6 +116,20 @@ class AbstractSite: ).first() return matched + @classmethod + def match_or_create_item_for_resource(cls, resource): + resource.item = cls.match_existing_item_for_resource(resource) + if resource.item is None: + model = cls.get_model_for_resource(resource) + if not model: + return None + t, v = model.get_best_lookup_id(resource.get_all_lookup_ids()) + obj = model.copy_metadata(resource.metadata) + obj["primary_lookup_id_type"] = t + obj["primary_lookup_id_value"] = v + resource.item = model.objects.create(**obj) + return resource.item + def get_item(self): p = self.get_resource() if not p: @@ -116,17 +138,7 @@ class AbstractSite: if not p.ready: # raise ValueError(f'resource not ready for {self.url}') return None - model = p.get_preferred_model() - if not model: - model = self.DEFAULT_MODEL - p.item = self.match_existing_item(p, model) - if p.item is None: - t, v = model.get_best_lookup_id(p.get_all_lookup_ids()) - obj = model.copy_metadata(p.metadata) - obj["primary_lookup_id_type"] = t - obj["primary_lookup_id_value"] = v - p.item = model.objects.create(**obj) - return p.item + return self.match_or_create_item_for_resource(p) @property def ready(self): @@ -175,7 +187,7 @@ class AbstractSite: if not p.ready: _logger.error(f"unable to get resource {self.url} ready") return None - if auto_create and p.item is None: + if auto_create: # and (p.item is None or p.item.is_deleted): self.get_item() if auto_save: p.save() diff --git a/catalog/sites/douban_movie.py b/catalog/sites/douban_movie.py index d413d894..50e85ce6 100644 --- a/catalog/sites/douban_movie.py +++ b/catalog/sites/douban_movie.py @@ -216,7 +216,7 @@ class DoubanMovie(AbstractSite): } ) pd.metadata["preferred_model"] = ( - ("TVSeason" if season else "TVShow") if is_series else "Movie" + ("TVShow" if is_series else "Movie") if not season else "TVSeason" ) tmdb_season_id = None if imdb_code: diff --git a/legacy/management/commands/migrate_catalog.py b/legacy/management/commands/migrate_catalog.py index 41a033ed..da9a91a0 100644 --- a/legacy/management/commands/migrate_catalog.py +++ b/legacy/management/commands/migrate_catalog.py @@ -140,6 +140,14 @@ def _movie_tv_convert(entity): "is_series": entity.is_series, } ) + if entity.source_site == "douban": + content.metadata["preferred_model"] = ( + "TVSeason" + if entity.is_series or entity.episodes or entity.season + else "Movie" + ) + else: + content.metadata["preferred_model"] = "TVShow" if entity.is_series else "Movie" if entity.imdb_code: content.lookup_ids[IdType.IMDB] = entity.imdb_code if entity.other_info and entity.other_info.get("TMDB_ID"): @@ -191,8 +199,8 @@ class Command(BaseCommand): "--clearlink", help="clear legacy link table", action="store_true" ) parser.add_argument( - "--doubantv", - help="go thru douban tv and generate TMDB_Season link for TVSeason", + "--clearmovie", + help="clear movie/tv/TVSeason", action="store_true", ) parser.add_argument( @@ -214,9 +222,15 @@ class Command(BaseCommand): if SongLink.objects.filter(old_id=entity.id).count() == 0: SongLink.objects.create(old_id=entity.id, new_uid=new_uid) - def douban_tv(self): - """go thru douban tv and generate TMDB link""" - pass + def clearmovie(self): + MovieLink.objects.all().delete() + for cls in [Movie, TVShow, TVSeason]: + print(cls) + cls.objects.all().update( + primary_lookup_id_type=None, + primary_lookup_id_value=None, + is_deleted=True, + ) def handle(self, *args, **options): if options["song"]: @@ -226,8 +240,8 @@ class Command(BaseCommand): self.process_song(ci.song) return - if options["doubantv"]: - return self.douban_tv() + if options["clearmovie"]: + return self.clearmovie() types = options["types"] or [ Legacy_Game, @@ -263,16 +277,9 @@ class Command(BaseCommand): if not site.DEFAULT_MODEL and not content.metadata.get( "preferred_model" ): - if model_map[typ] == Movie and ( - entity.is_series or entity.season - ): - content.metadata["preferred_model"] = ( - "TVSeason" if entity.season else "TVShow" - ) - else: - content.metadata["preferred_model"] = model_map[ - typ - ].__name__ + content.metadata["preferred_model"] = model_map[ + typ + ].__name__ item = site.get_resource_ready( preloaded_content=content, ignore_existing_content=reload,