From e61be6cf4fdd00a51b6b7f039b005e1a58937051 Mon Sep 17 00:00:00 2001 From: Marc Beninca Date: Mon, 23 Sep 2024 12:53:28 +0200 Subject: [PATCH 01/11] sw.freetube --- rwx/sw/freetube/__init__.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 rwx/sw/freetube/__init__.py diff --git a/rwx/sw/freetube/__init__.py b/rwx/sw/freetube/__init__.py new file mode 100644 index 0000000..cb60ff9 --- /dev/null +++ b/rwx/sw/freetube/__init__.py @@ -0,0 +1 @@ +"""Handle FreeTube configuration.""" From 19153b3bc1f7372b2142f1ec403afb87012f003b Mon Sep 17 00:00:00 2001 From: Marc Beninca Date: Mon, 23 Sep 2024 13:04:56 +0200 Subject: [PATCH 02/11] freetube.db --- rwx/sw/freetube/db.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 rwx/sw/freetube/db.py diff --git a/rwx/sw/freetube/db.py b/rwx/sw/freetube/db.py new file mode 100644 index 0000000..4b3f56b --- /dev/null +++ b/rwx/sw/freetube/db.py @@ -0,0 +1,20 @@ +"""Handle FreeTube db.""" + +def to_db(value: object) -> str: + """Render value as string. + + :param value: value to render + :type value: object + :rtype: str + """ + match value: + case bool(): + text = str(value).lower() + case dict(): + sub = ",".join([f'"{i}":{to_db(v)}' for i, v in value.items()]) + text = f"{{{sub}}}" + case float() | str(): + text = f'"{value}"' + case _: + text = str(value) + return text From 45df47519543f239ba7e4ef7ac6c4969aa1c315d Mon Sep 17 00:00:00 2001 From: Marc Beninca Date: Mon, 23 Sep 2024 13:27:16 +0200 Subject: [PATCH 03/11] freetube.settings --- rwx/sw/freetube/__init__.py | 2 +- rwx/sw/freetube/db.py | 2 +- rwx/sw/freetube/settings.py | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 rwx/sw/freetube/settings.py diff --git a/rwx/sw/freetube/__init__.py b/rwx/sw/freetube/__init__.py index cb60ff9..250b9c3 100644 --- a/rwx/sw/freetube/__init__.py +++ b/rwx/sw/freetube/__init__.py @@ -1 +1 @@ -"""Handle FreeTube configuration.""" +"""Configure FreeTube.""" diff --git a/rwx/sw/freetube/db.py b/rwx/sw/freetube/db.py index 4b3f56b..9e37162 100644 --- a/rwx/sw/freetube/db.py +++ b/rwx/sw/freetube/db.py @@ -1,4 +1,4 @@ -"""Handle FreeTube db.""" +"""Output FreeTube db.""" def to_db(value: object) -> str: """Render value as string. diff --git a/rwx/sw/freetube/settings.py b/rwx/sw/freetube/settings.py new file mode 100644 index 0000000..67bb084 --- /dev/null +++ b/rwx/sw/freetube/settings.py @@ -0,0 +1,33 @@ +"""FreeTube settings.""" + +from rwx import Class + +from .db import to_db + + +class Setting(Class): + """FreeTube setting.""" + + def __init__(self, uid: str, value: object) -> None: + """Set uid & value. + + :param uid: unique identifier + :type uid: str + :param value: value + :type value: object + """ + self.uid = uid + self.value = value + + def to_db(self) -> str: + """Return uid & value as db string. + + :rtype: str + """ + return f"""\ +{{\ +"_id":"{self.uid}"\ +,\ +"value":{to_db(self.value)}\ +}}\ +""" From 2a01ef0066b332f7165f298bfab8a907e67f5d48 Mon Sep 17 00:00:00 2001 From: Marc Beninca Date: Mon, 23 Sep 2024 14:24:58 +0200 Subject: [PATCH 04/11] freetube.channels --- rwx/sw/freetube/channels.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 rwx/sw/freetube/channels.py diff --git a/rwx/sw/freetube/channels.py b/rwx/sw/freetube/channels.py new file mode 100644 index 0000000..48f6d05 --- /dev/null +++ b/rwx/sw/freetube/channels.py @@ -0,0 +1,29 @@ +"""FreeTube channels.""" + +from rwx import Class + + +class Channel(Class): + """FreeTube channel.""" + + def __init__(self, uid: str, name: str) -> None: + """Set uid & name. + + :param uid: unique identifier + :type uid: str + :param name: label + :type name: str + """ + self.id = uid + self.name = name + + def to_db(self) -> str: + """Return identifier as db. + + :rtype: str + """ + return f"""\ +{{\ +"id":"{self.id}"\ +}}\ +""" From 6ece695be4c1d2d508bd4aaebc12798ebdf9a484 Mon Sep 17 00:00:00 2001 From: Marc Beninca Date: Mon, 23 Sep 2024 14:35:16 +0200 Subject: [PATCH 05/11] channel.uid --- rwx/sw/freetube/channels.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rwx/sw/freetube/channels.py b/rwx/sw/freetube/channels.py index 48f6d05..30777e9 100644 --- a/rwx/sw/freetube/channels.py +++ b/rwx/sw/freetube/channels.py @@ -14,7 +14,7 @@ class Channel(Class): :param name: label :type name: str """ - self.id = uid + self.uid = uid self.name = name def to_db(self) -> str: @@ -24,6 +24,6 @@ class Channel(Class): """ return f"""\ {{\ -"id":"{self.id}"\ +"id":"{self.uid}"\ }}\ """ From 46ec104b7571a8dd1de42a5044841aaa28305015 Mon Sep 17 00:00:00 2001 From: Marc Beninca Date: Mon, 23 Sep 2024 14:35:32 +0200 Subject: [PATCH 06/11] freetube.videos --- rwx/sw/freetube/videos.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 rwx/sw/freetube/videos.py diff --git a/rwx/sw/freetube/videos.py b/rwx/sw/freetube/videos.py new file mode 100644 index 0000000..8a53713 --- /dev/null +++ b/rwx/sw/freetube/videos.py @@ -0,0 +1,33 @@ +"""FreeTube videos.""" + +from rwx import Class + + +class Video(Class): + """FreeTube video.""" + + def __init__(self, uid: str, name: str) -> None: + """Set id & name. + + :param uid: identifier + :type uid: str + :param name: label + :type name: str + """ + self.uid = uid + self.name = name + + def to_db(self) -> str: + """Return identifier, zero length & title. + + :rtype: str + """ + return f"""\ +{{\ +"videoId":"{self.uid}"\ +,\ +"lengthSeconds":0\ +,\ +"title":"{self.name}"\ +}}\ +""" From a92a3a786a672dc93b3ad20904ffdcc1b94c5b6f Mon Sep 17 00:00:00 2001 From: Marc Beninca Date: Mon, 23 Sep 2024 14:46:13 +0200 Subject: [PATCH 07/11] freetube.playlists --- rwx/sw/freetube/playlists.py | 47 ++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 rwx/sw/freetube/playlists.py diff --git a/rwx/sw/freetube/playlists.py b/rwx/sw/freetube/playlists.py new file mode 100644 index 0000000..4183336 --- /dev/null +++ b/rwx/sw/freetube/playlists.py @@ -0,0 +1,47 @@ +"""FreeTube playlists.""" + +from rwx import Class + +from .videos import Video + + +class Playlist(Class): + """FreeTube playlist.""" + + def __init__(self, uid: str, name: str) -> None: + """Set uid & name. + + :param uid: identifier + :type uid: str + :param name: label + :type name: str + """ + self.uid = uid + self.name = name + self.videos: list[Video] = [] + + def add(self, video: Video) -> None: + """Add video. + + :param video: video to add + :type video: Video + """ + self.videos.append(video) + + def to_db(self) -> str: + """Return identifier, name & videos. + + :rtype: str + """ + videos = ",".join([video.to_db() for video in self.videos]) + return f"""\ +{{\ +"_id":"{self.uid}"\ +,\ +"playlistName":"{self.name}"\ +,\ +"protected":true\ +,\ +"videos":[{videos}]\ +}}\ +""" From edd8e15978b1d08938f363f48339fa691776afe7 Mon Sep 17 00:00:00 2001 From: Marc Beninca Date: Mon, 23 Sep 2024 14:59:00 +0200 Subject: [PATCH 08/11] freetube.profiles --- rwx/sw/freetube/profiles.py | 45 +++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 rwx/sw/freetube/profiles.py diff --git a/rwx/sw/freetube/profiles.py b/rwx/sw/freetube/profiles.py new file mode 100644 index 0000000..ffb0adc --- /dev/null +++ b/rwx/sw/freetube/profiles.py @@ -0,0 +1,45 @@ +"""FreeTube profiles.""" + +from rwx import Class + +from .channels import Channel + + +class Profile(Class): + """FreeTube profile.""" + + def __init__(self, uid: str, name: str) -> None: + """Set uid & name. + + :param uid: unique identifier + :type uid: str + :param name: label + :type name: str + """ + self.id = uid + self.name = name + self.channels: list[Channel] = [] + + def add(self, channel: Channel) -> None: + """Add channel. + + :param channel: channel to add + :type channel: Channel + """ + self.channels.append(channel) + + def to_db(self) -> str: + """Return identifier, name & channels. + + :rtype: str + """ + channels = ",".join([channel.to_db() for channel in self.channels]) + return f"""\ +{{\ +"_id":"{self.id}"\ +,\ +"name":"{self.name}"\ +,\ +"subscriptions":[{channels}]\ +}}\ +""" From 5eae0334de4494b63207e8e1ad784f8a4c1c7d4d Mon Sep 17 00:00:00 2001 From: Marc Beninca Date: Mon, 23 Sep 2024 17:25:57 +0200 Subject: [PATCH 09/11] fs.read_file_object --- rwx/fs/__init__.py | 14 ++++++++++++++ rwx/sw/freetube/db.py | 1 + 2 files changed, 15 insertions(+) diff --git a/rwx/fs/__init__.py b/rwx/fs/__init__.py index 6abcce7..184c198 100644 --- a/rwx/fs/__init__.py +++ b/rwx/fs/__init__.py @@ -2,6 +2,7 @@ import os import shutil +import tomllib from pathlib import Path from rwx import ps @@ -106,6 +107,19 @@ def read_file_lines(file_path: Path, charset: str = CHARSET) -> list[str]: return read_file_text(file_path, charset).split(os.linesep) +def read_file_object(file_path: Path, charset: str = CHARSET) -> object: + """Read whole file as toml object. + + :param file_path: source input file + :type file_path: Path + :param charset: charset to use for decoding input + :type charset: str + :rtype: object + """ + text = read_file_text(file_path, charset) + return tomllib.loads(text) + + def read_file_text(file_path: Path, charset: str = CHARSET) -> str: """Read whole file text. diff --git a/rwx/sw/freetube/db.py b/rwx/sw/freetube/db.py index 9e37162..e3eb31e 100644 --- a/rwx/sw/freetube/db.py +++ b/rwx/sw/freetube/db.py @@ -1,5 +1,6 @@ """Output FreeTube db.""" + def to_db(value: object) -> str: """Render value as string. From daccf01b8c406704d088a621a6b18f567bcba673 Mon Sep 17 00:00:00 2001 From: Marc Beninca Date: Mon, 23 Sep 2024 18:48:44 +0200 Subject: [PATCH 10/11] read_file_dict --- rwx/fs/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rwx/fs/__init__.py b/rwx/fs/__init__.py index 184c198..46a26e6 100644 --- a/rwx/fs/__init__.py +++ b/rwx/fs/__init__.py @@ -107,14 +107,14 @@ def read_file_lines(file_path: Path, charset: str = CHARSET) -> list[str]: return read_file_text(file_path, charset).split(os.linesep) -def read_file_object(file_path: Path, charset: str = CHARSET) -> object: +def read_file_dict(file_path: Path, charset: str = CHARSET) -> dict: """Read whole file as toml object. :param file_path: source input file :type file_path: Path :param charset: charset to use for decoding input :type charset: str - :rtype: object + :rtype: dict """ text = read_file_text(file_path, charset) return tomllib.loads(text) From eb3c9814bb1f1f5408fa2667437cbf4050ac1493 Mon Sep 17 00:00:00 2001 From: Marc Beninca Date: Mon, 23 Sep 2024 18:49:34 +0200 Subject: [PATCH 11/11] mv --- rwx/fs/__init__.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/rwx/fs/__init__.py b/rwx/fs/__init__.py index 46a26e6..205746d 100644 --- a/rwx/fs/__init__.py +++ b/rwx/fs/__init__.py @@ -95,18 +95,6 @@ def read_file_bytes(file_path: Path) -> bytes: return file_object.read() -def read_file_lines(file_path: Path, charset: str = CHARSET) -> list[str]: - """Read whole file lines. - - :param file_path: source input file - :type file_path: Path - :param charset: charset to use for decoding input - :type charset: str - :rtype: list[str] - """ - return read_file_text(file_path, charset).split(os.linesep) - - def read_file_dict(file_path: Path, charset: str = CHARSET) -> dict: """Read whole file as toml object. @@ -120,6 +108,18 @@ def read_file_dict(file_path: Path, charset: str = CHARSET) -> dict: return tomllib.loads(text) +def read_file_lines(file_path: Path, charset: str = CHARSET) -> list[str]: + """Read whole file lines. + + :param file_path: source input file + :type file_path: Path + :param charset: charset to use for decoding input + :type charset: str + :rtype: list[str] + """ + return read_file_text(file_path, charset).split(os.linesep) + + def read_file_text(file_path: Path, charset: str = CHARSET) -> str: """Read whole file text.