mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-05-24 02:02:36 -04:00
Add refresh message handler
This commit is contained in:
parent
d34d87957e
commit
8a816b587f
@ -1,4 +1,5 @@
|
||||
from datetime import timedelta
|
||||
from typing import Literal
|
||||
import asyncio
|
||||
from logging import getLogger
|
||||
from providers.provider import Provider, ProviderError
|
||||
@ -165,3 +166,30 @@ class Matcher:
|
||||
return await self._client.post("seasons", data=season.to_kyoo())
|
||||
|
||||
return await create_season(show_id, season_number)
|
||||
|
||||
async def refresh(
|
||||
self,
|
||||
kind: Literal["collection", "movie", "episode", "show", "season"],
|
||||
kyoo_id: str,
|
||||
):
|
||||
identify_table = {
|
||||
"collection": lambda _, id: self._provider.identify_collection(
|
||||
id["dataId"]
|
||||
),
|
||||
"movie": lambda _, id: self._provider.identify_movie(id["dataId"]),
|
||||
"show": lambda _, id: self._provider.identify_show(id["dataId"]),
|
||||
"season": lambda season, id: self._provider.identify_season(
|
||||
id["dataId"], season["seasonNumber"]
|
||||
),
|
||||
"episode": lambda episode, id: self._provider.identify_episode(
|
||||
id["showId"], id["season"], id["episode"], episode["absoluteNumber"]
|
||||
),
|
||||
}
|
||||
current = await self._client.get(kind, kyoo_id)
|
||||
if self._provider.name not in current["externalId"]:
|
||||
logger.error(f"Could not refresh metadata of {kind}/{kyoo_id}. Missisg provider id.")
|
||||
return False
|
||||
provider_id = current["externalId"][self._provider.name]
|
||||
new_value = await identify_table[kind](current, provider_id)
|
||||
await self._client.put(f"{kind}/{kyoo_id}", data=new_value.to_kyoo())
|
||||
return True
|
||||
|
@ -1,5 +1,5 @@
|
||||
import asyncio
|
||||
from typing import Union
|
||||
from typing import Union, Literal
|
||||
from msgspec import Struct, json
|
||||
import os
|
||||
import logging
|
||||
@ -19,10 +19,11 @@ class Scan(Message):
|
||||
class Delete(Message):
|
||||
path: str
|
||||
|
||||
class Identify(Message):
|
||||
pass
|
||||
class Refresh(Message):
|
||||
kind: Literal["collection", "show", "movie", "season", "episode"]
|
||||
id: str
|
||||
|
||||
decoder = json.Decoder(Union[Scan, Delete, Identify])
|
||||
decoder = json.Decoder(Union[Scan, Delete, Refresh])
|
||||
|
||||
class Subscriber:
|
||||
QUEUE = "scanner"
|
||||
@ -49,8 +50,8 @@ class Subscriber:
|
||||
ack = await scanner.identify(path)
|
||||
case Delete(path):
|
||||
ack = await scanner.delete(path)
|
||||
# case Identify():
|
||||
# ack = await scanner.delete(msg.path)
|
||||
case Refresh(kind, id):
|
||||
ack = await scanner.refresh(kind, id)
|
||||
case _:
|
||||
logger.error(f"Invalid action: {msg.action}")
|
||||
if ack:
|
||||
|
@ -154,3 +154,35 @@ class KyooClient:
|
||||
r.raise_for_status()
|
||||
|
||||
await self.delete_issue(path)
|
||||
|
||||
async def get(
|
||||
self, kind: Literal["movie", "show", "season", "episode", "collection"], id: str
|
||||
):
|
||||
async with self.client.get(
|
||||
f"{self._url}/{kind}/{id}",
|
||||
headers={"X-API-Key": self._api_key},
|
||||
) as r:
|
||||
if not r.ok:
|
||||
logger.error(f"Request error: {await r.text()}")
|
||||
r.raise_for_status()
|
||||
return await r.json()
|
||||
|
||||
async def put(self, path: str, *, data: dict[str, Any]):
|
||||
logger.debug(
|
||||
"Sending %s: %s",
|
||||
path,
|
||||
jsons.dumps(
|
||||
data,
|
||||
key_transformer=jsons.KEY_TRANSFORMER_CAMELCASE,
|
||||
jdkwargs={"indent": 4},
|
||||
),
|
||||
)
|
||||
async with self.client.post(
|
||||
f"{self._url}/{path}",
|
||||
json=data,
|
||||
headers={"X-API-Key": self._api_key},
|
||||
) as r:
|
||||
# Allow 409 and continue as if it worked.
|
||||
if not r.ok and r.status != 409:
|
||||
logger.error(f"Request error: {await r.text()}")
|
||||
r.raise_for_status()
|
||||
|
Loading…
x
Reference in New Issue
Block a user