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
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
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:
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.
why won't it let me sign in with my details?
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.
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.
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.
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.
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
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.
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'}
Is it possible to add Hi-res FLAC support ? it is downloading in m4a/ALAC though......
Heya .... currently there is no support for artist download of all singles and albums? Is this something that can be integrated?
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 :)
the errors start on 3rd track. highest quality, save lyrics to file turned on
Tag year Is missing on final file. Is posible implement this one?
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
The app icon is not showing, whether in tray nor as app icon.
It's A safe or not safe?
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'
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
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
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.
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"}
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.
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
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.
Any chance we can have the ability to search for tracks by supplying the {ARTIST} - {TRACK} when using the CLI?
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
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?
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
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.
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?
Only downloading M4a files and not max
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
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
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/)
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.