mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-06-23 15:30:34 -04:00
Fix lots of stuff
This commit is contained in:
parent
489336c77a
commit
2f6943cd6f
@ -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` })
|
||||||
|
@ -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())
|
|
||||||
|
@ -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)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -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,
|
||||||
),
|
),
|
||||||
|
@ -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(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user