Skip to content

Commit 1156e00

Browse files
authored
[DEV] Make inspect resolution more human readable (#1451)
Removes a lot of the boilerplate output around `concat` and `sanitize`.
1 parent efbac43 commit 1156e00

17 files changed

Lines changed: 138 additions & 62 deletions

docs/source/config_reference/scripting/scripting_functions.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -837,7 +837,7 @@ behavior.
837837

838838
sanitize
839839
~~~~~~~~
840-
:spec: ``sanitize(value: AnyArgument) -> String``
840+
:spec: ``sanitize(value: AnyArgument, ...) -> String``
841841

842842
Sanitize a string using yt-dlp's ``sanitize_filename`` method to ensure it's safe to use
843843
for file/directory names on any OS.

src/ytdl_sub/entries/script/custom_functions.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,12 @@ def truncate_filepath_if_too_long(filepath: String) -> String:
4646
return String(FilePathTruncater.maybe_truncate_file_path(filepath.value))
4747

4848
@staticmethod
49-
def sanitize(value: AnyArgument) -> String:
49+
def sanitize(*value: AnyArgument) -> String:
5050
"""
5151
Sanitize a string using yt-dlp's ``sanitize_filename`` method to ensure it's safe to use
5252
for file/directory names on any OS.
5353
"""
54-
return String(sanitize_filename(str(value)))
54+
return String("".join(sanitize_filename(str(val)) for val in value))
5555

5656
@staticmethod
5757
def sanitize_plex_episode(string: String) -> String:

src/ytdl_sub/entries/script/variable_definitions.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from abc import ABC
22
from functools import cache, cached_property
3-
from typing import Dict, Set
3+
from typing import Dict, Optional, Set
44

55
from ytdl_sub.entries.script.custom_functions import CustomFunctions
66
from ytdl_sub.entries.script.variable_types import (
@@ -1215,6 +1215,14 @@ def unresolvable_static_variables(self) -> Set[Variable]:
12151215
VARIABLES.entry_metadata,
12161216
} | self.injected_variables()
12171217

1218+
def get(self, name: str) -> Optional[Variable]:
1219+
"""
1220+
Returns the variable attribute if it exists. None otherwise.
1221+
"""
1222+
if not hasattr(self, name):
1223+
return None
1224+
return getattr(self, name)
1225+
12181226

12191227
# Singletons to use externally
12201228
VARIABLES: VariableDefinitions = VariableDefinitions()

src/ytdl_sub/utils/script.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
import re
33
from typing import Any, Dict, Optional
44

5+
from ytdl_sub.entries.script.custom_functions import CustomFunctions
6+
from ytdl_sub.entries.script.variable_definitions import VARIABLES
7+
from ytdl_sub.entries.script.variable_types import BooleanVariable, IntegerVariable
58
from ytdl_sub.script.parser import parse
69
from ytdl_sub.script.types.array import Array, UnresolvedArray
710
from ytdl_sub.script.types.function import BuiltInFunction, Function
@@ -13,6 +16,7 @@
1316
from ytdl_sub.script.utils.name_validation import is_function
1417

1518
# pylint: disable=too-many-return-statements
19+
# pylint: disable=too-many-branches
1620

1721

1822
class ScriptUtils:
@@ -110,6 +114,62 @@ def _get_quote_char(cls, arg: str) -> str:
110114
return '"'
111115
return "'''"
112116

117+
@classmethod
118+
def _maybe_to_optimized_sanitize(cls, arg: Argument) -> Argument:
119+
# If it is %sanitize(%concat(...)), return %sanitize(...)
120+
if (
121+
isinstance(arg, Function)
122+
and arg.name == "sanitize"
123+
and len(arg.args) == 1
124+
and isinstance(arg.args[0], Function)
125+
and arg.args[0].name == "concat"
126+
):
127+
return BuiltInFunction(name="sanitize", args=arg.args[0].args)
128+
129+
return arg
130+
131+
@classmethod
132+
def _maybe_sanitized_script_code(cls, arg: Argument) -> Optional[str]:
133+
if not (isinstance(arg, Function) and arg.name == "sanitize"):
134+
return None
135+
136+
output = ""
137+
for sub_arg in arg.args:
138+
if isinstance(sub_arg, Variable):
139+
# No need to sanitize built-in integer variables
140+
if isinstance(VARIABLES.get(sub_arg.name), (IntegerVariable, BooleanVariable)):
141+
output += f"{{ {sub_arg.name} }}"
142+
else:
143+
output += f"{{ {sub_arg.name}_sanitized }}"
144+
elif isinstance(sub_arg, (Integer, Float, Boolean)):
145+
output += str(sub_arg.native)
146+
elif isinstance(sub_arg, String):
147+
output += CustomFunctions.sanitize(sub_arg).native
148+
elif isinstance(sub_arg, BuiltInFunction) and (
149+
issubclass(sub_arg.function_spec.return_type, (Integer, Float, Boolean))
150+
or sub_arg.name == "pad_zero"
151+
):
152+
# If we know the function's output is sanitized, let's not wrap it
153+
output += cls._to_script_code(sub_arg, top_level=True)
154+
else:
155+
# Purposefully do not set top_level to True so we do not recurse
156+
output += (
157+
f"{{ {cls._to_script_code(BuiltInFunction(name='sanitize', args=[sub_arg]))} }}"
158+
)
159+
160+
return output
161+
162+
@classmethod
163+
def _maybe_concat_script_code(cls, arg: Argument) -> Optional[str]:
164+
if not (isinstance(arg, Function) and arg.name == "concat"):
165+
return None
166+
167+
out = ""
168+
for sub_arg in arg.args:
169+
out += cls._to_script_code(sub_arg, top_level=True)
170+
171+
return out
172+
113173
@classmethod
114174
def _to_script_code(cls, arg: Argument, top_level: bool = False) -> str:
115175
if not top_level and isinstance(arg, (Integer, Boolean, Float)):
@@ -123,6 +183,14 @@ def _to_script_code(cls, arg: Argument, top_level: bool = False) -> str:
123183

124184
return arg.native if top_level else f"{quote}{arg.native}{quote}"
125185

186+
arg = cls._maybe_to_optimized_sanitize(arg)
187+
188+
if top_level:
189+
if (out := cls._maybe_sanitized_script_code(arg)) is not None:
190+
return out
191+
if (out := cls._maybe_concat_script_code(arg)) is not None:
192+
return out
193+
126194
if isinstance(arg, Integer):
127195
out = f"%int({arg.native})"
128196
elif isinstance(arg, Boolean):

tests/resources/expected_json/music/inspect_sub_fill.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,21 +79,21 @@
7979
"file_name": "{ track_full_path }",
8080
"keep_files_date_eval": "{ upload_date_standardized }",
8181
"maintain_download_archive": true,
82-
"output_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpzald2h7x",
82+
"output_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpv_h5mst_",
8383
"preserve_mtime": false,
8484
"thumbnail_name": "{ album_cover_path }"
8585
},
8686
"overrides": {
87-
"album_cover_path": "Lester Young/{ %concat( \"[\", playlist_max_upload_year, \"] \", %sanitize( playlist_title ) ) }/folder.{ thumbnail_ext }",
88-
"album_dir": "[{ playlist_max_upload_year }] { %sanitize( playlist_title ) }",
87+
"album_cover_path": "Lester Young/[{ playlist_max_upload_year }] { playlist_title_sanitized }/folder.{ thumbnail_ext }",
88+
"album_dir": "[{ playlist_max_upload_year }] { playlist_title_sanitized }",
8989
"artist_dir": "Lester Young",
9090
"avatar_uncropped_thumbnail_file_name": "",
9191
"banner_uncropped_thumbnail_file_name": "",
9292
"enable_resolution_assert": true,
9393
"enable_throttle_protection": true,
9494
"include_sibling_metadata": true,
9595
"modified_webpage_url": "{ webpage_url }",
96-
"music_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpzald2h7x",
96+
"music_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpv_h5mst_",
9797
"resolution_assert": "{ %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) }",
9898
"resolution_assert_height_gte": 361,
9999
"resolution_assert_ignore_titles": "{ [ ] }",
@@ -110,8 +110,8 @@
110110
"track_album_artist": "Lester Young",
111111
"track_artist": "Lester Young",
112112
"track_date": "{ upload_date_standardized }",
113-
"track_file_name": "{ playlist_index_padded } - { %sanitize( title ) }.{ ext }",
114-
"track_full_path": "Lester Young/{ %concat( \"[\", playlist_max_upload_year, \"] \", %sanitize( playlist_title ) ) }/{ %concat( playlist_index_padded, \" - \", %sanitize( title ), \".\", ext ) }",
113+
"track_file_name": "{ playlist_index_padded } - { title_sanitized }.{ ext }",
114+
"track_full_path": "Lester Young/[{ playlist_max_upload_year }] { playlist_title_sanitized }/{ playlist_index_padded } - { title_sanitized }.{ ext }",
115115
"track_genre": "Jazz",
116116
"track_genre_default": "Unset",
117117
"track_number": "{ playlist_index }",

tests/resources/expected_json/music/inspect_sub_internal.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,15 @@
7676
},
7777
"output_options": {
7878
"download_archive_name": ".ytdl-sub-Lester Young-download-archive.json",
79-
"file_name": "Lester Young/{ %concat( \"[\", %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ), \"] \", %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }/{ %concat( %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ), \" - \", %sanitize( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ), \".\", ext ) }",
79+
"file_name": "Lester Young/[{ %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) }] { %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }/{ %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) } - { %sanitize( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }.{ ext }",
8080
"keep_files_date_eval": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) }",
8181
"maintain_download_archive": true,
82-
"output_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpdu1vad67",
82+
"output_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmp7z9ceu_d",
8383
"preserve_mtime": false,
84-
"thumbnail_name": "Lester Young/{ %concat( \"[\", %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ), \"] \", %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }/folder.jpg"
84+
"thumbnail_name": "Lester Young/[{ %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) }] { %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }/folder.jpg"
8585
},
8686
"overrides": {
87-
"album_cover_path": "Lester Young/{ %concat( \"[\", %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ), \"] \", %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }/folder.jpg",
87+
"album_cover_path": "Lester Young/[{ %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) }] { %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }/folder.jpg",
8888
"album_dir": "[{ %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) }] { %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }",
8989
"artist_dir": "Lester Young",
9090
"avatar_uncropped_thumbnail_file_name": "",
@@ -93,7 +93,7 @@
9393
"enable_throttle_protection": true,
9494
"include_sibling_metadata": true,
9595
"modified_webpage_url": "{ %map_get( entry_metadata, \"webpage_url\" ) }",
96-
"music_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpdu1vad67",
96+
"music_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmp7z9ceu_d",
9797
"resolution_assert": "{ %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) }",
9898
"resolution_assert_height_gte": 361,
9999
"resolution_assert_ignore_titles": "{ [ ] }",
@@ -111,7 +111,7 @@
111111
"track_artist": "Lester Young",
112112
"track_date": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) }",
113113
"track_file_name": "{ %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) } - { %sanitize( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }.{ ext }",
114-
"track_full_path": "Lester Young/{ %concat( \"[\", %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ), \"] \", %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }/{ %concat( %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ), \" - \", %sanitize( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ), \".\", ext ) }",
114+
"track_full_path": "Lester Young/[{ %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) }] { %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }/{ %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) } - { %sanitize( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }.{ ext }",
115115
"track_genre": "Jazz",
116116
"track_genre_default": "Unset",
117117
"track_number": "{ %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ) }",

