Fix lots of stuff

This commit is contained in:
Zoe Roux 2025-06-07 18:59:00 +02:00
parent 489336c77a
commit 2f6943cd6f
No known key found for this signature in database
5 changed files with 31 additions and 20 deletions

View File

@ -103,8 +103,8 @@ export const processImages = async () => {
`); `);
await tx.delete(mqueue).where(eq(mqueue.id, item.id)); await tx.delete(mqueue).where(eq(mqueue.id, item.id));
} catch (err) { } catch (err: any) {
console.error("Failed to download image", img.url, err); console.error("Failed to download image", img.url, err.message);
await tx await tx
.update(mqueue) .update(mqueue)
.set({ attempt: sql`${mqueue.attempt}+1` }) .set({ attempt: sql`${mqueue.attempt}+1` })

View File

@ -59,22 +59,20 @@ class KyooClient(metaclass=Singleton):
r.raise_for_status() r.raise_for_status()
async def create_movie(self, movie: Movie) -> Resource: async def create_movie(self, movie: Movie) -> Resource:
logger.debug("sending movie %s", movie.model_dump_json(by_alias=True))
async with self._client.post( async with self._client.post(
"movies", "movies",
data=movie.model_dump_json(by_alias=True), data=movie.model_dump_json(by_alias=True),
) as r: ) as r:
r.raise_for_status() r.raise_for_status()
return Resource(**await r.json()) return Resource.model_validate(await r.json())
async def create_serie(self, serie: Serie) -> Resource: async def create_serie(self, serie: Serie) -> Resource:
logger.debug("sending serie %s", serie.model_dump_json(by_alias=True))
async with self._client.post( async with self._client.post(
"series", "series",
data=serie.model_dump_json(by_alias=True), data=serie.model_dump_json(by_alias=True),
) as r: ) as r:
r.raise_for_status() r.raise_for_status()
return Resource(**await r.json()) return Resource.model_validate(await r.json())
async def link_videos( async def link_videos(
self, self,
@ -89,7 +87,7 @@ class KyooClient(metaclass=Singleton):
id=request.id, id=request.id,
for_=[ for_=[
For.Special(serie=show, special=ep.episode) For.Special(serie=show, special=ep.episode)
if ep.season is None if ep.season is None or ep.season == 0
else For.Episode(serie=show, season=ep.season, episode=ep.episode) else For.Episode(serie=show, season=ep.season, episode=ep.episode)
for ep in request.episodes for ep in request.episodes
], ],
@ -103,4 +101,3 @@ class KyooClient(metaclass=Singleton):
), ),
) as r: ) as r:
r.raise_for_status() r.raise_for_status()
return TypeAdapter(list[VideoCreated]).validate_json(await r.text())

View File

@ -11,8 +11,9 @@ from .client import KyooClient
from .database import get_db from .database import get_db
from .identifiers.identify import identify from .identifiers.identify import identify
from .models.metadataid import EpisodeId, MetadataId from .models.metadataid import EpisodeId, MetadataId
from .models.request import Request
from .models.videos import For, Video, VideoInfo from .models.videos import For, Video, VideoInfo
from .requests import Request, RequestCreator from .requests import RequestCreator
logger = getLogger(__name__) logger = getLogger(__name__)
@ -48,7 +49,6 @@ class FsScanner:
self._info = await self._client.get_videos_info() self._info = await self._client.get_videos_info()
# TODO: handle unmatched
to_register = videos - self._info.paths to_register = videos - self._info.paths
to_delete = self._info.paths - videos if remove_deleted else set() to_delete = self._info.paths - videos if remove_deleted else set()
@ -68,6 +68,11 @@ class FsScanner:
if to_register: if to_register:
logger.info("Found %d new files to register.", len(to_register)) logger.info("Found %d new files to register.", len(to_register))
await self._register(to_register) await self._register(to_register)
if self._info.unmatched:
logger.info(
"Retrying & updating %d unmatched files.", len(self._info.unmatched)
)
await self._register(self._info.unmatched)
logger.info("Scan finished for %s.", path) logger.info("Scan finished for %s.", path)
except Exception as e: except Exception as e:
@ -160,7 +165,7 @@ class FsScanner:
for slug in slugs: for slug in slugs:
video.for_.append( video.for_.append(
For.Episode(serie=slug, season=ep.season, episode=ep.episode) For.Episode(serie=slug, season=ep.season, episode=ep.episode)
if ep.season is not None if ep.season is not None and ep.season != 0
else For.Special(serie=slug, special=ep.episode) else For.Special(serie=slug, special=ep.episode)
) )

