Implement link videos on the scanner

This commit is contained in:
Zoe Roux 2025-06-05 11:14:44 +02:00
parent d9d411b377
commit 3e69ea9c8b
No known key found for this signature in database
4 changed files with 49 additions and 13 deletions

View File

@ -1,15 +1,16 @@
import os
from logging import getLogger
from types import TracebackType
from typing import Literal
from aiohttp import ClientSession
from pydantic import TypeAdapter
from scanner.utils import Singleton
from .models.movie import Movie
from .models.serie import Serie
from .models.videos import Resource, Video, VideoCreated, VideoInfo
from .models.videos import For, Resource, Video, VideoCreated, VideoInfo, VideoLink
from .requests import Request
from .utils import Singleton
logger = getLogger(__name__)
@ -74,3 +75,32 @@ class KyooClient(metaclass=Singleton):
) as r:
r.raise_for_status()
return Resource(**await r.json())
async def link_videos(
self,
kind: Literal["movie", "serie"],
show: str,
videos: list[Request.Video],
):
def map_request(request: Request.Video):
if kind == "movie":
return VideoLink(id=request.id, for_=[For.Movie(movie=show)])
return VideoLink(
id=request.id,
for_=[
For.Special(serie=show, special=ep.episode)
if ep.season is None
else For.Episode(serie=show, season=ep.season, episode=ep.episode)
for ep in request.episodes
],
)
async with self._client.post(
"videos",
data=TypeAdapter(list[VideoLink]).dump_json(
[map_request(x) for x in videos],
by_alias=True,
),
) as r:
r.raise_for_status()
return TypeAdapter(list[VideoCreated]).validate_json(await r.text())

View File

@ -1,6 +1,6 @@
from contextlib import asynccontextmanager
import os
import re
from contextlib import asynccontextmanager
from logging import getLogger
from mimetypes import guess_file_type
from os.path import dirname, exists, isdir, join
@ -157,12 +157,11 @@ class FsScanner:
)
else:
for ep in video.guess.episodes:
if ep.season is not None:
for slug in slugs:
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
else For.Special(serie=slug, special=ep.episode)
)
for k, v in video.guess.external_id.items():

View File

@ -58,7 +58,7 @@ class For(Model):
order: float
class Special(Model):
serie: int
serie: str
special: int
@ -78,3 +78,10 @@ class VideoCreated(Model):
path: str
guess: Guess
entries: list[Resource]
class VideoLink(Model):
id: str
for_: list[
For.Slug | For.ExternalId | For.Movie | For.Episode | For.Order | For.Special
]

View File

@ -146,7 +146,7 @@ class RequestProcessor:
request.pk,
)
if finished and finished["videos"] != request.videos:
await self._client.link_videos(show.slug, finished["videos"])
await self._client.link_videos(show.kind, show.slug, finished["videos"])
except Exception as e:
logger.error("Couldn't process request", exc_info=e)
cur = await self._database.execute(