<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>ytm-player releases</title>
    <link>https://ytm-player.com/changelog</link>
    <description>Releases of ytm-player, a YouTube Music TUI client.</description>
    <atom:link href="https://ytm-player.com/changelog/rss.xml" rel="self" type="application/rss+xml" />
    <language>en</language>
    
    <item>
      <title>v1.9.2</title>
      <link>https://ytm-player.com/changelog/v1.9.2</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.9.2</guid>
      <pubDate>Fri, 01 May 2026 12:00:00 GMT</pubDate>
      <description>A focused fix release. The Charts page region selector was effectively non-functional — three structural bugs in how we read YouTube's chart response made a global event playlist appear regardless of region. Also includes a TrackTable migration that retires three hand-rolled `DataTable` pages and two related bug fixes.

**Charts** — bug report thanks @dmnmsc (#73)

- **Events visually separated fr</description>
    </item>
    <item>
      <title>v1.9.1</title>
      <link>https://ytm-player.com/changelog/v1.9.1</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.9.1</guid>
      <pubDate>Thu, 30 Apr 2026 12:00:00 GMT</pubDate>
      <description>This is the third and final wave of major updates in a rapid release cycle — quieter cadence ahead.

A community-PR-driven feature release. Six PRs from @wgordon17 plus user-reported UX work, an AUR auto-publish pipeline, and a per-collection shuffle memory system. Distribution data milestone — crossed 10,000 lifetime PyPI downloads on the day this release was assembled.

&gt; Supersedes the same-day</description>
    </item>
    <item>
      <title>v1.8.0</title>
      <link>https://ytm-player.com/changelog/v1.8.0</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.8.0</guid>
      <pubDate>Tue, 28 Apr 2026 12:00:00 GMT</pubDate>
      <description>A reliability and quality release driven by a multi-agent expert audit. Hardens error handling across the service/UI cascade so silent-failure UX is replaced with actionable feedback, fixes several latent runtime bugs, and brings the codebase to zero non-exempted Pyright errors (down from 218).

**New**

- **First-run discoverability toast** — on first launch, a 1.5s-delayed toast reads &quot;Press ? f</description>
    </item>
    <item>
      <title>v1.7.2</title>
      <link>https://ytm-player.com/changelog/v1.7.2</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.7.2</guid>
      <pubDate>Mon, 27 Apr 2026 12:00:00 GMT</pubDate>
      <description>A combined release covering broader Python compatibility, a monthly Python release watcher, a full README restructure into a landing page + dedicated docs, and the 3.10 backport shims required to support Ubuntu 22.04.

**New**

- README has been split into a 64-line landing page plus seven dedicated docs (`docs/installation.md`, `docs/configuration.md`, `docs/keybindings.md`, `docs/cli-reference.m</description>
    </item>
    <item>
      <title>v1.7.0</title>
      <link>https://ytm-player.com/changelog/v1.7.0</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.7.0</guid>
      <pubDate>Mon, 27 Apr 2026 12:00:00 GMT</pubDate>
      <description>A polish release focused on resume-on-launch, lyric metadata cleanup, theming
correctness, and a typing overhaul that silences Pyright noise across the
mixin-based App. 30 commits, 545 tests (was 491).

**New**

- Heart toggle on the playback bar — visible `❤` indicator between the track info and volume, filled in the theme accent when the current track is liked, muted when not. Press `l` (or clic</description>
    </item>
    <item>
      <title>v1.6.0</title>
      <link>https://ytm-player.com/changelog/v1.6.0</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.6.0</guid>
      <pubDate>Fri, 17 Apr 2026 12:00:00 GMT</pubDate>
      <description>A polish release focused on diagnostics, stability, security, and performance.
51 commits, 65 new tests (491 total), no headline user-facing features — but a
lot of friction removed from &quot;what do I do when something breaks?&quot;

**New**

- `ytm doctor` command — prints a one-paste diagnostic report (version, Python, mpv, OS, recent log lines, most recent crash trace). Drop the output into a bug repor</description>
    </item>
    <item>
      <title>v1.5.9</title>
      <link>https://ytm-player.com/changelog/v1.5.9</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.5.9</guid>
      <pubDate>Thu, 16 Apr 2026 12:00:00 GMT</pubDate>
      <description>**Fixes**
- Fixed `gc` (jump to current track) crashing on Queue and Liked Songs — `scroll_to_cursor()` doesn't exist on Textual's `DataTable`. Removed the bogus calls; `move_cursor()` already scrolls by default (fixes [#52](https://github.com/peternaame-boop/ytm-player/issues/52), thanks @dmnmsc)
- Fixed Queue &quot;Now Playing&quot; header not updating on track change — `call_from_thread()` raises `Runtim</description>
    </item>
    <item>
      <title>v1.5.8</title>
      <link>https://ytm-player.com/changelog/v1.5.8</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.5.8</guid>
      <pubDate>Thu, 16 Apr 2026 12:00:00 GMT</pubDate>
      <description>**New**
- Track filter (`/`) extended to Queue and Liked Songs pages — search by title or artist, debounced, queue/reorder/delete operations correctly map filtered indices to real positions (fixes [#48](https://github.com/peternaame-boop/ytm-player/issues/48), thanks @dmnmsc)
- Liked Songs loading status — footer now shows &quot;loading more…&quot; while background fetch runs for libraries beyond 300 tracks</description>
    </item>
    <item>
      <title>v1.5.7</title>
      <link>https://ytm-player.com/changelog/v1.5.7</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.5.7</guid>
      <pubDate>Wed, 15 Apr 2026 12:00:00 GMT</pubDate>
      <description>**New**
- Track filter on Library and Context pages — press `/` to filter tracks by title, artist, or album in real-time. Enter keeps filtered view, Escape clears it. Queue integration preserved (fixes [#43](https://github.com/peternaame-boop/ytm-player/issues/43), thanks @dmnmsc; fixes [#46](https://github.com/peternaame-boop/ytm-player/issues/46), thanks @valkyrieglasc)
- Optimistic sidebar upda</description>
    </item>
    <item>
      <title>v1.5.6</title>
      <link>https://ytm-player.com/changelog/v1.5.6</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.5.6</guid>
      <pubDate>Fri, 10 Apr 2026 12:00:00 GMT</pubDate>
      <description>**New**
- Bouncing playlist names — long playlist titles in the sidebar now bounce (scroll back and forth) when highlighted, so you can read the full name (thanks @dmnmsc, [#32](https://github.com/peternaame-boop/ytm-player/issues/32))

**Fixes**
- Fixed &quot;Add to Queue&quot; / &quot;Play Next&quot; doing nothing — popup dismissal was triggering a spurious track selection that cleared the queue immediately after a</description>
    </item>
    <item>
      <title>v1.5.5</title>
      <link>https://ytm-player.com/changelog/v1.5.5</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.5.5</guid>
      <pubDate>Thu, 09 Apr 2026 12:00:00 GMT</pubDate>
      <description>**New**
- Textual native theme support — all 18 built-in themes (nord, dracula, gruvbox, catppuccin, etc.) work via `Ctrl+P` → &quot;Change theme&quot;. Theme selection persists across sessions. Custom **ytm-dark** theme registered as default (fixes [#23](https://github.com/peternaame-boop/ytm-player/issues/23), thanks @dsafxP)
- CLI like/dislike/unlike commands — `ytm like`, `ytm dislike`, `ytm unlike` to </description>
    </item>
    <item>
      <title>v1.5.2</title>
      <link>https://ytm-player.com/changelog/v1.5.2</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.5.2</guid>
      <pubDate>Tue, 17 Mar 2026 12:00:00 GMT</pubDate>
      <description>**Fixes**
- Fixed RTL lyrics displaying in wrong word order — disabled manual RTL reordering which was reversing text on both BiDi and non-BiDi terminals. Added `bidi_mode` config option (`auto`/`reorder`/`passthrough`) for users who need explicit control
- Fixed lyrics sidebar ignoring custom `lyrics_played`/`lyrics_current`/`lyrics_upcoming` theme colors — CSS was wired to wrong variables (`$suc</description>
    </item>
    <item>
      <title>v1.5.1</title>
      <link>https://ytm-player.com/changelog/v1.5.1</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.5.1</guid>
      <pubDate>Thu, 12 Mar 2026 12:00:00 GMT</pubDate>
      <description>**New**
- Multi-account auth support — `ytm setup` now handles Google accounts logged into multiple YouTube Music profiles, probing all `x-goog-authuser` indices automatically (thanks @glywil, PR [#15](https://github.com/peternaame-boop/ytm-player/pull/15))
- Gentoo packaging — available in the GURU overlay via `emerge media-sound/ytm-player` (thanks @dsafxP, PR [#21](https://github.com/peternaame</description>
    </item>
    <item>
      <title>v1.5.0</title>
      <link>https://ytm-player.com/changelog/v1.5.0</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.5.0</guid>
      <pubDate>Mon, 09 Mar 2026 12:00:00 GMT</pubDate>
      <description>**Refactor**
- Decomposed `app.py` (2000+ lines) into a package with 7 focused mixins — playback, navigation, keys, session, sidebar, track actions, MPRIS, IPC. Zero behavioral changes; all 370 tests pass unchanged.

**New**
- Lyrics transliteration — toggle ASCII transliteration of non-Latin lyrics with `T` (Shift+T), useful for Japanese, Korean, Arabic, Cyrillic, etc. Requires optional `anyascii</description>
    </item>
    <item>
      <title>v1.4.0</title>
      <link>https://ytm-player.com/changelog/v1.4.0</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.4.0</guid>
      <pubDate>Sat, 07 Mar 2026 12:00:00 GMT</pubDate>
      <description>**New**
- Native macOS media key and Now Playing support — hardware media keys (play/pause, next, previous) now work via Quartz event taps, and track metadata appears in macOS Control Center (thanks @Thayrov, PR [#12](https://github.com/peternaame-boop/ytm-player/pull/12))

**Fixes**
- Documented how to install optional features for AUR users — pip doesn't work on Arch due to PEP 668 (fixes [#13](</description>
    </item>
    <item>
      <title>v1.3.6</title>
      <link>https://ytm-player.com/changelog/v1.3.6</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.3.6</guid>
      <pubDate>Thu, 05 Mar 2026 12:00:00 GMT</pubDate>
      <description>**Windows Fix**
- Fixed mpv crash inside Textual TUI on Windows — locale was being set via the legacy `msvcrt.dll` CRT, but Python 3.12+ uses `ucrtbase.dll`, so the `setlocale(LC_NUMERIC, &quot;C&quot;)` call had no effect and mpv refused to initialize (access violation on null handle)
- Fixed mpv DLL not found on Windows when installed via scoop/chocolatey — auto-locates `libmpv-2.dll` in common install di</description>
    </item>
    <item>
      <title>v1.3.4</title>
      <link>https://ytm-player.com/changelog/v1.3.4</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.3.4</guid>
      <pubDate>Thu, 05 Mar 2026 12:00:00 GMT</pubDate>
      <description>**Windows Compatibility**
- Fixed crash on Windows caused by config file encoding (em-dash written as cp1252 instead of UTF-8)
- Added TCP localhost IPC for Windows (Unix sockets unavailable), with proper stale port cleanup
- Fixed PID liveness check on Windows using `OpenProcess` API
- Config now stored in `%APPDATA%\ytm-player`, cache in `%LOCALAPPDATA%\ytm-player`
- Fixed crash log path, libc d</description>
    </item>
    <item>
      <title>v1.3.3</title>
      <link>https://ytm-player.com/changelog/v1.3.3</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.3.3</guid>
      <pubDate>Thu, 05 Mar 2026 12:00:00 GMT</pubDate>
      <description>**Bug Fixes**
- Disabled media key listener on macOS — pynput can't intercept keys, causing previous track to open iTunes. Media keys on macOS will be implemented properly with MPRemoteCommandCenter in a future release.
- Suppressed noisy warnings on macOS startup (&quot;dbus-next not installed&quot;, &quot;process not trusted&quot;)</description>
    </item>
    <item>
      <title>v1.3.1</title>
      <link>https://ytm-player.com/changelog/v1.3.1</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.3.1</guid>
      <pubDate>Thu, 05 Mar 2026 12:00:00 GMT</pubDate>
      <description>**New**
- Cross-platform media key support — play/pause, next, and previous media keys now work on macOS and Windows via `pynput` (Linux already supported via MPRIS)
- Pillow (album art) is now a default dependency — no longer requires `pip install ytm-player[images]`</description>
    </item>
    <item>
      <title>v1.3.0</title>
      <link>https://ytm-player.com/changelog/v1.3.0</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.3.0</guid>
      <pubDate>Thu, 05 Mar 2026 12:00:00 GMT</pubDate>
      <description>**New**
- `ytm setup --manual` — skip browser detection, paste request headers directly (thanks @uhs-robert, [#10](https://github.com/peternaame-boop/ytm-player/issues/10))
- `ytm setup --browser &lt;name&gt;` — extract cookies from a specific browser (chrome, firefox, brave, etc.)
- Theme variables `$surface` and `$text` now properly defined — fixes unstyled popups, sidebars, and scrollbars (thanks @ah</description>
    </item>
    <item>
      <title>v1.2.11</title>
      <link>https://ytm-player.com/changelog/v1.2.11</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.2.11</guid>
      <pubDate>Tue, 03 Mar 2026 12:00:00 GMT</pubDate>
      <description>**New**
- yt-dlp configuration support: `cookies.txt` auth, `remote_components`, `js_runtimes` via `[yt_dlp]` config section (thanks @gitiy1, [PR #1](https://github.com/peternaame-boop/ytm-player/pull/1))</description>
    </item>
    <item>
      <title>v1.2.10</title>
      <link>https://ytm-player.com/changelog/v1.2.10</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.2.10</guid>
      <pubDate>Tue, 03 Mar 2026 12:00:00 GMT</pubDate>
      <description>**Bug Fixes**
- Fixed RTL text (Arabic/Hebrew) in track table columns — added BiDi isolation (LRI/PDI) so RTL album/artist names don't bleed into adjacent columns</description>
    </item>
    <item>
      <title>v1.2.9</title>
      <link>https://ytm-player.com/changelog/v1.2.9</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.2.9</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      <description>**New**
- Published to PyPI — install with `pip install ytm-player` or `pipx install ytm-player`

**Bug Fixes**
- Fixed track auto-advance stopping after song ends — three root causes: mpv end-file reason read from wrong event object, event loop reference permanently lost under thread race condition, and `CancelledError` not caught in track-end handler
- Fixed RTL text (Arabic/Hebrew) display — re</description>
    </item>
    <item>
      <title>v1.2.4</title>
      <link>https://ytm-player.com/changelog/v1.2.4</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.2.4</guid>
      <pubDate>Tue, 17 Feb 2026 12:00:00 GMT</pubDate>
      <description>**Bug Fixes**
- Fixed intermittent playback stopping mid-queue — consecutive stream failures (stale yt-dlp session, network hiccup) now reset the stream resolver automatically, preventing the queue index from advancing past all remaining tracks
- Fixed playlists appearing empty after prolonged use — YTMusic API client now auto-reinitializes after 3 consecutive failures (handles expired sessions/co</description>
    </item>
    <item>
      <title>v1.2.3</title>
      <link>https://ytm-player.com/changelog/v1.2.3</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.2.3</guid>
      <pubDate>Tue, 17 Feb 2026 12:00:00 GMT</pubDate>
      <description>**Bug Fixes**
- Fixed MPRIS silently disabled on Python 3.14 — `from __future__ import annotations` caused dbus-next to reject `-&gt; None` return types, disabling media keys and desktop player widgets
- Fixed RTL lyrics line-wrap reading bottom-to-top — long lines are now pre-wrapped in logical order before reordering, so sentence start is on top</description>
    </item>
    <item>
      <title>v1.2.2</title>
      <link>https://ytm-player.com/changelog/v1.2.2</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.2.2</guid>
      <pubDate>Sun, 15 Feb 2026 12:00:00 GMT</pubDate>
      <description>**Bug Fixes**
- Fixed play/pause doing nothing after session restore — player had no stream loaded so toggling pause was a no-op; now starts playback from the restored queue position
- Fixed MPRIS play/pause also being a no-op after session restore (same root cause)
- Fixed RTL (Hebrew, Arabic, etc.) lyrics displaying in wrong order — segment-level reordering now renders bidirectional text correct</description>
    </item>
    <item>
      <title>v1.2.1</title>
      <link>https://ytm-player.com/changelog/v1.2.1</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.2.1</guid>
      <pubDate>Sat, 14 Feb 2026 12:00:00 GMT</pubDate>
      <description>**Features**
- Synced (timestamped) lyrics — lyrics highlight and auto-scroll with the song in real time
- Click-to-seek on lyrics — click any synced lyric line to jump to that part of the song
- LRCLIB.net fallback — when YouTube Music doesn't provide synced lyrics, fetches them from LRCLIB.net (no API key needed)
- Lyrics auto-center — current lyric line stays centered in the viewport as the son</description>
    </item>
    <item>
      <title>v1.2.0</title>
      <link>https://ytm-player.com/changelog/v1.2.0</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.2.0</guid>
      <pubDate>Sat, 14 Feb 2026 12:00:00 GMT</pubDate>
      <description>**Features**
- Persistent playlist sidebar (left) — visible across all views, toggleable per-view with state memory (`Ctrl+e`)
- Persistent lyrics sidebar (right) — synced lyrics with auto-scroll, replaces the old full-page Lyrics view (`l` to toggle)
- Header bar with toggle buttons for both sidebars
- Pinned navigation items (Liked Songs, Recently Played) in the playlist sidebar
- Per-view sideb</description>
    </item>
    <item>
      <title>v1.1.3</title>
      <link>https://ytm-player.com/changelog/v1.1.3</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.1.3</guid>
      <pubDate>Sat, 14 Feb 2026 12:00:00 GMT</pubDate>
      <description>**Features**
- Click column headers to sort — click any column header (Title, Artist, Album, Duration, #) to sort; click again to reverse
- Drag-to-resize columns — drag column header borders to adjust widths; Title column auto-fills remaining space
- Playlist sort order — requests &quot;recently added&quot; order from YouTube Music API when loading playlists
- `#` column preserves original playlist positio</description>
    </item>
    <item>
      <title>v1.1.2</title>
      <link>https://ytm-player.com/changelog/v1.1.2</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.1.2</guid>
      <pubDate>Sat, 14 Feb 2026 12:00:00 GMT</pubDate>
      <description>**Features**
- Shuffle-aware playlist playback — double-clicking a playlist with shuffle on now starts from a random track instead of always the first
- Table sorting — sort any track list by Title (`s t`), Artist (`s a`), Album (`s A`), Duration (`s d`), or reverse (`s r`)
- Session resume — on startup, restores last queue position and shows the track in the footer (without auto-playing)
- Quit a</description>
    </item>
    <item>
      <title>v1.1.1</title>
      <link>https://ytm-player.com/changelog/v1.1.1</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.1.1</guid>
      <pubDate>Fri, 13 Feb 2026 12:00:00 GMT</pubDate>
      <description>**Bug Fixes**
- Fixed right-click on track table triggering playback instead of only opening context menu
- Fixed auto-advance bug: songs after the 2nd track would not play due to stale `_end_file_skip` counter
- Fixed thread-safe skip counter — check+increment now atomic under lock
- Fixed duplicate end-file events causing track skipping (debounce guard)
- Fixed `player.play()` failure leaving st</description>
    </item>
    <item>
      <title>v1.1.0</title>
      <link>https://ytm-player.com/changelog/v1.1.0</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.1.0</guid>
      <pubDate>Thu, 12 Feb 2026 12:00:00 GMT</pubDate>
      <description>**Features**
- Liked Songs page (`g y`) — browse and play your liked music
- Recently Played page (`g r`) — local history from SQLite
- Download for offline — right-click any track → &quot;Download for Offline&quot;
- Discord Rich Presence — show what you're listening to (optional, `pip install -e &quot;.[discord]&quot;`)
- Last.fm scrobbling — automatic scrobbling + Now Playing (optional, `pip install -e &quot;.[lastfm]&quot;</description>
    </item>
    <item>
      <title>v1.0.0</title>
      <link>https://ytm-player.com/changelog/v1.0.0</link>
      <guid isPermaLink="true">https://ytm-player.com/changelog/v1.0.0</guid>
      <pubDate>Sat, 07 Feb 2026 12:00:00 GMT</pubDate>
      <description>- Initial release
- Full TUI with 7 pages (Library, Search, Browse, Context, Lyrics, Queue, Help)
- Vim-style keybindings with multi-key sequences and count prefixes
- Audio playback via mpv with shuffle, repeat, queue management
- Predictive search with music-first mode
- Spotify playlist import (API + scraper)
- Play and search history in SQLite
- Audio cache with LRU eviction (1GB default)
- Al</description>
    </item>
  </channel>
</rss>