tests/resources/expected_json/music/inspect_sub_original.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
"enable_throttle_protection": true,
7272
"include_sibling_metadata": true,
7373
"modified_webpage_url": "{webpage_url}",
74-
"music_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpk6coazyn",
74+
"music_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpgcphf_8p",
7575
"resolution_assert": "{\n %if(\n %and(\n enable_resolution_assert,\n %ne( height, 0 ),\n %not(resolution_assert_is_ignored)\n ),\n %assert(\n %gte( height, resolution_assert_height_gte ),\n %concat(\n \"Entry \",\n title,\n \" downloaded at a low resolution (\",\n resolution_readable,\n \"), you've probably been throttled. \",\n \"Stopping further downloads, wait a few hours and try again. \",\n \"Disable using the override variable `enable_resolution_assert: False`.\"\n )\n ),\n \"false is no-op\"\n )\n}",
7676
"resolution_assert_height_gte": 361,
7777
"resolution_assert_ignore_titles": "{ [] }",

tests/resources/expected_json/music/inspect_sub_resolve.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,24 +76,24 @@
7676
},
7777
"output_options": {
7878
"download_archive_name": ".ytdl-sub-Lester Young-download-archive.json",
79-
"file_name": "Lester Young/{ %concat( \"[\", playlist_max_upload_year, \"] \", %sanitize( playlist_title ) ) }/{ %concat( playlist_index_padded, \" - \", %sanitize( title ), \".\", ext ) }",
79+
"file_name": "Lester Young/[{ playlist_max_upload_year }] { playlist_title_sanitized }/{ playlist_index_padded } - { title_sanitized }.{ ext }",
8080
"keep_files_date_eval": "{ upload_date_standardized }",
8181
"maintain_download_archive": true,
82-
"output_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpd5oeacb3",
82+
"output_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmplsyhpyfi",
8383
"preserve_mtime": false,
84-
"thumbnail_name": "Lester Young/{ %concat( \"[\", playlist_max_upload_year, \"] \", %sanitize( playlist_title ) ) }/folder.{ thumbnail_ext }"
84+
"thumbnail_name": "Lester Young/[{ playlist_max_upload_year }] { playlist_title_sanitized }/folder.{ thumbnail_ext }"
8585
},
8686
"overrides": {
87-
"album_cover_path": "Lester Young/{ %concat( \"[\", playlist_max_upload_year, \"] \", %sanitize( playlist_title ) ) }/folder.{ thumbnail_ext }",
88-
"album_dir": "[{ playlist_max_upload_year }] { %sanitize( playlist_title ) }",
87+
"album_cover_path": "Lester Young/[{ playlist_max_upload_year }] { playlist_title_sanitized }/folder.{ thumbnail_ext }",
88+
"album_dir": "[{ playlist_max_upload_year }] { playlist_title_sanitized }",
8989
"artist_dir": "Lester Young",
9090
"avatar_uncropped_thumbnail_file_name": "",
9191
"banner_uncropped_thumbnail_file_name": "",
9292
"enable_resolution_assert": true,
9393
"enable_throttle_protection": true,
9494
"include_sibling_metadata": true,
9595
"modified_webpage_url": "{ webpage_url }",
96-
"music_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpd5oeacb3",
96+
"music_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmplsyhpyfi",
9797
"resolution_assert": "{ %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) }",
9898
"resolution_assert_height_gte": 361,
9999
"resolution_assert_ignore_titles": "{ [ ] }",
@@ -110,8 +110,8 @@
110110
"track_album_artist": "Lester Young",
111111
"track_artist": "Lester Young",
112112
"track_date": "{ upload_date_standardized }",
113-
"track_file_name": "{ playlist_index_padded } - { %sanitize( title ) }.{ ext }",
114-
"track_full_path": "Lester Young/{ %concat( \"[\", playlist_max_upload_year, \"] \", %sanitize( playlist_title ) ) }/{ %concat( playlist_index_padded, \" - \", %sanitize( title ), \".\", ext ) }",
113+
"track_file_name": "{ playlist_index_padded } - { title_sanitized }.{ ext }",
114+
"track_full_path": "Lester Young/[{ playlist_max_upload_year }] { playlist_title_sanitized }/{ playlist_index_padded } - { title_sanitized }.{ ext }",
115115
"track_genre": "Jazz",
116116
"track_genre_default": "Unset",
117117
"track_number": "{ playlist_index }",

tests/resources/expected_json/music_video/inspect_sub_fill.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"info_json_name": "{ music_video_file_name }.{ info_json_ext }",
3939
"keep_files_date_eval": "{ upload_date_standardized }",
4040
"maintain_download_archive": true,
41-
"output_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpyukbh6ta",
41+
"output_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmp23dslv3t",
4242
"preserve_mtime": false,
4343
"thumbnail_name": "{ music_video_file_name }.jpg"
4444
},
@@ -66,7 +66,7 @@
6666
"music_video_album_default": "Music Videos",
6767
"music_video_artist": "Rick Astley",
6868
"music_video_date": "{ %elif( %contains_url_field( \"date\" ), %get_url_field( \"date\", upload_date_standardized ), %contains_url_field( \"year\" ), %concat( %get_url_field( \"date\", upload_year ), \"-01-01\" ), upload_date_standardized ) }",
69-
"music_video_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmpyukbh6ta",
69+
"music_video_directory": "/var/folders/rw/hl1xmkmj68zdl2kjx3l0dwzc0000gn/T/tmp23dslv3t",
7070
"music_video_file_name": "Rick Astley/{ %sanitize( %get_url_field( \"title\", title ) ) }",
7171
"music_video_file_name_suffix": "",
7272
"music_video_genre": "Pop",

0 commit comments

Comments
 (0)