extractors/coll/youtube: explicitly type playlist data

master
Felix Stupp 6 months ago
parent 8b6e318a20
commit b2d0c8bc3d
Signed by: zocker
GPG Key ID: 93E1BD26F6B02FB7

@ -1,9 +1,14 @@
from __future__ import annotations from __future__ import annotations
from collections.abc import (
Collection,
)
from datetime import datetime from datetime import datetime
import logging import logging
import re import re
from typing import Dict, TypeAlias from typing import (
TypedDict,
)
from pony import orm # TODO remove from pony import orm # TODO remove
import youtubesearchpython import youtubesearchpython
@ -22,10 +27,28 @@ from ..generic import (
from .base import CollectionExtractor from .base import CollectionExtractor
DataType: TypeAlias = Dict class PlaylistChannel(TypedDict):
name: str
id: str
class PlaylistMetadata(TypedDict):
id: str
title: str
channel: PlaylistChannel
link: str
class PlaylistVideo(TypedDict):
id: str
class PlaylistData(TypedDict):
info: PlaylistMetadata
videos: Collection[PlaylistVideo]
class YouTubeCollectionExtractor(CollectionExtractor[DataType]): class YouTubeCollectionExtractor(CollectionExtractor[PlaylistData]):
__uri_regex = re.compile( __uri_regex = re.compile(
r"""^ r"""^
https?:// https?://
@ -87,15 +110,15 @@ class YouTubeCollectionExtractor(CollectionExtractor[DataType]):
last_release_date last_release_date
) )
def _extract_offline(self, uri: str) -> ExtractedDataOffline[DataType]: def _extract_offline(self, uri: str) -> ExtractedDataOffline[PlaylistData]:
playlist_id = self.__convert_if_required(self.__get_id(uri)) playlist_id = self.__convert_if_required(self.__get_id(uri))
return ExtractedDataOffline[DataType]( return ExtractedDataOffline[PlaylistData](
extractor_name=self.name, extractor_name=self.name,
object_key=playlist_id, object_key=playlist_id,
object_uri=uri, object_uri=uri,
) )
def _extract_online(self, uri: str) -> ExtractedDataOnline[DataType]: def _extract_online(self, uri: str) -> ExtractedDataOnline[PlaylistData]:
orig_id = self.__get_id(uri) orig_id = self.__get_id(uri)
playlist_id = self.__convert_if_required(orig_id) playlist_id = self.__convert_if_required(orig_id)
playlist_link = f"https://www.youtube.com/playlist?list={playlist_id}" playlist_link = f"https://www.youtube.com/playlist?list={playlist_id}"
@ -117,7 +140,7 @@ class YouTubeCollectionExtractor(CollectionExtractor[DataType]):
logging.debug( logging.debug(
f"Retrieved {len(playlist.videos)} videos from playlist {playlist_link!r}" f"Retrieved {len(playlist.videos)} videos from playlist {playlist_link!r}"
) )
return ExtractedDataOnline[DataType]( return ExtractedDataOnline[PlaylistData](
extractor_name=self.name, extractor_name=self.name,
object_key=playlist_id, object_key=playlist_id,
object_uri=uri, object_uri=uri,
@ -130,7 +153,7 @@ class YouTubeCollectionExtractor(CollectionExtractor[DataType]):
def _update_object_raw( def _update_object_raw(
self, self,
object: MediaCollection, object: MediaCollection,
data: DataType, data: PlaylistData,
) -> ChangedReport: ) -> ChangedReport:
info = data["info"] info = data["info"]
is_channel = self.__is_channel_id(info["id"]) is_channel = self.__is_channel_id(info["id"])

Loading…
Cancel
Save