Closed Dialgatrainer02 closed 8 months ago
Can you please paste your settings.json
? Cannot re-produce this so far.
Can you reliable re-produce this error? For me it works just fine with your config. Which version of this app do you use?
Maybe it is something country specific. Anyway... Please debug this line: https://github.com/exislow/tidal-dl-ng/blob/2559913d8b9cfbaa96c51c2fbaf6952d297ea987/tidal_dl_ng/download.py#L314
I need the content of track.album
.
yes i can reliably reproduce app version is 0.7.1 im in the uk
i placed a breakpoint after the class m is defined whioch is the closest i could get p m = <tidal_dl_ng.metadata.Metadata object at 0x7b6859263d50>
ii was being dumb track.name is "all Of Me" track.album gives me
/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.VID │
│ ❱ 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 0x75fb7ba0b4d0> │ │
│ │ dl = <tidal_dl_ng.download.Download object at │ │
│ │ 0x75fb7bad6610> │ │
│ │ file_template = 'Tracks/{artist_name} - {track_title}' │ │
│ │ fn_logger = <tidal_dl_ng.helper.wrapper.LoggerWrapped │ │
│ │ object at 0x75fb7bac6190> │ │
│ │ item = 'https://tidal.com/browse/track/152668960' │ │
│ │ item_id = '152668960' │ │
│ │ list_urls = None │ │
│ │ media_type = <MediaType.TRACK: 'track'> │ │
│ │ progress = <rich.progress.Progress object at │ │
│ │ 0x75fb7d3d3e90> │ │
│ │ progress_table = <rich.table.Table object at 0x75fb7bad6b50> │ │
│ │ settings = <tidal_dl_ng.config.Settings object at │ │
│ │ 0x75fb7b76e190> │ │
│ │ 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_ │
│ 229 │ │ │ │ tmp_path_file = os.path.join(tmp_path_dir, s │
│ 230 │ │ │ │ # Download media. │
│ ❱ 231 │ │ │ │ tmp_path_file = self._download(media=media, │
│ 232 │ │ │ │ │
│ 233 │ │ │ │ if isinstance(media, Video) and self.setting │
│ 234 │ │ │ │ │ # Convert `*.ts` file to `*.mp4` using f │
│ │
│ ╭──────────────────────────── locals ────────────────────────────╮ │
│ │ download_skip = False │ │
│ │ file_name_relative = 'Tracks/The Score, Travis Barker - All Of │ │
│ │ Me' │ │
│ │ file_template = 'Tracks/{artist_name} - {track_title}' │ │
│ │ manifest = 'PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0… │ │
│ │ media = <tidalapi.media.Track object at │ │
│ │ 0x75fb7bad7b50> │ │
│ │ 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 │ │
│ │ 0x75fb7bad6610> │ │
│ │ stream = <tidalapi.media.Stream object at │ │
│ │ 0x75fb7bac66d0> │ │
│ │ stream_manifest = StreamManifest( │ │
│ │ │ codecs='mp4a.40.2', │ │
│ │ │ mime_type='audio/mp4', │ │
│ │ │ urls=[ │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediat… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediat… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediat… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediat… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediat… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediat… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediat… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediat… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediat… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediat… │ │
│ │ │ │ ... +32 │ │
│ │ │ ], │ │
│ │ │ file_extension='.m4a', │ │
│ │ │ encryption_type='NONE', │ │
│ │ │ encryption_key=None │ │
│ │ ) │ │
│ │ tmp_path_dir = '/tmp/tmp1h7dpi92' │ │
│ │ tmp_path_file = '/tmp/tmp1h7dpi92/87f7f750-1575-45fa-92c… │ │
│ │ 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_decrypt │
│ 153 │ │ │
│ 154 │ │ return tmp_path_file_decrypted │
│ 155 │
│ │
│ ╭──────────────────────────── locals ────────────────────────────╮ │
│ │ block_size = None │ │
│ │ data = b'\x00\x00\x05\x94moof\x00\x00\x00\… │ │
│ │ f = <_io.BufferedWriter │ │
│ │ name='/tmp/tmp1h7dpi92/87f7f750-157… │ │
│ │ media = <tidalapi.media.Track object at │ │
│ │ 0x75fb7bad7b50> │ │
│ │ media_name = 'The Score, Travis Barker - All Of │ │
│ │ Me' │ │
│ │ needs_decryption = False │ │
│ │ p_task = 0 │ │
│ │ path_file = '/tmp/tmp1h7dpi92/87f7f750-1575-45f… │ │
│ │ progress_stdout = True │ │
│ │ progress_total = 42 │ │
│ │ r = <Response [200]> │ │
│ │ self = <tidal_dl_ng.download.Download │ │
│ │ object at 0x75fb7bad6610> │ │
│ │ stream_manifest = StreamManifest( │ │
│ │ │ codecs='mp4a.40.2', │ │
│ │ │ mime_type='audio/mp4', │ │
│ │ │ urls=[ │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/m… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/m… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/m… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/m… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/m… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/m… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/m… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/m… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/m… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/m… │ │
│ │ │ │ ... +32 │ │
│ │ │ ], │ │
│ │ │ file_extension='.m4a', │ │
│ │ │ encryption_type='NONE', │ │
│ │ │ encryption_key=None │ │
│ │ ) │ │
│ │ tmp_path_file_decrypted = '/tmp/tmp1h7dpi92/87f7f750-1575-45f… │ │
│ │ url = 'https://sp-ad-fa.audio.tidal.com/m… │ │
│ │ urls_count = 42 │ │
│ ╰────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ │
│ ng/download.py:288 in metadata_write │
│ │
│ 285 │ │ │ ), │
│ 286 │ │ ) │
│ 287 │ │ breakpoint() │
│ ❱ 288 │ │ m.save() │
│ 289 │ │ │
│ 290 │ │ result = True │
│ 291 │
│ │
│ ╭──────────────────────────── locals ────────────────────────────╮ │
│ │ copy_right = '℗ 2020 Republic Records, a division of UMG │ │
│ │ Recordings, Inc.' │ │
│ │ isrc = 'USUM72014229' │ │
│ │ lyrics = '' │ │
│ │ m = <tidal_dl_ng.metadata.Metadata object at │ │
│ │ 0x75fb7bcaad90> │ │
│ │ path_file = '/tmp/tmp1h7dpi92/87f7f750-1575-45fa-92cb-a31a… │ │
│ │ release_date = '' │ │
│ │ result = False │ │
│ │ self = <tidal_dl_ng.download.Download object at │ │
│ │ 0x75fb7bad6610> │ │
│ │ track = <tidalapi.media.Track object at 0x75fb7bad7b50> │ │
│ ╰────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/lib/python3.11/bdb.py:90 in trace_dispatch │
│ │
│ 87 │ │ if self.quitting: │
│ 88 │ │ │ return # None │
│ 89 │ │ if event == 'line': │
│ ❱ 90 │ │ │ return self.dispatch_line(frame) │
│ 91 │ │ if event == 'call': │
│ 92 │ │ │ return self.dispatch_call(frame, arg) │
│ 93 │ │ if event == 'return': │
│ │
│ ╭──────────────────────────── locals ────────────────────────────╮ │
│ │ arg = None │ │
│ │ event = 'line' │ │
│ │ frame = <frame at 0x75fb7b7b6430, file │ │
│ │ '/home/olivia/tidal-dl/.venv/lib/python3.11/site-pack… │ │
│ │ line 288, code metadata_write> │ │
│ │ self = <pdb.Pdb object at 0x75fb7ad5c310> │ │
│ ╰────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/lib/python3.11/bdb.py:114 in dispatch_line │
│ │
│ 111 │ │ Return self.trace_dispatch to continue tracing in th │
│ 112 │ │ """ │
│ 113 │ │ if self.stop_here(frame) or self.break_here(frame): │
│ ❱ 114 │ │ │ self.user_line(frame) │
│ 115 │ │ │ if self.quitting: raise BdbQuit │
│ 116 │ │ return self.trace_dispatch │
│ 117 │
│ │
│ ╭──────────────────────────── locals ────────────────────────────╮ │
│ │ frame = <frame at 0x75fb7b7b6430, file │ │
│ │ '/home/olivia/tidal-dl/.venv/lib/python3.11/site-pack… │ │
│ │ line 288, code metadata_write> │ │
│ │ self = <pdb.Pdb object at 0x75fb7ad5c310> │ │
│ ╰────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/lib/python3.11/pdb.py:331 in user_line │
│ │
│ 328 │ │ │ │ return │
│ 329 │ │ │ self._wait_for_mainpyfile = False │
│ 330 │ │ if self.bp_commands(frame): │
│ ❱ 331 │ │ │ self.interaction(frame, None) │
│ 332 │ │
│ 333 │ def bp_commands(self, frame): │
│ 334 │ │ """Call every command that was set for the current │
│ │
│ ╭──────────────────────────── locals ────────────────────────────╮ │
│ │ frame = <frame at 0x75fb7b7b6430, file │ │
│ │ '/home/olivia/tidal-dl/.venv/lib/python3.11/site-pack… │ │
│ │ line 288, code metadata_write> │ │
│ │ self = <pdb.Pdb object at 0x75fb7ad5c310> │ │
│ ╰────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/lib/python3.11/pdb.py:426 in interaction │
│ │
│ 423 │ │ │ self.forget() │
│ 424 │ │ │ return │
│ 425 │ │ self.print_stack_entry(self.stack[self.curindex]) │
│ ❱ 426 │ │ self._cmdloop() │
│ 427 │ │ self.forget() │
│ 428 │ │
│ 429 │ def displayhook(self, obj): │
│ │
│ ╭──────────────────────────── locals ────────────────────────────╮ │
│ │ frame = <frame at 0x75fb7b7b6430, file │ │
│ │ '/home/olivia/tidal-dl/.venv/lib/python3.11/site-… │ │
│ │ line 288, code metadata_write> │ │
│ │ self = <pdb.Pdb object at 0x75fb7ad5c310> │ │
│ │ traceback = None │ │
│ ╰────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/lib/python3.11/pdb.py:391 in _cmdloop │
│ │
│ 388 │ │ │ │ # keyboard interrupts allow for an easy way │
│ 389 │ │ │ │ # the current command, so allow them during │
│ 390 │ │ │ │ self.allow_kbdint = True │
│ ❱ 391 │ │ │ │ self.cmdloop() │
│ 392 │ │ │ │ self.allow_kbdint = False │
│ 393 │ │ │ │ break │
│ 394 │ │ │ except KeyboardInterrupt: │
│ │
│ ╭───────────────── locals ──────────────────╮ │
│ │ self = <pdb.Pdb object at 0x75fb7ad5c310> │ │
│ ╰───────────────────────────────────────────╯ │
│ │
│ /usr/lib/python3.11/cmd.py:138 in cmdloop │
│ │
│ 135 │ │ │ │ │ │ else: │
│ 136 │ │ │ │ │ │ │ line = line.rstrip('\r\n') │
│ 137 │ │ │ │ line = self.precmd(line) │
│ ❱ 138 │ │ │ │ stop = self.onecmd(line) │
│ 139 │ │ │ │ stop = self.postcmd(stop, line) │
│ 140 │ │ │ self.postloop() │
│ 141 │ │ finally: │
│ │
│ ╭──────────────────────────── locals ────────────────────────────╮ │
│ │ intro = None │ │
│ │ line = 'run print(track.album)' │ │
│ │ readline = <module 'readline' from │ │
│ │ '/usr/lib/python3.11/lib-dynload/readline.cpython-… │ │
│ │ self = <pdb.Pdb object at 0x75fb7ad5c310> │ │
│ │ stop = None │ │
│ ╰────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/lib/python3.11/pdb.py:491 in onecmd │
│ │
│ 488 │ │ a breakpoint command list definition. │
│ 489 │ │ """ │
│ 490 │ │ if not self.commands_defining: │
│ ❱ 491 │ │ │ return cmd.Cmd.onecmd(self, line) │
│ 492 │ │ else: │
│ 493 │ │ │ return self.handle_command_def(line) │
│ 494 │
│ │
│ ╭───────────────── locals ──────────────────╮ │
│ │ line = 'run print(track.album)' │ │
│ │ self = <pdb.Pdb object at 0x75fb7ad5c310> │ │
│ ╰───────────────────────────────────────────╯ │
│ │
│ /usr/lib/python3.11/cmd.py:217 in onecmd │
│ │
│ 214 │ │ │ │ func = getattr(self, 'do_' + cmd) │
│ 215 │ │ │ except AttributeError: │
│ 216 │ │ │ │ return self.default(line) │
│ ❱ 217 │ │ │ return func(arg) │
│ 218 │ │
│ 219 │ def emptyline(self): │
│ 220 │ │ """Called when an empty line is entered in response │
│ │
│ ╭──────────────────────────── locals ────────────────────────────╮ │
│ │ arg = 'print(track.album)' │ │
│ │ cmd = 'run' │ │
│ │ func = <bound method Pdb.do_run of <pdb.Pdb object at │ │
│ │ 0x75fb7ad5c310>> │ │
│ │ line = 'run print(track.album)' │ │
│ │ self = <pdb.Pdb object at 0x75fb7ad5c310> │ │
│ ╰────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/lib/python3.11/pdb.py:1111 in do_run │
│ │
│ 1108 │ │ │ │ return │
│ 1109 │ │ │ sys.argv[:0] = argv0 │
│ 1110 │ │ # this is caught in the main debugger loop │
│ ❱ 1111 │ │ raise Restart │
│ 1112 │ │
│ 1113 │ do_restart = do_run │
│ 1114 │
│ │
│ ╭─────────────────────────── locals ───────────────────────────╮ │
│ │ arg = 'print(track.album)' │ │
│ │ argv0 = ['/home/olivia/tidal-dl/.venv/bin/tidal-dl-ng'] │ │
│ │ self = <pdb.Pdb object at 0x75fb7ad5c310> │ │
│ │ shlex = <module 'shlex' from '/usr/lib/python3.11/shlex.py'> │
No worries. First of all, please update to the latest release.
You did great job. Can you please insert at the following line https://github.com/exislow/tidal-dl-ng/blob/2559913d8b9cfbaa96c51c2fbaf6952d297ea987/tidal_dl_ng/download.py#L306 this content?
print(vars(track))
print(vars(track.album))
Thus, it must look like this:
if lyrics:
self.lyrics_write_file(path_file + EXTENSION_LYRICS, lyrics)
print(vars(track))
print(vars(track.album))
# `None` values are not allowed.
m: Metadata = Metadata(
Please execute your command again and paste everything, which was printed out.
added the lines and updated
tidal-dl-ng dl https://tidal.com/browse/track/152668960
Let us check, if you are already logged in... Yep, looks good! You are logged in.
{'session': <tidalapi.session.Session object at 0x7915d427b110>, 'requests': <tidalapi.request.Requests object at 0x7915d427aed0>, 'album': <tidalapi.album.Album object at 0x7915d4383f50>,
'id': 152668960, 'name': 'All Of Me', 'duration': 163, 'available': True, 'tidal_release_date': datetime.datetime(2020, 8, 28, 0, 0, tzinfo=tzutc()), 'user_date_added': None, 'track_num': 2,
'volume_num': 1, 'explicit': False, 'popularity': 14, 'artist': <tidalapi.artist.Artist object at 0x7915d45da910>, 'artists': [<tidalapi.artist.Artist object at 0x7915d45d9110>,
<tidalapi.artist.Artist object at 0x7915d45d8fd0>], 'type': None, 'artist_roles': None, 'replay_gain': -10.59, 'peak': 0.999937, 'isrc': 'USUM72014229', 'copyright': '℗ 2020 Republic
Records, a division of UMG Recordings, Inc.', 'audio_quality': <Quality.hi_res: 'HI_RES'>, 'version': None, 'media_metadata_tags': ['LOSSLESS', 'MQA'], 'full_name': 'All Of Me'}
{'session': <tidalapi.session.Session object at 0x7915d427b110>, 'requests': <tidalapi.request.Requests object at 0x7915d427aed0>, 'artist': <tidalapi.artist.Artist object at
0x7915d45d9110>, 'id': 152668956, 'cover': '38201f9b-fb1e-45df-b4fa-85464bf4df6e', 'video_cover': None, 'duration': None, 'available': None, 'num_tracks': None, 'num_videos': None,
'num_volumes': None, 'copyright': None, 'version': None, 'explicit': None, 'universal_product_number': None, 'popularity': None, 'type': None, 'artists': [<tidalapi.artist.Artist object at
0x7915d45d9110>, <tidalapi.artist.Artist object at 0x7915d45d8fd0>], 'release_date': None, 'tidal_release_date': None, 'user_date_added': None}
╭─────────────────────────────────── 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:180 in download │
│ │
│ 177 │ │ │ if media_type in [MediaType.TRACK, MediaType.VIDEO]: │
│ 178 │ │ │ │ download_delay: bool = bool(settings.data.download_delay and urls.index( │
│ 179 │ │ │ │ │
│ ❱ 180 │ │ │ │ dl.item( │
│ 181 │ │ │ │ │ media_id=item_id, media_type=media_type, file_template=file_template │
│ 182 │ │ │ │ ) │
│ 183 │ │ │ elif media_type in [MediaType.ALBUM, MediaType.PLAYLIST, MediaType.MIX]: │
│ │
│ ╭─────────────────────────────────────── locals ───────────────────────────────────────╮ │
│ │ ctx = <click.core.Context object at 0x7915d5047550> │ │
│ │ dl = <tidal_dl_ng.download.Download object at 0x7915d45d8ed0> │ │
│ │ download_delay = False │ │
│ │ file_template = 'Tracks/{artist_name} - {track_title}' │ │
│ │ file_urls = None │ │
│ │ fn_logger = <tidal_dl_ng.helper.wrapper.LoggerWrapped object at 0x7915d47af150> │ │
│ │ item = 'https://tidal.com/browse/track/152668960' │ │
│ │ item_id = '152668960' │ │
│ │ media_type = <MediaType.TRACK: 'track'> │ │
│ │ progress = <rich.progress.Progress object at 0x7915d4299ed0> │ │
│ │ progress_table = <rich.table.Table object at 0x7915d45d9590> │ │
│ │ settings = <tidal_dl_ng.config.Settings object at 0x7915d427a0d0> │ │
│ │ urls = ['https://tidal.com/browse/track/152668960'] │ │
│ │ urls_pos_last = 0 │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/download.py:233 in item │
│ │
│ 230 │ │ │ with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmp_path_dir │
│ 231 │ │ │ │ tmp_path_file = os.path.join(tmp_path_dir, str(uuid4()) + stream_manifes │
│ 232 │ │ │ │ # Download media. │
│ ❱ 233 │ │ │ │ tmp_path_file = self._download(media=media, stream_manifest=stream_manif │
│ 234 │ │ │ │ │
│ 235 │ │ │ │ if isinstance(media, Video) and self.settings.data.video_convert_mp4: │
│ 236 │ │ │ │ │ # Convert `*.ts` file to `*.mp4` using ffmpeg │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ download_delay = False │ │
│ │ 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 0x7915d4298410> │ │
│ │ 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 0x7915d45d8ed0> │ │
│ │ stream = <tidalapi.media.Stream object at 0x7915d427b950> │ │
│ │ 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/tmp21psalph' │ │
│ │ tmp_path_file = '/tmp/tmp21psalph/974f3563-a4fd-4060-b6db-3526ed39c197.m4a' │ │
│ │ video_download = True │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/download.py:153 in │
│ _download │
│ │
│ 150 │ │ │
│ 151 │ │ # Write metadata to file. │
│ 152 │ │ if not isinstance(media, Video): │
│ ❱ 153 │ │ │ self.metadata_write(media, tmp_path_file_decrypted) │
│ 154 │ │ │
│ 155 │ │ return tmp_path_file_decrypted │
│ 156 │
│ │
│ ╭─────────────────────────────────────────── 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/tmp21psalph/974f3563-a4fd-4060-b6db-3526ed39c197.m4a'> │ │
│ │ media = <tidalapi.media.Track object at 0x7915d4298410> │ │
│ │ media_name = 'The Score, Travis Barker - All Of Me' │ │
│ │ needs_decryption = False │ │
│ │ p_task = 0 │ │
│ │ path_file = '/tmp/tmp21psalph/974f3563-a4fd-4060-b6db-3526ed39c197.m4a' │ │
│ │ progress_stdout = True │ │
│ │ progress_total = 42 │ │
│ │ r = <Response [200]> │ │
│ │ self = <tidal_dl_ng.download.Download object at 0x7915d45d8ed0> │ │
│ │ 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/tmp21psalph/974f3563-a4fd-4060-b6db-3526ed39c197.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:330 in │
│ metadata_write │
│ │
│ 327 │ │ │ ), │
│ 328 │ │ ) │
│ 329 │ │ │
│ ❱ 330 │ │ m.save() │
│ 331 │ │ │
│ 332 │ │ result = True │
│ 333 │
│ │
│ ╭─────────────────────────────────── locals ───────────────────────────────────╮ │
│ │ copy_right = '℗ 2020 Republic Records, a division of UMG Recordings, Inc.' │ │
│ │ isrc = 'USUM72014229' │ │
│ │ lyrics = '' │ │
│ │ m = <tidal_dl_ng.metadata.Metadata object at 0x7915d42984d0> │ │
│ │ path_file = '/tmp/tmp21psalph/974f3563-a4fd-4060-b6db-3526ed39c197.m4a' │ │
│ │ release_date = '' │ │
│ │ result = False │ │
│ │ self = <tidal_dl_ng.download.Download object at 0x7915d45d8ed0> │ │
│ │ track = <tidalapi.media.Track object at 0x7915d4298410> │ │
│ ╰──────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /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 0x7915d42984d0> │ │
│ ╰─────────────────────────────────────────────────────────────────╯ │
│ │
│ /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 0x7915d42984d0> │ │
│ ╰─────────────────────────────────────────────────────────────────╯ │
│ │
│ /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 0x7915d42711c0> │ │
│ │ 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
Great, thank you. In your case the variable track.album.name
(album name) is missing / non existing. But this cannot be. Every album has a name. Super wild phenomenon...
I basically know how to fix this for you but before I do (which is actually nonsense), can you tell:
i have a tidal hifi plus plan
same album different song:
tidal-dl-ng dl https://tidal.com/browse/track/152668957
Let us check, if you are already logged in... Yep, looks good! You are logged in.
{'session': <tidalapi.session.Session object at 0x7eb0c72cabd0>, 'requests': <tidalapi.request.Requests object at 0x7eb0c6f91a10>, 'album': <tidalapi.album.Album object at 0x7eb0c72d8190>,
'id': 152668957, 'name': 'Can You Hear Me Now', 'duration': 194, 'available': True, 'tidal_release_date': datetime.datetime(2020, 8, 28, 0, 0, tzinfo=tzutc()), 'user_date_added': None,
'track_num': 1, 'volume_num': 1, 'explicit': False, 'popularity': 15, 'artist': <tidalapi.artist.Artist object at 0x7eb0c72cb310>, 'artists': [<tidalapi.artist.Artist object at
0x7eb0c6fac790>], 'type': None, 'artist_roles': None, 'replay_gain': -10.59, 'peak': 0.999906, 'isrc': 'USUM72014838', 'copyright': '℗ 2020 Republic Records, a division of UMG Recordings,
Inc.', 'audio_quality': <Quality.hi_res: 'HI_RES'>, 'version': None, 'media_metadata_tags': ['LOSSLESS', 'MQA'], 'full_name': 'Can You Hear Me Now'}
{'session': <tidalapi.session.Session object at 0x7eb0c72cabd0>, 'requests': <tidalapi.request.Requests object at 0x7eb0c6f91a10>, 'artist': <tidalapi.artist.Artist object at
0x7eb0c6fac790>, 'id': 152668956, 'cover': '38201f9b-fb1e-45df-b4fa-85464bf4df6e', 'video_cover': None, 'duration': None, 'available': None, 'num_tracks': None, 'num_videos': None,
'num_volumes': None, 'copyright': None, 'version': None, 'explicit': None, 'universal_product_number': None, 'popularity': None, 'type': None, 'artists': [<tidalapi.artist.Artist object at
0x7eb0c6fac790>], 'release_date': None, 'tidal_release_date': None, 'user_date_added': None}
╭─────────────────────────────────── Download Progress ───────────────────────────────────╮
│ │
│ │
│ Item 'The Score - Can You Hear Me No' ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% │
│ │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/cli.py:180 in download │
│ │
│ 177 │ │ │ if media_type in [MediaType.TRACK, MediaType.VIDEO]: │
│ 178 │ │ │ │ download_delay: bool = bool(settings.data.download_delay and urls.index( │
│ 179 │ │ │ │ │
│ ❱ 180 │ │ │ │ dl.item( │
│ 181 │ │ │ │ │ media_id=item_id, media_type=media_type, file_template=file_template │
│ 182 │ │ │ │ ) │
│ 183 │ │ │ elif media_type in [MediaType.ALBUM, MediaType.PLAYLIST, MediaType.MIX]: │
│ │
│ ╭─────────────────────────────────────── locals ───────────────────────────────────────╮ │
│ │ ctx = <click.core.Context object at 0x7eb0c730acd0> │ │
│ │ dl = <tidal_dl_ng.download.Download object at 0x7eb0c72d8f10> │ │
│ │ download_delay = False │ │
│ │ file_template = 'Tracks/{artist_name} - {track_title}' │ │
│ │ file_urls = None │ │
│ │ fn_logger = <tidal_dl_ng.helper.wrapper.LoggerWrapped object at 0x7eb0c72c8ed0> │ │
│ │ item = 'https://tidal.com/browse/track/152668957' │ │
│ │ item_id = '152668957' │ │
│ │ media_type = <MediaType.TRACK: 'track'> │ │
│ │ progress = <rich.progress.Progress object at 0x7eb0c760a090> │ │
│ │ progress_table = <rich.table.Table object at 0x7eb0c72d8690> │ │
│ │ settings = <tidal_dl_ng.config.Settings object at 0x7eb0c6f92110> │ │
│ │ urls = ['https://tidal.com/browse/track/152668957'] │ │
│ │ urls_pos_last = 0 │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/download.py:233 in item │
│ │
│ 230 │ │ │ with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmp_path_dir │
│ 231 │ │ │ │ tmp_path_file = os.path.join(tmp_path_dir, str(uuid4()) + stream_manifes │
│ 232 │ │ │ │ # Download media. │
│ ❱ 233 │ │ │ │ tmp_path_file = self._download(media=media, stream_manifest=stream_manif │
│ 234 │ │ │ │ │
│ 235 │ │ │ │ if isinstance(media, Video) and self.settings.data.video_convert_mp4: │
│ 236 │ │ │ │ │ # Convert `*.ts` file to `*.mp4` using ffmpeg │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ download_delay = False │ │
│ │ download_skip = False │ │
│ │ file_name_relative = 'Tracks/The Score - Can You Hear Me Now' │ │
│ │ file_template = 'Tracks/{artist_name} - {track_title}' │ │
│ │ manifest = 'PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48TVBEIHhtbG5zPSJ1c… │ │
│ │ media = <tidalapi.media.Track object at 0x7eb0c72d8410> │ │
│ │ media_id = '152668957' │ │
│ │ media_type = <MediaType.TRACK: 'track'> │ │
│ │ mime_type = 'application/dash+xml' │ │
│ │ path_file = '/home/olivia/Downloads/Tracks/The Score - Can You Hear Me Now.m4a' │ │
│ │ self = <tidal_dl_ng.download.Download object at 0x7eb0c72d8f10> │ │
│ │ stream = <tidalapi.media.Stream object at 0x7eb0c7760bd0> │ │
│ │ stream_manifest = StreamManifest( │ │
│ │ │ codecs='mp4a.40.2', │ │
│ │ │ mime_type='audio/mp4', │ │
│ │ │ urls=[ │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA3ZDdh… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA3ZDdh… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA3ZDdh… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA3ZDdh… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA3ZDdh… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA3ZDdh… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA3ZDdh… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA3ZDdh… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA3ZDdh… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA3ZDdh… │ │
│ │ │ │ ... +40 │ │
│ │ │ ], │ │
│ │ │ file_extension='.m4a', │ │
│ │ │ encryption_type='NONE', │ │
│ │ │ encryption_key=None │ │
│ │ ) │ │
│ │ tmp_path_dir = '/tmp/tmpclrjj4l2' │ │
│ │ tmp_path_file = '/tmp/tmpclrjj4l2/89b5aa8a-1e14-4a77-958b-f10962d88bd0.m4a' │ │
│ │ video_download = True │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/download.py:153 in │
│ _download │
│ │
│ 150 │ │ │
│ 151 │ │ # Write metadata to file. │
│ 152 │ │ if not isinstance(media, Video): │
│ ❱ 153 │ │ │ self.metadata_write(media, tmp_path_file_decrypted) │
│ 154 │ │ │
│ 155 │ │ return tmp_path_file_decrypted │
│ 156 │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ block_size = None │ │
│ │ data = b'\x00\x00\x03\xfcmoof\x00\x00\x00\x10mfhd\x00\x00\x00\x00\x00\x0… │ │
│ │ f = <_io.BufferedWriter │ │
│ │ name='/tmp/tmpclrjj4l2/89b5aa8a-1e14-4a77-958b-f10962d88bd0.m4a'> │ │
│ │ media = <tidalapi.media.Track object at 0x7eb0c72d8410> │ │
│ │ media_name = 'The Score - Can You Hear Me Now' │ │
│ │ needs_decryption = False │ │
│ │ p_task = 0 │ │
│ │ path_file = '/tmp/tmpclrjj4l2/89b5aa8a-1e14-4a77-958b-f10962d88bd0.m4a' │ │
│ │ progress_stdout = True │ │
│ │ progress_total = 50 │ │
│ │ r = <Response [200]> │ │
│ │ self = <tidal_dl_ng.download.Download object at 0x7eb0c72d8f10> │ │
│ │ stream_manifest = StreamManifest( │ │
│ │ │ codecs='mp4a.40.2', │ │
│ │ │ mime_type='audio/mp4', │ │
│ │ │ urls=[ │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA… │ │
│ │ │ │ ... +40 │ │
│ │ │ ], │ │
│ │ │ file_extension='.m4a', │ │
│ │ │ encryption_type='NONE', │ │
│ │ │ encryption_key=None │ │
│ │ ) │ │
│ │ tmp_path_file_decrypted = '/tmp/tmpclrjj4l2/89b5aa8a-1e14-4a77-958b-f10962d88bd0.m4a' │ │
│ │ url = 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzE5MjZmMzkzMTA… │ │
│ │ urls_count = 50 │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/download.py:330 in │
│ metadata_write │
│ │
│ 327 │ │ │ ), │
│ 328 │ │ ) │
│ 329 │ │ │
│ ❱ 330 │ │ m.save() │
│ 331 │ │ │
│ 332 │ │ result = True │
│ 333 │
│ │
│ ╭─────────────────────────────────── locals ───────────────────────────────────╮ │
│ │ copy_right = '℗ 2020 Republic Records, a division of UMG Recordings, Inc.' │ │
│ │ isrc = 'USUM72014838' │ │
│ │ lyrics = '' │ │
│ │ m = <tidal_dl_ng.metadata.Metadata object at 0x7eb0c72cb790> │ │
│ │ path_file = '/tmp/tmpclrjj4l2/89b5aa8a-1e14-4a77-958b-f10962d88bd0.m4a' │ │
│ │ release_date = '' │ │
│ │ result = False │ │
│ │ self = <tidal_dl_ng.download.Download object at 0x7eb0c72d8f10> │ │
│ │ track = <tidalapi.media.Track object at 0x7eb0c72d8410> │ │
│ ╰──────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /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 0x7eb0c72cb790> │ │
│ ╰─────────────────────────────────────────────────────────────────╯ │
│ │
│ /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 0x7eb0c72cb790> │ │
│ ╰─────────────────────────────────────────────────────────────────╯ │
│ │
│ /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': 'Can You Hear Me Now'} │ │
│ │ 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 0x7eb0c6f891c0> │ │
│ │ self = {'©nam': 'Can You Hear Me Now'} │ │
│ │ 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': 'Can You Hear Me Now'} │ │
│ │ value = None │ │
│ ╰───────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
TypeError: 'NoneType' object is not iterable
different album and artist:
tidal-dl-ng dl https://tidal.com/browse/track/175693674
Let us check, if you are already logged in... Yep, looks good! You are logged in.
{'session': <tidalapi.session.Session object at 0x75db33fcf710>, 'requests': <tidalapi.request.Requests object at 0x75db33cb12d0>, 'album': <tidalapi.album.Album object at 0x75db33fcebd0>,
'id': 175693674, 'name': 'Welcome Home, Son (Remastered)', 'duration': 287, 'available': True, 'tidal_release_date': datetime.datetime(2021, 2, 28, 0, 0, tzinfo=tzutc()), 'user_date_added':
None, 'track_num': 2, 'volume_num': 1, 'explicit': False, 'popularity': 7, 'artist': <tidalapi.artist.Artist object at 0x75db341b2ed0>, 'artists': [<tidalapi.artist.Artist object at
0x75db33fdeb50>], 'type': None, 'artist_roles': None, 'replay_gain': -9.14, 'peak': 0.977081, 'isrc': 'TCAFK2199916', 'copyright': '2019 Bear Machine', 'audio_quality':
<Quality.high_lossless: 'LOSSLESS'>, 'version': None, 'media_metadata_tags': ['LOSSLESS'], 'full_name': 'Welcome Home, Son (Remastered)'}
{'session': <tidalapi.session.Session object at 0x75db33fcf710>, 'requests': <tidalapi.request.Requests object at 0x75db33cb12d0>, 'artist': <tidalapi.artist.Artist object at
0x75db33fdeb50>, 'id': 175693670, 'cover': '3381bd47-5cd3-4881-86c4-12b63b9fa6e7', 'video_cover': None, 'duration': None, 'available': None, 'num_tracks': None, 'num_videos': None,
'num_volumes': None, 'copyright': None, 'version': None, 'explicit': None, 'universal_product_number': None, 'popularity': None, 'type': None, 'artists': [<tidalapi.artist.Artist object at
0x75db33fdeb50>], 'release_date': None, 'tidal_release_date': None, 'user_date_added': None}
╭─────────────────────────────────── Download Progress ───────────────────────────────────╮
│ │
│ │
│ Item 'Radical Face - Welcome Home, S' ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% │
│ │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/cli.py:180 in download │
│ │
│ 177 │ │ │ if media_type in [MediaType.TRACK, MediaType.VIDEO]: │
│ 178 │ │ │ │ download_delay: bool = bool(settings.data.download_delay and urls.index( │
│ 179 │ │ │ │ │
│ ❱ 180 │ │ │ │ dl.item( │
│ 181 │ │ │ │ │ media_id=item_id, media_type=media_type, file_template=file_template │
│ 182 │ │ │ │ ) │
│ 183 │ │ │ elif media_type in [MediaType.ALBUM, MediaType.PLAYLIST, MediaType.MIX]: │
│ │
│ ╭─────────────────────────────────────── locals ───────────────────────────────────────╮ │
│ │ ctx = <click.core.Context object at 0x75db34ddee10> │ │
│ │ dl = <tidal_dl_ng.download.Download object at 0x75db33cb2750> │ │
│ │ download_delay = False │ │
│ │ file_template = 'Tracks/{artist_name} - {track_title}' │ │
│ │ file_urls = None │ │
│ │ fn_logger = <tidal_dl_ng.helper.wrapper.LoggerWrapped object at 0x75db33cb2290> │ │
│ │ item = 'https://tidal.com/browse/track/175693674' │ │
│ │ item_id = '175693674' │ │
│ │ media_type = <MediaType.TRACK: 'track'> │ │
│ │ progress = <rich.progress.Progress object at 0x75db349d89d0> │ │
│ │ progress_table = <rich.table.Table object at 0x75db33fcc0d0> │ │
│ │ settings = <tidal_dl_ng.config.Settings object at 0x75db341b3490> │ │
│ │ urls = ['https://tidal.com/browse/track/175693674'] │ │
│ │ urls_pos_last = 0 │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/download.py:233 in item │
│ │
│ 230 │ │ │ with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmp_path_dir │
│ 231 │ │ │ │ tmp_path_file = os.path.join(tmp_path_dir, str(uuid4()) + stream_manifes │
│ 232 │ │ │ │ # Download media. │
│ ❱ 233 │ │ │ │ tmp_path_file = self._download(media=media, stream_manifest=stream_manif │
│ 234 │ │ │ │ │
│ 235 │ │ │ │ if isinstance(media, Video) and self.settings.data.video_convert_mp4: │
│ 236 │ │ │ │ │ # Convert `*.ts` file to `*.mp4` using ffmpeg │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ download_delay = False │ │
│ │ download_skip = False │ │
│ │ file_name_relative = 'Tracks/Radical Face - Welcome Home, Son (Remastered)' │ │
│ │ file_template = 'Tracks/{artist_name} - {track_title}' │ │
│ │ manifest = 'PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48TVBEIHhtbG5zPSJ1c… │ │
│ │ media = <tidalapi.media.Track object at 0x75db33fdc950> │ │
│ │ media_id = '175693674' │ │
│ │ media_type = <MediaType.TRACK: 'track'> │ │
│ │ mime_type = 'application/dash+xml' │ │
│ │ path_file = '/home/olivia/Downloads/Tracks/Radical Face - Welcome Home, Son │ │
│ │ (Remastered).m4a' │ │
│ │ self = <tidal_dl_ng.download.Download object at 0x75db33cb2750> │ │
│ │ stream = <tidalapi.media.Stream object at 0x75db33cb0b10> │ │
│ │ stream_manifest = StreamManifest( │ │
│ │ │ codecs='mp4a.40.2', │ │
│ │ │ mime_type='audio/mp4', │ │
│ │ │ urls=[ │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGIxOTJj… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGIxOTJj… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGIxOTJj… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGIxOTJj… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGIxOTJj… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGIxOTJj… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGIxOTJj… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGIxOTJj… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGIxOTJj… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGIxOTJj… │ │
│ │ │ │ ... +63 │ │
│ │ │ ], │ │
│ │ │ file_extension='.m4a', │ │
│ │ │ encryption_type='NONE', │ │
│ │ │ encryption_key=None │ │
│ │ ) │ │
│ │ tmp_path_dir = '/tmp/tmpdrrt8ai6' │ │
│ │ tmp_path_file = '/tmp/tmpdrrt8ai6/0add22a8-1cf1-4128-a79f-d360d5f3cb0d.m4a' │ │
│ │ video_download = True │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/download.py:153 in │
│ _download │
│ │
│ 150 │ │ │
│ 151 │ │ # Write metadata to file. │
│ 152 │ │ if not isinstance(media, Video): │
│ ❱ 153 │ │ │ self.metadata_write(media, tmp_path_file_decrypted) │
│ 154 │ │ │
│ 155 │ │ return tmp_path_file_decrypted │
│ 156 │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ block_size = None │ │
│ │ data = b'\x00\x00\x04\x8cmoof\x00\x00\x00\x10mfhd\x00\x00\x00\x00\x00\x0… │ │
│ │ f = <_io.BufferedWriter │ │
│ │ name='/tmp/tmpdrrt8ai6/0add22a8-1cf1-4128-a79f-d360d5f3cb0d.m4a'> │ │
│ │ media = <tidalapi.media.Track object at 0x75db33fdc950> │ │
│ │ media_name = 'Radical Face - Welcome Home, Son (Remastered)' │ │
│ │ needs_decryption = False │ │
│ │ p_task = 0 │ │
│ │ path_file = '/tmp/tmpdrrt8ai6/0add22a8-1cf1-4128-a79f-d360d5f3cb0d.m4a' │ │
│ │ progress_stdout = True │ │
│ │ progress_total = 73 │ │
│ │ r = <Response [200]> │ │
│ │ self = <tidal_dl_ng.download.Download object at 0x75db33cb2750> │ │
│ │ stream_manifest = StreamManifest( │ │
│ │ │ codecs='mp4a.40.2', │ │
│ │ │ mime_type='audio/mp4', │ │
│ │ │ urls=[ │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGI… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGI… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGI… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGI… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGI… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGI… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGI… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGI… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGI… │ │
│ │ │ │ │ │
│ │ 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGI… │ │
│ │ │ │ ... +63 │ │
│ │ │ ], │ │
│ │ │ file_extension='.m4a', │ │
│ │ │ encryption_type='NONE', │ │
│ │ │ encryption_key=None │ │
│ │ ) │ │
│ │ tmp_path_file_decrypted = '/tmp/tmpdrrt8ai6/0add22a8-1cf1-4128-a79f-d360d5f3cb0d.m4a' │ │
│ │ url = 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzEyMGQ3ZmZjZGI… │ │
│ │ urls_count = 73 │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/download.py:330 in │
│ metadata_write │
│ │
│ 327 │ │ │ ), │
│ 328 │ │ ) │
│ 329 │ │ │
│ ❱ 330 │ │ m.save() │
│ 331 │ │ │
│ 332 │ │ result = True │
│ 333 │
│ │
│ ╭────────────────────────────────── locals ──────────────────────────────────╮ │
│ │ copy_right = '2019 Bear Machine' │ │
│ │ isrc = 'TCAFK2199916' │ │
│ │ lyrics = '' │ │
│ │ m = <tidal_dl_ng.metadata.Metadata object at 0x75db35650b50> │ │
│ │ path_file = '/tmp/tmpdrrt8ai6/0add22a8-1cf1-4128-a79f-d360d5f3cb0d.m4a' │ │
│ │ release_date = '' │ │
│ │ result = False │ │
│ │ self = <tidal_dl_ng.download.Download object at 0x75db33cb2750> │ │
│ │ track = <tidalapi.media.Track object at 0x75db33fdc950> │ │
│ ╰────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /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 0x75db35650b50> │ │
│ ╰─────────────────────────────────────────────────────────────────╯ │
│ │
│ /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 0x75db35650b50> │ │
│ ╰─────────────────────────────────────────────────────────────────╯ │
│ │
│ /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': 'Welcome Home, Son (Remastered)'} │ │
│ │ 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 0x75db33c8d1c0> │ │
│ │ self = {'©nam': 'Welcome Home, Son (Remastered)'} │ │
│ │ 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': 'Welcome Home, Son (Remastered)'} │ │
│ │ value = None │ │
│ ╰──────────────────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
TypeError: 'NoneType' object is not iterable
To confirm, that my fix works I need some more information regarding album downloads. Can you please do the following?
vars(media)
here: https://github.com/exislow/tidal-dl-ng/blob/2e75bf4fdcad7fe475768819d8894339e5d1052c/tidal_dl_ng/download.py#L348 raise MediaMissing
print(vars(media))
# Create file name and path
file_name_relative = format_path_media(file_template, media)
tidal-dl-ng dl https://tidal.com/browse/album/135465075
You do not need to finish the download. As soon as print(vars(media))
has printed it's output you can abort the script (CTRL + C).
Thank you I can do this tomorrow when I'm home
Okay, thanks.
tidal-dl-ng dl https://tidal.com/browse/album/135465075
Let us check, if you are already logged in... Yep, looks good! You are logged in.
{'session': <tidalapi.session.Session object at 0x7b5619e30690>, 'requests': <tidalapi.request.Requests object at 0x7b5618b023d0>, 'artist': <tidalapi.artist.Artist object at
0x7b5618e105d0>, 'id': 135465075, 'cover': 'd0ab8252-6247-405b-9742-251bb3bed01a', 'video_cover': None, 'duration': 4755, 'available': True, 'num_tracks': 14, 'num_videos': 0, 'num_volumes':
1, 'copyright': '(P) 1999 Sony Music Entertainment', 'version': None, 'explicit': False, 'universal_product_number': '886448349747', 'popularity': 21, 'type': 'ALBUM', 'artists':
[<tidalapi.artist.Artist object at 0x7b5618b01190>], 'release_date': datetime.datetime(1999, 11, 16, 0, 0), 'tidal_release_date': datetime.datetime(2020, 4, 3, 0, 0, tzinfo=tzutc()),
'user_date_added': None}
╭──────────────────────────────────────────────────────────────────────────────────── Download Progress ─────────────────────────────────────────────────────────────────────────────────────╮
│ │
│ │
│ │
│ │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/cli.py:184 in download │
│ │
│ 181 │ │ │ │ │ media_id=item_id, media_type=media_type, file_template=file_template │
│ 182 │ │ │ │ ) │
│ 183 │ │ │ elif media_type in [MediaType.ALBUM, MediaType.PLAYLIST, MediaType.MIX]: │
│ ❱ 184 │ │ │ │ dl.items( │
│ 185 │ │ │ │ │ media_id=item_id, │
│ 186 │ │ │ │ │ media_type=media_type, │
│ 187 │ │ │ │ │ file_template=file_template, │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ ctx = <click.core.Context object at 0x7b5618fe7a50> │ │
│ │ dl = <tidal_dl_ng.download.Download object at 0x7b5618dfccd0> │ │
│ │ file_template = 'Albums/{artist_name} - {album_title}/{track_num}. {artist_name} - │ │
│ │ {track_title}' │ │
│ │ file_urls = None │ │
│ │ fn_logger = <tidal_dl_ng.helper.wrapper.LoggerWrapped object at 0x7b5618dfe390> │ │
│ │ item = 'https://tidal.com/browse/album/135465075' │ │
│ │ item_id = '135465075' │ │
│ │ media_type = <MediaType.ALBUM: 'album'> │ │
│ │ progress = <rich.progress.Progress object at 0x7b5619109e90> │ │
│ │ progress_table = <rich.table.Table object at 0x7b561a193fd0> │ │
│ │ settings = <tidal_dl_ng.config.Settings object at 0x7b5618aef050> │ │
│ │ urls = ['https://tidal.com/browse/album/135465075'] │ │
│ │ urls_pos_last = 0 │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/download.py:357 in items │
│ │
│ 354 │ │ if isinstance(media, Mix): │
│ 355 │ │ │ list_media_name = media.title[:30] │
│ 356 │ │ elif video_download: │
│ ❱ 357 │ │ │ list_media_name = media.name[:30] │
│ 358 │ │ else: │
│ 359 │ │ │ videos_include = False │
│ 360 │ │ │ list_media_name = media.name[:30] │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ download_delay = True │ │
│ │ file_name_relative = 'Albums/Toto - {album_title}/{track_num}. Toto - {track_title}' │ │
│ │ file_template = 'Albums/{artist_name} - {album_title}/{track_num}. {artist_name} - │ │
│ │ {track_title}' │ │
│ │ media = <tidalapi.album.Album object at 0x7b5618dfd110> │ │
│ │ media_id = '135465075' │ │
│ │ media_type = <MediaType.ALBUM: 'album'> │ │
│ │ self = <tidal_dl_ng.download.Download object at 0x7b5618dfccd0> │ │
│ │ video_download = True │ │
│ │ videos_include = True │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
TypeError: 'NoneType' object is not subscriptable
i entered the command to download an album with the print vars media line and i got this sorry it took so long to do i also ran pip install --upgrade tidal-dl-ng just to make sure i was on latest version
Great work. This phenomenon is actually not possible to be honest. If you open the official TIDAL app it must show you the album name but the data you receive from the same API my app uses is missing the album.name
at all.
Every work around I like to implement would be suuuuper hacky. To avoid this I have started to consult the maintainer from python-tidal
(the TIDAL API library this app is relying on): https://github.com/tamland/python-tidal/issues/234
Let's see, what their opinion on this is.