mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-07-09 03:04:20 -04:00
Implement link videos on the scanner
This commit is contained in:
parent
d9d411b377
commit
3e69ea9c8b
@ -1,15 +1,16 @@
|
|||||||
import os
|
import os
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
from types import TracebackType
|
from types import TracebackType
|
||||||
|
from typing import Literal
|
||||||
|
|
||||||
from aiohttp import ClientSession
|
from aiohttp import ClientSession
|
||||||
from pydantic import TypeAdapter
|
from pydantic import TypeAdapter
|
||||||
|
|
||||||
from scanner.utils import Singleton
|
|
||||||
|
|
||||||
from .models.movie import Movie
|
from .models.movie import Movie
|
||||||
from .models.serie import Serie
|
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__)
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
@ -74,3 +75,32 @@ class KyooClient(metaclass=Singleton):
|
|||||||
) as r:
|
) as r:
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
return Resource(**await r.json())
|
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())
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
from contextlib import asynccontextmanager
|
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
from contextlib import asynccontextmanager
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
from mimetypes import guess_file_type
|
from mimetypes import guess_file_type
|
||||||
from os.path import dirname, exists, isdir, join
|
from os.path import dirname, exists, isdir, join
|
||||||
@ -157,12 +157,11 @@ class FsScanner:
|
|||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
for ep in video.guess.episodes:
|
for ep in video.guess.episodes:
|
||||||
if ep.season is not None:
|
|
||||||
for slug in slugs:
|
for slug in slugs:
|
||||||
video.for_.append(
|
video.for_.append(
|
||||||
For.Episode(
|
For.Episode(serie=slug, season=ep.season, episode=ep.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():
|
for k, v in video.guess.external_id.items():
|
||||||
|
@ -58,7 +58,7 @@ class For(Model):
|
|||||||
order: float
|
order: float
|
||||||
|
|
||||||
class Special(Model):
|
class Special(Model):
|
||||||
serie: int
|
serie: str
|
||||||
special: int
|
special: int
|
||||||
|
|
||||||
|
|
||||||
@ -78,3 +78,10 @@ class VideoCreated(Model):
|
|||||||
path: str
|
path: str
|
||||||
guess: Guess
|
guess: Guess
|
||||||
entries: list[Resource]
|
entries: list[Resource]
|
||||||
|
|
||||||
|
|
||||||
|
class VideoLink(Model):
|
||||||
|
id: str
|
||||||
|
for_: list[
|
||||||
|
For.Slug | For.ExternalId | For.Movie | For.Episode | For.Order | For.Special
|
||||||
|
]
|
||||||
|
@ -146,7 +146,7 @@ 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.slug, finished["videos"])
|
await self._client.link_videos(show.kind, show.slug, finished["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