Fix simkl requests body and episode identification

This commit is contained in:
Zoe Roux 2024-03-21 02:39:04 +01:00
parent fe9aa865f9
commit 2df874e786
No known key found for this signature in database
2 changed files with 47 additions and 21 deletions

View File

@ -2,10 +2,16 @@ from typing import Literal
from dataclasses import dataclass from dataclasses import dataclass
from dataclasses_json import dataclass_json, LetterCase from dataclasses_json import dataclass_json, LetterCase
from autosync.models.show import Show
from .metadataid import MetadataID from .metadataid import MetadataID
@dataclass_json(letter_case=LetterCase.CAMEL) @dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass @dataclass
class Episode: class Episode:
external_id: dict[str, MetadataID] external_id: dict[str, MetadataID]
show: Show
season_number: int
episode_number: int
absolute_number: int
kind: Literal["episode"] kind: Literal["episode"]

View File

@ -1,6 +1,7 @@
import os import os
import requests import requests
import logging import logging
from autosync.models.metadataid import MetadataID
from autosync.services.service import Service from autosync.services.service import Service
from ..models.user import User from ..models.user import User
@ -31,16 +32,24 @@ class Simkl(Service):
if resource.kind == "episode": if resource.kind == "episode":
if status.status != Status.COMPLETED: if status.status != Status.COMPLETED:
return return
resp = requests.post( resp = requests.post(
"https://api.simkl.com/sync/history", "https://api.simkl.com/sync/history",
json={ json={
"episodes": { "shows": [
"watched_at": watch_date.isoformat(), {
"ids": { "watched_at": watch_date.isoformat(),
service: id.data_id "title": resource.show.name,
for service, id in resource.external_id.items() "year": resource.show.year,
}, "ids": self._map_external_ids(resource.show.external_id),
} "seasons": [
{
"number": resource.season_number,
"episodes": [{"number": resource.episode_number}],
},
],
}
]
}, },
headers={ headers={
"Authorization": f"Bearer {user.external_id["simkl"].token.access_token}", "Authorization": f"Bearer {user.external_id["simkl"].token.access_token}",
@ -52,25 +61,24 @@ class Simkl(Service):
category = "movies" if resource.kind == "movie" else "shows" category = "movies" if resource.kind == "movie" else "shows"
simkl_status = self._to_simkl_status(status.status) simkl_status = self._map_status(status.status)
if simkl_status is None: if simkl_status is None:
return return
resp = requests.post( resp = requests.post(
"https://api.simkl.com/sync/add-to-list", "https://api.simkl.com/sync/add-to-list",
json={ json={
category: { category: [
"to": simkl_status, {
"watched_at": watch_date "to": simkl_status,
if status.status == Status.COMPLETED "watched_at": watch_date.isoformat()
else None, if status.status == Status.COMPLETED
"title": resource.name, else None,
"year": resource.year, "title": resource.name,
"ids": { "year": resource.year,
service: id.data_id "ids": self._map_external_ids(resource.external_id),
for service, id in resource.external_id.items() }
}, ]
}
}, },
headers={ headers={
"Authorization": f"Bearer {user.external_id["simkl"].token.access_token}", "Authorization": f"Bearer {user.external_id["simkl"].token.access_token}",
@ -79,7 +87,7 @@ class Simkl(Service):
) )
logging.info("Simkl response: %s %s", resp.status_code, resp.text) logging.info("Simkl response: %s %s", resp.status_code, resp.text)
def _to_simkl_status(self, status: Status): def _map_status(self, status: Status):
match status: match status:
case Status.COMPLETED: case Status.COMPLETED:
return "completed" return "completed"
@ -94,3 +102,15 @@ class Simkl(Service):
return None return None
case _: case _:
return None return None
def _map_external_ids(self, ids: dict[str, MetadataID]):
return {
# "simkl": int(ids["simkl"].data_id) if "simkl" in ids else None,
# "mal": int(ids["mal"].data_id) if "mal" in ids else None,
# "tvdb": int(ids["tvdb"].data_id) if "tvdb" in ids else None,
"imdb": ids["imdb"].data_id if "imdb" in ids else None,
# "anidb": int(ids["anidb"].data_id) if "anidb" in ids else None,
"tmdb": int(ids["themoviedatabase"].data_id)
if "themoviedatabase" in ids
else None,
}