diff --git a/docs/source/config_reference/scripting/scripting_functions.rst b/docs/source/config_reference/scripting/scripting_functions.rst index 61076fa7..e2cf4e41 100644 --- a/docs/source/config_reference/scripting/scripting_functions.rst +++ b/docs/source/config_reference/scripting/scripting_functions.rst @@ -634,7 +634,7 @@ capitalize concat ~~~~~~ -:spec: ``concat(values: String, ...) -> String`` +:spec: ``concat(values: AnyArgument, ...) -> String`` :description: Concatenate multiple Strings into a single String. diff --git a/docs/source/prebuilt_presets/tv_shows.rst b/docs/source/prebuilt_presets/tv_shows.rst index 8510350d..2e8a9674 100644 --- a/docs/source/prebuilt_presets/tv_shows.rst +++ b/docs/source/prebuilt_presets/tv_shows.rst @@ -74,24 +74,47 @@ Must define ``tv_show_directory``. Available presets: Advanced Usage ~~~~~~~~~~~~~~ -If you prefer a different organization method, you can instead apply multiple presets to your subscriptions. +If you prefer a different season/episode organization method, you can set the following override variables. -You will need a base of one of the below: +.. code-block:: yaml -* ``kodi_tv_show_by_date`` -* ``jellyfin_tv_show_by_date`` -* ``plex_tv_show_by_date`` + __preset__: + overrides: + tv_show_directory: "/tv_shows" + tv_show_by_date_season_ordering: "year-month" + tv_show_by_date_episode_ordering: "day" -And then add one of these: +Or for a specific preset -* ``season_by_year__episode_by_month_day`` -* ``season_by_year_month__episode_by_day`` -* ``season_by_year__episode_by_month_day_reversed`` - - * Episode numbers are reversed, meaning more recent episodes appear at the top of a season by having a lower value. -* ``season_by_year__episode_by_download_index`` - - * Episodes are numbered by the download order. NOTE that this is fetched using the length of the download archive. Do not use if you intend to remove old videos. +.. code-block:: yaml + + "~Kids Toys Play": + url: "https://www.youtube.com/@KidsToysPlayChannel" + tv_show_by_date_season_ordering: "year-month" + tv_show_by_date_episode_ordering: "day" + +The following are supported. + +**tv_show_by_date_season_ordering** + +* upload-year +* upload-year-month +* release-year +* release-year-month + +**tv_show_by_date_episode_ordering** + +* upload-day +* upload-month-day +* upload-month-day-reversed + + * Reversed means more recent episodes appear at the top of a season by having a lower value. +* release-day +* release-month-day +* release-month-day-reversed +* download-index + + * Episodes are numbered by the download order. **NOTE**: this is fetched using the length of the download archive. Do not use if you intend to remove old videos. TV Show Collection diff --git a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml index 7eb58fbd..af7e221f 100644 --- a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml +++ b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml @@ -63,16 +63,18 @@ presets: tv_show_by_date_season_ordering: >- { %throw("Must specify tv_show_by_date_season_ordering") } - "%season_ordering_": + "%season_ordering_": >- { %eq( %lower(tv_show_by_date_season_ordering), $0 ) } season_number: >- { %elif( - %season_ordering_( "year" ), upload_year, - %season_ordering_( "year-month" ), %concat(upload_year, upload_month_padded), + %season_ordering_( "upload-year" ), upload_year, + %season_ordering_( "upload-year-month" ), %concat(upload_year, upload_month_padded), + %season_ordering_( "release-year" ), release_year, + %season_ordering_( "release-year-month" ), %concat(release_year, release_month_padded), %throw( - "tv_show_by_date_season_ordering must be one of the following: 'year', 'year-month'" + 'tv_show_by_date_season_ordering must be one of the following: "upload-year", "upload-year-month", "release-year", "release-year-month"' ) ) } @@ -80,66 +82,72 @@ presets: # both year and year-month are fixed width, until the year 10000 :) season_number_padded: "{season_number}" - # TODO _tv_show_by_date_episode_ordering: overrides: - tv_show_by_date_season_ordering: >- - { %throw("Must specify tv_show_by_date_season_ordering") } + tv_show_by_date_episode_ordering: >- + { %throw("Must specify tv_show_by_date_episode_ordering") } - "%season_ordering_": - { %eq( %lower(tv_show_by_date_season_ordering), $0 ) } + "%episode_ordering_": >- + { %eq( %lower(tv_show_by_date_episode_ordering), $0 ) } - season_number: >- + episode_number_and_padded_: >- { %elif( - %season_ordering_( "year" ), upload_year, - %season_ordering_( "year-month" ), %concat(upload_year, upload_month_padded), + %episode_ordering_( "upload-day" ), [ %concat(upload_day, upload_date_index_padded), 4 ], + %episode_ordering_( "upload-month-day" ), [ %concat(upload_month, upload_day_padded, upload_date_index_padded), 6], + %episode_ordering_( "upload-month-day-reversed" ), [ %concat(upload_day_of_year_reversed, upload_date_index_reversed_padded), 5], + %episode_ordering_( "release-day" ), [ %concat(release_day, upload_date_index_padded), 4 ], + %episode_ordering_( "release-month-day" ), [ %concat(release_month, release_day_padded, upload_date_index_padded), 6], + %episode_ordering_( "release-month-day-reversed" ), [ %concat(release_day_of_year_reversed, upload_date_index_reversed_padded), 5], + %episode_ordering_( "download-index" ), [ download_index, 6 ], %throw( - "tv_show_by_date_season_ordering must be one of the following: 'year', 'year-month'" + 'tv_show_by_date_episode_ordering must be one of the following: "upload-day", "upload-month-day", "upload-month-day-reversed", "release-day", "release-month-day", "release-month-day-reversed", "download-index"' ) ) } - # both year and year-month are fixed width, until the year 10000 :) - season_number_padded: "{season_number}" + episode_number: "{ %array_at(episode_number_and_padded_, 0) }" + episode_number_padded: "{ %pad_zero( %int(episode_number), %int(%array_at(episode_number_and_padded_, 1))) }" #################################################################################################### # LEGACY PRESETS _season_by_year: + preset: "_tv_show_by_date_season_ordering" overrides: - tv_show_by_date_season_ordering: "year" + tv_show_by_date_season_ordering: "upload-year" _season_by_year_month: + preset: "_tv_show_by_date_season_ordering" overrides: - tv_show_by_date_season_ordering: "year-month" + tv_show_by_date_season_ordering: "upload-year-month" #################################################################################################### season_by_year_month__episode_by_day: preset: - "_season_by_year_month" + - "_tv_show_by_date_episode_ordering" overrides: - episode_number: "{upload_day}{upload_date_index_padded}" - episode_number_padded: "{upload_day_padded}{upload_date_index_padded}" + tv_show_by_date_episode_ordering: "upload-day" season_by_year__episode_by_month_day: preset: - "_season_by_year" + - "_tv_show_by_date_episode_ordering" overrides: - episode_number: "{upload_month}{upload_day_padded}{upload_date_index_padded}" - episode_number_padded: "{upload_month_padded}{upload_day_padded}{upload_date_index_padded}" + tv_show_by_date_episode_ordering: "upload-month-day" season_by_year__episode_by_month_day_reversed: preset: - "_season_by_year" + - "_tv_show_by_date_episode_ordering" overrides: - episode_number: "{upload_day_of_year_reversed}{upload_date_index_reversed_padded}" - episode_number_padded: "{upload_day_of_year_reversed_padded}{upload_date_index_reversed_padded}" + tv_show_by_date_episode_ordering: "upload-month-day-reversed" season_by_year__episode_by_download_index: preset: - "_season_by_year" + - "_tv_show_by_date_episode_ordering" overrides: - episode_number: "{download_index}" - episode_number_padded: "{download_index_padded6}" \ No newline at end of file + tv_show_by_date_episode_ordering: "download-index" diff --git a/src/ytdl_sub/script/functions/string_functions.py b/src/ytdl_sub/script/functions/string_functions.py index 43ff87a5..a1f4567e 100644 --- a/src/ytdl_sub/script/functions/string_functions.py +++ b/src/ytdl_sub/script/functions/string_functions.py @@ -127,12 +127,12 @@ class StringFunctions: return Array([String(split_val) for split_val in string.value.split(sep=sep.value)]) @staticmethod - def concat(*values: String) -> String: + def concat(*values: AnyArgument) -> String: """ :description: Concatenate multiple Strings into a single String. """ - return String("".join(val.value for val in values)) + return String("".join(str(val.value) for val in values)) @staticmethod def pad(string: String, length: Integer, char: String) -> String: