Parse json messages on autosync

This commit is contained in:
Zoe Roux 2024-03-21 00:34:11 +01:00
parent 22d0d064f7
commit a8fe8e2e13
No known key found for this signature in database
12 changed files with 49 additions and 13 deletions

View File

@ -1,13 +1,22 @@
import json
import logging
import os
import dataclasses_json
import pika
from pika import spec
from pika.adapters.blocking_connection import BlockingChannel
import pika.credentials
from datetime import date, datetime
from autosync.models.message import Message
from autosync.services.aggregate import Aggregate
from autosync.services.simkl import Simkl
dataclasses_json.cfg.global_config.encoders[date] = date.isoformat
dataclasses_json.cfg.global_config.decoders[date] = date.fromisoformat
dataclasses_json.cfg.global_config.encoders[datetime] = datetime.isoformat
dataclasses_json.cfg.global_config.decoders[datetime] = datetime.fromisoformat
logging.basicConfig(level=logging.INFO)
service = Aggregate([Simkl()])
@ -17,8 +26,12 @@ def on_message(
properties: spec.BasicProperties,
body: bytes,
):
status = json.loads(body)
service.update(status.user, status.resource, status)
try:
status = Message.from_json(body)
service.update(status.user, status.resource, status)
except Exception as e:
logging.exception("Error processing message.", exc_info=e)
logging.exception("Body: %s", body)
def main():
@ -41,4 +54,5 @@ def main():
channel.basic_consume(
queue=queue_name, on_message_callback=on_message, auto_ack=True
)
logging.info("Listening for autosync.")
channel.start_consuming()

View File

@ -1,9 +1,10 @@
from typing import Literal
from dataclasses import dataclass
from dataclasses_json import dataclass_json, LetterCase
from .metadataid import MetadataID
@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass
class Episode:
external_id: dict[str, MetadataID]

View File

@ -1,4 +1,5 @@
from dataclasses import dataclass
from dataclasses_json import dataclass_json, LetterCase
from autosync.models.episode import Episode
from autosync.models.movie import Movie
@ -7,12 +8,14 @@ from autosync.models.user import User
from autosync.models.watch_status import WatchStatus
@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass
class WatchStatusMessage(WatchStatus):
user: User
resource: Movie | Show | Episode
@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass
class Message:
action: str

View File

@ -1,7 +1,9 @@
from dataclasses import dataclass
from dataclasses_json import dataclass_json, LetterCase
from typing import Optional
@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass
class MetadataID:
data_id: str

View File

@ -1,10 +1,12 @@
from typing import Literal, Optional
from datetime import date
from dataclasses import dataclass
from dataclasses_json import dataclass_json, LetterCase
from .metadataid import MetadataID
@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass
class Movie:
name: str

View File

@ -1,10 +1,12 @@
from typing import Literal, Optional
from datetime import date
from dataclasses import dataclass
from dataclasses_json import dataclass_json, LetterCase
from .metadataid import MetadataID
@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass
class Show:
name: str

View File

@ -1,8 +1,10 @@
from datetime import datetime, time
from dataclasses import dataclass
from dataclasses_json import dataclass_json, LetterCase
from typing import Optional
@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass
class JwtToken:
token_type: str
@ -12,6 +14,7 @@ class JwtToken:
expire_at: datetime
@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass
class ExternalToken:
id: str
@ -20,6 +23,7 @@ class ExternalToken:
token: JwtToken
@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass
class User:
id: str

View File

@ -1,21 +1,23 @@
from datetime import date
from dataclasses import dataclass
from dataclasses_json import dataclass_json, LetterCase
from typing import Optional
from enum import Enum
class Status(str, Enum):
COMPLETED = "completed"
WATCHING = "watching"
DROPED = "droped"
PLANNED = "planned"
DELETED = "deleted"
COMPLETED = "Completed"
WATCHING = "Watching"
DROPED = "Droped"
PLANNED = "Planned"
DELETED = "Deleted"
@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass
class WatchStatus:
added_date: date
played_date: date
played_date: Optional[date]
status: Status
watched_time: Optional[int]
watched_percent: Optional[int]

View File

@ -18,4 +18,9 @@ class Aggregate(Service):
def update(self, user: User, resource: Movie | Show | Episode, status: WatchStatus):
for service in self._services:
service.update(user, resource, status)
try:
service.update(user, resource, status)
except Exception as e:
logging.exception(
"Unhandled error on autosync %s:", service.name, exc_info=e
)

View File

@ -1,5 +1,4 @@
import os
from typing_extensions import assert_type
import requests
import logging

View File

@ -1,2 +1,3 @@
pika
requets
requests
dataclasses-json

View File

@ -7,6 +7,7 @@
watchfiles
pika
requests
dataclasses-json
]);
dotnet = with pkgs.dotnetCorePackages;
combinePackages [