mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-12-06 06:36:25 +00:00
Add requests errors in db and api
This commit is contained in:
@@ -18,6 +18,7 @@ create table scanner.requests(
|
||||
external_id jsonb not null default '{}'::jsonb,
|
||||
videos jsonb not null default '[]'::jsonb,
|
||||
status scanner.request_status not null default 'pending',
|
||||
error jsonb,
|
||||
started_at timestamptz,
|
||||
created_at timestamptz not null default now()::timestamptz,
|
||||
constraint unique_kty unique nulls not distinct (kind, title, year)
|
||||
|
||||
@@ -3,7 +3,7 @@ from logging import getLogger
|
||||
from types import TracebackType
|
||||
from typing import Literal
|
||||
|
||||
from aiohttp import ClientSession
|
||||
from aiohttp import ClientResponse, ClientResponseError, ClientSession
|
||||
from pydantic import TypeAdapter
|
||||
|
||||
from .models.movie import Movie
|
||||
@@ -38,9 +38,19 @@ class KyooClient(metaclass=Singleton):
|
||||
):
|
||||
await self._client.close()
|
||||
|
||||
async def raise_for_status(self, r: ClientResponse):
|
||||
if r.status >= 400:
|
||||
raise ClientResponseError(
|
||||
r.request_info,
|
||||
r.history,
|
||||
status=r.status,
|
||||
message=await r.text(),
|
||||
headers=r.headers,
|
||||
)
|
||||
|
||||
async def get_videos_info(self) -> VideoInfo:
|
||||
async with self._client.get("videos") as r:
|
||||
r.raise_for_status()
|
||||
await self.raise_for_status(r)
|
||||
return VideoInfo(**await r.json())
|
||||
|
||||
async def create_videos(self, videos: list[Video]) -> list[VideoCreated]:
|
||||
@@ -48,7 +58,7 @@ class KyooClient(metaclass=Singleton):
|
||||
"videos",
|
||||
data=TypeAdapter(list[Video]).dump_json(videos, by_alias=True),
|
||||
) as r:
|
||||
r.raise_for_status()
|
||||
await self.raise_for_status(r)
|
||||
return TypeAdapter(list[VideoCreated]).validate_json(await r.text())
|
||||
|
||||
async def delete_videos(self, videos: list[str] | set[str]):
|
||||
@@ -56,14 +66,14 @@ class KyooClient(metaclass=Singleton):
|
||||
"videos",
|
||||
data=TypeAdapter(list[str] | set[str]).dump_json(videos, by_alias=True),
|
||||
) as r:
|
||||
r.raise_for_status()
|
||||
await self.raise_for_status(r)
|
||||
|
||||
async def create_movie(self, movie: Movie) -> Resource:
|
||||
async with self._client.post(
|
||||
"movies",
|
||||
data=movie.model_dump_json(by_alias=True),
|
||||
) as r:
|
||||
r.raise_for_status()
|
||||
await self.raise_for_status(r)
|
||||
return Resource.model_validate(await r.json())
|
||||
|
||||
async def create_serie(self, serie: Serie) -> Resource:
|
||||
@@ -71,7 +81,7 @@ class KyooClient(metaclass=Singleton):
|
||||
"series",
|
||||
data=serie.model_dump_json(by_alias=True),
|
||||
) as r:
|
||||
r.raise_for_status()
|
||||
await self.raise_for_status(r)
|
||||
return Resource.model_validate(await r.json())
|
||||
|
||||
async def link_videos(
|
||||
@@ -100,4 +110,4 @@ class KyooClient(metaclass=Singleton):
|
||||
by_alias=True,
|
||||
),
|
||||
) as r:
|
||||
r.raise_for_status()
|
||||
await self.raise_for_status(r)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from __future__ import annotations
|
||||
from datetime import datetime
|
||||
from typing import Literal
|
||||
from typing import Any, Literal
|
||||
|
||||
from pydantic import Field
|
||||
|
||||
@@ -31,4 +31,5 @@ class RequestRet(Model):
|
||||
"running",
|
||||
"failed",
|
||||
]
|
||||
error: dict[str, Any] | None
|
||||
started_at: datetime | None
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from asyncio import CancelledError, Event, TaskGroup
|
||||
from logging import getLogger
|
||||
from traceback import TracebackException
|
||||
from typing import cast
|
||||
|
||||
from asyncpg import Connection, Pool
|
||||
@@ -161,11 +162,22 @@ class RequestProcessor:
|
||||
update
|
||||
scanner.requests
|
||||
set
|
||||
status = 'failed'
|
||||
status = 'failed',
|
||||
error = $2
|
||||
where
|
||||
pk = $1
|
||||
""",
|
||||
request.pk,
|
||||
{
|
||||
"title": type(e).__name__,
|
||||
"message": str(e),
|
||||
"traceback": [
|
||||
line
|
||||
for part in TracebackException.from_exception(e).format()
|
||||
for line in part.split("\n")
|
||||
if line.strip()
|
||||
],
|
||||
},
|
||||
)
|
||||
return True
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ class StatusService:
|
||||
title,
|
||||
year,
|
||||
status,
|
||||
error,
|
||||
started_at
|
||||
from
|
||||
scanner.requests
|
||||
|
||||
Reference in New Issue
Block a user