307 Commits
Author SHA1 Message Date
copilot-swe-agent[bot]and19JVJeffery 6ec3553e91 Changes before error encountered
Agent-Logs-Url: https://github.com/19JVJeffery/tiddl-gui/sessions/ee218a96-15f4-4124-8eea-902561b3cc4e

Co-authored-by: 19JVJeffery <94115228+19JVJeffery@users.noreply.github.com>
2026-05-18 10:04:33 +00:00
copilot-swe-agent[bot]and19JVJeffery 5551420b65 Sticky panel headers on all pages + remove CLI files and update README
Co-authored-by: 19JVJeffery <94115228+19JVJeffery@users.noreply.github.com>
2026-03-10 22:02:56 +00:00
TooYoungTooSimp 3d1314e198 Enable trust_env in aiohttp.ClientSession (#294) 2026-02-26 14:41:56 +01:00
Filip VoskaandClaude Sonnet 4.6 cf0d1cd362 fix: handle null/missing fields in Video API responses (#295)
* fix: handle null/missing fields in Video API responses

Tidal's API returns some Video objects (lyric/visualiser videos on
artist pages) with fields that don't match the current strict models:

- `imageId` can be null instead of a string
- The nested `album` object can be present but missing `id`, `title`,
  and `cover`

These validation failures cause the entire `ArtistVideosItems` page
to be rejected by Pydantic before any video can be parsed, resulting
in 0 downloads when targeting an artist with `--videos`.

A second independent bug causes an `AttributeError` on every video:
the default template `{album.artist}/{album.title}/{item.title}` is
shared with videos, but many videos have no album. When `album=None`
is passed to `format_template`, Python's `str.format()` evaluates
`None.artist` and raises `AttributeError: 'NoneType' object has no
attribute 'artist'`, which is caught and printed as an error for
every single video.

Fix:
- `resources.py`: make `Video.imageId` and `Video.Album.{id,title,
  cover}` optional so incomplete API responses pass validation
- `format.py`: give `AlbumTemplate` field defaults so it can be
  instantiated empty; use `AlbumTemplate()` as fallback instead of
  `None` when no album is present, so `{album.*}` tokens render as
  empty strings rather than raising AttributeError
- `download/__init__.py`: guard `video.album.id` accesses against
  `None` (now possible after the model fix) in both video code paths

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test: add tests for Video model null fields and AlbumTemplate fallback

Covers the two bugs fixed in the previous commit:

- Video model accepts null/missing imageId and partial album objects
- format_template does not raise AttributeError when album is None
  and the template references {album.*} tokens

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-26 14:35:33 +01:00
hexx.one 06f9d940d9 ✨ Added --skip-errors flag to skip unavailable items during download (#274)
* feat: Add `--skip-errors` flag to skip unavailable items during download

* feat: skip-error handling for unavailable items in albums, artists & mixes; fix some missing template variables

* fixes #267
2026-01-18 17:35:54 +01:00
Oskar Dudziński 9f7d3aec1e 🐛 Album/artist download errors related to templates are now handled (#257)
* refactor variable name in _clean_segment function for clarity

* Add error handling documentation for format_template function

* Add error handling for album template formatting in download_callback
2025-12-05 14:11:47 +01:00
Oskar Dudziński f691c7ba0a 🐛 Fixed cover that can be None. 2025-12-03 01:12:07 +01:00
Oskar Dudziński 82c4ce0c37 🐛 Fixed covers that were fetched unnecessarily #245 (#254)
* fetch cover only when item is about to be downloaded

* rename cover method to `fetch_data`

* 🚀 Bump version from 3.1.4a3 to 3.1.4
2025-12-01 19:05:46 +01:00
Oskar Dudziński cf0ef2d304 ✨ Sort credits contributors surname alphabetically #247 2025-12-01 01:13:59 +01:00
Oskar Dudziński cbcb55d14a 🐛 Item's path segments are now cleaned #251 2025-11-29 22:57:10 +01:00
Oskar Dudziński 1480be4aed 🏷️ Make audio properties optional in TrackStream model, closes #252 2025-11-29 19:07:07 +01:00
Oskar Dudziński a794fa0673 🐛 Fixed cover fetching 2025-11-24 20:00:35 +01:00
Oskar Dudziński d56398168e Revert "✨ Added album lyrics download to .lrc file (#241)" (#248)
This reverts commit f2ee4f8fad.
2025-11-24 19:49:25 +01:00
Daniele Russo f2ee4f8fad ✨ Added album lyrics download to .lrc file (#241)
* adding flag for download lyrics

* adding sum debug info

* adding configuration part

* Update config.example.toml

* refactor: move lyrics to utility and apply code review feedback

* refactor: optimize lyrics download and apply code review feedback

- Pass album_items directly to lyrics function to avoid redundant API calls
- Remove unused Path import from api.py
- Remove duplicate debug logging already covered elsewhere
- Use last_album_items reference instead of fetching data again
- Move lyrics download logic to separate utility function in core.utils.lyrics
- Keep lyrics configuration only in docs/config.example.toml without modifying other settings

This optimization reduces API calls by reusing already fetched album items data instead of making new requests for lyrics download.
2025-11-24 19:25:13 +01:00
Oskar Dudziński d978e87641 🐛 Fixed invalid track covers when downloading playlist #244 2025-11-22 23:17:41 +01:00
Oskar Dudziński 97f3fed079 ✨ Added album.release template 2025-11-21 22:16:38 +01:00
Oskar Dudziński 22730003df 🐛 Fixed metadata.cover config was not respected 2025-11-21 22:14:17 +01:00
Oskar Dudziński aae9781f31 ✨ Track metadata title has now version of the track 2025-11-21 20:49:01 +01:00
Oskar Dudziński c8a8939741 🐛 Fixed {album.master} template (#237)
* fix `predict_item_quality` logic

* update `album.master` template logic

* bump to 3.1a2
2025-11-20 18:13:06 +01:00
Oskar Dudziński 85088e737a 🐛 Fixed video downloading (#235)
* rename `VideoQuality` to `StreamVideoQuality`

* remove bad logic from predicting video quality

* print info when skipping video

* bump to 3.1.1 alpha
2025-11-20 16:13:53 +01:00
Oskar Dudziński 1873d512f1 ✨ Added fav subcommand 2025-11-17 17:53:23 +01:00
Oskar Dudziński 74e45ef39a 🐛 Fixed album data that was not available while downloading playlists (#226)
* fetch album while handling playlist when there is "{album}" in template

* add note to the docs
2025-11-17 15:46:41 +01:00
Oskar Dudziński 02919e38e6 ✨ Added {album.master} template (#225)
* add `MediaMetadataTags` literal

* add `album.master` template

* add docs
2025-11-17 14:40:28 +01:00
Oskar Dudziński 06b1eded7c ✨ Added explicit and dolby templates (#223)
* strip formatted parts of path

* handle "None" explicit attribute

* add explicit field to items

* add explicit to template example

* add docs for explicit

* add `dolby` field to items

* add `dolby` docs
2025-11-17 02:58:13 +01:00
Oskar Dudziński 66b9f021ad 🐛 Fixed wrong quality in item.quality template (#222)
* get quality from arg instead from item

* add missing type

* create function that returns proper quality for item quality templating
2025-11-17 02:39:10 +01:00
Oskar Dudziński 7515753297 ♻️ Move quality literals to core 2025-11-16 22:54:17 +01:00
Oskar Dudziński 9a122ec630 🐛 Fixed missing embedded covers #220 2025-11-14 15:07:19 +01:00
Oskar Dudziński 96fb746fd9 ✨ New metadata.album_review config setting (#216)
* add `get_album_review` endpoint

* add `metadata.album_review` config option

* add comment to `add_track_metadata`

* move `AlbumReview` model to its own file and clean up imports

* fix API endpoint for fetching album reviews

* add normalized_text method to AlbumReview model for text processing

* add unit test for `normalize_review_text` function and refactor `AlbumReview` model

* add `album_review` to metadata

* update comment

* add comment
2025-11-13 13:38:04 +01:00
Oskar Dudziński e0fe7e1655 🐛 Fixed matching URLs when using url command (#215)
* refactor `from_string` method to improve resource type extraction logic
2025-11-12 23:37:41 +01:00
Oskar Dudziński eb0ae38df8 🐛 Fixed scan_path didnt update with download_path 2025-11-12 22:33:23 +01:00
Oskar Dudziński 46ddd8e4e1 🔊 Log if ffmpeg is installed 2025-11-12 18:18:51 +01:00
Oskar Dudziński f444ef2689 ✨ Auth Token is now refreshed mid-request (#213) 2025-11-12 18:09:41 +01:00
Oskar Dudziński 3b9c089d01 🔊 Added API error log 2025-11-10 18:47:19 +01:00
Oskar Dudziński 0924b4c755 🐛 Other API exceptions are now handled (#212)
* add retry logic for `res.json()`

* add wrapper for handling resources

* lower api limits
2025-11-10 18:39:57 +01:00
Oskar Dudziński 244a4bc07b 🐛 Fixed temp file by: @fff7d1bc in #196 2025-11-10 17:24:14 +01:00
Oskar Dudziński dc2ff4da33 💄 Show item download path 2025-11-10 17:11:54 +01:00
Oskar Dudziński a8e3876dfd 🚑️ Handle API error at get_track_stream (#202) 2025-11-09 20:14:56 +01:00
Oskar Dudziński c7f0836566 🏷️ Update album type literals 2025-11-09 19:22:13 +01:00
Oskar Dudziński a525b676eb ✨ Added omit_cache and debug options from config 2025-11-09 17:14:57 +01:00
Oskar Dudziński 4c345f8c28 🐛 Fix #196 2025-11-08 23:36:33 +01:00
Oskar Dudziński cd454a4220 🐛 Fix #195 2025-11-08 23:19:57 +01:00
Oskar Dudziński b87888536e ✨ tiddl3 (#194) 2025-11-08 15:18:44 +01:00
copey02andSC c255d42283 FLAC: set cover type to Front (3) and clear existing pictures (#190)
Co-authored-by: SC <SC>
2025-11-05 18:59:53 +01:00
Oskar Dudziński 3fdbdb5500 🐛 Fixed artists metadata 2025-11-05 18:55:47 +01:00
Oskar Dudziński 6d796db94c Revert "🐛 Fix artists order (#189)" (#191)
This reverts commit 11b8b28e81.
2025-11-05 18:53:56 +01:00
Oskar Dudziński 11b8b28e81 🐛 Fix artists order (#189) 2025-11-05 18:39:26 +01:00
Oskar Dudziński 1613f85978 ✨ Download only videos from an artist (#181)
* add `getArtistVideos` api endpoint

* add `--only-video` flag

* bump version
2025-11-03 16:59:54 +01:00
Oskar Dudziński 4217833984 ✨ Update modification time on existing items (#178)
* added `update_mtime` to config

* update mtime on files

* update only existing files that wont be redownloaded

* allow updating mtime if `DOWNLOAD_VIDEO` is False

* add custom message for skipped videos
2025-10-28 22:21:34 +01:00
Oskar Dudziński 455129c4ca 🐛 Fixed error with missing lyrics (#176)
* add exception handling for getlyrics

* refactor logging
2025-10-26 14:07:19 +01:00
Oskar Dudziński eec05c4f09 ✨ Added track cover size from config 2025-10-17 22:44:52 +02:00