Merge pull request #249 from exislow/248-bug-500-server-error-internal-server-error-for-url
248 bug 500 server error internal server error for url
This commit is contained in:
+20
-11
@@ -98,6 +98,7 @@ class Download:
|
|||||||
def _download(
|
def _download(
|
||||||
self,
|
self,
|
||||||
media: Track | Video,
|
media: Track | Video,
|
||||||
|
stream_manifest: StreamManifest,
|
||||||
path_file: pathlib.Path,
|
path_file: pathlib.Path,
|
||||||
) -> (bool, pathlib.Path):
|
) -> (bool, pathlib.Path):
|
||||||
media_name: str = name_builder_item(media)
|
media_name: str = name_builder_item(media)
|
||||||
@@ -108,15 +109,17 @@ class Download:
|
|||||||
result_merge: bool = False
|
result_merge: bool = False
|
||||||
|
|
||||||
# Get urls for media.
|
# Get urls for media.
|
||||||
|
try:
|
||||||
if isinstance(media, Track):
|
if isinstance(media, Track):
|
||||||
urls = media.get_stream().get_stream_manifest().get_urls()
|
urls = stream_manifest.get_urls()
|
||||||
stream_manifest: StreamManifest = media.get_stream().get_stream_manifest()
|
|
||||||
elif isinstance(media, Video):
|
elif isinstance(media, Video):
|
||||||
m3u8_variant: m3u8.M3U8 = m3u8.load(media.get_url())
|
m3u8_variant: m3u8.M3U8 = m3u8.load(media.get_url())
|
||||||
# Find the desired video resolution or the next best one.
|
# Find the desired video resolution or the next best one.
|
||||||
m3u8_playlist, codecs = self._extract_video_stream(m3u8_variant, int(self.settings.data.quality_video))
|
m3u8_playlist, codecs = self._extract_video_stream(m3u8_variant, int(self.settings.data.quality_video))
|
||||||
# Populate urls.
|
# Populate urls.
|
||||||
urls = m3u8_playlist.files
|
urls = m3u8_playlist.files
|
||||||
|
except Exception:
|
||||||
|
return False, path_file
|
||||||
|
|
||||||
# Set the correct progress output channel.
|
# Set the correct progress output channel.
|
||||||
if self.progress_gui is None:
|
if self.progress_gui is None:
|
||||||
@@ -187,7 +190,7 @@ class Download:
|
|||||||
self.fn_logger.error(f"Something went wrong while writing to {media_name}. File is corrupt!")
|
self.fn_logger.error(f"Something went wrong while writing to {media_name}. File is corrupt!")
|
||||||
elif result_merge and isinstance(media, Track) and stream_manifest.is_encrypted:
|
elif result_merge and isinstance(media, Track) and stream_manifest.is_encrypted:
|
||||||
key, nonce = decrypt_security_token(stream_manifest.encryption_key)
|
key, nonce = decrypt_security_token(stream_manifest.encryption_key)
|
||||||
tmp_path_file_decrypted = path_file.with_suffix("_decrypted")
|
tmp_path_file_decrypted = path_file.with_suffix(".decrypted")
|
||||||
decrypt_file(path_file, tmp_path_file_decrypted, key, nonce)
|
decrypt_file(path_file, tmp_path_file_decrypted, key, nonce)
|
||||||
|
|
||||||
return result_merge, tmp_path_file_decrypted
|
return result_merge, tmp_path_file_decrypted
|
||||||
@@ -322,9 +325,9 @@ class Download:
|
|||||||
self.adjust_quality_video(quality_video) if quality_video else quality_video
|
self.adjust_quality_video(quality_video) if quality_video else quality_video
|
||||||
)
|
)
|
||||||
|
|
||||||
if isinstance(media, Track):
|
|
||||||
try:
|
try:
|
||||||
media_stream = media.get_stream()
|
media_stream = media.get_stream()
|
||||||
|
stream_manifest: StreamManifest = media_stream.get_stream_manifest()
|
||||||
except TooManyRequests:
|
except TooManyRequests:
|
||||||
self.fn_logger.exception(
|
self.fn_logger.exception(
|
||||||
f"Too many requests against TIDAL backend. Skipping '{name_builder_item(media)}'. "
|
f"Too many requests against TIDAL backend. Skipping '{name_builder_item(media)}'. "
|
||||||
@@ -332,15 +335,15 @@ class Download:
|
|||||||
)
|
)
|
||||||
|
|
||||||
return False, ""
|
return False, ""
|
||||||
except:
|
except Exception:
|
||||||
self.fn_logger.exception(f"Something went wrong. Skipping '{name_builder_item(media)}'.")
|
self.fn_logger.exception(f"Something went wrong. Skipping '{name_builder_item(media)}'.")
|
||||||
|
|
||||||
return False, ""
|
return False, ""
|
||||||
|
|
||||||
|
if isinstance(media, Track):
|
||||||
# TODO: HOTFIX! Go back to
|
# TODO: HOTFIX! Go back to
|
||||||
# file_extension = media_stream.get_stream_manifest().file_extension
|
# file_extension = media_stream.get_stream_manifest().file_extension
|
||||||
# After tidalapi has fixed #304
|
# After tidalapi has fixed #304
|
||||||
stream_manifest: StreamManifest = media_stream.get_stream_manifest()
|
|
||||||
if stream_manifest.file_extension is VideoExtensions.TS:
|
if stream_manifest.file_extension is VideoExtensions.TS:
|
||||||
file_extension = stream_manifest.file_extension
|
file_extension = stream_manifest.file_extension
|
||||||
elif stream_manifest.dash_info and AudioExtensions.FLAC in stream_manifest.dash_info.first_url:
|
elif stream_manifest.dash_info and AudioExtensions.FLAC in stream_manifest.dash_info.first_url:
|
||||||
@@ -349,8 +352,7 @@ class Download:
|
|||||||
file_extension = AudioExtensions.M4A
|
file_extension = AudioExtensions.M4A
|
||||||
|
|
||||||
if self.settings.data.extract_flac and (
|
if self.settings.data.extract_flac and (
|
||||||
media_stream.get_stream_manifest().codecs.upper() == Codec.FLAC
|
stream_manifest.codecs.upper() == Codec.FLAC and file_extension != AudioExtensions.FLAC
|
||||||
and file_extension != AudioExtensions.FLAC
|
|
||||||
):
|
):
|
||||||
file_extension = AudioExtensions.FLAC
|
file_extension = AudioExtensions.FLAC
|
||||||
do_flac_extract = True
|
do_flac_extract = True
|
||||||
@@ -369,7 +371,9 @@ class Download:
|
|||||||
tmp_path_file.touch()
|
tmp_path_file.touch()
|
||||||
|
|
||||||
# Download media.
|
# Download media.
|
||||||
result_download, tmp_path_file = self._download(media=media, path_file=tmp_path_file)
|
result_download, tmp_path_file = self._download(
|
||||||
|
media=media, stream_manifest=stream_manifest, path_file=tmp_path_file
|
||||||
|
)
|
||||||
|
|
||||||
if result_download:
|
if result_download:
|
||||||
# Convert video from TS to MP4
|
# Convert video from TS to MP4
|
||||||
@@ -396,7 +400,7 @@ class Download:
|
|||||||
|
|
||||||
# Move cover file
|
# Move cover file
|
||||||
# TODO: Cover is downloaded with every track of the album. Needs refactoring, so cover is only
|
# TODO: Cover is downloaded with every track of the album. Needs refactoring, so cover is only
|
||||||
# dowloaded for an album once.
|
# downloaded for an album once.
|
||||||
if self.settings.data.cover_album_file and tmp_path_cover:
|
if self.settings.data.cover_album_file and tmp_path_cover:
|
||||||
self._move_cover(tmp_path_cover, path_media_dst)
|
self._move_cover(tmp_path_cover, path_media_dst)
|
||||||
|
|
||||||
@@ -420,7 +424,12 @@ class Download:
|
|||||||
# Whether a file was downloaded or skipped and the download delay is enabled, wait until the next download.
|
# Whether a file was downloaded or skipped and the download delay is enabled, wait until the next download.
|
||||||
# Only use this, if you have a list of several Track items.
|
# Only use this, if you have a list of several Track items.
|
||||||
if download_delay and not skip_file:
|
if download_delay and not skip_file:
|
||||||
time_sleep: float = round(random.SystemRandom().uniform(1.5, 4), 1)
|
time_sleep: float = round(
|
||||||
|
random.SystemRandom().uniform(
|
||||||
|
self.settings.data.download_delay_sec_min, self.settings.data.download_delay_sec_max
|
||||||
|
),
|
||||||
|
1,
|
||||||
|
)
|
||||||
|
|
||||||
self.fn_logger.debug(f"Next download will start in {time_sleep} seconds.")
|
self.fn_logger.debug(f"Next download will start in {time_sleep} seconds.")
|
||||||
time.sleep(time_sleep)
|
time.sleep(time_sleep)
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ class Settings:
|
|||||||
cover_album_file: bool = True
|
cover_album_file: bool = True
|
||||||
extract_flac: bool = True
|
extract_flac: bool = True
|
||||||
downloads_simultaneous_per_track_max: int = 20
|
downloads_simultaneous_per_track_max: int = 20
|
||||||
|
download_delay_sec_min: float = 3.0
|
||||||
|
download_delay_sec_max: float = 5.0
|
||||||
|
|
||||||
|
|
||||||
@dataclass_json
|
@dataclass_json
|
||||||
@@ -80,6 +82,8 @@ class HelpSettings:
|
|||||||
cover_album_file: str = "Save cover to 'cover.jpg', if an album is downloaded."
|
cover_album_file: str = "Save cover to 'cover.jpg', if an album is downloaded."
|
||||||
extract_flac: str = "Extract FLAC audio tracks from MP4 containers and save them as `*.flac` (uses FFmpeg)."
|
extract_flac: str = "Extract FLAC audio tracks from MP4 containers and save them as `*.flac` (uses FFmpeg)."
|
||||||
downloads_simultaneous_per_track_max: str = "Maximum number of simultaneous chunk downloads per track."
|
downloads_simultaneous_per_track_max: str = "Maximum number of simultaneous chunk downloads per track."
|
||||||
|
download_delay_sec_min: float = "Lower boundary for the calculation of the download delay in seconds."
|
||||||
|
download_delay_sec_max: float = "Upper boundary for the calculation of the download delay in seconds."
|
||||||
|
|
||||||
|
|
||||||
@dataclass_json
|
@dataclass_json
|
||||||
|
|||||||
Reference in New Issue
Block a user