exislow / tidal-dl-ng Goto Github PK
View Code? Open in Web Editor NEWTIDAL Media Downloader Next Generation! Up to HiRes Lossless / TIDAL MAX 24-bit, 192 kHz.
License: GNU Affero General Public License v3.0
TIDAL Media Downloader Next Generation! Up to HiRes Lossless / TIDAL MAX 24-bit, 192 kHz.
License: GNU Affero General Public License v3.0
Currently, it seems like when we download a playlist, the program will have human-like delays before it downloads a track, which is what we want. But, there is also a case where you can have 1000 tracks out 1010 total downloaded already, in which case it applies the delay to every song even if it already exists. Ideally, it should check is a file for the requested track already exists, and if it does, then skip delay and move to the next request.
cc: @exislow
K
Please allow for every media type (playlist, album, track, etc.) to be able to use the same asset tag. Currently downloading individual tracks won't load the "{album_title}". I would like all the songs regardles of asset tag to be downloaded in the same folder structure
{artist_name}/{album_title}/song.extention
This helps keeps things organized
Running the .exe version on Windows 11.
When you open the preferences window, the tooltip popups when hovering over the options are very hard to read, light grey text over white background.
0.8.3
Windows
No response
{"skip_existing": false, "lyrics_embed": false, "lyrics_file": false, "video_download": true, "download_delay": true, "download_base_path": "./download/", "quality_audio": "HIGH", "quality_video": 1080, "format_album": "Albums/{artist_name} - {title}/{track_num}. {artist_name} - {track_title}", "format_playlist": "Playlists/{playlist_name}/{artist_name} - {track_title}", "format_mix": "Mix/{mix_name}/{artist_name} - {track_title}", "format_track": "Tracks/{artist_name} - {track_title}", "format_video": "Videos/{artist_name} - {track_title}", "video_convert_mp4": false, "metadata_cover_dimension": "640x640"}
I tried to download the Jennifer Lopez - LOVE? - Album.
Interesting to note for some albums (like the one mentioned above) there is a tag missing.
The "Release Date" / "Recorded Date" - Tag is missing.
But if you download only the track by itself the tag is assigned correctly.
(See Images)
This problem may be solved by using available_release_date
instead of release_date
.
Missing the release date during downloading album:
btw: here you can see the album/performer tag with the track - title in it, should be only the album artist (see another issue)
The correct tags by downloading the track by itself:
v0.8.3
Linux
No response
{"skip_existing": "exact", "lyrics_embed": true, "lyrics_file": false, "video_download": true, "download_delay": true, "download_base_path": "/home/eric/Musik", "quality_audio": "HI_RES_LOSSLESS", "quality_video": 1080, "format_album": "{artist_name}/{album_title}/{track_num} - {track_title}", "format_playlist": "Playlists/{playlist_name}/{artist_name} - {track_title}", "format_mix": "Mix/{mix_name}/{artist_name} - {track_title}", "format_track": "{artist_name}/{track_title}/{track_num} - {track_title}", "format_video": "Videos/{artist_name}/{track_title}", "video_convert_mp4": true, "metadata_cover_dimension": "1280x1280"}
Running the exe version on Windows 11.
File > Version page isn't showing the actual version. Instead returns 0.0.0
0.8.3
Windows
No response
{"skip_existing": false, "lyrics_embed": false, "lyrics_file": false, "video_download": true, "download_delay": true, "download_base_path": "./download/", "quality_audio": "HIGH", "quality_video": 1080, "format_album": "Albums/{artist_name} - {title}/{track_num}. {artist_name} - {track_title}", "format_playlist": "Playlists/{playlist_name}/{artist_name} - {track_title}", "format_mix": "Mix/{mix_name}/{artist_name} - {track_title}", "format_track": "Tracks/{artist_name} - {track_title}", "format_video": "Videos/{artist_name} - {track_title}", "video_convert_mp4": false, "metadata_cover_dimension": "640x640"}
Hi @exislow,
I see that you already contributed to python-tidal project by adding the option to authenticate via PKCE method. Well done!
Are you planning to add this option in your own project?
Cheers
im making a python script to automatically download all my liked songs and i can get the urls via tidalapi.
Is there any way i can use tidal-dl-ng in the python script without having to use subprocess.run.Iif you can how would you send cli commands via python?
Noob question I guess but I dont know to what can I change quality audio in config on not gui version. It's HIGH now but what else can it be? Info is either not accessible or I dont know how to see it.
Hello, thank you very much for your effort! It's nice to be able to download Hi-Res tracks!
Would it be possible in a future version to be able to use direct links to albums/playlists/tracks? Example (album): https://tidal.com/browse/album/74414448
We can get these links when we use the "Share" function in Tidal.
Edit: I'm not sure if there is a CLI version, I was referring to the GUI version. If I put the link in the search box and press Enter, it just searches on Tidal:
Edit 2 - I also found a CLI version, which is nice. There are some more things that would be nice to have in the GUI:
Hi @exislow ,
I have a question.
When I login and authenticate via PKCE method I'm able to download at HI_RES_LOSSLESS quality with no issues.
But after several hours (<24hrs) the best quality I can get with exatcly the same settings is 44/16.
When I delete the token.json and re-login, I'm again able to download at MAX quality.
Why is this happening?
Is there any workaround?
Thanks in advance for your help.
Cheers
Let us check, if you are already logged in... Yep, looks good! You are logged in.
╭─────────────────────────────────── Download Progress ───────────────────────────────────╮
│ │
│ │
│ Item 'The Score, Travis Barker - All' ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% │
│ │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/cli.py:176 in download │
│ │
│ 173 │ │ with Live(progress_table, refresh_per_second=10): │
│ 174 │ │ │ # Download media. │
│ 175 │ │ │ if media_type in [MediaType.TRACK, MediaType.VIDEO]: │
│ ❱ 176 │ │ │ │ dl.item( │
│ 177 │ │ │ │ │ media_id=item_id, │
│ 178 │ │ │ │ │ media_type=media_type, │
│ 179 │ │ │ │ │ file_template=file_template, │
│ │
│ ╭─────────────────────────────────────── locals ───────────────────────────────────────╮ │
│ │ ctx = <click.core.Context object at 0x7251e7cfa890> │ │
│ │ dl = <tidal_dl_ng.download.Download object at 0x7251e7d0d050> │ │
│ │ file_template = 'Tracks/{artist_name} - {track_title}' │ │
│ │ fn_logger = <tidal_dl_ng.helper.wrapper.LoggerWrapped object at 0x7251e7d0e550> │ │
│ │ item = 'https://tidal.com/browse/track/152668960' │ │
│ │ item_id = '152668960' │ │
│ │ list_urls = None │ │
│ │ media_type = <MediaType.TRACK: 'track'> │ │
│ │ progress = <rich.progress.Progress object at 0x7251e7d3b0d0> │ │
│ │ progress_table = <rich.table.Table object at 0x7251e7d0e350> │ │
│ │ settings = <tidal_dl_ng.config.Settings object at 0x7251e7a0b150> │ │
│ │ urls = ['https://tidal.com/browse/track/152668960'] │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/download.py:231 in item │
│ │
│ 228 │ │ │ with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmp_path_dir │
│ 229 │ │ │ │ tmp_path_file = os.path.join(tmp_path_dir, str(uuid4()) + stream_manifes │
│ 230 │ │ │ │ # Download media. │
│ ❱ 231 │ │ │ │ tmp_path_file = self._download(media=media, stream_manifest=stream_manif │
│ 232 │ │ │ │ │
│ 233 │ │ │ │ if isinstance(media, Video) and self.settings.data.video_convert_mp4: │
│ 234 │ │ │ │ │ # Convert `*.ts` file to `*.mp4` using ffmpeg │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ download_skip = False │ │
│ │ file_name_relative = 'Tracks/The Score, Travis Barker - All Of Me' │ │
│ │ file_template = 'Tracks/{artist_name} - {track_title}' │ │
│ │ manifest = 'PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48TVBEIHhtbG5zPSJ1c… │ │
│ │ media = <tidalapi.media.Track object at 0x7251e7a20a10> │ │
│ │ media_id = '152668960' │ │
│ │ media_type = <MediaType.TRACK: 'track'> │ │
│ │ mime_type = 'application/dash+xml' │ │
│ │ path_file = '/home/olivia/Downloads/Tracks/The Score, Travis Barker - All Of │ │
│ │ Me.m4a' │ │
│ │ self = <tidal_dl_ng.download.Download object at 0x7251e7d0d050> │ │
│ │ stream = <tidalapi.media.Stream object at 0x7251e7cfaf90> │ │
│ │ stream_manifest = StreamManifest( │ │
│ │ │ codecs='mp4a.40.2', │ │
│ │ │ mime_type='audio/mp4', │ │
│ │ │ urls=[ │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │ │ │ ... +32 │ │
│ │ │ ], │ │
│ │ │ file_extension='.m4a', │ │
│ │ │ encryption_type='NONE', │ │
│ │ │ encryption_key=None │ │
│ │ ) │ │
│ │ tmp_path_dir = '/tmp/tmpgf0l28gy' │ │
│ │ tmp_path_file = '/tmp/tmpgf0l28gy/969e9323-1895-4308-96db-4641d6c72479.m4a' │ │
│ │ video_download = True │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/download.py:152 in │
│ _download │
│ │
│ 149 │ │ │
│ 150 │ │ # Write metadata to file. │
│ 151 │ │ if not isinstance(media, Video): │
│ ❱ 152 │ │ │ self.metadata_write(media, tmp_path_file_decrypted) │
│ 153 │ │ │
│ 154 │ │ return tmp_path_file_decrypted │
│ 155 │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ block_size = None │ │
│ │ data = b'\x00\x00\x05\x94moof\x00\x00\x00\x10mfhd\x00\x00\x00\x00\x00\x0… │ │
│ │ f = <_io.BufferedWriter │ │
│ │ name='/tmp/tmpgf0l28gy/969e9323-1895-4308-96db-4641d6c72479.m4a'> │ │
│ │ media = <tidalapi.media.Track object at 0x7251e7a20a10> │ │
│ │ media_name = 'The Score, Travis Barker - All Of Me' │ │
│ │ needs_decryption = False │ │
│ │ p_task = 0 │ │
│ │ path_file = '/tmp/tmpgf0l28gy/969e9323-1895-4308-96db-4641d6c72479.m4a' │ │
│ │ progress_stdout = True │ │
│ │ progress_total = 42 │ │
│ │ r = <Response [200]> │ │
│ │ self = <tidal_dl_ng.download.Download object at 0x7251e7d0d050> │ │
│ │ stream_manifest = StreamManifest( │ │
│ │ │ codecs='mp4a.40.2', │ │
│ │ │ mime_type='audio/mp4', │ │
│ │ │ urls=[ │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │ │ │ ... +32 │ │
│ │ │ ], │ │
│ │ │ file_extension='.m4a', │ │
│ │ │ encryption_type='NONE', │ │
│ │ │ encryption_key=None │ │
│ │ ) │ │
│ │ tmp_path_file_decrypted = '/tmp/tmpgf0l28gy/969e9323-1895-4308-96db-4641d6c72479.m4a' │ │
│ │ url = 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │ urls_count = 42 │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/download.py:289 in │
│ metadata_write │
│ │
│ 286 │ │ │ ), │
│ 287 │ │ ) │
│ 288 │ │ │
│ ❱ 289 │ │ m.save() │
│ 290 │ │ │
│ 291 │ │ result = True │
│ 292 │
│ │
│ ╭─────────────────────────────────── locals ───────────────────────────────────╮ │
│ │ copy_right = '℗ 2020 Republic Records, a division of UMG Recordings, Inc.' │ │
│ │ isrc = 'USUM72014229' │ │
│ │ lyrics = '' │ │
│ │ m = <tidal_dl_ng.metadata.Metadata object at 0x7251e7a629d0> │ │
│ │ path_file = '/tmp/tmpgf0l28gy/969e9323-1895-4308-96db-4641d6c72479.m4a' │ │
│ │ release_date = '' │ │
│ │ result = False │ │
│ │ self = <tidal_dl_ng.download.Download object at 0x7251e7d0d050> │ │
│ │ track = <tidalapi.media.Track object at 0x7251e7a20a10> │ │
│ ╰──────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/metadata.py:97 in save │
│ │
│ 94 │ │ elif isinstance(self.m, mutagen.mp3.MP3): │
│ 95 │ │ │ self.set_mp3() │
│ 96 │ │ elif isinstance(self.m, mutagen.mp4.MP4): │
│ ❱ 97 │ │ │ self.set_mp4() │
│ 98 │ │ │
│ 99 │ │ self._cover() │
│ 100 │ │ self.m.save() │
│ │
│ ╭──────────────────────────── locals ─────────────────────────────╮ │
│ │ self = <tidal_dl_ng.metadata.Metadata object at 0x7251e7a629d0> │ │
│ ╰─────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/metadata.py:134 in set_mp4 │
│ │
│ 131 │ │
│ 132 │ def set_mp4(self): │
│ 133 │ │ self.m.tags["\xa9nam"] = self.title │
│ ❱ 134 │ │ self.m.tags["\xa9alb"] = self.album │
│ 135 │ │ self.m.tags["aART"] = self.albumartist │
│ 136 │ │ self.m.tags["\xa9ART"] = ", ".join(self.artists) if self.artists else "" │
│ 137 │ │ self.m.tags["cprt"] = self.copy_right │
│ │
│ ╭──────────────────────────── locals ─────────────────────────────╮ │
│ │ self = <tidal_dl_ng.metadata.Metadata object at 0x7251e7a629d0> │ │
│ ╰─────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/mutagen/mp4/__init__.py:372 in │
│ __setitem__ │
│ │
│ 369 │ def __setitem__(self, key, value): │
│ 370 │ │ if not isinstance(key, str): │
│ 371 │ │ │ raise TypeError("key has to be str") │
│ ❱ 372 │ │ self._render(key, value) │
│ 373 │ │ super(MP4Tags, self).__setitem__(key, value) │
│ 374 │ │
│ 375 │ @classmethod │
│ │
│ ╭─────────── locals ────────────╮ │
│ │ key = '©alb' │ │
│ │ self = {'©nam': 'All Of Me'} │ │
│ │ value = None │ │
│ ╰───────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/mutagen/mp4/__init__.py:388 in _render │
│ │
│ 385 │ │ │ render_func = type(self).__render_text │
│ 386 │ │ │ render_args = [] │
│ 387 │ │ │
│ ❱ 388 │ │ return render_func(self, key, value, *render_args) │
│ 389 │ │
│ 390 │ @convert_error(IOError, error) │
│ 391 │ @loadfile(writable=True) │
│ │
│ ╭───────────────────────────── locals ─────────────────────────────╮ │
│ │ atom_name = b'\xa9alb' │ │
│ │ key = '©alb' │ │
│ │ render_args = () │ │
│ │ render_func = <function MP4Tags.__render_text at 0x7251e7a01260> │ │
│ │ self = {'©nam': 'All Of Me'} │ │
│ │ value = None │ │
│ ╰──────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/mutagen/mp4/__init__.py:822 in │
│ __render_text │
│ │
│ 819 │ │ │ value = [value] │
│ 820 │ │ │
│ 821 │ │ encoded = [] │
│ ❱ 822 │ │ for v in value: │
│ 823 │ │ │ if not isinstance(v, str): │
│ 824 │ │ │ │ raise TypeError("%r not str" % v) │
│ 825 │
│ │
│ ╭───────────── locals ─────────────╮ │
│ │ encoded = [] │ │
│ │ flags = <AtomDataType.UTF8: 1> │ │
│ │ key = '©alb' │ │
│ │ self = {'©nam': 'All Of Me'} │ │
│ │ value = None │ │
│ ╰──────────────────────────────────╯ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
TypeError: 'NoneType' object is not iterable```
command run "tidal-dl-ng dl https://tidal.com/browse/track/152668960"
steps to reproduce: make a python venv and install tidal-dl-ng
set up config as necessary
try to download a track
The m4a file format is not recognized by the ROON program and many digital transports/streamers. We have to convert it to the FLAC format. Make the save in the default FLAC format. What is not clear here. Rather, it is strange why it is stored in m4a, which has nothing to do with Tidal and HD FLAC.
I read it, but I don’t understand why they are asking you to make a FLAC, but you don’t want to and claim that m4a is good. So difficult to save in a FLAC format compatible with many devices? Or just write - I can’t do it any other way, only m4a.
At the moment it seems unable to change download path for windows client (for tracks)- you can write all you want in download path it stays default.
Regarding video download - so far cant find downloaded files at all, although download process seems to have place. Windows searching gave up on finding these files :)
Getting the below error as are others here starting the program:
Failed to execute script 'gui' due to unhandled exception: cannot access local variable 'settings_json' where it is not associated with a value.
Traceback (most recent call last):
File "tidal_dl_ng\gui.py", line 535, in
File "tidal_dl_ng\gui.py", line 528, in gui_activate
File "tidal_dl_ng\gui.py", line 64, in init
File "tidal_dl_ng\helper\decorator.py", line 19, in call
File "tidal_dl_ng\config.py", line 77, in init
File "tidal_dl_ng\config.py", line 66, in read
UnboundLocalError: cannot access local variable 'settings_json' where it is not associated with a value
Using windows 10 pro 64
When attemtping to download tracks using CLI in either high or hi_res quality, the following error occurs.
tidal-dl-ng dl https://listen.tidal.com/mix/0161bc50700b85c9c9d68d4da0147d
Let us check, if you are already logged in... Yep, looks good! You are logged in.
╭───────────────────────────── Download Progress ─────────────────────────────╮
│ │
│ │
│ List 'My Daily Discovery' ⠋ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0% │
│ Item 'Paint The Town Red' ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% │
│ │
│ │
╰─────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /usr/local/lib/python3.11/site-packages/tidal_dl_ng/cli.py:192 in download │
│ │
│ 189 │ │ │ │ │ file_template = settings.data.format_mix │
│ 190 │ │ │ │ │ media_type = MediaType.Mix │
│ 191 │ │ │ │ │
│ ❱ 192 │ │ │ │ dl.list( │
│ 193 │ │ │ │ │ id_media=id_item, │
│ 194 │ │ │ │ │ media_type=media_type, │
│ 195 │ │ │ │ │ path_base=settings.data.download_base_path, │
│ │
│ ╭───────────────────────────────────── locals ──────────────────────────────────────╮ │
│ │ ctx = <click.core.Context object at 0x112a45a50> │ │
│ │ dl = <tidal_dl_ng.download.Download object at 0x112a86cd0> │ │
│ │ file_template = 'Mix/{mix_name}/{artist_name} - {track_title}' │ │
│ │ fn_logger = <tidal_dl_ng.helper.wrapper.WrapperLogger object at 0x112b0e310> │ │
│ │ id_item = '0161bc50700b85c9c9d68d4da0147d' │ │
│ │ item = 'https://listen.tidal.com/mix/0161bc50700b85c9c9d68d4da0147d' │ │
│ │ list_urls = None │ │
│ │ media_name = 'mix' │ │
│ │ media_type = <MediaType.Mix: 'mix'> │ │
│ │ progress = <rich.progress.Progress object at 0x112a86e90> │ │
│ │ progress_table = <rich.table.Table object at 0x112b0e290> │ │
│ │ settings = <tidal_dl_ng.config.Settings object at 0x112a460d0> │ │
│ │ urls_or_ids = ['https://listen.tidal.com/mix/0161bc50700b85c9c9d68d4da0147d'] │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/local/lib/python3.11/site-packages/tidal_dl_ng/download.py:285 in list │
│ │
│ 282 │ │ │ for media in items: │
│ 283 │ │ │ │ Progress() │
│ 284 │ │ │ │ # TODO: Handle return value of `track` method. │
│ ❱ 285 │ │ │ │ self.item( │
│ 286 │ │ │ │ │ path_base=path_file, │
│ 287 │ │ │ │ │ file_template=file_name_relative, │
│ 288 │ │ │ │ │ media=media, │
│ │
│ ╭─────────────────────────────────────── locals ────────────────────────────────────────╮ │
│ │ download_delay = True │ │
│ │ file_name_relative = 'Mix/My Daily Discovery/{artist_name} - {track_title}' │ │
│ │ file_template = 'Mix/{mix_name}/{artist_name} - {track_title}' │ │
│ │ fn_logger = <tidal_dl_ng.helper.wrapper.WrapperLogger object at 0x112b0e310> │ │
│ │ id_media = '0161bc50700b85c9c9d68d4da0147d' │ │
│ │ items = [ │ │
│ │ │ <tidalapi.media.Track object at 0x112a47f90>, │ │
│ │ │ <tidalapi.media.Track object at 0x112a6d2d0>, │ │
│ │ │ <tidalapi.media.Track object at 0x112b24190>, │ │
│ │ │ <tidalapi.media.Track object at 0x112b27990>, │ │
│ │ │ <tidalapi.media.Track object at 0x112b247d0>, │ │
│ │ │ <tidalapi.media.Track object at 0x112b47e10>, │ │
│ │ │ <tidalapi.media.Track object at 0x112b50110>, │ │
│ │ │ <tidalapi.media.Track object at 0x112b504d0>, │ │
│ │ │ <tidalapi.media.Track object at 0x112b50650>, │ │
│ │ │ <tidalapi.media.Track object at 0x112b507d0> │ │
│ │ ] │ │
│ │ list_media = <tidalapi.mix.Mix object at 0x112b0e590> │ │
│ │ list_media_name = 'My Daily Discovery' │ │
│ │ media = <tidalapi.media.Track object at 0x112a47f90> │ │
│ │ media_type = <MediaType.Mix: 'mix'> │ │
│ │ p_task1 = 0 │ │
│ │ path_base = './download/' │ │
│ │ path_file = './download/' │ │
│ │ progress = <rich.progress.Progress object at 0x112a86e90> │ │
│ │ progress_gui = None │ │
│ │ progress_stdout = True │ │
│ │ self = <tidal_dl_ng.download.Download object at 0x112a86cd0> │ │
│ │ video_download = True │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/local/lib/python3.11/site-packages/tidal_dl_ng/download.py:167 in item │
│ │
│ 164 │ │ │ │ │ else: │
│ 165 │ │ │ │ │ │ tmp_path_file_decrypted = tmp_path_file │
│ 166 │ │ │ │ │ │
│ ❱ 167 │ │ │ │ │ self.metadata_write(media, tmp_path_file_decrypted) │
│ 168 │ │ │ │ elif isinstance(media, Video): │
│ 169 │ │ │ │ │ tmp_path_file_decrypted = self._video(media, tmp_path_file) │
│ 170 │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ block_size = 4096 │ │
│ │ data = b'P*\x012@\xc9@)QBf\xe4\xc2$<0\x84\x94\x0f&J\x05\xa0d\xf8I\x92I\x… │ │
│ │ download_skip = False │ │
│ │ f = <_io.BufferedWriter │ │
│ │ name='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x… │ │
│ │ file_extension = '.flac' │ │
│ │ file_name_relative = 'Mix/My Daily Discovery/Doja Cat - Paint The Town Red' │ │
│ │ file_template = 'Mix/My Daily Discovery/{artist_name} - {track_title}' │ │
│ │ fn_logger = <tidal_dl_ng.helper.wrapper.WrapperLogger object at 0x112b0e310> │ │
│ │ id = None │ │
│ │ media = <tidalapi.media.Track object at 0x112a47f90> │ │
│ │ media_type = None │ │
│ │ needs_decryption = False │ │
│ │ p_task = 1 │ │
│ │ path_base = './download/' │ │
│ │ path_file = '/Users/will/Code/personal-auto-radio-main/download/Mix/My Daily │ │
│ │ Discovery/Doja C'+28 │ │
│ │ progress = <rich.progress.Progress object at 0x112a86e90> │ │
│ │ progress_gui = None │ │
│ │ progress_stdout = True │ │
│ │ r = <Response [200]> │ │
│ │ self = <tidal_dl_ng.download.Download object at 0x112a86cd0> │ │
│ │ stream = <tidalapi.media.Stream object at 0x112ae2990> │ │
│ │ stream_manifest = { │ │
│ │ │ 'mimeType': 'audio/flac', │ │
│ │ │ 'codecs': 'flac', │ │
│ │ │ 'encryptionType': 'NONE', │ │
│ │ │ 'urls': [ │ │
│ │ │ │ │ │
│ │ 'https://sp-pr-cf.audio.tidal.com/mediatracks/CAEaKRInZmEzZWFiMmE… │ │
│ │ │ ] │ │
│ │ } │ │
│ │ stream_url = 'https://sp-pr-cf.audio.tidal.com/mediatracks/CAEaKRInZmEzZWFiMmE… │ │
│ │ tmp_path_dir = '/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_' │ │
│ │ tmp_path_file = '/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/932… │ │
│ │ tmp_path_file_decrypted = '/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/932… │ │
│ │ total_size_in_bytes = 25605975 │ │
│ │ validation_result = False │ │
│ │ video_download = True │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/local/lib/python3.11/site-packages/tidal_dl_ng/download.py:227 in metadata_write │
│ │
│ 224 │ │ │ url_cover=self.cover_url(track.album.cover), │
│ 225 │ │ ) │
│ 226 │ │ │
│ ❱ 227 │ │ m.save() │
│ 228 │ │ │
│ 229 │ │ result = True │
│ 230 │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ copy_right = '' │ │
│ │ lyrics = 'By\nWalk on by\nWalk on by\nWalk on by\nWalk on by\n\nYeah, bitch, I said │ │
│ │ what I said\n'+3299 │ │
│ │ m = <tidal_dl_ng.metadata.Metadata object at 0x112b61090> │ │
│ │ path_file = '/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327cdc8-727b-… │ │
│ │ release_date = '2023-08-04' │ │
│ │ result = False │ │
│ │ self = <tidal_dl_ng.download.Download object at 0x112a86cd0> │ │
│ │ track = <tidalapi.media.Track object at 0x112a47f90> │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/local/lib/python3.11/site-packages/tidal_dl_ng/metadata.py:114 in save │
│ │
│ 111 │ │ │ self.set_mp4() │
│ 112 │ │ │
│ 113 │ │ self._cover() │
│ ❱ 114 │ │ self.m.save() │
│ 115 │ │ │
│ 116 │ │ return True │
│ 117 │
│ │
│ ╭─────────────────────────── locals ───────────────────────────╮ │
│ │ self = <tidal_dl_ng.metadata.Metadata object at 0x112b61090> │ │
│ ╰──────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/local/lib/python3.11/site-packages/mutagen/_util.py:185 in wrapper │
│ │
│ 182 │ │ @wraps(func) │
│ 183 │ │ def wrapper(*args, **kwargs): │
│ 184 │ │ │ try: │
│ ❱ 185 │ │ │ │ return func(*args, **kwargs) │
│ 186 │ │ │ except exc_dest: │
│ 187 │ │ │ │ raise │
│ 188 │ │ │ except exc_src as err: │
│ │
│ │
│ /usr/local/lib/python3.11/site-packages/mutagen/_util.py:156 in wrapper │
│ │
│ 153 │ │ │ │ convert_file_args(args, kwargs) │
│ 154 │ │ │ with _openfile(self, filething, filename, fileobj, │
│ 155 │ │ │ │ │ │ writable, create) as h: │
│ ❱ 156 │ │ │ │ return func(self, h, *args, **kwargs) │
│ 157 │ │ │
│ 158 │ │ @wraps(func) │
│ 159 │ │ def wrapper_func(*args, **kwargs): │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ args = () │ │
│ │ convert_file_args = <function loadfile.<locals>.convert_file_args at 0x111e75440> │ │
│ │ create = False │ │
│ │ filename = None │ │
│ │ fileobj = None │ │
│ │ filething = None │ │
│ │ func = <function FLAC.save at 0x111e75580> │ │
│ │ h = FileThing( │ │
│ │ │ fileobj=<_io.BufferedRandom │ │
│ │ name='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327… │ │
│ │ │ │ │
│ │ filename='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/… │ │
│ │ │ │ │
│ │ name='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327… │ │
│ │ ) │ │
│ │ kwargs = {} │ │
│ │ self = {'album': ['Paint The Town Red'], 'artist': ['Doja Cat'], 'disctotal': │ │
│ │ ['1'], 'albumartist': ['Doja Cat'], 'title': ['Paint The Town Red'], │ │
│ │ 'date': ['2023-08-04'], 'composer': [''], 'tracktotal': ['1'], │ │
│ │ 'copyright': [''], 'tracknumber': ['1'], 'isrc': [None], 'lyrics': │ │
│ │ ["By\nWalk on by\nWalk on by\nWalk on by\nWalk on by\n\nYeah, bitch, I │ │
│ │ said what I said\nI'd rather be famous instead (walk on by)\nI let all │ │
│ │ that get to my head\nI don't care, I paint the town red (walk on │ │
│ │ by)\nBitch, I said what I said\nI'd rather be famous instead (walk on │ │
│ │ by)\nI let all that get to my head\nI don't care, I paint the town red │ │
│ │ (walk on by)\n\nMm, she the devil\nShe a bad lil' bitch, she a rebel │ │
│ │ (walk on by)\nShe put her foot to the pedal\nIt'll take a whole lot for │ │
│ │ me to settle (walk on by)\nMm, she the devil\nShe a bad lil' bitch, she │ │
│ │ a rebel (walk on by)\nShe put her foot to the pedal\nIt'll take a whole │ │
│ │ lot for me (yeah) to settle (walk on by)\n\nYeah, said my happiness is │ │
│ │ all of your misery\nI put good dick all in my kidneys (walk on by)\nThis │ │
│ │ Margiel' don't come with no jealousy\nMy illness don't come with no │ │
│ │ remedy (walk on by)\nI am so much fun without Hennessy\nThey just want │ │
│ │ my love and my energy (walk on by)\nYou can't talk no shit without │ │
│ │ penalties\nBitch, I'm in yo' shit if you send for me (walk on by)\n\nI'm │ │
│ │ going to glow up one more time\nTrust me, I have magical foresight (walk │ │
│ │ on by)\nYou gon' see me sleepin' in courtside\nYou gon' see me eatin' │ │
│ │ ten more times (walk on by)\nUgh, you can't take that bitch │ │
│ │ nowhere\nUgh, I look better with no hair (walk on by)\nUgh, ain't no │ │
│ │ sign I can't smoke here\nUgh (yeah), gimme the chance and I'll go there │ │
│ │ (walk on by)\n\nYeah, bitch, I said what I said\nI'd rather be famous │ │
│ │ instead (walk on by)\nI let all that get to my head\nI don't care, I │ │
│ │ paint the town red (walk on by)\nBitch, I said what I said\nI'd rather │ │
│ │ be famous instead (walk on by)\nI let all that get to my head\nI don't │ │
│ │ care, I paint the town red (walk on by)\n\nMm, she the devil\nShe a bad │ │
│ │ lil' bitch, she a rebel (walk on by)\nShe put her foot to the │ │
│ │ pedal\nIt'll take a whole lot for me to settle (walk on by)\nMm, she the │ │
│ │ devil\nShe a bad lil' bitch, she a rebel (walk on by)\nShe put her foot │ │
│ │ to the pedal\nIt'll take a whole lot (yeah) for me to settle (walk on │ │
│ │ by)\n\nYeah, said pop make money, now you try, bitch\nYou could use a │ │
│ │ revamp with a new vibe, sis (walk on by)\nI don't need a big feature or │ │
│ │ a new sidekick\nI don't need a new fan 'cause my boo like it (walk on │ │
│ │ by)\nI don't need to wear a wig to make you like it\nI'm a two-time │ │
│ │ bitch, you ain't knew I'd win? (Walk on by)\nThrow a shot like you tryna │ │
│ │ have a food fight then\nAll my opps waitin' for me to be you, I bet │ │
│ │ (walk on by)\n\nSaid I got drive, I don't need a car\nMoney really all │ │
│ │ that we fiendin' for (walk on by)\nI'm doin' things they ain't seen │ │
│ │ before\nFans ain't dumb, but extremists are (walk on by)\nI'm a demon │ │
│ │ lord\nFall off what? I ain't seen the horse (walk on by)\nCalled your │ │
│ │ bluff, better cite the source\nFame ain't somethin' that I need no more │ │
│ │ (walk on by)\n\n'Cause, bitch, I said what I said\nI'd rather be famous │ │
│ │ instead (walk on by)\nI let all that get to my head\nI don't care, I │ │
│ │ paint the town red (walk on by)\nBitch, I said what I said\nI'd rather │ │
│ │ be famous instead (walk on by)\nI let all that get to my head\nI don't │ │
│ │ care, I paint the town red (walk on by)\n\nMm, she the devil\nShe a bad │ │
│ │ lil' bitch, she a rebel (walk on by)\nShe put her foot to the │ │
│ │ pedal\nIt'll take a whole lot for me to settle (walk on by)\nMm, she the │ │
│ │ devil\nShe a bad lil' bitch, she a rebel (walk on by)\nShe put her foot │ │
│ │ to the pedal\nIt'll take a whole lot for me to settle (walk on │ │
│ │ by)\n\nWalk on by\nWalk on by\nWalk on by\nWalk on by"], 'discnumber': │ │
│ │ ['1']} │ │
│ │ writable = True │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/local/lib/python3.11/site-packages/mutagen/flac.py:859 in save │
│ │
│ 856 │ │ │ │ raise ValueError("Invalid seektable object type!") │
│ 857 │ │ │ self.metadata_blocks.append(self.seektable) │
│ 858 │ │ │
│ ❱ 859 │ │ self._save(filething, self.metadata_blocks, deleteid3, padding) │
│ 860 │ │
│ 861 │ def _save(self, filething, metadata_blocks, deleteid3, padding): │
│ 862 │ │ f = StrictFileObject(filething.fileobj) │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ deleteid3 = False │ │
│ │ filething = FileThing( │ │
│ │ │ fileobj=<_io.BufferedRandom │ │
│ │ name='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327cdc8-727… │ │
│ │ │ │ │
│ │ filename='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327cdc8… │ │
│ │ │ │ │
│ │ name='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327cdc8-727… │ │
│ │ ) │ │
│ │ padding = None │ │
│ │ self = {'album': ['Paint The Town Red'], 'artist': ['Doja Cat'], 'disctotal': ['1'], │ │
│ │ 'albumartist': ['Doja Cat'], 'title': ['Paint The Town Red'], 'date': │ │
│ │ ['2023-08-04'], 'composer': [''], 'tracktotal': ['1'], 'copyright': [''], │ │
│ │ 'tracknumber': ['1'], 'isrc': [None], 'lyrics': ["By\nWalk on by\nWalk on │ │
│ │ by\nWalk on by\nWalk on by\n\nYeah, bitch, I said what I said\nI'd rather be │ │
│ │ famous instead (walk on by)\nI let all that get to my head\nI don't care, I │ │
│ │ paint the town red (walk on by)\nBitch, I said what I said\nI'd rather be famous │ │
│ │ instead (walk on by)\nI let all that get to my head\nI don't care, I paint the │ │
│ │ town red (walk on by)\n\nMm, she the devil\nShe a bad lil' bitch, she a rebel │ │
│ │ (walk on by)\nShe put her foot to the pedal\nIt'll take a whole lot for me to │ │
│ │ settle (walk on by)\nMm, she the devil\nShe a bad lil' bitch, she a rebel (walk │ │
│ │ on by)\nShe put her foot to the pedal\nIt'll take a whole lot for me (yeah) to │ │
│ │ settle (walk on by)\n\nYeah, said my happiness is all of your misery\nI put good │ │
│ │ dick all in my kidneys (walk on by)\nThis Margiel' don't come with no │ │
│ │ jealousy\nMy illness don't come with no remedy (walk on by)\nI am so much fun │ │
│ │ without Hennessy\nThey just want my love and my energy (walk on by)\nYou can't │ │
│ │ talk no shit without penalties\nBitch, I'm in yo' shit if you send for me (walk │ │
│ │ on by)\n\nI'm going to glow up one more time\nTrust me, I have magical foresight │ │
│ │ (walk on by)\nYou gon' see me sleepin' in courtside\nYou gon' see me eatin' ten │ │
│ │ more times (walk on by)\nUgh, you can't take that bitch nowhere\nUgh, I look │ │
│ │ better with no hair (walk on by)\nUgh, ain't no sign I can't smoke here\nUgh │ │
│ │ (yeah), gimme the chance and I'll go there (walk on by)\n\nYeah, bitch, I said │ │
│ │ what I said\nI'd rather be famous instead (walk on by)\nI let all that get to my │ │
│ │ head\nI don't care, I paint the town red (walk on by)\nBitch, I said what I │ │
│ │ said\nI'd rather be famous instead (walk on by)\nI let all that get to my │ │
│ │ head\nI don't care, I paint the town red (walk on by)\n\nMm, she the devil\nShe │ │
│ │ a bad lil' bitch, she a rebel (walk on by)\nShe put her foot to the pedal\nIt'll │ │
│ │ take a whole lot for me to settle (walk on by)\nMm, she the devil\nShe a bad │ │
│ │ lil' bitch, she a rebel (walk on by)\nShe put her foot to the pedal\nIt'll take │ │
│ │ a whole lot (yeah) for me to settle (walk on by)\n\nYeah, said pop make money, │ │
│ │ now you try, bitch\nYou could use a revamp with a new vibe, sis (walk on by)\nI │ │
│ │ don't need a big feature or a new sidekick\nI don't need a new fan 'cause my boo │ │
│ │ like it (walk on by)\nI don't need to wear a wig to make you like it\nI'm a │ │
│ │ two-time bitch, you ain't knew I'd win? (Walk on by)\nThrow a shot like you │ │
│ │ tryna have a food fight then\nAll my opps waitin' for me to be you, I bet (walk │ │
│ │ on by)\n\nSaid I got drive, I don't need a car\nMoney really all that we │ │
│ │ fiendin' for (walk on by)\nI'm doin' things they ain't seen before\nFans ain't │ │
│ │ dumb, but extremists are (walk on by)\nI'm a demon lord\nFall off what? I ain't │ │
│ │ seen the horse (walk on by)\nCalled your bluff, better cite the source\nFame │ │
│ │ ain't somethin' that I need no more (walk on by)\n\n'Cause, bitch, I said what I │ │
│ │ said\nI'd rather be famous instead (walk on by)\nI let all that get to my │ │
│ │ head\nI don't care, I paint the town red (walk on by)\nBitch, I said what I │ │
│ │ said\nI'd rather be famous instead (walk on by)\nI let all that get to my │ │
│ │ head\nI don't care, I paint the town red (walk on by)\n\nMm, she the devil\nShe │ │
│ │ a bad lil' bitch, she a rebel (walk on by)\nShe put her foot to the pedal\nIt'll │ │
│ │ take a whole lot for me to settle (walk on by)\nMm, she the devil\nShe a bad │ │
│ │ lil' bitch, she a rebel (walk on by)\nShe put her foot to the pedal\nIt'll take │ │
│ │ a whole lot for me to settle (walk on by)\n\nWalk on by\nWalk on by\nWalk on │ │
│ │ by\nWalk on by"], 'discnumber': ['1']} │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/local/lib/python3.11/site-packages/mutagen/flac.py:875 in _save │
│ │
│ 872 │ │ │
│ 873 │ │ content_size = get_size(f) - audio_offset │
│ 874 │ │ assert content_size >= 0 │
│ ❱ 875 │ │ data = MetadataBlock._writeblocks( │
│ 876 │ │ │ metadata_blocks, available, content_size, padding) │
│ 877 │ │ data_size = len(data) │
│ 878 │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ audio_offset = 478 │ │
│ │ available = 474 │ │
│ │ content_size = 25605497 │ │
│ │ deleteid3 = False │ │
│ │ f = <mutagen.flac.StrictFileObject object at 0x112b64750> │ │
│ │ filething = FileThing( │ │
│ │ │ fileobj=<_io.BufferedRandom │ │
│ │ name='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327cd… │ │
│ │ │ │ │
│ │ filename='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/93… │ │
│ │ │ │ │
│ │ name='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327cd… │ │
│ │ ) │ │
│ │ header = 4 │ │
│ │ metadata_blocks = [ │ │
│ │ │ <mutagen.flac.StreamInfo object at 0x112b74110>, │ │
│ │ │ <SeekTable seekpoints=[(0, 0, 4096), (442368, 682783, 4096), (884736, │ │
│ │ 1448766, 4096), (1327104, 2566497, 4096), (1769472, 3743395, 4096), │ │
│ │ (2211840, 5029764, 4096), (2654208, 6301888, 4096), (3096576, 7392502, │ │
│ │ 4096), (3538944, 8475871, 4096), (3981312, 9559462, 4096), (4423680, │ │
│ │ 10677017, 4096), (4866048, 11822337, 4096), (5308416, 13027215, 4096), │ │
│ │ (5750784, 14314076, 4096), (6193152, 15533291, 4096), (6635520, 16683240, │ │
│ │ 4096), (7077888, 17799734, 4096), (7520256, 18910079, 4096), (7962624, │ │
│ │ 20036396, 4096), (8404992, 21190777, 4096), (8847360, 22454406, 4096), │ │
│ │ (9289728, 23751243, 4096), (9732096, 24704583, 4096), (10174464, 25601407, │ │
│ │ 4096)]>, │ │
│ │ │ [ │ │
│ │ │ │ ('title', 'Paint The Town Red'), │ │
│ │ │ │ ('album', 'Paint The Town Red'), │ │
│ │ │ │ ('albumartist', 'Doja Cat'), │ │
│ │ │ │ ('artist', 'Doja Cat'), │ │
│ │ │ │ ('copyright', ''), │ │
│ │ │ │ ('tracknumber', '1'), │ │
│ │ │ │ ('tracktotal', '1'), │ │
│ │ │ │ ('discnumber', '1'), │ │
│ │ │ │ ('disctotal', '1'), │ │
│ │ │ │ ('date', '2023-08-04'), │ │
│ │ │ │ ... +3 │ │
│ │ │ ], │ │
│ │ │ <Picture 'image/jpeg' (10402 bytes)> │ │
│ │ ] │ │
│ │ padding = None │ │
│ │ self = {'album': ['Paint The Town Red'], 'artist': ['Doja Cat'], 'disctotal': │ │
│ │ ['1'], 'albumartist': ['Doja Cat'], 'title': ['Paint The Town Red'], │ │
│ │ 'date': ['2023-08-04'], 'composer': [''], 'tracktotal': ['1'], │ │
│ │ 'copyright': [''], 'tracknumber': ['1'], 'isrc': [None], 'lyrics': │ │
│ │ ["By\nWalk on by\nWalk on by\nWalk on by\nWalk on by\n\nYeah, bitch, I │ │
│ │ said what I said\nI'd rather be famous instead (walk on by)\nI let all │ │
│ │ that get to my head\nI don't care, I paint the town red (walk on │ │
│ │ by)\nBitch, I said what I said\nI'd rather be famous instead (walk on │ │
│ │ by)\nI let all that get to my head\nI don't care, I paint the town red │ │
│ │ (walk on by)\n\nMm, she the devil\nShe a bad lil' bitch, she a rebel (walk │ │
│ │ on by)\nShe put her foot to the pedal\nIt'll take a whole lot for me to │ │
│ │ settle (walk on by)\nMm, she the devil\nShe a bad lil' bitch, she a rebel │ │
│ │ (walk on by)\nShe put her foot to the pedal\nIt'll take a whole lot for me │ │
│ │ (yeah) to settle (walk on by)\n\nYeah, said my happiness is all of your │ │
│ │ misery\nI put good dick all in my kidneys (walk on by)\nThis Margiel' │ │
│ │ don't come with no jealousy\nMy illness don't come with no remedy (walk on │ │
│ │ by)\nI am so much fun without Hennessy\nThey just want my love and my │ │
│ │ energy (walk on by)\nYou can't talk no shit without penalties\nBitch, I'm │ │
│ │ in yo' shit if you send for me (walk on by)\n\nI'm going to glow up one │ │
│ │ more time\nTrust me, I have magical foresight (walk on by)\nYou gon' see │ │
│ │ me sleepin' in courtside\nYou gon' see me eatin' ten more times (walk on │ │
│ │ by)\nUgh, you can't take that bitch nowhere\nUgh, I look better with no │ │
│ │ hair (walk on by)\nUgh, ain't no sign I can't smoke here\nUgh (yeah), │ │
│ │ gimme the chance and I'll go there (walk on by)\n\nYeah, bitch, I said │ │
│ │ what I said\nI'd rather be famous instead (walk on by)\nI let all that get │ │
│ │ to my head\nI don't care, I paint the town red (walk on by)\nBitch, I said │ │
│ │ what I said\nI'd rather be famous instead (walk on by)\nI let all that get │ │
│ │ to my head\nI don't care, I paint the town red (walk on by)\n\nMm, she the │ │
│ │ devil\nShe a bad lil' bitch, she a rebel (walk on by)\nShe put her foot to │ │
│ │ the pedal\nIt'll take a whole lot for me to settle (walk on by)\nMm, she │ │
│ │ the devil\nShe a bad lil' bitch, she a rebel (walk on by)\nShe put her │ │
│ │ foot to the pedal\nIt'll take a whole lot (yeah) for me to settle (walk on │ │
│ │ by)\n\nYeah, said pop make money, now you try, bitch\nYou could use a │ │
│ │ revamp with a new vibe, sis (walk on by)\nI don't need a big feature or a │ │
│ │ new sidekick\nI don't need a new fan 'cause my boo like it (walk on by)\nI │ │
│ │ don't need to wear a wig to make you like it\nI'm a two-time bitch, you │ │
│ │ ain't knew I'd win? (Walk on by)\nThrow a shot like you tryna have a food │ │
│ │ fight then\nAll my opps waitin' for me to be you, I bet (walk on │ │
│ │ by)\n\nSaid I got drive, I don't need a car\nMoney really all that we │ │
│ │ fiendin' for (walk on by)\nI'm doin' things they ain't seen before\nFans │ │
│ │ ain't dumb, but extremists are (walk on by)\nI'm a demon lord\nFall off │ │
│ │ what? I ain't seen the horse (walk on by)\nCalled your bluff, better cite │ │
│ │ the source\nFame ain't somethin' that I need no more (walk on │ │
│ │ by)\n\n'Cause, bitch, I said what I said\nI'd rather be famous instead │ │
│ │ (walk on by)\nI let all that get to my head\nI don't care, I paint the │ │
│ │ town red (walk on by)\nBitch, I said what I said\nI'd rather be famous │ │
│ │ instead (walk on by)\nI let all that get to my head\nI don't care, I paint │ │
│ │ the town red (walk on by)\n\nMm, she the devil\nShe a bad lil' bitch, she │ │
│ │ a rebel (walk on by)\nShe put her foot to the pedal\nIt'll take a whole │ │
│ │ lot for me to settle (walk on by)\nMm, she the devil\nShe a bad lil' │ │
│ │ bitch, she a rebel (walk on by)\nShe put her foot to the pedal\nIt'll take │ │
│ │ a whole lot for me to settle (walk on by)\n\nWalk on by\nWalk on by\nWalk │ │
│ │ on by\nWalk on by"], 'discnumber': ['1']} │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/local/lib/python3.11/site-packages/mutagen/flac.py:153 in _writeblocks │
│ │
│ 150 │ │ for block in blocks: │
│ 151 │ │ │ if isinstance(block, Padding): │
│ 152 │ │ │ │ continue │
│ ❱ 153 │ │ │ data += cls._writeblock(block) │
│ 154 │ │ blockssize = len(data) │
│ 155 │ │ │
│ 156 │ │ # take the padding overhead into account. we always add one │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ available = 474 │ │
│ │ block = [ │ │
│ │ │ ('title', 'Paint The Town Red'), │ │
│ │ │ ('album', 'Paint The Town Red'), │ │
│ │ │ ('albumartist', 'Doja Cat'), │ │
│ │ │ ('artist', 'Doja Cat'), │ │
│ │ │ ('copyright', ''), │ │
│ │ │ ('tracknumber', '1'), │ │
│ │ │ ('tracktotal', '1'), │ │
│ │ │ ('discnumber', '1'), │ │
│ │ │ ('disctotal', '1'), │ │
│ │ │ ('date', '2023-08-04'), │ │
│ │ │ ... +3 │ │
│ │ ] │ │
│ │ blocks = [ │ │
│ │ │ <mutagen.flac.StreamInfo object at 0x112b74110>, │ │
│ │ │ <SeekTable seekpoints=[(0, 0, 4096), (442368, 682783, 4096), (884736, │ │
│ │ 1448766, 4096), (1327104, 2566497, 4096), (1769472, 3743395, 4096), (2211840, │ │
│ │ 5029764, 4096), (2654208, 6301888, 4096), (3096576, 7392502, 4096), (3538944, │ │
│ │ 8475871, 4096), (3981312, 9559462, 4096), (4423680, 10677017, 4096), │ │
│ │ (4866048, 11822337, 4096), (5308416, 13027215, 4096), (5750784, 14314076, │ │
│ │ 4096), (6193152, 15533291, 4096), (6635520, 16683240, 4096), (7077888, │ │
│ │ 17799734, 4096), (7520256, 18910079, 4096), (7962624, 20036396, 4096), │ │
│ │ (8404992, 21190777, 4096), (8847360, 22454406, 4096), (9289728, 23751243, │ │
│ │ 4096), (9732096, 24704583, 4096), (10174464, 25601407, 4096)]>, │ │
│ │ │ [ │ │
│ │ │ │ ('title', 'Paint The Town Red'), │ │
│ │ │ │ ('album', 'Paint The Town Red'), │ │
│ │ │ │ ('albumartist', 'Doja Cat'), │ │
│ │ │ │ ('artist', 'Doja Cat'), │ │
│ │ │ │ ('copyright', ''), │ │
│ │ │ │ ('tracknumber', '1'), │ │
│ │ │ │ ('tracktotal', '1'), │ │
│ │ │ │ ('discnumber', '1'), │ │
│ │ │ │ ('disctotal', '1'), │ │
│ │ │ │ ('date', '2023-08-04'), │ │
│ │ │ │ ... +3 │ │
│ │ │ ], │ │
│ │ │ <Picture 'image/jpeg' (10402 bytes)> │ │
│ │ ] │ │
│ │ cls = <class 'mutagen.flac.MetadataBlock'> │ │
│ │ cont_size = 25605497 │ │
│ │ data = bytearray(b'\x00\x00\x00"\x10\x00\x10\x00\x00\x00\x0e\x005M\n\xc4B\xf0\x00\x… │ │
│ │ \x8b\x7f\x10\x00\x00\x00\x00\x00\x00y\x80\x00\x00\x00\x00\x00\x011\xbb,\x10\… │ │
│ │ padding_func = None │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/local/lib/python3.11/site-packages/mutagen/flac.py:125 in _writeblock │
│ │
│ 122 │ │ │
│ 123 │ │ data = bytearray() │
│ 124 │ │ code = (block.code | 128) if is_last else block.code │
│ ❱ 125 │ │ datum = block.write() │
│ 126 │ │ size = len(datum) │
│ 127 │ │ if size > cls._MAX_SIZE: │
│ 128 │ │ │ if block._distrust_size and block._invalid_overflow_size != -1: │
│ │
│ ╭──────────────────── locals ────────────────────╮ │
│ │ block = [ │ │
│ │ │ ( │ │
│ │ │ │ 'title', │ │
│ │ │ │ 'Paint The Town Red' │ │
│ │ │ ), │ │
│ │ │ ( │ │
│ │ │ │ 'album', │ │
│ │ │ │ 'Paint The Town Red' │ │
│ │ │ ), │ │
│ │ │ ('albumartist', 'Doja Cat'), │ │
│ │ │ ('artist', 'Doja Cat'), │ │
│ │ │ ('copyright', ''), │ │
│ │ │ ('tracknumber', '1'), │ │
│ │ │ ('tracktotal', '1'), │ │
│ │ │ ('discnumber', '1'), │ │
│ │ │ ('disctotal', '1'), │ │
│ │ │ ('date', '2023-08-04'), │ │
│ │ │ ... +3 │ │
│ │ ] │ │
│ │ cls = <class 'mutagen.flac.MetadataBlock'> │ │
│ │ code = 4 │ │
│ │ data = bytearray(b'') │ │
│ │ is_last = False │ │
│ ╰────────────────────────────────────────────────╯ │
│ │
│ /usr/local/lib/python3.11/site-packages/mutagen/flac.py:356 in write │
│ │
│ 353 │ │ super(VCFLACDict, self).load(data, errors=errors, framing=framing) │
│ 354 │ │
│ 355 │ def write(self, framing=False): │
│ ❱ 356 │ │ return super(VCFLACDict, self).write(framing=framing) │
│ 357 │
│ 358 │
│ 359 class CueSheetTrackIndex(tuple): │
│ │
│ ╭──────────────────── locals ────────────────────╮ │
│ │ framing = False │ │
│ │ self = [ │ │
│ │ │ ( │ │
│ │ │ │ 'title', │ │
│ │ │ │ 'Paint The Town Red' │ │
│ │ │ ), │ │
│ │ │ ( │ │
│ │ │ │ 'album', │ │
│ │ │ │ 'Paint The Town Red' │ │
│ │ │ ), │ │
│ │ │ ('albumartist', 'Doja Cat'), │ │
│ │ │ ('artist', 'Doja Cat'), │ │
│ │ │ ('copyright', ''), │ │
│ │ │ ('tracknumber', '1'), │ │
│ │ │ ('tracktotal', '1'), │ │
│ │ │ ('discnumber', '1'), │ │
│ │ │ ('disctotal', '1'), │ │
│ │ │ ('date', '2023-08-04'), │ │
│ │ │ ... +3 │ │
│ │ ] │ │
│ ╰────────────────────────────────────────────────╯ │
│ │
│ /usr/local/lib/python3.11/site-packages/mutagen/_vorbis.py:177 in write │
│ │
│ 174 │ │ │ framing (bool): if true, append a framing bit (see load) │
│ 175 │ │ """ │
│ 176 │ │ │
│ ❱ 177 │ │ self.validate() │
│ 178 │ │ │
│ 179 │ │ def _encode(value): │
│ 180 │ │ │ if not isinstance(value, bytes): │
│ │
│ ╭──────────────────── locals ────────────────────╮ │
│ │ framing = False │ │
│ │ self = [ │ │
│ │ │ ( │ │
│ │ │ │ 'title', │ │
│ │ │ │ 'Paint The Town Red' │ │
│ │ │ ), │ │
│ │ │ ( │ │
│ │ │ │ 'album', │ │
│ │ │ │ 'Paint The Town Red' │ │
│ │ │ ), │ │
│ │ │ ('albumartist', 'Doja Cat'), │ │
│ │ │ ('artist', 'Doja Cat'), │ │
│ │ │ ('copyright', ''), │ │
│ │ │ ('tracknumber', '1'), │ │
│ │ │ ('tracktotal', '1'), │ │
│ │ │ ('discnumber', '1'), │ │
│ │ │ ('disctotal', '1'), │ │
│ │ │ ('date', '2023-08-04'), │ │
│ │ │ ... +3 │ │
│ │ ] │ │
│ ╰────────────────────────────────────────────────╯ │
│ │
│ /usr/local/lib/python3.11/site-packages/mutagen/_vorbis.py:157 in validate │
│ │
│ 154 │ │ │ │
│ 155 │ │ │ if not isinstance(value, str): │
│ 156 │ │ │ │ err = "%r needs to be str for key %r" % (value, key) │
│ ❱ 157 │ │ │ │ raise ValueError(err) │
│ 158 │ │ │
│ 159 │ │ return True │
│ 160 │
│ │
│ ╭─────────────────── locals ────────────────────╮ │
│ │ err = "None needs to be str for key 'isrc'" │ │
│ │ key = 'isrc' │ │
│ │ self = [ │ │
│ │ │ ('title', 'Paint The Town Red'), │ │
│ │ │ ('album', 'Paint The Town Red'), │ │
│ │ │ ('albumartist', 'Doja Cat'), │ │
│ │ │ ('artist', 'Doja Cat'), │ │
│ │ │ ('copyright', ''), │ │
│ │ │ ('tracknumber', '1'), │ │
│ │ │ ('tracktotal', '1'), │ │
│ │ │ ('discnumber', '1'), │ │
│ │ │ ('disctotal', '1'), │ │
│ │ │ ('date', '2023-08-04'), │ │
│ │ │ ... +3 │ │
│ │ ] │ │
│ │ value = None │ │
│ ╰───────────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
ValueError: None needs to be str for key 'isrc'
Currently there is no information about the audio resolution of an album or track in the result tree.
That's why we have to look in the original Tidal App or Web Player which quality the album has.
I would need the quality to make sure it's the correct album and if the album has a higher quality than the album I already have.
This could be done by upgrading to tidalapi version 0.7.5 and the use of the get_audio_resolution
- method which is part of the album class.
As this results in a much higher traffic load this should only be executed on the album and not the individual tracks.
For the individual tracks there is the audio_quality
option, but I don't know how big the impact of this method is if it's executed on every track.
Any chance we can have the ability to search for tracks by supplying the {ARTIST} - {TRACK} when using the CLI?
If I search, for instance, for playlists I would like to see what their content is within the GUI. It would be great, if the result view in the right half of the GUI could have something like a +
button, which would expand the list and show me the items, so I can download only selected items.
v0.9.0
Windows
No response
{"skip_existing": "exact", "lyrics_embed": true, "lyrics_file": false, "video_download": false, "download_delay": false, "download_base_path": "C:\\Users\\PingwinekX\\Music", "quality_audio": "HI_RES_LOSSLESS", "quality_video": 360, "format_album": "Albums/{artist_name} - {album_title}/{track_num}. {artist_name} - {track_title}", "format_playlist": "Playlists/{playlist_name}/{artist_name} - {track_title}", "format_mix": "Mix/{mix_name}/{artist_name} - {track_title}", "format_track": "Tracks/{artist_name} - {track_title}", "format_video": "Videos/{artist_name} - {track_title}", "video_convert_mp4": false, "metadata_cover_dimension": "1280x1280"}
Problem : Tidal only available for few countries and some people can't buy (Geo Restrict / Payment Issues / etc.)
Note : If you don't have any interest, feel free to leave, no problem.
If you can add this API (like external adapter) it will be great, and it's totally free and open source.
Solution : https://github.com/sachinsenal0x64/hifi-tui?tab=readme-ov-file#-api-documentation
Goal : Free Access Without Any Subscription and We DO NOT encourage piracy
the errors start on 3rd track. highest quality, save lyrics to file turned on
I'd like to have the ability to send the timed lyrics to dedicated file with the idnetial song name, just a different extension (.lrc)
ex: 01-song.flac
01-song.lrc
contents of the file is like:
[00:12.00]Line 1 lyrics
[00:17.20]Line 2 lyrics
These timed lyrics are already being pulled from tidal-dl-ng, just need to write it to the file, and add a config option for "lyricsfile : true/false" in the json config
Tag year Is missing on final file. Is posible implement this one?
Heya .... currently there is no support for artist download of all singles and albums? Is this something that can be integrated?
I have tested the latest version, and it works great. But testing the latest quality (hiress_lossles) and the (hires), the file extension is M4A, is everything ok? It is no longer FLAC?
why won't it let me sign in with my details?
Currently the media is downlaoded as a stream via the get_stream
-method.
The problem is that this should only be used for streaming a real song and not downloading it.
As a consequence, because of the sometimes slow download / stream speed, the download lasts longer than 30 seconds which indicates a stream in Tidal.
Thereby not only the statistics of the personal account will be modified,
but this also affects the amount of "streams" / "clicks" of a track which shouldn't be influenced (because artists are paid depending on the amount of streams they have and it's explicitly forbidden regarding the Usage guidelines).
In addition from the perspective of Tidal is looks like you randomly skip tracks and "hear" them a random time which could look a bit weird and suspicious.
If it's possible to still get the higher bit-rates and sample-rates I would suggest to switch from get_stream
to get_url
.
Hi @exislow,
I know you are quite busy working on adding PKCE login method to your next release, which I'm so eagerly waiting for, but still wanted to ask if you could consider adding a feature in your CLI command to set the download path, quality and url(s) all in one line.
For example, something like:
tidal-dl-ng cfg download_base_path "/mnt/test/" quality "Hi-Res" dl https://tidal.com/browse/track/xxxxxxxxxx
Thanks in advance
First of all:
Thanks and keep up the good work!
Unfortunately, I am experiencing the following error:
When downloading an album, the following error sometimes occurs (see log output):
"TypeError: 'NoneType' object is not iterable"
Example:
Frankie Goes To Hollywood - Welcome To The Pleasuredome (album_id: 86639807)
As soon as the first track has reached 100%, the said error is displayed, but it is not always the first track, e.g. with the album (Schiller - Zeitreise - Das Beste von Schiller) the error occurs after the fourth track.
v0.8.2
Linux
Traceback (most recent call last):
File "/home/eric/.pyenv/versions/3.11.8/lib/python3.11/site-packages/tidal_dl_ng/worker.py", line 31, in run
self.fn(*self.args, **self.kwargs)
File "/home/eric/.pyenv/versions/3.11.8/lib/python3.11/site-packages/tidal_dl_ng/gui.py", line 521, in on_download_results
self.download(media, self.dl, delay_track=download_delay)
File "/home/eric/.pyenv/versions/3.11.8/lib/python3.11/site-packages/tidal_dl_ng/gui.py", line 535, in download
dl.items(
File "/home/eric/.pyenv/versions/3.11.8/lib/python3.11/site-packages/tidal_dl_ng/download.py", line 382, in items
status_download, result_path_file = self.item(
^^^^^^^^^^
File "/home/eric/.pyenv/versions/3.11.8/lib/python3.11/site-packages/tidal_dl_ng/download.py", line 233, in item
tmp_path_file = self._download(media=media, stream_manifest=stream_manifest, path_file=tmp_path_file)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/eric/.pyenv/versions/3.11.8/lib/python3.11/site-packages/tidal_dl_ng/download.py", line 153, in _download
self.metadata_write(media, tmp_path_file_decrypted)
File "/home/eric/.pyenv/versions/3.11.8/lib/python3.11/site-packages/tidal_dl_ng/download.py", line 328, in metadata_write
m.save()
File "/home/eric/.pyenv/versions/3.11.8/lib/python3.11/site-packages/tidal_dl_ng/metadata.py", line 97, in save
self.set_mp4()
File "/home/eric/.pyenv/versions/3.11.8/lib/python3.11/site-packages/tidal_dl_ng/metadata.py", line 143, in set_mp4
self.m.tags["\xa9lyr"] = self.lyrics
~~~~~~~~~~~^^^^^^^^^^^
File "/home/eric/.pyenv/versions/3.11.8/lib/python3.11/site-packages/mutagen/mp4/__init__.py", line 372, in __setitem__
self._render(key, value)
File "/home/eric/.pyenv/versions/3.11.8/lib/python3.11/site-packages/mutagen/mp4/__init__.py", line 388, in _render
return render_func(self, key, value, *render_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/eric/.pyenv/versions/3.11.8/lib/python3.11/site-packages/mutagen/mp4/__init__.py", line 822, in __render_text
for v in value:
TypeError: 'NoneType' object is not iterable
{"skip_existing": "exact", "lyrics_embed": true, "lyrics_file": false, "video_download": true, "download_delay": true, "download_base_path": "/home/eric/Musik", "quality_audio": "HI_RES_LOSSLESS", "quality_video": 1080, "format_album": "Albums/{artist_name}/{album_title}/{track_num} - {track_title}", "format_playlist": "Playlists/{playlist_name}/{artist_name} - {track_title}", "format_mix": "Mix/{mix_name}/{artist_name} - {track_title}", "format_track": "Tracks/{artist_name}/{track_title}/{track_num} - {track_title}", "format_video": "Videos/{artist_name}/{track_title}", "video_convert_mp4": true, "metadata_cover_dimension": "1280x1280"}
Currently, when we download a playlist, the program will check if the file already exists in the playlist folder. It would be nice to have a config field that just checks the name of the file and not the extension.
USE CASE: As a DJ, you might want to convert all your downloaded files to a different format within the same folder to avoid unnecessary copies, having this feature will allow us to maintain a unified directory for downloading and consumption, ultimately being able to download only new songs in that playlist regardless of file extension.
I found a small problem which is related to the track name (and the corresponding filename):
The bug occured e.g. for the following compilation: https://listen.tidal.com/album/199830585
Specifically the 4th track has the title "Wir werden sehen (Paul Kalkbrenner Remix 2020 edit)".
When analyzing the file the track-name consists only of the title but not the remix name (see image below).
It would be nice if the information about remixes and other data of this kind is included in the tags.
I think the full name of the track including the version can be received by track.full_name
.
Thank you for your work!
v0.8.3
Linux
No response
{"skip_existing": "exact", "lyrics_embed": true, "lyrics_file": false, "video_download": true, "download_delay": true, "download_base_path": "/home/eric/Musik", "quality_audio": "HI_RES_LOSSLESS", "quality_video": 1080, "format_album": "{artist_name}/{album_title}/{track_num} - {track_title}", "format_playlist": "Playlists/{playlist_name}/{artist_name} - {track_title}", "format_mix": "Mix/{mix_name}/{artist_name} - {track_title}", "format_track": "{artist_name}/{track_title}/{track_num} - {track_title}", "format_video": "Videos/{artist_name}/{track_title}", "video_convert_mp4": true, "metadata_cover_dimension": "1280x1280"}
I was downloading from an old playlist, when it ran into a song that has been removed from Tidal, but is still in the playlist itself. It hits this 401 error and stops everything. I think the appropriate action would be to say that the track isn't available and move on to the next song.
Response was <Response [401]>
Response json was {'status': 401, 'subStatus': 4005, 'userMessage': 'Asset is not ready for playback'}
Example https://tidal.com/browse/track/345695655. When I'm trying to import the downloaded files to MusicBee library it shows errors that file is corrupted. The song plays normally, but all tags are empty and stuff like bitrate or sample rate is unknown. Checked it in (windows 11) Media Player and there are tags shown and editable but the bit rate is still unknown/nothing so there has to be something wrong with the file. I checked if embeded lyrics matter, they dont.
0.8.3
Windows
No response
{"skip_existing": false, "lyrics_embed": false, "lyrics_file": false, "video_download": false, "download_delay": false, "download_base_path": "C:\\Users\\PingwinekX\\Music", "quality_audio": "HI_RES_LOSSLESS", "quality_video": 360, "format_album": "Albums/{artist_name} - {album_title}/{track_num}. {artist_name} - {track_title}", "format_playlist": "Playlists/{playlist_name}/{artist_name} - {track_title}", "format_mix": "Mix/{mix_name}/{artist_name} - {track_title}", "format_track": "Tracks/{artist_name} - {track_title}", "format_video": "Videos/{artist_name} - {track_title}", "video_convert_mp4": true, "metadata_cover_dimension": "320x320"}
Make default conservation in the format of a flac or selection of format. When using files in ROON, M4A is not supported and has to be converted, doing unnecessary work, not all digital transports also support M4A. Also, if the maintenance of the release in the MQA is chosen, then there should be an identification mark of the format, it does not need to be redrawn, but leave as it is. The choice of 16/44.1 or HD-flac should only be for files in the HD-flac format.
It’s also a good idea to add a search using a link from Tidal; searching by name is very inconvenient.
Thank you.
Running .exe version on Windows 11.
When downloading a video, if you have the preference 'convert to mp4' enabled, but don't have FFMPEG location in PATH environment variable, process will just hang with no feedback.
Before downloading a video, if the 'convert to mp4' option is enabled you could check for ffmpeg being in PATH and display a message before download.
Or alternatively after downloading, rather than hanging when unable to launch ffmpeg, you could provide the feedback of ffmpeg not found & leave the video as .ts file.
Hello,
While trying to download 24bit/192khz songs from Tidal it seems like Tidal-dl new gen can only download up to 48khz I think it is MQA (same with Yaronzz's tidal-dl)
Here you can see the track is 24/192
after I've downloaded it using your GUI
and it shows up as being 48000hz
It would be cool if you could fix up Tidal-dl new gen and support the downloading of Tidal hi-res lossless and not being directed to mqa instead.
If this is a user issue please let me know how to fix it, it'll be greatly appreciated.
Is it possible to add Hi-res FLAC support ? it is downloading in m4a/ALAC though......
The app icon is not showing, whether in tray nor as app icon.
OS: Windows 11 23H2
TIDAL-Downloader-NG.exe - v0.4.31
Seems to randomly crash; sometimes at launch, sometimes when trying to download a file (and then re-launching & downloading same file doesn't crash).
Not sure if there is a log file with more info to include?
Event Viewer shows faulting module is different each time. Seems a mix of Qt6Gui.dll, ntdll.dll, VCRuntime140.dll
It's A safe or not safe?
I have tested the new ui version, my operating system is windows 10.
and I found these bugs:
initially when i put the parameters in hi_res_lossles the program closes suddenly. i have started it again and i have put the value in hi_res and everything went correctly. Although it is not 24B, that is another matter.
the album comes out without the album name, instead it says {title}.
the file options button doesn't work, I haven't got it to do anything.
I will continue to report any errors I find. thanks for your work.
OS: Windows 11
TIDAL-Downloader-NG.exe release 0.4.31
When searching for songs & tracks have multiple artists, only the first artist is displayed in the GUI. Can make it tricky when trying to select particular versions/remixes of a song.
Album artist tag has track name in it example 1st song "artist1 - track1name", 2nd song "artist1 - track2name" instead of just artist name across every album track making every track a new album (in musicbee for example) and even when im downloading songs in lowest quality (2-3MB file) it takes as long as downloading highest but im not sure if it depends on u or tidal
0.8.2
Windows
No response
{"skip_existing": "exact", "lyrics_embed": false, "lyrics_file": false, "video_download": true, "download_delay": false, "download_base_path": "C:\\Users\\Admin\\Music", "quality_audio": "LOW", "quality_video": 360, "format_album": "Albums/{artist_name} - {album_title}/{track_num}. {artist_name} - {track_title}", "format_playlist": "Playlists/{playlist_name}/{artist_name} - {track_title}", "format_mix": "Mix/{mix_name}/{artist_name} - {track_title}", "format_track": "Tracks/{artist_name} - {track_title}", "format_video": "Videos/{artist_name} - {track_title}", "video_convert_mp4": true, "metadata_cover_dimension": "1280x1280"}
Hello,
I'm struggling to pass new values of configuration paramaters via CLI.
Following your instructions I tried every possible methods I could think of but couldn't pass a new value to certain parameter.
Please see one of the ways I tried to pass the respective arguments to set a new value to download folder parameter.
Can you provide an example to pass multiple values for multiple parametrs in one line?
Also, is it possible to combine dl command and cfg in one CLI command?
Many thanks in advance.
The CLI command:
tidal-dl-ng cfg --names download_base_path "/mnt/test/"
Error:
Got unexpected extra argument (/mnt/test/)
OS: Windows 11
Tidal-Downloader-NG.exe release 0.4.31
Haven't found a reliable way to reproduce this, however a few times now when downloading (has happened on Video, and also audio). When you select the track & then click download, it will get stuck showing 0% complete and make no progress.
Rest of UI seems responsive still, however cannot start any new downloads until you close & re-open.
Seems to occur more often with Video (selecting 1080p) and Lossless audio... Wonder if its maybe something to do with trying to get a 1080p video, or flac audio when source isn't available... If thats the case, would it be possible to have GUI indicate versions available for selected track.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.