Merge branch 'master' into j/unstructured

This commit is contained in:
Jesse Bannon 2024-06-02 11:22:45 -07:00
commit 5184113121
50 changed files with 208 additions and 99 deletions

View file

@ -716,7 +716,7 @@ to_native_filepath
:spec: ``to_native_filepath(filepath: String) -> String``
Convert any unix-based path separators ('/') with the OS's native
separator.
separator. In addition, expand ~ to absolute directories.
truncate_filepath_if_too_long
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View file

@ -15,7 +15,7 @@ classifiers = [
"Programming Language :: Python :: 3.11",
]
dependencies = [
"yt-dlp==2024.04.09",
"yt-dlp==2024.5.27",
"colorama~=0.4",
"mergedeep~=1.3",
"mediafile~=0.12",
@ -49,7 +49,7 @@ test = [
lint = [
"black==24.4.2",
"isort==5.13.2",
"pylint==3.1.0",
"pylint==3.2.2",
]
docs = [
"sphinx~=7.0",

View file

@ -1,3 +1,5 @@
import os
import posixpath
from typing import Any
from typing import Dict
from typing import Optional
@ -147,7 +149,8 @@ class ConfigOptions(StrictDictValidator):
The directory to temporarily store downloaded files before moving them into their final
directory. Defaults to .ytdl-sub-working-directory
"""
return self._working_directory.value
# Expands tildas to actual paths, use native os sep
return os.path.expanduser(self._working_directory.value.replace(posixpath.sep, os.sep))
@property
def umask(self) -> Optional[str]:

View file

@ -36,9 +36,9 @@ class CustomFunctions:
def to_native_filepath(filepath: String) -> String:
"""
Convert any unix-based path separators ('/') with the OS's native
separator.
separator. In addition, expand ~ to absolute directories.
"""
return String(filepath.value.replace(posixpath.sep, os.sep))
return String(os.path.expanduser(filepath.value.replace(posixpath.sep, os.sep)))
@staticmethod
def truncate_filepath_if_too_long(filepath: String) -> String:

View file

@ -7,6 +7,7 @@ presets:
output_directory: "{music_video_directory}"
file_name: "{music_video_file_name}.{ext}"
thumbnail_name: "{music_video_file_name}.jpg"
info_json_name: "{music_video_file_name}.{info_json_ext}"
maintain_download_archive: True
ytdl_options:

View file

@ -161,7 +161,7 @@ class SubscriptionDownload(BaseSubscription, ABC):
)
self.download_archive.save_download_mappings()
FileHandler.delete(self.download_archive.working_file_path)
FileHandler.delete(self.download_archive.working_ytdl_file_path)
@contextlib.contextmanager
def _remove_empty_directories_in_output_directory(self):

View file

@ -89,7 +89,9 @@ class SubscriptionYTDLOptions:
ytdl_options = {}
if self._preset.output_options.maintain_download_archive:
ytdl_options["download_archive"] = self._enhanced_download_archive.working_file_path
ytdl_options["download_archive"] = (
self._enhanced_download_archive.working_ytdl_file_path
)
if self._preset.output_options.keep_max_files:
keep_max_files = int(
self._overrides.apply_formatter(self._preset.output_options.keep_max_files)

View file

@ -385,7 +385,11 @@ class FileHandler:
dst_file_path
Destination file
"""
shutil.copyfile(src=src_file_path, dst=dst_file_path)
# Perform the copy by first writing to a temp file, then moving it.
# This tries to prevent corrupted writes if the processed dies mid-write,
atomic_dst = f"{dst_file_path}-ytdl-sub-incomplete"
shutil.copyfile(src=src_file_path, dst=atomic_dst)
shutil.move(src=atomic_dst, dst=dst_file_path)
@classmethod
def move(cls, src_file_path: Union[str, Path], dst_file_path: Union[str, Path]):

View file

@ -72,8 +72,7 @@ def download_and_convert_url_thumbnail(
if not thumbnail_url:
return None
# timeout after 8 seconds
with urlopen(thumbnail_url, timeout=1.0) as file:
with urlopen(thumbnail_url, timeout=7.0) as file:
with tempfile.NamedTemporaryFile(delete=False) as thumbnail:
thumbnail.write(file.read())

View file

@ -506,10 +506,19 @@ class EnhancedDownloadArchive:
"""
Returns
-------
The download mapping's file path in the working directory.
The download mapping's file path in the working directory for ytdl usage
"""
return str(Path(self.working_directory) / self.file_name)
@property
def working_ytdl_file_path(self) -> str:
"""
Returns
-------
The download mapping's file path in the working directory for ytdl usage
"""
return f"{self.working_file_path}-ytdl-archive"
@property
def mapping(self) -> DownloadMappings:
"""
@ -541,7 +550,7 @@ class EnhancedDownloadArchive:
return self
# Otherwise, create a ytdl download archive file in the working directory.
self.mapping.to_download_archive().to_file(self.working_file_path)
self.mapping.to_download_archive().to_file(self.working_ytdl_file_path)
return self
@ -603,15 +612,18 @@ class EnhancedDownloadArchive:
if self._migrated_file_name:
self._download_mapping.to_file(output_json_file=self.working_file_path)
self.save_file_to_output_directory(
file_name=self.file_name, output_file_name=self._migrated_file_name
file_name=self.file_name, output_file_name=self._migrated_file_name, copy_file=True
)
FileHandler.delete(file_path=self.working_file_path)
# and delete the old one if the name differs
if self._file_name != self._migrated_file_name:
self.delete_file_from_output_directory(file_name=self.file_name)
# Otherwise, only save if there are changes to the transaction log
elif not self.get_file_handler_transaction_log().is_empty:
self._download_mapping.to_file(output_json_file=self.working_file_path)
self.save_file_to_output_directory(file_name=self.file_name)
self.save_file_to_output_directory(file_name=self.file_name, copy_file=True)
FileHandler.delete(file_path=self.working_file_path)
return self
def delete_file_from_output_directory(self, file_name: str):

View file

@ -1,10 +1,5 @@
{
".ytdl-sub-Sithu Aye-download-archive.json": "1c4bcf58581eac1851be92ee29a3c4d7",
"Sithu Aye/[2021] 10 Years Remixes and Reimaginings/01 - Double Helix Reimagined.mp3": "ac0e6a2936c309765c69a4c98c42ad10",
"Sithu Aye/[2021] 10 Years Remixes and Reimaginings/02 - Skye Reimagined.mp3": "38387bd0ec5fc229e30b1a8ce5b9cddb",
"Sithu Aye/[2021] 10 Years Remixes and Reimaginings/03 - Baryofusion.mp3": "344dbb939b09713dcc33894a8b1b8459",
"Sithu Aye/[2021] 10 Years Remixes and Reimaginings/04 - Mandalay Reimagined.mp3": "9bacbd5166a740c06d3329dcfae0d9aa",
"Sithu Aye/[2021] 10 Years Remixes and Reimaginings/folder.jpg": "bf6f70d51557a71b69fed85b2cb476f0",
".ytdl-sub-Sithu Aye-download-archive.json": "93ad50c4f4cca753f40c46bc6e31cabf",
"Sithu Aye/[2022] ReInvent the Universe (10th Anniversary Remaster)/01 - Invent the Universe.mp3": "482e97a4f9a30aa4413f45f5f3f5dbba",
"Sithu Aye/[2022] ReInvent the Universe (10th Anniversary Remaster)/02 - Grand Unification (feat. David Maxim Micic).mp3": "34e43fd80b4c61295abbb8b794e523a7",
"Sithu Aye/[2022] ReInvent the Universe (10th Anniversary Remaster)/03 - Expansion.mp3": "0ba4b8ef65e274cbf065b6f0a5f444e5",
@ -16,6 +11,10 @@
"Sithu Aye/[2022] ReInvent the Universe (10th Anniversary Remaster)/09 - Formation.mp3": "d588ed8edc324ea657abb2be96d557a1",
"Sithu Aye/[2022] ReInvent the Universe (10th Anniversary Remaster)/10 - Pale Blue Dot.mp3": "8245d285ba2403bf512f83c4a585eb81",
"Sithu Aye/[2022] ReInvent the Universe (10th Anniversary Remaster)/folder.jpg": "d8cffeca026afaa619f641a95143f803",
"Sithu Aye/[2024] Kindness/01 - Run it Down.mp3": "9570867fd53419c1297411c9bf877a62",
"Sithu Aye/[2024] Kindness/01 - Run it Down.mp3": "227c366845913f3476ae83fce0b72c56",
"Sithu Aye/[2024] Kindness/02 - Zero Sum Groove.mp3": "0bd3b51acefc2a363309a8f94dd146d7",
"Sithu Aye/[2024] Kindness/03 - Obsidian.mp3": "2a6b87e1ab5a69fc6c4503dc0dd03623",
"Sithu Aye/[2024] Kindness/04 - Fear is the Kindness Killer.mp3": "4593d02a83f722d481846552554d13ba",
"Sithu Aye/[2024] Kindness/05 - Ghost;Cleanse.mp3": "f89156a892b597be9b594ce10131ab60",
"Sithu Aye/[2024] Kindness/folder.jpg": "8f72c9acb1a2e49fcbdc2624a46b229c"
}

View file

@ -1,6 +1,7 @@
{
".ytdl-sub-chapters_from_comments-download-archive.json": "2510b2ff3c54aa4813a4f23ea079e1ec",
".ytdl-sub-chapters_from_comments-download-archive.json": "70bc3bb62af3a344b0256e1d3b98dcb0",
"JMC/Move 78 - Automated Improvisation [Full Album].info.json": "INFO_JSON",
"JMC/Move 78 - Automated Improvisation [Full Album].jpg": "c12e6a6f242680d1096a1a99d74a62c6",
"JMC/Move 78 - Automated Improvisation [Full Album].mp4": "63119bd17a035574263aeec188e11d5e",
"JMC/Move 78 - Automated Improvisation [Full Album].mp4": "fbe825bf5fb8ce193d47c3da3540e815",
"JMC/Move 78 - Automated Improvisation [Full Album].nfo": "039268e97673a6f2b391772ec3b52fac"
}

View file

@ -1,6 +1,7 @@
{
".ytdl-sub-file_convert_test-download-archive.json": "f720289a704349fbe38ef5ed451af724",
".ytdl-sub-file_convert_test-download-archive.json": "36ac81b6a021c1479a588477d74afd38",
"file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.info.json": "INFO_JSON",
"file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.jpg": "662fcaadf6e80d63591bac19a5fdffb0",
"file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.mp4": "24f5057254471bc6ecc3056e91af1444",
"file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.mp4": "7609c4f53565aa8f9eac50ad755b5c47",
"file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.nfo": "752e6b6eea853c8a1f62faa4b841b292"
}

View file

@ -1,5 +1,6 @@
{
".ytdl-sub-file_convert_test-download-archive.json": "8fa4bf42c9686f8520ce107e48b73215",
".ytdl-sub-file_convert_test-download-archive.json": "83e57376a260ab3a58978dee4a06df4a",
"file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.info.json": "INFO_JSON",
"file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.jpg": "662fcaadf6e80d63591bac19a5fdffb0",
"file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.mkv": "175320a51dc3efcea84daebec3c1d7e1",
"file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.nfo": "752e6b6eea853c8a1f62faa4b841b292"

View file

@ -1,6 +1,7 @@
{
".ytdl-sub-match_filter_test-download-archive.json": "30f10646149d9eea4eb970749f352f7d",
".ytdl-sub-match_filter_test-download-archive.json": "c2154694d771b47e7878622851b379b7",
"match_filter_test/Jesse's Minecraft Server [Trailer - Mar.21].info.json": "INFO_JSON",
"match_filter_test/Jesse's Minecraft Server [Trailer - Mar.21].jpg": "e7830aa8a64b0cde65ba3f7e5fc56530",
"match_filter_test/Jesse's Minecraft Server [Trailer - Mar.21].mp4": "f17a540070964a199b35f981561d94e4",
"match_filter_test/Jesse's Minecraft Server [Trailer - Mar.21].mp4": "a0dc417dbf369c47bbac571bdb18e0e4",
"match_filter_test/Jesse's Minecraft Server [Trailer - Mar.21].nfo": "d85f4500bb5d8a2425d734a23b5a944c"
}

View file

@ -1,6 +1,6 @@
{
".ytdl-sub-multiple_songs_test-download-archive.json": "54237df5e00d1598dfd39f341ee03d75",
"Project Zombie/[2011] Jesse's Minecraft Server/01 - Jesse's Minecraft Server [Trailer - Mar.21].ogg": "9e53a68a39f290899a3dce03fdca6490",
"Project Zombie/[2011] Jesse's Minecraft Server/01 - Jesse's Minecraft Server [Trailer - Mar.21].ogg": "221dab6e9d6840a0b4b7bb24444c87ff",
"Project Zombie/[2011] Jesse's Minecraft Server/02 - Jesse's Minecraft Server [Trailer - Feb.27].ogg": "02dc8e368de9555d062bde31dcc82852",
"Project Zombie/[2011] Jesse's Minecraft Server/03 - Jesse's Minecraft Server [Trailer - Feb.1].ogg": "c808e1da2bccd419201eeeffc32c3729",
"Project Zombie/[2011] Jesse's Minecraft Server/folder.jpg": "e7830aa8a64b0cde65ba3f7e5fc56530"

View file

@ -1,6 +1,7 @@
{
".ytdl-sub-sponsorblock_with_embedded_subs_test-download-archive.json": "2cb4b9586fd5bb7f1fed76ed9195e6e4",
".ytdl-sub-sponsorblock_with_embedded_subs_test-download-archive.json": "53eda1f626aaec8814ff005bf8d46ef7",
"JMC/This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.info.json": "INFO_JSON",
"JMC/This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.jpg": "b5353a824a4800cc26f884e3025ed969",
"JMC/This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.mp4": "0539ff781c824f17ae3ffbd7dc830a8f",
"JMC/This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.mp4": "19889ac778397147e55fe640c9a0f490",
"JMC/This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.nfo": "ae73ec18a9f0e5a54c90061ccd32e7f4"
}

View file

@ -1,5 +1,6 @@
{
".ytdl-sub-subtitles_embedded_test-download-archive.json": "a74ecea9f7844be23f470bbe702788f3",
".ytdl-sub-subtitles_embedded_test-download-archive.json": "538f36d011bb6077de044263d511a45b",
"JMC/YouTube Rewind 2019 For the Record #YouTubeRewind.info.json": "INFO_JSON",
"JMC/YouTube Rewind 2019 For the Record #YouTubeRewind.jpg": "50ee47c80f679029f5d3503bb91b045a",
"JMC/YouTube Rewind 2019 For the Record #YouTubeRewind.mp4": "f90f3bb948014420931c337b09007a18",
"JMC/YouTube Rewind 2019 For the Record #YouTubeRewind.nfo": "e6ac56ce52c747e2e271f12208f9a538"

View file

@ -1,7 +1,8 @@
{
".ytdl-sub-subtitles_embedded_and_file_test-download-archive.json": "a05bbc3b8851e92da10c67cd9acb32d0",
".ytdl-sub-subtitles_embedded_and_file_test-download-archive.json": "470a4652395e01c970aaa40fe8fcea6c",
"JMC/YouTube Rewind 2019 For the Record #YouTubeRewind.de.srt": "b343c3bb9257b7ee7ba38f570a115b37",
"JMC/YouTube Rewind 2019 For the Record #YouTubeRewind.en.srt": "fe8c6ee92cae6e059fd80fd61691adbe",
"JMC/YouTube Rewind 2019 For the Record #YouTubeRewind.info.json": "INFO_JSON",
"JMC/YouTube Rewind 2019 For the Record #YouTubeRewind.jpg": "50ee47c80f679029f5d3503bb91b045a",
"JMC/YouTube Rewind 2019 For the Record #YouTubeRewind.mp4": "f90f3bb948014420931c337b09007a18",
"JMC/YouTube Rewind 2019 For the Record #YouTubeRewind.nfo": "e6ac56ce52c747e2e271f12208f9a538"

View file

@ -1,14 +1,18 @@
{
".ytdl-sub-subscription_test-download-archive.json": "d9f5fdb6fc3fc3c3bf87772c406448ec",
".ytdl-sub-subscription_test-download-archive.json": "b98a30417f259daeec888e1a5047b9ed",
"subscription_test/Mock Entry 20-1.info.json": "INFO_JSON",
"subscription_test/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7",
"subscription_test/Mock Entry 20-1.mp4": "34916dc26e723c3464adcc4687898ca8",
"subscription_test/Mock Entry 20-1.nfo": "68a6a9e51a12e75d4c68e6e644b409d1",
"subscription_test/Mock Entry 20-2.info.json": "INFO_JSON",
"subscription_test/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7",
"subscription_test/Mock Entry 20-2.mp4": "01a910b7a023325aa9d4ad3a013a1e02",
"subscription_test/Mock Entry 20-2.nfo": "1cbe51945c1a7a9ced0eb1222e9d2405",
"subscription_test/Mock Entry 20-3.info.json": "INFO_JSON",
"subscription_test/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7",
"subscription_test/Mock Entry 20-3.mp4": "812b6db9ff08bf1822e99e43d371400d",
"subscription_test/Mock Entry 20-3.nfo": "ef07f30d3e882de3f7cb3ad675125352",
"subscription_test/Mock Entry 21-1.info.json": "INFO_JSON",
"subscription_test/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7",
"subscription_test/Mock Entry 21-1.mp4": "079832b6e49b283d80be402c9c928b90",
"subscription_test/Mock Entry 21-1.nfo": "dc714fd9f3c3729f74927ad245b50d9d"

View file

@ -1,14 +1,18 @@
{
".ytdl-sub-subscription_test-download-archive.json": "d9f5fdb6fc3fc3c3bf87772c406448ec",
".ytdl-sub-subscription_test-download-archive.json": "b98a30417f259daeec888e1a5047b9ed",
"subscription_test/Mock Entry 20-1.info.json": "INFO_JSON",
"subscription_test/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7",
"subscription_test/Mock Entry 20-1.mp4": "34916dc26e723c3464adcc4687898ca8",
"subscription_test/Mock Entry 20-1.nfo": "68a6a9e51a12e75d4c68e6e644b409d1",
"subscription_test/Mock Entry 20-2.info.json": "INFO_JSON",
"subscription_test/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7",
"subscription_test/Mock Entry 20-2.mp4": "01a910b7a023325aa9d4ad3a013a1e02",
"subscription_test/Mock Entry 20-2.nfo": "1cbe51945c1a7a9ced0eb1222e9d2405",
"subscription_test/Mock Entry 20-3.info.json": "INFO_JSON",
"subscription_test/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7",
"subscription_test/Mock Entry 20-3.mp4": "812b6db9ff08bf1822e99e43d371400d",
"subscription_test/Mock Entry 20-3.nfo": "ef07f30d3e882de3f7cb3ad675125352",
"subscription_test/Mock Entry 21-1.info.json": "INFO_JSON",
"subscription_test/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7",
"subscription_test/Mock Entry 21-1.mp4": "079832b6e49b283d80be402c9c928b90",
"subscription_test/Mock Entry 21-1.nfo": "dc714fd9f3c3729f74927ad245b50d9d"

View file

@ -1,11 +1,15 @@
{
".ytdl-sub-subscription_test-download-archive.json": "7d31b00238ca1f66c5e7f4735ca7aa87",
".ytdl-sub-subscription_test-download-archive.json": "6cb47203ec56d8318a0d428b5b4efa5d",
"subscription_test/Mock Entry 20-1.info.json": "INFO_JSON",
"subscription_test/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7",
"subscription_test/Mock Entry 20-1.mp4": "34916dc26e723c3464adcc4687898ca8",
"subscription_test/Mock Entry 20-2.info.json": "INFO_JSON",
"subscription_test/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7",
"subscription_test/Mock Entry 20-2.mp4": "01a910b7a023325aa9d4ad3a013a1e02",
"subscription_test/Mock Entry 20-3.info.json": "INFO_JSON",
"subscription_test/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7",
"subscription_test/Mock Entry 20-3.mp4": "812b6db9ff08bf1822e99e43d371400d",
"subscription_test/Mock Entry 21-1.info.json": "INFO_JSON",
"subscription_test/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7",
"subscription_test/Mock Entry 21-1.mp4": "079832b6e49b283d80be402c9c928b90"
}

View file

@ -18,7 +18,7 @@
"Project Zombie/Season 2011/s2011.e022701 - Jesse's Minecraft Server [Trailer - Feb.27].nfo": "20af231e30a035fb2bc0c946f4b4026d",
"Project Zombie/Season 2011/s2011.e032101 - Jesse's Minecraft Server [Trailer - Mar.21]-thumb.jpg": "e7830aa8a64b0cde65ba3f7e5fc56530",
"Project Zombie/Season 2011/s2011.e032101 - Jesse's Minecraft Server [Trailer - Mar.21].info.json": "INFO_JSON",
"Project Zombie/Season 2011/s2011.e032101 - Jesse's Minecraft Server [Trailer - Mar.21].mp4": "eac3dfce44c2a723f2fc74e9552aa510",
"Project Zombie/Season 2011/s2011.e032101 - Jesse's Minecraft Server [Trailer - Mar.21].mp4": "7df8f1469adb02f1aecfbb049276cae7",
"Project Zombie/Season 2011/s2011.e032101 - Jesse's Minecraft Server [Trailer - Mar.21].nfo": "f8bdc463c0cb2ffdc82aba2bcc27ad5d",
"Project Zombie/Season 2011/s2011.e052901 - Project Zombie Official Trailer (IP mc.projectzombie.beastnode.net)-thumb.jpg": "c956192a379b3661595c9920972d4819",
"Project Zombie/Season 2011/s2011.e052901 - Project Zombie Official Trailer (IP mc.projectzombie.beastnode.net).info.json": "INFO_JSON",

View file

@ -10,7 +10,7 @@
"JMC/Season 01/s01.e11022701 - Jesse's Minecraft Server [Trailer - Feb.27].nfo": "da7645e8826586388ae0d8278ef6a1c1",
"JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21]-thumb.jpg": "e7830aa8a64b0cde65ba3f7e5fc56530",
"JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].info.json": "INFO_JSON",
"JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].mp4": "dc04853870bbb811f6b312e20b58253b",
"JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].mp4": "91f22944f797513fcda9856e244dd3b3",
"JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].nfo": "c56083e2f3545fa2cafc4d67cbfdacf8",
"JMC/fanart.jpg": "129c6639b47299bc48062f0365e670ee",
"JMC/poster.jpg": "5de28eea5a921a041452ab3ce1041f73",

View file

@ -10,7 +10,7 @@
"JMC/Season 01/s01.e11022701 - Jesse's Minecraft Server [Trailer - Feb.27].nfo": "da7645e8826586388ae0d8278ef6a1c1",
"JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21]-thumb.jpg": "e7830aa8a64b0cde65ba3f7e5fc56530",
"JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].info.json": "INFO_JSON",
"JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].mp4": "dc04853870bbb811f6b312e20b58253b",
"JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].mp4": "91f22944f797513fcda9856e244dd3b3",
"JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].nfo": "c56083e2f3545fa2cafc4d67cbfdacf8",
"JMC/fanart.jpg": "129c6639b47299bc48062f0365e670ee",
"JMC/poster.jpg": "5de28eea5a921a041452ab3ce1041f73",

View file

@ -1,4 +1,5 @@
{
"JMC/Oblivion Mod Falcor p.1.info.json": "INFO_JSON",
"JMC/Oblivion Mod Falcor p.1.jpg": "fb95b510681676e81c321171fc23143e",
"JMC/Oblivion Mod Falcor p.1.mp4": "318faf3eb1d7666491553cdfd2a2e9fb",
"JMC/Oblivion Mod Falcor p.1.nfo": "58c2be339869b5d071c1758d55c72ddb"

View file

@ -1,4 +1,5 @@
{
"JMC/Oblivion Mod Falcor p.1.info.json": "INFO_JSON",
"JMC/Oblivion Mod Falcor p.1.jpg": "fb95b510681676e81c321171fc23143e",
"JMC/Oblivion Mod Falcor p.1.mp4": "318faf3eb1d7666491553cdfd2a2e9fb",
"JMC/Oblivion Mod Falcor p.1.nfo": "58c2be339869b5d071c1758d55c72ddb"

View file

@ -1,4 +1,5 @@
{
"JMC/Oblivion Mod Falcor p.1.info.json": "INFO_JSON",
"JMC/Oblivion Mod Falcor p.1.mp4": "d3bdda5ec6822ea3b4b4bd8908eb327a",
"JMC/Oblivion Mod Falcor p.1.nfo": "58c2be339869b5d071c1758d55c72ddb"
}

View file

@ -2,64 +2,6 @@ Files created:
----------------------------------------
{output_directory}
.ytdl-sub-Sithu Aye-download-archive.json
{output_directory}/Sithu Aye/[2021] 10 Years Remixes and Reimaginings
01 - Double Helix Reimagined.mp3
Music Tags:
album: 10 Years: Remixes and Reimaginings
albumartist: Sithu Aye
albumartists: Sithu Aye
artist: Sithu Aye
artists: Sithu Aye
date: 2021-11-26
genres: Progressive Metal
original_date: 2021-11-26
title: Double Helix Reimagined
track: 1
tracktotal: 10
year: 2021
02 - Skye Reimagined.mp3
Music Tags:
album: 10 Years: Remixes and Reimaginings
albumartist: Sithu Aye
albumartists: Sithu Aye
artist: Sithu Aye
artists: Sithu Aye
date: 2021-11-26
genres: Progressive Metal
original_date: 2021-11-26
title: Skye Reimagined
track: 2
tracktotal: 10
year: 2021
03 - Baryofusion.mp3
Music Tags:
album: 10 Years: Remixes and Reimaginings
albumartist: Sithu Aye
albumartists: Sithu Aye
artist: Sithu Aye
artists: Sithu Aye
date: 2021-11-26
genres: Progressive Metal
original_date: 2021-11-26
title: Baryofusion
track: 3
tracktotal: 10
year: 2021
04 - Mandalay Reimagined.mp3
Music Tags:
album: 10 Years: Remixes and Reimaginings
albumartist: Sithu Aye
albumartists: Sithu Aye
artist: Sithu Aye
artists: Sithu Aye
date: 2021-11-26
genres: Progressive Metal
original_date: 2021-11-26
title: Mandalay Reimagined
track: 4
tracktotal: 10
year: 2021
folder.jpg
{output_directory}/Sithu Aye/[2022] ReInvent the Universe (10th Anniversary Remaster)
01 - Invent the Universe.mp3
Music Tags:
@ -215,6 +157,62 @@ Files created:
original_date: 2024-03-23
title: Run it Down
track: 1
tracktotal: 1
tracktotal: 5
year: 2024
02 - Zero Sum Groove.mp3
Music Tags:
album: Kindness
albumartist: Sithu Aye
albumartists: Sithu Aye
artist: Sithu Aye
artists: Sithu Aye
date: 2024-03-23
genres: Progressive Metal
original_date: 2024-03-23
title: Zero Sum Groove
track: 2
tracktotal: 5
year: 2024
03 - Obsidian.mp3
Music Tags:
album: Kindness
albumartist: Sithu Aye
albumartists: Sithu Aye
artist: Sithu Aye
artists: Sithu Aye
date: 2024-03-23
genres: Progressive Metal
original_date: 2024-03-23
title: Obsidian
track: 3
tracktotal: 5
year: 2024
04 - Fear is the Kindness Killer.mp3
Music Tags:
album: Kindness
albumartist: Sithu Aye
albumartists: Sithu Aye
artist: Sithu Aye
artists: Sithu Aye
date: 2024-03-23
genres: Progressive Metal
original_date: 2024-03-23
title: Fear is the Kindness Killer
track: 4
tracktotal: 5
year: 2024
05 - Ghost;Cleanse.mp3
Music Tags:
album: Kindness
albumartist: Sithu Aye
albumartists: Sithu Aye
artist: Sithu Aye
artists: Sithu Aye
date: 2024-03-23
genres: Progressive Metal
original_date: 2024-03-23
title: Ghost;Cleanse
track: 5
tracktotal: 5
year: 2024
folder.jpg

View file

@ -3,8 +3,19 @@ Files created:
{output_directory}
.ytdl-sub-chapters_from_comments-download-archive.json
{output_directory}/JMC
Move 78 - Automated Improvisation [Full Album].info.json
Move 78 - Automated Improvisation [Full Album].jpg
Move 78 - Automated Improvisation [Full Album].mp4
Chapters from comments:
0:00: 01. The Lonely Tears of Lee Seedol
4:30: 02. But What If We're Wrong
9:16: 03. Follow the Earworm Pt.2
12:25: 04. Keyword Salad
16:48: 05. Ultra Natural
20:47: 06. Flight Instructions
25:46: 07. Dawn of the Useless Class
29:58: 08. Schnitzel Whisperer
32:16: 09. Teilo
Embedded subtitles with lang(s) en, de
Video Tags:
album: Music Videos

View file

@ -3,6 +3,7 @@ Files created:
{output_directory}
.ytdl-sub-file_convert_test-download-archive.json
{output_directory}/file_convert_test
When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.info.json
When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.jpg
When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.mp4
Video Tags:

View file

@ -3,6 +3,7 @@ Files created:
{output_directory}
.ytdl-sub-file_convert_test-download-archive.json
{output_directory}/file_convert_test
When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.info.json
When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.jpg
When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.mkv
Converted from mp4

View file

@ -3,6 +3,7 @@ Files created:
{output_directory}
.ytdl-sub-match_filter_test-download-archive.json
{output_directory}/match_filter_test
Jesse's Minecraft Server [Trailer - Mar.21].info.json
Jesse's Minecraft Server [Trailer - Mar.21].jpg
Jesse's Minecraft Server [Trailer - Mar.21].mp4
Video Tags:

View file

@ -35,6 +35,7 @@ Files created:
the
tag 🎸🎸
{output_directory}/kodi_safe_xml
Can you hear the difference 🎸🔥 #shorts.info.json
Can you hear the difference 🎸🔥 #shorts.jpg
Can you hear the difference 🎸🔥 #shorts.mp4
Video Tags:

View file

@ -35,6 +35,7 @@ Files created:
the
tag □□
{output_directory}/kodi_safe_xml
Can you hear the difference 🎸🔥 #shorts.info.json
Can you hear the difference 🎸🔥 #shorts.jpg
Can you hear the difference 🎸🔥 #shorts.mp4
Video Tags:

View file

@ -3,6 +3,7 @@ Files created:
{output_directory}
.ytdl-sub-sponsorblock_with_embedded_subs_test-download-archive.json
{output_directory}/JMC
This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.info.json
This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.jpg
This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.mp4
Embedded Chapters:

View file

@ -3,6 +3,7 @@ Files created:
{output_directory}
.ytdl-sub-regex_capture_playlist_test-download-archive.json
{output_directory}/regex_capture_playlist_test
Jesse's Minecraft Server [Trailer - Feb.1].info.json
Jesse's Minecraft Server [Trailer - Feb.1].jpg
Jesse's Minecraft Server [Trailer - Feb.1].mp4
Video Tags:
@ -27,6 +28,7 @@ Files created:
title_cap_1_sanitized: Trailer
title_cap_2: Feb.1
upload_date_both_caps: First and Second containing in regex default
Jesse's Minecraft Server [Trailer - Feb.27].info.json
Jesse's Minecraft Server [Trailer - Feb.27].jpg
Jesse's Minecraft Server [Trailer - Feb.27].mp4
Video Tags:

View file

@ -3,6 +3,7 @@ Files created:
{output_directory}
.ytdl-sub-regex_exclude_playlist_test-download-archive.json
{output_directory}/regex_exclude_playlist_test
Jesse's Minecraft Server [Trailer - Mar.21].info.json
Jesse's Minecraft Server [Trailer - Mar.21].jpg
Jesse's Minecraft Server [Trailer - Mar.21].mp4
Video Tags:

View file

@ -3,6 +3,7 @@ Files created:
{output_directory}
.ytdl-sub-regex_match_and_exclude_playlist_test-download-archive.json
{output_directory}/regex_match_and_exclude_playlist_test
Jesse's Minecraft Server [Trailer - Feb.1].info.json
Jesse's Minecraft Server [Trailer - Feb.1].jpg
Jesse's Minecraft Server [Trailer - Feb.1].mp4
Video Tags:

View file

@ -3,6 +3,7 @@ Files created:
{output_directory}
.ytdl-sub-regex_using_overrides_test-download-archive.json
{output_directory}/regex_using_overrides_test
Jesse's Minecraft Server [Trailer - Mar.21].info.json
Jesse's Minecraft Server [Trailer - Mar.21].jpg
Jesse's Minecraft Server [Trailer - Mar.21].mp4
Video Tags:

View file

@ -3,6 +3,7 @@ Files created:
{output_directory}
.ytdl-sub-subtitles_embedded_test-download-archive.json
{output_directory}/JMC
YouTube Rewind 2019 For the Record #YouTubeRewind.info.json
YouTube Rewind 2019 For the Record #YouTubeRewind.jpg
YouTube Rewind 2019 For the Record #YouTubeRewind.mp4
Embedded subtitles with lang(s) en, de

View file

@ -5,6 +5,7 @@ Files created:
{output_directory}/JMC
YouTube Rewind 2019 For the Record #YouTubeRewind.de.srt
YouTube Rewind 2019 For the Record #YouTubeRewind.en.srt
YouTube Rewind 2019 For the Record #YouTubeRewind.info.json
YouTube Rewind 2019 For the Record #YouTubeRewind.jpg
YouTube Rewind 2019 For the Record #YouTubeRewind.mp4
Embedded subtitles with lang(s) en, de

View file

@ -3,6 +3,7 @@ Files created:
{output_directory}
.ytdl-sub-subscription_test-download-archive.json
{output_directory}/subscription_test
Mock Entry 20-1.info.json
Mock Entry 20-1.jpg
Mock Entry 20-1.mp4
Video Tags:
@ -20,6 +21,7 @@ Files created:
genre: ytdl-sub
premiered: 2020-08-08
title: Mock Entry 20-1
Mock Entry 20-2.info.json
Mock Entry 20-2.jpg
Mock Entry 20-2.mp4
Video Tags:
@ -37,6 +39,7 @@ Files created:
genre: ytdl-sub
premiered: 2020-08-08
title: Mock Entry 20-2
Mock Entry 20-3.info.json
Mock Entry 20-3.jpg
Mock Entry 20-3.mp4
Video Tags:
@ -54,6 +57,7 @@ Files created:
genre: ytdl-sub
premiered: 2020-08-07
title: Mock Entry 20-3
Mock Entry 21-1.info.json
Mock Entry 21-1.jpg
Mock Entry 21-1.mp4
Video Tags:

View file

@ -3,6 +3,7 @@ Files created:
{output_directory}
.ytdl-sub-subscription_test-download-archive.json
{output_directory}/subscription_test
Mock Entry 20-1.info.json
Mock Entry 20-1.jpg
Mock Entry 20-1.mp4
Video Tags:
@ -20,6 +21,7 @@ Files created:
genre: ytdl-sub
premiered: 2020-08-08
title: Mock Entry 20-1
Mock Entry 20-2.info.json
Mock Entry 20-2.jpg
Mock Entry 20-2.mp4
Video Tags:
@ -37,6 +39,7 @@ Files created:
genre: ytdl-sub
premiered: 2020-08-08
title: Mock Entry 20-2
Mock Entry 20-3.info.json
Mock Entry 20-3.jpg
Mock Entry 20-3.mp4
Video Tags:
@ -54,6 +57,7 @@ Files created:
genre: ytdl-sub
premiered: 2020-08-07
title: Mock Entry 20-3
Mock Entry 21-1.info.json
Mock Entry 21-1.jpg
Mock Entry 21-1.mp4
Video Tags:

View file

@ -3,6 +3,7 @@ Files created:
{output_directory}
.ytdl-sub-subscription_test-download-archive.json
{output_directory}/subscription_test
Mock Entry 20-1.info.json
Mock Entry 20-1.jpg
Mock Entry 20-1.mp4
Video Tags:
@ -12,6 +13,7 @@ Files created:
premiered: 2020-08-08
title: Mock Entry 20-1
year: 2020
Mock Entry 20-2.info.json
Mock Entry 20-2.jpg
Mock Entry 20-2.mp4
Video Tags:
@ -21,6 +23,7 @@ Files created:
premiered: 2020-08-08
title: Mock Entry 20-2
year: 2020
Mock Entry 20-3.info.json
Mock Entry 20-3.jpg
Mock Entry 20-3.mp4
Video Tags:
@ -30,6 +33,7 @@ Files created:
premiered: 2020-08-07
title: Mock Entry 20-3
year: 2020
Mock Entry 21-1.info.json
Mock Entry 21-1.jpg
Mock Entry 21-1.mp4
Video Tags:

View file

@ -1,6 +1,7 @@
Files created:
----------------------------------------
{output_directory}/JMC
Oblivion Mod Falcor p.1.info.json
Oblivion Mod Falcor p.1.jpg
Oblivion Mod Falcor p.1.mp4
Video Tags:

View file

@ -1,6 +1,7 @@
Files created:
----------------------------------------
{output_directory}/JMC
Oblivion Mod Falcor p.1.info.json
Oblivion Mod Falcor p.1.jpg
Oblivion Mod Falcor p.1.mp4
Video Tags:

View file

@ -1,6 +1,7 @@
Files created:
----------------------------------------
{output_directory}/JMC
Oblivion Mod Falcor p.1.info.json
Oblivion Mod Falcor p.1.mp4
Video Tags:
album: Music Videos

View file

@ -1,4 +1,6 @@
import os.path
import re
from pathlib import Path
from typing import Dict
from typing import Optional
@ -94,6 +96,18 @@ class TestConfigFilePartiallyValidatesPresets:
},
)
def test_config_file_working_dir_home_dir(self):
out = ConfigFile(
name="test_tilda",
value={
"configuration": {"working_directory": "~/working/dir"},
},
)
assert out.config_options.working_directory == str(
Path(os.path.expanduser("~")) / "working" / "dir"
)
@pytest.mark.parametrize(
"preset_dict",
[

View file

@ -1,4 +1,6 @@
import os.path
import re
from pathlib import Path
import pytest
@ -37,6 +39,20 @@ class TestPreset:
},
)
def test_preset_with_output_directory_tilda(self, config_file, output_options, youtube_video):
out = Preset(
config=config_file,
name="test",
value={
"download": youtube_video,
"output_options": {"output_directory": "~/output/dir", "file_name": "{dne_var}"},
"overrides": {"dne_var": "not dne"},
},
)
assert out.overrides.apply_formatter(out.output_options.output_directory) == str(
Path(os.path.expanduser("~")) / "output" / "dir"
)
def test_preset_parent(self, config_file, output_options, youtube_video):
preset = Preset(
config=config_file,