mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-06-04 22:24:14 -04:00
Make anilist poc work
This commit is contained in:
parent
fb0af0855c
commit
fa7229f6f9
@ -1,6 +1,6 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
from aiohttp import ClientSession
|
from aiohttp import ClientSession
|
||||||
from datetime import date, timedelta
|
from datetime import date, timedelta, datetime
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
@ -15,7 +15,7 @@ from ..types.studio import Studio
|
|||||||
from ..types.genre import Genre
|
from ..types.genre import Genre
|
||||||
from ..types.metadataid import MetadataID
|
from ..types.metadataid import MetadataID
|
||||||
from ..types.show import Show, ShowTranslation, Status as ShowStatus
|
from ..types.show import Show, ShowTranslation, Status as ShowStatus
|
||||||
from ..types.collection import Collection, CollectionTranslation
|
from ..types.collection import Collection
|
||||||
|
|
||||||
logger = getLogger(__name__)
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
@ -68,7 +68,16 @@ class AniList(Provider):
|
|||||||
if r.status == 404:
|
if r.status == 404:
|
||||||
raise ProviderError(not_found)
|
raise ProviderError(not_found)
|
||||||
if r.status == 429:
|
if r.status == 429:
|
||||||
|
logger.error(r.headers)
|
||||||
|
if "Retry-After" in r.headers:
|
||||||
await asyncio.sleep(float(r.headers["Retry-After"]))
|
await asyncio.sleep(float(r.headers["Retry-After"]))
|
||||||
|
elif "X-RateLimit-Reset" in r.headers:
|
||||||
|
reset = datetime.fromtimestamp(
|
||||||
|
float(r.headers["X-RateLimit-Reset"])
|
||||||
|
)
|
||||||
|
await asyncio.sleep((reset - datetime.now()).total_seconds())
|
||||||
|
else:
|
||||||
|
await asyncio.sleep(60)
|
||||||
continue
|
continue
|
||||||
ret = await r.json()
|
ret = await r.json()
|
||||||
logger.error(ret)
|
logger.error(ret)
|
||||||
@ -187,24 +196,34 @@ class AniList(Provider):
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
original_language=ret["countryOfOrigin"],
|
original_language=ret["countryOfOrigin"],
|
||||||
aliases=[ret["title"]["english"], ret["title"]["native"]],
|
aliases=[
|
||||||
|
x
|
||||||
|
for x in [ret["title"]["english"], ret["title"]["native"]]
|
||||||
|
if x is not None
|
||||||
|
],
|
||||||
start_air=date(
|
start_air=date(
|
||||||
year=ret["startDate"]["year"],
|
year=ret["startDate"]["year"],
|
||||||
month=ret["startDate"]["month"],
|
month=ret["startDate"]["month"] or 1,
|
||||||
day=ret["startDate"]["day"],
|
day=ret["startDate"]["day"] or 1,
|
||||||
),
|
)
|
||||||
|
if ret["startDate"] is not None
|
||||||
|
else None,
|
||||||
end_air=date(
|
end_air=date(
|
||||||
year=ret["endDate"]["year"],
|
year=ret["endDate"]["year"],
|
||||||
month=ret["endDate"]["month"],
|
month=ret["endDate"]["month"] or 1,
|
||||||
day=ret["endDate"]["day"],
|
day=ret["endDate"]["day"] or 1,
|
||||||
)
|
)
|
||||||
if ret["endDate"]["year"] is not None
|
if ret["endDate"]["year"] is not None
|
||||||
else None,
|
else None,
|
||||||
status=ShowStatus.FINISHED
|
status=ShowStatus.FINISHED
|
||||||
if ret["status"] == "FINISHED"
|
if ret["status"] == "FINISHED"
|
||||||
else ShowStatus.AIRING,
|
else ShowStatus.AIRING,
|
||||||
rating=ret["averageScore"],
|
rating=ret["averageScore"] or 0,
|
||||||
genres=[self._genre_map[x] for x in ret["genres"] if x in self._genre_map],
|
genres=[
|
||||||
|
self._genre_map[x]
|
||||||
|
for x in ret["genres"]
|
||||||
|
if x in self._genre_map and self._genre_map[x] is not None
|
||||||
|
],
|
||||||
studios=[
|
studios=[
|
||||||
Studio(
|
Studio(
|
||||||
name=x["name"],
|
name=x["name"],
|
||||||
@ -216,11 +235,17 @@ class AniList(Provider):
|
|||||||
],
|
],
|
||||||
external_id={
|
external_id={
|
||||||
self.name: MetadataID(ret["id"], ret["siteUrl"]),
|
self.name: MetadataID(ret["id"], ret["siteUrl"]),
|
||||||
|
}
|
||||||
|
| (
|
||||||
|
{
|
||||||
"mal": MetadataID(
|
"mal": MetadataID(
|
||||||
ret["idMal"], f"https://myanimelist.net/anime/{ret['idMal']}"
|
ret["idMal"], f"https://myanimelist.net/anime/{ret['idMal']}"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if ret["idMal"] is not None
|
||||||
|
else {}
|
||||||
),
|
),
|
||||||
# TODO: add anidb id (needed for xem lookup and scrubbing)
|
# TODO: add anidb id (needed for xem lookup and scrubbing)
|
||||||
},
|
|
||||||
seasons=[],
|
seasons=[],
|
||||||
)
|
)
|
||||||
show.seasons.append(
|
show.seasons.append(
|
||||||
@ -264,6 +289,7 @@ class AniList(Provider):
|
|||||||
}
|
}
|
||||||
description(asHtml: false)
|
description(asHtml: false)
|
||||||
status
|
status
|
||||||
|
duration
|
||||||
startDate {
|
startDate {
|
||||||
year
|
year
|
||||||
month
|
month
|
||||||
@ -332,18 +358,28 @@ class AniList(Provider):
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
original_language=ret["countryOfOrigin"],
|
original_language=ret["countryOfOrigin"],
|
||||||
aliases=[ret["title"]["english"], ret["title"]["native"]],
|
aliases=[
|
||||||
|
x
|
||||||
|
for x in [ret["title"]["english"], ret["title"]["native"]]
|
||||||
|
if x is not None
|
||||||
|
],
|
||||||
air_date=date(
|
air_date=date(
|
||||||
year=ret["startDate"]["year"],
|
year=ret["startDate"]["year"],
|
||||||
month=ret["startDate"]["month"],
|
month=ret["startDate"]["month"] or 1,
|
||||||
day=ret["startDate"]["day"],
|
day=ret["startDate"]["day"] or 1,
|
||||||
),
|
)
|
||||||
|
if ret["startDate"] is not None
|
||||||
|
else None,
|
||||||
status=MovieStatus.FINISHED
|
status=MovieStatus.FINISHED
|
||||||
if ret["status"] == "FINISHED"
|
if ret["status"] == "FINISHED"
|
||||||
else MovieStatus.PLANNED,
|
else MovieStatus.PLANNED,
|
||||||
rating=ret["averageScore"],
|
rating=ret["averageScore"] or 0,
|
||||||
runtime=ret["runtime"],
|
runtime=ret["duration"],
|
||||||
genres=[self._genre_map[x] for x in ret["genres"] if x in self._genre_map],
|
genres=[
|
||||||
|
self._genre_map[x]
|
||||||
|
for x in ret["genres"]
|
||||||
|
if x in self._genre_map and self._genre_map[x] is not None
|
||||||
|
],
|
||||||
studios=[
|
studios=[
|
||||||
Studio(
|
Studio(
|
||||||
name=x["name"],
|
name=x["name"],
|
||||||
@ -355,11 +391,17 @@ class AniList(Provider):
|
|||||||
],
|
],
|
||||||
external_id={
|
external_id={
|
||||||
self.name: MetadataID(ret["id"], ret["siteUrl"]),
|
self.name: MetadataID(ret["id"], ret["siteUrl"]),
|
||||||
|
}
|
||||||
|
| (
|
||||||
|
{
|
||||||
"mal": MetadataID(
|
"mal": MetadataID(
|
||||||
ret["idMal"], f"https://myanimelist.net/anime/{ret['idMal']}"
|
ret["idMal"], f"https://myanimelist.net/anime/{ret['idMal']}"
|
||||||
),
|
),
|
||||||
# TODO: add anidb id (needed for xem lookup and scrubbing)
|
# TODO: add anidb id (needed for xem lookup and scrubbing)
|
||||||
},
|
}
|
||||||
|
if ret["idMal"] is not None
|
||||||
|
else {}
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
async def search_movie(self, name: str, year: Optional[int]) -> Movie:
|
async def search_movie(self, name: str, year: Optional[int]) -> Movie:
|
||||||
@ -393,7 +435,21 @@ class AniList(Provider):
|
|||||||
self.name: EpisodeID(
|
self.name: EpisodeID(
|
||||||
show.external_id[self.name].data_id, None, absolute, None
|
show.external_id[self.name].data_id, None, absolute, None
|
||||||
),
|
),
|
||||||
"mal": EpisodeID(show.external_id["mal"].data_id, None, absolute, None),
|
}
|
||||||
|
| (
|
||||||
|
{
|
||||||
|
"mal": EpisodeID(
|
||||||
|
show.external_id["mal"].data_id, None, absolute, None
|
||||||
|
),
|
||||||
|
}
|
||||||
|
if "mal" in show.external_id
|
||||||
|
else {}
|
||||||
|
),
|
||||||
|
translations={
|
||||||
|
"en": EpisodeTranslation(
|
||||||
|
name=f"Episode {absolute}",
|
||||||
|
overview=None,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ class Provider:
|
|||||||
providers = []
|
providers = []
|
||||||
|
|
||||||
from providers.implementations.anilist import AniList
|
from providers.implementations.anilist import AniList
|
||||||
|
|
||||||
return AniList(client)
|
return AniList(client)
|
||||||
|
|
||||||
from providers.implementations.themoviedatabase import TheMovieDatabase
|
from providers.implementations.themoviedatabase import TheMovieDatabase
|
||||||
@ -32,7 +33,6 @@ class Provider:
|
|||||||
tmdb = TheMovieDatabase(languages, client, tmdb)
|
tmdb = TheMovieDatabase(languages, client, tmdb)
|
||||||
providers.append(tmdb)
|
providers.append(tmdb)
|
||||||
|
|
||||||
|
|
||||||
if not any(providers):
|
if not any(providers):
|
||||||
raise ProviderError(
|
raise ProviderError(
|
||||||
"No provider configured. You probably forgot to specify an API Key"
|
"No provider configured. You probably forgot to specify an API Key"
|
||||||
|
@ -33,6 +33,7 @@ class Season:
|
|||||||
return {
|
return {
|
||||||
**asdict(self),
|
**asdict(self),
|
||||||
**asdict(self.translations[default_language]),
|
**asdict(self.translations[default_language]),
|
||||||
|
"episodes_count": 0,
|
||||||
"poster": next(iter(self.translations[default_language].posters), None),
|
"poster": next(iter(self.translations[default_language].posters), None),
|
||||||
"thumbnail": next(
|
"thumbnail": next(
|
||||||
iter(self.translations[default_language].thumbnails), None
|
iter(self.translations[default_language].thumbnails), None
|
||||||
|
Loading…
x
Reference in New Issue
Block a user