View File

@ -182,7 +182,7 @@ class TheMovieDatabase(Provider):
Language.get( Language.get(
f"{trans['iso_639_1']}-{trans['iso_3166_1']}" f"{trans['iso_639_1']}-{trans['iso_3166_1']}"
): MovieTranslation( ): MovieTranslation(
name=clean(trans["data"]["name"]) name=clean(trans["data"]["title"])
or ( or (
clean(movie["original_title"]) clean(movie["original_title"])
if movie["original_language"] == trans["iso_639_1"] if movie["original_language"] == trans["iso_639_1"]
@ -296,7 +296,9 @@ class TheMovieDatabase(Provider):
else SerieStatus.AIRING else SerieStatus.AIRING
if serie["in_production"] if serie["in_production"]
else SerieStatus.FINISHED, else SerieStatus.FINISHED,
runtime=serie["last_episode_to_air"]["runtime"], runtime=serie["last_episode_to_air"]["runtime"]
if serie["last_episode_to_air"]
else None,
start_air=datetime.strptime(serie["first_air_date"], "%Y-%m-%d").date() start_air=datetime.strptime(serie["first_air_date"], "%Y-%m-%d").date()
if serie["first_air_date"] if serie["first_air_date"]
else None, else None,
@ -560,12 +562,12 @@ class TheMovieDatabase(Provider):
return Collection( return Collection(
slug=to_slug(collection["name"]), slug=to_slug(collection["name"]),
# assume all parts are in the same language # assume all parts are in the same language
original_language=Language.get(collection["part"][0]["original_language"]), original_language=Language.get(collection["parts"][0]["original_language"]),
genres=[ genres=[
y for x in collection["part"] for y in self._map_genres(x["genres"]) y for x in collection["parts"] for y in self._map_genres(x["genre_ids"])
], ],
rating=round( rating=round(
mean(float(x["vote_average"]) * 10 for x in collection["part"]) mean(float(x["vote_average"]) * 10 for x in collection["parts"])
), ),
external_id={ external_id={
self.name: MetadataId( self.name: MetadataId(
@ -577,9 +579,9 @@ class TheMovieDatabase(Provider):
Language.get( Language.get(
f"{trans['iso_639_1']}-{trans['iso_3166_1']}" f"{trans['iso_639_1']}-{trans['iso_3166_1']}"
): CollectionTranslation( ): CollectionTranslation(
name=clean(trans["data"]["name"]) or collection["name"], name=clean(trans["data"]["title"]) or collection["name"],
latin_name=None, latin_name=None,
description=trans["overview"], description=trans["data"]["overview"],
tagline=None, tagline=None,
aliases=[], aliases=[],
tags=[], tags=[],
@ -664,7 +666,7 @@ class TheMovieDatabase(Provider):
translations={ translations={
"en": StudioTranslation( "en": StudioTranslation(
name=company["name"], name=company["name"],
logo=f"https://image.tmdb.org/t/p/original{company['logo_path']}" logo=self._map_image(company["logo_path"])
if "logo_path" in company if "logo_path" in company
else None, else None,
), ),

View File

@ -131,7 +131,14 @@ class RequestProcessor:
request.pk, request.pk,
) )
if finished and finished["videos"] != request.videos: if finished and finished["videos"] != request.videos:
await self._client.link_videos(show.kind, show.slug, finished["videos"]) videos = TypeAdapter(list[Request.Video]).validate_python(
finished["videos"]
)
await self._client.link_videos(
"movie" if request.kind == "movie" else "serie",
show.slug,
videos,
)
except Exception as e: except Exception as e:
logger.error("Couldn't process request", exc_info=e) logger.error("Couldn't process request", exc_info=e)
cur = await self._database.execute( cur = await self._database.execute(