From 5b195bd141a7a0eca0f9bbf3e875da4b7223c7ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Geoffrey=20=E2=80=9CFrogeye=E2=80=9D=20Preud=27homme?= Date: Fri, 17 Dec 2021 23:16:32 +0100 Subject: [PATCH] rssVideos: Add watch --- config/scripts/rssVideos | 55 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 5 deletions(-) diff --git a/config/scripts/rssVideos b/config/scripts/rssVideos index 532b26e..b58efd3 100755 --- a/config/scripts/rssVideos +++ b/config/scripts/rssVideos @@ -13,7 +13,9 @@ import functools import logging import os import pickle +import random import re +import subprocess import sys import typing import urllib.parse @@ -43,17 +45,20 @@ def configure_logging(args: configargparse.Namespace) -> None: class RVCommand(enum.Enum): download = "download" list = "list" + watch = "watch" class RVElement: parent: "RVDatabase" item: minidom.Element was_downloaded: bool + watched: bool def __init__(self, parent: "RVDatabase", item: minidom.Element) -> None: self.parent = parent self.item = item self.was_downloaded = False + self.watched = False def get_tag_data(self, tag_name: str) -> str: nodes = self.item.getElementsByTagName(tag_name) @@ -101,6 +106,8 @@ class RVElement: log.debug(f"From cache: {self}") if cache.was_downloaded: self.was_downloaded = True + if cache.watched: + self.watched = True def __str__(self) -> str: return f"{self.guid}: {self.creator} – {self.title} – {self.link}" @@ -204,6 +211,8 @@ class RVElement: def matches_search(self, args: configargparse.Namespace) -> bool: if not self.is_video: return False + if self.watched: + return False if args.title and not re.search(args.title, self.title): return False if args.creator and not re.search(args.creator, self.creator): @@ -240,6 +249,16 @@ class RVElement: return False return True + def watch(self) -> None: + if not self.downloaded: + self.download() + + proc = subprocess.run(['mpv', self.filepath]) + proc.check_returncode() + + self.watched = True + self.parent.save() + class RVDatabase: SAVE_FILE = ".cache.p" @@ -400,11 +419,20 @@ def get_args() -> configargparse.Namespace: sc_list = subparsers.add_parser("list") sc_list.set_defaults(subcommand=RVCommand.list) - sc_list.add("--guid", help="Regex to filter guid") - sc_list.add("--creator", help="Regex to filter by creator") - sc_list.add("--title", help="Regex to filter by title") - sc_list.add("--link", help="Regex to filter by link") - sc_list.add("--duration", help="Comparative to filter by duration") + + sc_watch = subparsers.add_parser("watch") + sc_watch.set_defaults(subcommand=RVCommand.watch) + sc_watch.add("order", choices=("old", "new", "random"), nargs="?", default="old", help="Watch X first") + + # TODO Command to watch multiple + + # Common arguments for filtering + for sc in (sc_list, sc_watch): + sc.add("--guid", help="Regex to filter guid") + sc.add("--creator", help="Regex to filter by creator") + sc.add("--title", help="Regex to filter by title") + sc.add("--link", help="Regex to filter by link") + sc.add("--duration", help="Comparative to filter by duration") args = parser.parse_args() args.videos = os.path.realpath(os.path.expanduser(args.videos)) @@ -419,6 +447,8 @@ def main() -> None: os.makedirs(args.videos, exist_ok=True) os.chdir(args.videos) + # TODO Abstract a bit + if args.subcommand == RVCommand.download: database = RVDatabase(args) database.read_feed() @@ -438,6 +468,21 @@ def main() -> None: continue print(element) + elif args.subcommand == RVCommand.watch: + cache = RVDatabase.load() + if not cache: + raise FileNotFoundError("This command doesn't work without a cache yet.") + elements = cache.elements.copy() + if args.order == "new": + elements = reversed(elements) + elif args.order == "random": + random.shuffle(elements) + for element in elements: + if not element.matches_search(args): + continue + element.watch() + break + if __name__ == "__main__": main()