👷 Fixed video and list download.

This commit is contained in:
Robert Honz
2024-04-21 22:42:19 +02:00
parent 2ff0aa2ee3
commit f31d69e0ae
2 changed files with 44 additions and 18 deletions
+15 -11
View File
@@ -12,10 +12,10 @@ import requests
from requests.exceptions import HTTPError from requests.exceptions import HTTPError
from rich.progress import Progress, TaskID from rich.progress import Progress, TaskID
from tidalapi import Album, Mix, Playlist, Session, Track, UserPlaylist, Video from tidalapi import Album, Mix, Playlist, Session, Track, UserPlaylist, Video
from tidalapi.media import AudioExtensions, Codec, Quality, StreamManifest, VideoExtensions, VideoQuality from tidalapi.media import AudioExtensions, Codec, Quality, StreamManifest, VideoExtensions
from tidal_dl_ng.config import Settings, Tidal from tidal_dl_ng.config import Settings, Tidal
from tidal_dl_ng.constants import EXTENSION_LYRICS, REQUESTS_TIMEOUT_SEC, MediaType, SkipExisting from tidal_dl_ng.constants import EXTENSION_LYRICS, REQUESTS_TIMEOUT_SEC, MediaType, QualityVideo, SkipExisting
from tidal_dl_ng.helper.decryption import decrypt_file, decrypt_security_token from tidal_dl_ng.helper.decryption import decrypt_file, decrypt_security_token
from tidal_dl_ng.helper.exceptions import MediaMissing from tidal_dl_ng.helper.exceptions import MediaMissing
from tidal_dl_ng.helper.path import check_file_exists, format_path_media, path_file_sanitize from tidal_dl_ng.helper.path import check_file_exists, format_path_media, path_file_sanitize
@@ -179,7 +179,7 @@ class Download:
video_download: bool = True, video_download: bool = True,
download_delay: bool = False, download_delay: bool = False,
quality_audio: Quality | None = None, quality_audio: Quality | None = None,
quality_video: VideoQuality | None = None, quality_video: QualityVideo | None = None,
) -> (bool, str): ) -> (bool, str):
try: try:
if media_id and media_type: if media_id and media_type:
@@ -213,7 +213,7 @@ class Download:
if isinstance(media, Track): if isinstance(media, Track):
# If hi_res is forbidden in settings and highest track quality is hi_res, downgrade to high_lossless. # If hi_res is forbidden in settings and highest track quality is hi_res, downgrade to high_lossless.
if self.settings.data.downgrade_on_hires and media.get_stream().audio_quality == Quality.hi_res: if self.settings.data.downgrade_on_hi_res and media.get_stream().audio_quality == Quality.hi_res:
quality_audio = Quality.high_lossless quality_audio = Quality.high_lossless
# If a quality is explicitly set, change it. # If a quality is explicitly set, change it.
@@ -233,7 +233,7 @@ class Download:
do_flac_extract = True do_flac_extract = True
elif isinstance(media, Video): elif isinstance(media, Video):
if quality_video: if quality_video:
quality_video_old = self.adjust_quality_video(quality_video) quality_video_old: QualityVideo = self.adjust_quality_video(quality_video)
file_extension = AudioExtensions.MP4 if self.settings.data.video_convert_mp4 else VideoExtensions.TS file_extension = AudioExtensions.MP4 if self.settings.data.video_convert_mp4 else VideoExtensions.TS
@@ -267,7 +267,7 @@ class Download:
tmp_path_file = self._video_convert(tmp_path_file) tmp_path_file = self._video_convert(tmp_path_file)
# Extract FLAC from MP4 container using ffmpeg # Extract FLAC from MP4 container using ffmpeg
if self.settings.data.extract_flac and do_flac_extract: if isinstance(media, Track) and self.settings.data.extract_flac and do_flac_extract:
tmp_path_file = self._extract_flac(tmp_path_file, media.isrc) tmp_path_file = self._extract_flac(tmp_path_file, media.isrc)
# Move final file to the configured destination directory. # Move final file to the configured destination directory.
@@ -314,10 +314,10 @@ class Download:
return quality_old return quality_old
def adjust_quality_video(self, quality) -> VideoQuality: def adjust_quality_video(self, quality) -> QualityVideo:
quality_old: VideoQuality = self.session.video_quality quality_old: QualityVideo = self.settings.data.quality_video
self.session.video_quality = quality self.settings.data.quality_video = quality
return quality_old return quality_old
@@ -400,7 +400,8 @@ class Download:
media_type: MediaType = None, media_type: MediaType = None,
video_download: bool = False, video_download: bool = False,
download_delay: bool = True, download_delay: bool = True,
quality: Quality | None = None, quality_audio: Quality | None = None,
quality_video: QualityVideo | None = None,
): ):
# If no media instance is provided, we need to create the media instance. # If no media instance is provided, we need to create the media instance.
if media_id and media_type: if media_id and media_type:
@@ -442,7 +443,10 @@ class Download:
for media in items: for media in items:
# Download the item. # Download the item.
status_download, result_path_file = self.item( status_download, result_path_file = self.item(
media=media, file_template=file_name_relative, quality_audio=quality media=media,
file_template=file_name_relative,
quality_audio=quality_audio,
quality_video=quality_video,
) )
# Advance progress bar. # Advance progress bar.
+29 -7
View File
@@ -543,7 +543,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
) -> QueueDownloadItem | bool: ) -> QueueDownloadItem | bool:
result: QueueDownloadItem | False result: QueueDownloadItem | False
name: str = "" name: str = ""
quality: Quality quality: Quality | QualityVideo | str = ""
explicit: str = "" explicit: str = ""
# Check if item is available on TIDAL. # Check if item is available on TIDAL.
@@ -574,7 +574,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
else: else:
quality = self.settings.data.quality_audio quality = self.settings.data.quality_audio
elif isinstance(media, Video): elif isinstance(media, Video):
quality = media.video_quality quality = self.settings.data.quality_video
if name: if name:
result = QueueDownloadItem( result = QueueDownloadItem(
@@ -799,7 +799,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
result: QueueDownloadStatus result: QueueDownloadStatus
item: QtWidgets.QTreeWidgetItem = items[0] item: QtWidgets.QTreeWidgetItem = items[0]
media: Track | Album | Playlist | Video | Mix | Artist = get_queue_download_media(item) media: Track | Album | Playlist | Video | Mix | Artist = get_queue_download_media(item)
quality: Quality = get_queue_download_quality(item) tmp_quality: str = get_queue_download_quality(item)
quality: Quality | QualityVideo | None = tmp_quality if tmp_quality else None
try: try:
self.s_queue_download_item_downloading.emit(item) self.s_queue_download_item_downloading.emit(item)
@@ -830,7 +831,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
item.setText(0, status) item.setText(0, status)
def on_queue_download( def on_queue_download(
self, media: Track | Album | Playlist | Video | Mix | Artist, quality: Quality | None = None self, media: Track | Album | Playlist | Video | Mix | Artist, quality: Quality | QualityVideo | None = None
) -> QueueDownloadStatus: ) -> QueueDownloadStatus:
result: QueueDownloadStatus result: QueueDownloadStatus
items_media: [Track | Album | Playlist | Video | Mix | Artist] items_media: [Track | Album | Playlist | Video | Mix | Artist]
@@ -852,27 +853,48 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
media: Track | Album | Playlist | Video | Mix | Artist, media: Track | Album | Playlist | Video | Mix | Artist,
dl: Download, dl: Download,
delay_track: bool = False, delay_track: bool = False,
quality: Quality | None = None, quality: Quality | QualityVideo | None = None,
) -> QueueDownloadStatus: ) -> QueueDownloadStatus:
result_dl: bool result_dl: bool
path_file: str path_file: str
result: QueueDownloadStatus result: QueueDownloadStatus
quality_audio: Quality | None
quality_video: QualityVideo | None
self.s_pb_reset.emit() self.s_pb_reset.emit()
self.s_statusbar_message.emit(StatusbarMessage(message="Download started...")) self.s_statusbar_message.emit(StatusbarMessage(message="Download started..."))
file_template = get_format_template(media, self.settings) file_template = get_format_template(media, self.settings)
if isinstance(media, Track | Video): if isinstance(media, Track | Video):
if isinstance(media, Track):
quality_audio = quality
quality_video = None
else:
quality_audio = None
quality_video = quality
result_dl, path_file = dl.item( result_dl, path_file = dl.item(
media=media, file_template=file_template, download_delay=delay_track, quality_audio=quality media=media,
file_template=file_template,
download_delay=delay_track,
quality_audio=quality_audio,
quality_video=quality_video,
) )
elif isinstance(media, Album | Playlist | Mix): elif isinstance(media, Album | Playlist | Mix):
if isinstance(media, Album):
quality_audio = quality
quality_video = None
else:
quality_audio = None
quality_video = None
dl.items( dl.items(
media=media, media=media,
file_template=file_template, file_template=file_template,
video_download=self.settings.data.video_download, video_download=self.settings.data.video_download,
download_delay=self.settings.data.download_delay, download_delay=self.settings.data.download_delay,
quality=quality, quality_audio=quality_audio,
quality_video=quality_video,
) )
# Dummy values # Dummy values