force all douban tv to be seasons to speed up migration

This commit is contained in:
Your Name 2023-01-08 00:32:25 -05:00
parent 1dc79e6a00
commit 2f97406c6b
4 changed files with 51 additions and 33 deletions

View file

@ -243,7 +243,6 @@ class Item(SoftDeleteMixin, PolymorphicModel):
IdType.ISRC, IdType.ISRC,
IdType.MusicBrainz, IdType.MusicBrainz,
IdType.Feed, IdType.Feed,
IdType.TMDB_TVSeason,
IdType.IMDB, IdType.IMDB,
] ]
for t in best_id_types: for t in best_id_types:

View file

@ -89,8 +89,16 @@ class AbstractSite:
data = ResourceContent() data = ResourceContent()
return data return data
@staticmethod @classmethod
def match_existing_item(resource, model=Item) -> Item | None: 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()) t, v = model.get_best_lookup_id(resource.get_all_lookup_ids())
matched = None matched = None
if t is not None: if t is not None:
@ -108,6 +116,20 @@ class AbstractSite:
).first() ).first()
return matched 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): def get_item(self):
p = self.get_resource() p = self.get_resource()
if not p: if not p:
@ -116,17 +138,7 @@ class AbstractSite:
if not p.ready: if not p.ready:
# raise ValueError(f'resource not ready for {self.url}') # raise ValueError(f'resource not ready for {self.url}')
return None return None
model = p.get_preferred_model() return self.match_or_create_item_for_resource(p)
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
@property @property
def ready(self): def ready(self):
@ -175,7 +187,7 @@ class AbstractSite:
if not p.ready: if not p.ready:
_logger.error(f"unable to get resource {self.url} ready") _logger.error(f"unable to get resource {self.url} ready")
return None 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() self.get_item()
if auto_save: if auto_save:
p.save() p.save()

View file

@ -216,7 +216,7 @@ class DoubanMovie(AbstractSite):
} }
) )
pd.metadata["preferred_model"] = ( 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 tmdb_season_id = None
if imdb_code: if imdb_code:

View file

@ -140,6 +140,14 @@ def _movie_tv_convert(entity):
"is_series": entity.is_series, "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: if entity.imdb_code:
content.lookup_ids[IdType.IMDB] = entity.imdb_code content.lookup_ids[IdType.IMDB] = entity.imdb_code
if entity.other_info and entity.other_info.get("TMDB_ID"): 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" "--clearlink", help="clear legacy link table", action="store_true"
) )
parser.add_argument( parser.add_argument(
"--doubantv", "--clearmovie",
help="go thru douban tv and generate TMDB_Season link for TVSeason", help="clear movie/tv/TVSeason",
action="store_true", action="store_true",
) )
parser.add_argument( parser.add_argument(
@ -214,9 +222,15 @@ class Command(BaseCommand):
if SongLink.objects.filter(old_id=entity.id).count() == 0: if SongLink.objects.filter(old_id=entity.id).count() == 0:
SongLink.objects.create(old_id=entity.id, new_uid=new_uid) SongLink.objects.create(old_id=entity.id, new_uid=new_uid)
def douban_tv(self): def clearmovie(self):
"""go thru douban tv and generate TMDB link""" MovieLink.objects.all().delete()
pass 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): def handle(self, *args, **options):
if options["song"]: if options["song"]:
@ -226,8 +240,8 @@ class Command(BaseCommand):
self.process_song(ci.song) self.process_song(ci.song)
return return
if options["doubantv"]: if options["clearmovie"]:
return self.douban_tv() return self.clearmovie()
types = options["types"] or [ types = options["types"] or [
Legacy_Game, Legacy_Game,
@ -263,16 +277,9 @@ class Command(BaseCommand):
if not site.DEFAULT_MODEL and not content.metadata.get( if not site.DEFAULT_MODEL and not content.metadata.get(
"preferred_model" "preferred_model"
): ):
if model_map[typ] == Movie and ( content.metadata["preferred_model"] = model_map[
entity.is_series or entity.season typ
): ].__name__
content.metadata["preferred_model"] = (
"TVSeason" if entity.season else "TVShow"
)
else:
content.metadata["preferred_model"] = model_map[
typ
].__name__
item = site.get_resource_ready( item = site.get_resource_ready(
preloaded_content=content, preloaded_content=content,
ignore_existing_content=reload, ignore_existing_content=reload,