From 088269f272d411d136588b7f96f98880d73acc36 Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Sun, 19 Mar 2023 10:12:00 +0100 Subject: [PATCH] youtube: Add tags for keywords --- .../extractors/all/youtube.py | 31 +++++++++++++++++++ .../extractors/media/youtube.py | 3 ++ 2 files changed, 34 insertions(+) diff --git a/server/entertainment_decider/extractors/all/youtube.py b/server/entertainment_decider/extractors/all/youtube.py index a55da69..4e53553 100644 --- a/server/entertainment_decider/extractors/all/youtube.py +++ b/server/entertainment_decider/extractors/all/youtube.py @@ -1,11 +1,19 @@ from __future__ import annotations from typing import ( + Iterable, List, NewType, TypedDict, ) +from ...models import Tag, TagKey + + +EXTRACTOR_KEY = ".extractor/com.youtube" + +KEYWORD_PREFIX = f"{EXTRACTOR_KEY}/keyword" + Keyword = NewType("Keyword", str) @@ -46,3 +54,26 @@ class YoutubeVideoData(TypedDict): uploadDate: str isLiveNow: bool link: str + + +def get_video_tags(video: YoutubeVideoData) -> Iterable[Tag]: + keyword_list = video.get("keywords") + if keyword_list is not None: + for keyword in keyword_list: + yield get_keyword_tag(keyword) + + +def get_keyword_tag(keyword: Keyword) -> Tag: + TagKey.get_or_create_tag( + tag_key=KEYWORD_PREFIX, + title=f"[{EXTRACTOR_NAME}] Keyword", + use_for_preferences=False, + ) + return TagKey.get_or_create_tag( + tag_key=f"{KEYWORD_PREFIX}/{keyword.lower()}", + title=f"[{EXTRACTOR_NAME}] [Keyword] {keyword}", + use_for_preferences=True, + super_tags=[ + KEYWORD_PREFIX, + ], + ) diff --git a/server/entertainment_decider/extractors/media/youtube.py b/server/entertainment_decider/extractors/media/youtube.py index 149df2c..4da5123 100644 --- a/server/entertainment_decider/extractors/media/youtube.py +++ b/server/entertainment_decider/extractors/media/youtube.py @@ -14,6 +14,7 @@ from ...models import ( ) from ..all.youtube import ( YoutubeVideoData, + get_video_tags, ) from ..generic import ( AuthorExtractedData, @@ -99,6 +100,8 @@ class YoutubeMediaExtractor(MediaExtractor[YoutubeVideoData]): data.get("uploadDate") or data["publishDate"], "%Y-%m-%d" ) object.length = int(data["duration"]["secondsText"]) + for tag in get_video_tags(data): + object.tag_list.add(tag) object.uri = f"https://www.youtube.com/watch?v={data['id']}" object.add_uris( (