termusic icon indicating copy to clipboard operation
termusic copied to clipboard

Server stops playback after pavucontrol is opened

Open hasezoey opened this issue 5 months ago • 19 comments

Environment & Versions

  • System: Linux Alpine
  • Termusic version: 0.11
  • Rust version:
  • Backend: rusty

Logs:

See https://github.com/tramhao/termusic/issues/452#issuecomment-3172583529

Description of the Problem

Thanks, as stated in the OP, I am on Alpine, which is not systemd-based, but of course has its own daemon to > run wireplumber, pipewire, and pipewire-pulse on log in. So all three are running.

I never had pulse installed. I was using pulsemixer as a frontend for pipewire. When running pavucontrol, termusic stops working, and never shows up in pavucontrol.

Precise steps to reproduce consistently (but only on my machine, I am afraid):

open termusic and listen to some music. Then, close it via TUI; open pavucontrol reopen termusic

The track that was previously playing is now stuck at 00:00 even though the status is "Running". Termusic does > not appear on pavucontrol.

The music is not playing. The server process is still alive in the background. The TUI responds to events inputs, > but I am unable to change the currently playing song for a few tries. After that, the player states that no song > is being currently played, and I am still unable to play anything.


This is a sub-issue mentioned in https://github.com/tramhao/termusic/issues/452#issuecomment-3172544269. To not de-rail that issue and try to debug this issue, a new thread is opened.

hasezoey avatar Aug 11 '25 10:08 hasezoey

I now have Alpine and termusic running in a VM.

Some initial notes: The current default alpine install (Standard) installed via setup-alpine and later with setup-desktop(plasma), has at the end result both pipewire and pulseaudio installed and running. Additionally, it does not install pipewire-alsa and instead has pulseaudio-alsa installed, meaning termusic uses pulseaudio. (inxi -A list 2 servers: Server-1: pipewire and Server-2: pulseaudio)

After uninstalling everything pulseaudio (apk del pulseaudio basically removes everything) and installing pipewire-pulse and pipewire-alsa and rebooting, termusic still plays fine and pavucontrol launches and lists PipeWire ALSA [termusic-server]: ALSA Playback as expected, both if the TUI is running if not.


@foxyseta could you run inxi -A (install inxi if not present) and report the output? Also please check that apk list "pulseaudio*" has nothing installed (expect maybe pulseaudio-qt if you are on kde) and check that pipewire-alsa (and maybe pipewire-pulse) are installed?

hasezoey avatar Aug 11 '25 10:08 hasezoey

inxi -a output:

CPU: dual core Intel Core i5-6200U (-MT MCP-) speed/min/max: 700/400/2800 MHz
Kernel: 6.12.41-0-lts x86_64 Up: 2h 46m Mem: 3.23/15.5 GiB (20.8%)
Storage: 223.57 GiB (42.8% used) Procs: 162 Shell: ash (busybox) inxi: 3.3.38

Plenty of pulseaudio packages are installed actually, as they are dependencies of pipewire-pulse:

World updated, but the following packages are not removed due to:
  pulseaudio: pipewire-pulse pulseaudio-bluez

OK: 8615 MiB in 1236 packages

foxyseta avatar Aug 13 '25 10:08 foxyseta

inxi -a output:

inxi options are case sensitive, i meant for -A (capital a).

Plenty of pulseaudio packages are installed actually, as they are dependencies of pipewire-pulse:

IIRC, after installing pipewire-pulse, i had only pulseaudio-qt installed, due to kde. I did not have pulseaudio-bluez installed to test. I will try to check the VM again.

hasezoey avatar Aug 13 '25 13:08 hasezoey

Output in my VM:

$ apk list --installed "pulseaudio*"
pulseaudio-qt-1.7.0-r0 x86_64 {pulseaudio-qt} (LGPL-2.1-only OR LGPL-3.0-only) [installed]
pulseaudio-utils-17.0-r5 x86_64 {pulseaudio} (LGPL-2.1-or-later) [installed]
$ apk list --installed "pipewire*"
pipewire-1.4.7-r0 x86_64 {pipewire} (LGPL-2.1-or-later) [installed]
pipewire-alsa-1.4.7-r0 x86_64 {pipewire} (LGPL-2.1-or-later) [installed]
pipewire-libs-1.4.7-r0 x86_64 {pipewire} (LGPL-2.1-or-later) [installed]
pipewire-openrc-1.4.7-r0 x86_64 {pipewire} (LGPL-2.1-or-later) [installed]
pipewire-pulse-1.4.7-r0 x86_64 {pipewire} (LGPL-2.1-or-later) [installed]
pipewire-pulse-openrc-1.4.7-r0 x86_64 {pipewire} (LGPL-2.1-or-later) [installed]
$ inxi -A
Audio:
  Message: No device data found.
  API: ALSA v: k6.12.41-0-lts status: kernel-api
  Server-1: PipeWire v: 1.4.7 status: active (process)

hasezoey avatar Aug 13 '25 13:08 hasezoey

inxi options are case sensitive, i meant for -A (capital a).

Sorry! I was aware of the case-sensitiveness, but plainly forgot which flag I was supposed to use.

Audio:
  Message: No device data found.
  API: ALSA v: k6.12.41-0-lts status: kernel-api
  Server-1: PipeWire v: 1.4.7 status: active

IIRC, after installing pipewire-pulse, i had only pulseaudio-qt installed, due to kde. I did not have pulseaudio-bluez installed to test.

Perhaps mine were old dependencies? By reinstalling pipewire-pulse, I managed to cut it down to:

pulseaudio-dev-17.0-r5 x86_64 {pulseaudio} (LGPL-2.1-or-later) [installed]
pulseaudio-utils-17.0-r5 x86_64 {pulseaudio} (LGPL-2.1-or-later) [installed]

pulseaudio-dev seems to be a depenency of mpv-dev which, if I am not mistaken, is needed to build termusic?

foxyseta avatar Aug 13 '25 14:08 foxyseta

pulseaudio-dev seems to be a depenency of mpv-dev which, if I am not mistaken, is needed to build termusic?

Might be, but my testing was for the rusty backend, as you said had been using where this issue appeared, or did i misunderstand something?

My bad, apparently, I switched to Rusty a while a go in my config and forgot about it.

source (and the logs that were attached) (as a side-FYI: the config option to set the backend is new since 0.11.0 and defaults to rusty, which will be used unless overwritten by environment variables or cli option)


Server-1: PipeWire v: 1.4.7 status: active By reinstalling pipewire-pulse, I managed to cut it down to:

With how your system is now, can you still reproduce the issue of opening pavucontrol having problems with termusic and not showing the termusic stream in pavucontrol?

hasezoey avatar Aug 13 '25 14:08 hasezoey

Might be, but my testing was for the rusty backend, as you said had been using where this issue appeared, or did i misunderstand something?

Yes, you are right. I uninstalled mpv-dev and pulseaudio-dev for the time being.

(as a side-FYI: the config option to set the backend is new since 0.11.0 and defaults to rusty, which will be used unless overwritten by environment variables or cli option)

This might be why I don't remember performing the switch indeed. I was suspecting something similar.

With how your system is now, can you still reproduce the issue of opening pavucontrol having problems with termusic and not showing the termusic stream in pavucontrol?

Yes, I can still reproduce it. I am using rusty as a backend. I installed termusic and termusic-server with rusty-simd via cargo from master. The only pulseaudio package I have on my system right now is pulseaudio-utils.

foxyseta avatar Aug 14 '25 23:08 foxyseta

Yes, I can still reproduce it. I am using rusty as a backend. I installed termusic and termusic-server with rusty-simd via cargo from master.

Thanks for the retry. Sadly as i cant reproduce it in the VM and there does not seem to be a anything in the logs, the best i can do is try to add a error for when the backend fails, maybe that will report the problem?

hasezoey avatar Aug 15 '25 08:08 hasezoey

Re: [tramhao/termusic] Server stops playback after pavucontrol is opened (Issue #552) – hasezoey left a comment (tramhao/termusic#552)

Yes, I can still reproduce it. I am using rusty as a backend. I installed termusic and termusic-server with rusty-simd via cargo from master.

Thanks for the retry. Sadly as i cant reproduce it in the VM and there does not seem to be a anything in the logs, the best i can do is try to add a error for when the backend fails, maybe that will report the problem?

Sure, I am willing to test it before moving back to mpv and uninstalling pavucontrol.

-- Best, Stefano

foxyseta avatar Aug 15 '25 08:08 foxyseta

the best i can do is try to add a error for when the backend fails, maybe that will report the problem? Sure, I am willing to test it before moving back to mpv and uninstalling pavucontrol.

I have investigated further, it is likely that the actual rusty backend thread is still alive, but the alsa output thread (that we basically dont have control over) has died, without a panic at that. I have now put up a testing branch (see below) that hopefully will try to detect in a debug way if that thread has died, the implementation is not ready for production, but enough to hopefully debug this issue.

Please install branch tryCheckOutputThread (repository & branch), run the following command and report back the logs (only the server is really necessary, but tui would also be good). Please adapt the command to suit how you start termusic, but keep the environment variables:

RUST_BACKTRACE=1 RUST_LOG=info,termusic_server=trace,termusic=trace termusic --backend=rusty

Also after you could reproduce the issue with pavucontrol changing termusic, please wait about ~7 seconds before exiting termusic (there is a timer for debug printing). (or tail the log output and wait for at least one Reference count: message after the problem before exiting)

hasezoey avatar Aug 15 '25 10:08 hasezoey

I don't see any errors in the log, unfortunately.

Termusic server

[2025-08-15T15:08:29.650+02:00 INFO termusic_server]: Server starting...
[2025-08-15T15:08:29.650+02:00 TRACE termusic_server]: Backend from CLI
[2025-08-15T15:08:30.417+02:00 WARN termusiclib::track]: Failed to read metadata from "/home/foxy/music/playlists/../tracks/reasoning/return-in-new-colors.mp3": Mpeg: File contains an invalid frame
[2025-08-15T15:08:30.572+02:00 INFO termusic_server]: Server listening on /tmp/termusic.socket
[2025-08-15T15:08:30.573+02:00 INFO termusic_server]: Server ready
[2025-08-15T15:08:30.573+02:00 INFO termusicplayback::backends]: Using Backend "rusty"
[2025-08-15T15:08:30.577+02:00 DEBUG termusic_server]: current track index: 34
[2025-08-15T15:08:30.577+02:00 DEBUG termusicplayback::playlist]: Stream Event not send: No Receivers
[2025-08-15T15:08:30.577+02:00 DEBUG termusicplayback::playlist]: need to proceed to next: false
[2025-08-15T15:08:30.577+02:00 INFO termusicplayback]: Starting Track Track {
    inner: Track(
        TrackData {
            path: "/home/foxy/music/playlists/../tracks/reasoning/discussion-hope-vs-despair-2nd-mix.mp3",
            album: None,
            file_type: Some(
                Mpeg,
            ),
        },
    ),
    duration: Some(
        201.195s,
    ),
    title: Some(
        "SDR2 OST: -2-20- Discussion -HOPE VS DESPAIR- [2nd mix]",
    ),
    artist: Some(
        "DontBleedOnTheSuits",
    ),
}
[2025-08-15T15:08:30.599+02:00 TRACE termusicplayback::backends::rusty::decoder::buffered_source]: Buffer capacity 4194304
[2025-08-15T15:08:30.601+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:08:30.624+02:00 INFO symphonia_core::probe]: found the format marker [49, 44, 33] @ 0+2 bytes.
[2025-08-15T15:08:30.629+02:00 INFO symphonia_core::probe]: found the format marker [ff, fb] @ 1258456+2 bytes.
[2025-08-15T15:08:30.629+02:00 INFO symphonia_bundle_mp3::demuxer]: using xing header for duration
[2025-08-15T15:08:30.629+02:00 INFO termusicplayback::backends::rusty::decoder]: Found supported container with trackid 0 and codectype 0x1003
[2025-08-15T15:08:30.629+02:00 TRACE termusicplayback::backends::rusty::decoder]: Time is 0, doing container metadata
[2025-08-15T15:08:30.684+02:00 INFO termusicplayback]: Not restoring Last position as it is not enabled for Music
[2025-08-15T15:08:30.684+02:00 DEBUG termusicplayback]: Stream Event not send: No Receivers
[2025-08-15T15:08:35.601+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:08:40.600+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:08:45.600+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:08:50.600+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:08:55.600+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:09:00.575+02:00 DEBUG termusic_server]: Saved playlist in interval
[2025-08-15T15:09:00.600+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:09:05.600+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:09:07.408+02:00 INFO termusic_server]: PlayerCmd::Quit received
[2025-08-15T15:09:07.409+02:00 INFO termusicplayback]: Not saving Last position as "Remember last position" is not enabled for Music
[2025-08-15T15:09:07.412+02:00 INFO termusic_server]: Bye
[2025-08-15T15:09:07.413+02:00 DEBUG termusicplayback::backends::rusty::sink]: Player Channel is closed
[2025-08-15T15:09:14.147+02:00 INFO termusic_server]: Server starting...
[2025-08-15T15:09:14.147+02:00 TRACE termusic_server]: Backend from CLI
[2025-08-15T15:09:14.320+02:00 WARN termusiclib::track]: Failed to read metadata from "/home/foxy/music/playlists/../tracks/reasoning/return-in-new-colors.mp3": Mpeg: File contains an invalid frame
[2025-08-15T15:09:14.326+02:00 INFO termusic_server]: Server listening on /tmp/termusic.socket
[2025-08-15T15:09:14.326+02:00 INFO termusic_server]: Server ready
[2025-08-15T15:09:14.326+02:00 INFO termusicplayback::backends]: Using Backend "rusty"
[2025-08-15T15:09:14.327+02:00 DEBUG termusic_server]: current track index: 34
[2025-08-15T15:09:14.327+02:00 DEBUG termusicplayback::playlist]: Stream Event not send: No Receivers
[2025-08-15T15:09:14.327+02:00 DEBUG termusicplayback::playlist]: need to proceed to next: false
[2025-08-15T15:09:14.327+02:00 INFO termusicplayback]: Starting Track Track {
    inner: Track(
        TrackData {
            path: "/home/foxy/music/playlists/../tracks/reasoning/discussion-hope-vs-despair-2nd-mix.mp3",
            album: None,
            file_type: Some(
                Mpeg,
            ),
        },
    ),
    duration: Some(
        201.195s,
    ),
    title: Some(
        "SDR2 OST: -2-20- Discussion -HOPE VS DESPAIR- [2nd mix]",
    ),
    artist: Some(
        "DontBleedOnTheSuits",
    ),
}
[2025-08-15T15:09:14.337+02:00 TRACE termusicplayback::backends::rusty::decoder::buffered_source]: Buffer capacity 4194304
[2025-08-15T15:09:14.338+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:09:14.339+02:00 INFO symphonia_core::probe]: found the format marker [49, 44, 33] @ 0+2 bytes.
[2025-08-15T15:09:14.341+02:00 INFO symphonia_core::probe]: found the format marker [ff, fb] @ 1258456+2 bytes.
[2025-08-15T15:09:14.342+02:00 INFO symphonia_bundle_mp3::demuxer]: using xing header for duration
[2025-08-15T15:09:14.342+02:00 INFO termusicplayback::backends::rusty::decoder]: Found supported container with trackid 0 and codectype 0x1003
[2025-08-15T15:09:14.342+02:00 TRACE termusicplayback::backends::rusty::decoder]: Time is 0, doing container metadata
[2025-08-15T15:09:14.438+02:00 INFO termusicplayback]: Not restoring Last position as it is not enabled for Music
[2025-08-15T15:09:19.339+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:09:24.338+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:09:29.338+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:09:34.338+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:09:39.338+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:09:44.328+02:00 DEBUG termusic_server]: Saved playlist in interval
[2025-08-15T15:09:44.338+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:09:49.339+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:09:54.338+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:09:59.338+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:10:04.339+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:10:09.339+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:10:14.339+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:10:19.338+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:10:24.338+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:10:29.339+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:10:34.339+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:10:39.339+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:10:44.338+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:10:49.339+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:10:54.339+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:10:59.339+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:11:04.338+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
[2025-08-15T15:11:09.339+02:00 DEBUG termusicplayback::backends::rusty::sink]: Reference count: (
    2,
    0,
)
Termusic TUI

[2025-08-15T15:08:29.646+02:00 INFO termusic]: Waiting until connected
[2025-08-15T15:08:29.650+02:00 DEBUG termusic]: Socket File not found!
[2025-08-15T15:08:29.760+02:00 DEBUG termusic]: Socket File not found!
[2025-08-15T15:08:29.871+02:00 DEBUG termusic]: Socket File not found!
[2025-08-15T15:08:29.982+02:00 DEBUG termusic]: Socket File not found!
[2025-08-15T15:08:30.093+02:00 DEBUG termusic]: Socket File not found!
[2025-08-15T15:08:30.204+02:00 DEBUG termusic]: Socket File not found!
[2025-08-15T15:08:30.308+02:00 DEBUG termusic]: Socket File not found!
[2025-08-15T15:08:30.414+02:00 DEBUG termusic]: Socket File not found!
[2025-08-15T15:08:30.525+02:00 DEBUG termusic]: Socket File not found!
[2025-08-15T15:08:30.634+02:00 INFO termusic]: Connected on unix:///tmp/termusic.socket
[2025-08-15T15:08:30.635+02:00 INFO termusic::ui::model]: Using viuer protocol ITerm
[2025-08-15T15:08:30.692+02:00 INFO termusiclib::new_database]: Scanning "/home/foxy/music"
[2025-08-15T15:08:30.692+02:00 INFO termusic::ui::music_player_client]: Got response from server: Map { stream: Streaming }
[2025-08-15T15:08:30.692+02:00 INFO termusic::ui]: Requesting Playlist from server
[2025-08-15T15:08:30.693+02:00 INFO termusic::ui::music_player_client]: Got response from server: Response { metadata: MetadataMap { headers: {"content-type": "application/grpc", "date": "Fri, 15 Aug 2025 13:08:30 GMT", "grpc-status": "0"} }, message: PlaylistTracks { current_track_index: 34, tracks: [PlaylistAddTrack { at_index: 0, duration: Some(Duration { secs: 192, nanos: 78000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/4-50-from-paddington-railways.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 1, duration: Some(Duration { secs: 108, nanos: 852000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/a-flower-without-a-match.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 2, duration: Some(Duration { secs: 123, nanos: 160000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/a-flowering-snake-xx.flac")) }), optional_title: None }, PlaylistAddTrack { at_index: 3, duration: Some(Duration { secs: 117, nanos: 629000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/a-flowering-snake.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 4, duration: Some(Duration { secs: 46, nanos: 550000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/a-murder-is-announced.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 5, duration: Some(Duration { secs: 133, nanos: 146000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/a-scheming-gambler.flac")) }), optional_title: None }, PlaylistAddTrack { at_index: 6, duration: Some(Duration { secs: 189, nanos: 362000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/a-time-for-excellent-manners.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 7, duration: Some(Duration { secs: 405, nanos: 238000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/aetherias-tragedy.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 8, duration: Some(Duration { secs: 188, nanos: 761000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/argument-b-side.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 9, duration: Some(Duration { secs: 116, nanos: 219000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/biting-nails.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 10, duration: Some(Duration { secs: 129, nanos: 71000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/black-or-white.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 11, duration: Some(Duration { secs: 143, nanos: 47000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/bold-and-daring.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 12, duration: Some(Duration { secs: 158, nanos: 15000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/breathtaking.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 13, duration: Some(Duration { secs: 122, nanos: 70000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/by-the-pricking-of-my-thumbs.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 14, duration: Some(Duration { secs: 309, nanos: 600000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-dawn-edition-vol-3.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 15, duration: Some(Duration { secs: 307, nanos: 704000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-dawn-edition-volume-2.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 16, duration: Some(Duration { secs: 373, nanos: 420000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-dawn-edition.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 17, duration: Some(Duration { secs: 281, nanos: 104000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-odd-edition.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 18, duration: Some(Duration { secs: 175, nanos: 804000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-resurrection-edition-no-intro.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 19, duration: Some(Duration { secs: 250, nanos: 96000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-resurrection-edition.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 20, duration: Some(Duration { secs: 282, nanos: 528000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-solar-edition-volume-2.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 21, duration: Some(Duration { secs: 280, nanos: 712000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-solar-edition.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 22, duration: Some(Duration { secs: 367, nanos: 543000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-space-edition.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 23, duration: Some(Duration { secs: 247, nanos: 667000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-sun-edition-v3-ver-b.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 24, duration: Some(Duration { secs: 283, nanos: 638000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-sun-edition-v3.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 25, duration: Some(Duration { secs: 297, nanos: 38000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/debate-scrum.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 26, duration: Some(Duration { secs: 187, nanos: 481000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/debating-truth.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 27, duration: Some(Duration { secs: 121, nanos: 731000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/desire-for-recklessness.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 28, duration: Some(Duration { secs: 181, nanos: 420000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/detective-danger.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 29, duration: Some(Duration { secs: 145, nanos: 104000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discombulate.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 30, duration: Some(Duration { secs: 230, nanos: 713000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discussion-break-2nd-mix.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 31, duration: Some(Duration { secs: 236, nanos: 95000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discussion-break.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 32, duration: Some(Duration { secs: 203, nanos: 964000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discussion-heat-up-2nd-mix.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 33, duration: Some(Duration { secs: 253, nanos: 388000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discussion-heat-up.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 34, duration: Some(Duration { secs: 201, nanos: 195000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discussion-hope-vs-despair-2nd-mix.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 35, duration: Some(Duration { secs: 270, nanos: 72000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discussion-hope-vs-despair.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 36, duration: Some(Duration { secs: 271, nanos: 909000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discussion-mix-edge-version.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 37, duration: Some(Duration { secs: 196, nanos: 911000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/distrust.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 38, duration: Some(Duration { secs: 111, nanos: 308000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/explaining-the-facts.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 39, duration: Some(Duration { secs: 181, nanos: 986000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/exquisite-aroma.flac")) }), optional_title: None }, PlaylistAddTrack { at_index: 40, duration: Some(Duration { secs: 89, nanos: 130000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/gavotte-of-dignity.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 41, duration: Some(Duration { secs: 121, nanos: 940000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/gloating.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 42, duration: Some(Duration { secs: 109, nanos: 506000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/guillotine-ballet.flac")) }), optional_title: None }, PlaylistAddTrack { at_index: 43, duration: Some(Duration { secs: 154, nanos: 305000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/high-strung-spirit.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 44, duration: Some(Duration { secs: 209, nanos: 450000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/high-strung.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 45, duration: Some(Duration { secs: 151, nanos: 824000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/hot-flash.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 46, duration: Some(Duration { secs: 186, nanos: 305000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/kakegurui.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 47, duration: Some(Duration { secs: 173, nanos: 897000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/l-s-theme-b.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 48, duration: Some(Duration { secs: 183, nanos: 902000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/l-s-theme.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 49, duration: Some(Duration { secs: 203, nanos: 886000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/light-s-theme.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 50, duration: Some(Duration { secs: 240, nanos: 48000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/living-in-lazy-parallel-world-short-ver.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 51, duration: Some(Duration { secs: 238, nanos: 80000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/living-in-lazy-parallel-world-short.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 52, duration: Some(Duration { secs: 173, nanos: 270000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/midsomer-murders.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 53, duration: Some(Duration { secs: 169, nanos: 535000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/mr-monokuma-s-tutoring.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 54, duration: Some(Duration { secs: 244, nanos: 114000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/mystery-labirinth-question-#2.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 55, duration: Some(Duration { secs: 239, nanos: 308000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/mystery-labirinth-question.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 56, duration: Some(Duration { secs: 299, nanos: 624000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/mystery-solution-myself.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 57, duration: Some(Duration { secs: 107, nanos: 50000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/near-2.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 58, duration: Some(Duration { secs: 181, nanos: 969000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/near-s-theme.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 59, duration: Some(Duration { secs: 119, nanos: 980000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/near.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 60, duration: Some(Duration { secs: 172, nanos: 199000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/objection-cross-sword.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 61, duration: Some(Duration { secs: 126, nanos: 851000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/on-the-edge-of-life-and-death.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 62, duration: Some(Duration { secs: 163, nanos: 239000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/on-the-move.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 63, duration: Some(Duration { secs: 111, nanos: 778000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/our-class-trial.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 64, duration: Some(Duration { secs: 119, nanos: 40000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/playing-with-toys.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 65, duration: Some(Duration { secs: 109, nanos: 740000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/pursuit.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 66, duration: Some(Duration { secs: 142, nanos: 54000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/rain-code-title-ver.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 67, duration: Some(Duration { secs: 199, nanos: 131000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/re-distrust.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 68, duration: Some(Duration { secs: 110, nanos: 132000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/re-trial-underground.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 69, duration: Some(Duration { secs: 232, nanos: 150000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/reasoning-death-match-break.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 70, duration: Some(Duration { secs: 246, nanos: 727000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/reasoning-death-match.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 71, duration: Some(Duration { secs: 189, nanos: 48000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/relief.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 72, duration: Some(Duration { secs: 0, nanos: 0 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/return-in-new-colors.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 73, duration: Some(Duration { secs: 139, nanos: 651000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/sadistic-intimacy.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 74, duration: Some(Duration { secs: 80, nanos: 718000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/severance-main-titles.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 75, duration: Some(Duration { secs: 98, nanos: 456000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/smashing-wrench.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 76, duration: Some(Duration { secs: 100, nanos: 571000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/something-strange.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 77, duration: Some(Duration { secs: 253, nanos: 74000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/spirit-praise-and-beauty.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 78, duration: Some(Duration { secs: 175, nanos: 961000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/strange-visage.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 79, duration: Some(Duration { secs: 193, nanos: 123000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/suspicious-looking.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 80, duration: Some(Duration { secs: 157, nanos: 48000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/the-demise-of-mankind.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 81, duration: Some(Duration { secs: 220, nanos: 839000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/the-game-is-on.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 82, duration: Some(Duration { secs: 163, nanos: 161000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/theme-from-agatha-christie-s-marple.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 83, duration: Some(Duration { secs: 149, nanos: 290000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/things-remembered.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 84, duration: Some(Duration { secs: 108, nanos: 565000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/trial-underground.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 85, duration: Some(Duration { secs: 284, nanos: 813000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/v3-argument-blade-lock.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 86, duration: Some(Duration { secs: 177, nanos: 868000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/v3-argument-break.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 87, duration: Some(Duration { secs: 203, nanos: 102000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/v3-argument-hope-vs-despair.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 88, duration: Some(Duration { secs: 176, nanos: 692000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/v3-argument-panic.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 89, duration: Some(Duration { secs: 176, nanos: 614000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/v3-argument-perjury.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 90, duration: Some(Duration { secs: 304, nanos: 901000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/v3-argument-turn-up-the-heat.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 91, duration: Some(Duration { secs: 94, nanos: 537000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/waltz-of-joy.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 92, duration: Some(Duration { secs: 137, nanos: 626000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/waltz-of-trickery.flac")) }), optional_title: None }, PlaylistAddTrack { at_index: 93, duration: Some(Duration { secs: 102, nanos: 168000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/westworld-main-title-theme.mp3")) }), optional_title: None }] }, extensions: Extensions }
[2025-08-15T15:08:30.863+02:00 WARN termusiclib::new_database]: Error scanning path "/home/foxy/music/tracks/reasoning/return-in-new-colors.mp3": FileDecoding(Mpeg: "File contains an invalid frame")
[2025-08-15T15:08:30.868+02:00 INFO termusiclib::new_database]: Finished Scanning "/home/foxy/music" with 0 created or updated
[2025-08-15T15:08:30.873+02:00 WARN termusiclib::track]: Failed to read metadata from "/home/foxy/music/playlists/../tracks/reasoning/return-in-new-colors.mp3": Mpeg: File contains an invalid frame
[2025-08-15T15:08:30.879+02:00 INFO termusic::ui::components::playlist]: index from player is: 34, index in tui is: Some(34)
[2025-08-15T15:08:30.880+02:00 INFO termusic::ui::music_player_client]: Got response from server: GetProgressResponse { progress: Some(PlayerTime { position: None, total_duration: None }), current_track_index: 0, status: 1, volume: 100, speed: 10, gapless: true, radio_title: "" }
[2025-08-15T15:09:07.412+02:00 INFO termusic]: Bye
[2025-08-15T15:09:14.142+02:00 INFO termusic]: Waiting until connected
[2025-08-15T15:09:14.148+02:00 DEBUG termusic]: Socket File not found!
[2025-08-15T15:09:14.255+02:00 DEBUG termusic]: Socket File not found!
[2025-08-15T15:09:14.362+02:00 INFO termusic]: Connected on unix:///tmp/termusic.socket
[2025-08-15T15:09:14.362+02:00 INFO termusic::ui::model]: Using viuer protocol ITerm
[2025-08-15T15:09:14.403+02:00 INFO termusiclib::new_database]: Scanning "/home/foxy/music"
[2025-08-15T15:09:14.403+02:00 INFO termusic::ui::music_player_client]: Got response from server: Map { stream: Streaming }
[2025-08-15T15:09:14.403+02:00 INFO termusic::ui]: Requesting Playlist from server
[2025-08-15T15:09:14.404+02:00 INFO termusic::ui::music_player_client]: Got response from server: Response { metadata: MetadataMap { headers: {"content-type": "application/grpc", "date": "Fri, 15 Aug 2025 13:09:14 GMT", "grpc-status": "0"} }, message: PlaylistTracks { current_track_index: 34, tracks: [PlaylistAddTrack { at_index: 0, duration: Some(Duration { secs: 192, nanos: 78000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/4-50-from-paddington-railways.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 1, duration: Some(Duration { secs: 108, nanos: 852000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/a-flower-without-a-match.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 2, duration: Some(Duration { secs: 123, nanos: 160000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/a-flowering-snake-xx.flac")) }), optional_title: None }, PlaylistAddTrack { at_index: 3, duration: Some(Duration { secs: 117, nanos: 629000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/a-flowering-snake.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 4, duration: Some(Duration { secs: 46, nanos: 550000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/a-murder-is-announced.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 5, duration: Some(Duration { secs: 133, nanos: 146000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/a-scheming-gambler.flac")) }), optional_title: None }, PlaylistAddTrack { at_index: 6, duration: Some(Duration { secs: 189, nanos: 362000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/a-time-for-excellent-manners.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 7, duration: Some(Duration { secs: 405, nanos: 238000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/aetherias-tragedy.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 8, duration: Some(Duration { secs: 188, nanos: 761000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/argument-b-side.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 9, duration: Some(Duration { secs: 116, nanos: 219000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/biting-nails.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 10, duration: Some(Duration { secs: 129, nanos: 71000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/black-or-white.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 11, duration: Some(Duration { secs: 143, nanos: 47000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/bold-and-daring.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 12, duration: Some(Duration { secs: 158, nanos: 15000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/breathtaking.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 13, duration: Some(Duration { secs: 122, nanos: 70000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/by-the-pricking-of-my-thumbs.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 14, duration: Some(Duration { secs: 309, nanos: 600000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-dawn-edition-vol-3.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 15, duration: Some(Duration { secs: 307, nanos: 704000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-dawn-edition-volume-2.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 16, duration: Some(Duration { secs: 373, nanos: 420000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-dawn-edition.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 17, duration: Some(Duration { secs: 281, nanos: 104000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-odd-edition.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 18, duration: Some(Duration { secs: 175, nanos: 804000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-resurrection-edition-no-intro.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 19, duration: Some(Duration { secs: 250, nanos: 96000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-resurrection-edition.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 20, duration: Some(Duration { secs: 282, nanos: 528000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-solar-edition-volume-2.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 21, duration: Some(Duration { secs: 280, nanos: 712000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-solar-edition.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 22, duration: Some(Duration { secs: 367, nanos: 543000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-space-edition.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 23, duration: Some(Duration { secs: 247, nanos: 667000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-sun-edition-v3-ver-b.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 24, duration: Some(Duration { secs: 283, nanos: 638000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/class-trial-sun-edition-v3.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 25, duration: Some(Duration { secs: 297, nanos: 38000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/debate-scrum.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 26, duration: Some(Duration { secs: 187, nanos: 481000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/debating-truth.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 27, duration: Some(Duration { secs: 121, nanos: 731000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/desire-for-recklessness.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 28, duration: Some(Duration { secs: 181, nanos: 420000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/detective-danger.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 29, duration: Some(Duration { secs: 145, nanos: 104000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discombulate.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 30, duration: Some(Duration { secs: 230, nanos: 713000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discussion-break-2nd-mix.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 31, duration: Some(Duration { secs: 236, nanos: 95000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discussion-break.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 32, duration: Some(Duration { secs: 203, nanos: 964000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discussion-heat-up-2nd-mix.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 33, duration: Some(Duration { secs: 253, nanos: 388000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discussion-heat-up.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 34, duration: Some(Duration { secs: 201, nanos: 195000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discussion-hope-vs-despair-2nd-mix.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 35, duration: Some(Duration { secs: 270, nanos: 72000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discussion-hope-vs-despair.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 36, duration: Some(Duration { secs: 271, nanos: 909000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/discussion-mix-edge-version.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 37, duration: Some(Duration { secs: 196, nanos: 911000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/distrust.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 38, duration: Some(Duration { secs: 111, nanos: 308000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/explaining-the-facts.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 39, duration: Some(Duration { secs: 181, nanos: 986000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/exquisite-aroma.flac")) }), optional_title: None }, PlaylistAddTrack { at_index: 40, duration: Some(Duration { secs: 89, nanos: 130000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/gavotte-of-dignity.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 41, duration: Some(Duration { secs: 121, nanos: 940000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/gloating.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 42, duration: Some(Duration { secs: 109, nanos: 506000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/guillotine-ballet.flac")) }), optional_title: None }, PlaylistAddTrack { at_index: 43, duration: Some(Duration { secs: 154, nanos: 305000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/high-strung-spirit.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 44, duration: Some(Duration { secs: 209, nanos: 450000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/high-strung.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 45, duration: Some(Duration { secs: 151, nanos: 824000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/hot-flash.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 46, duration: Some(Duration { secs: 186, nanos: 305000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/kakegurui.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 47, duration: Some(Duration { secs: 173, nanos: 897000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/l-s-theme-b.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 48, duration: Some(Duration { secs: 183, nanos: 902000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/l-s-theme.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 49, duration: Some(Duration { secs: 203, nanos: 886000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/light-s-theme.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 50, duration: Some(Duration { secs: 240, nanos: 48000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/living-in-lazy-parallel-world-short-ver.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 51, duration: Some(Duration { secs: 238, nanos: 80000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/living-in-lazy-parallel-world-short.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 52, duration: Some(Duration { secs: 173, nanos: 270000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/midsomer-murders.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 53, duration: Some(Duration { secs: 169, nanos: 535000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/mr-monokuma-s-tutoring.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 54, duration: Some(Duration { secs: 244, nanos: 114000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/mystery-labirinth-question-#2.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 55, duration: Some(Duration { secs: 239, nanos: 308000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/mystery-labirinth-question.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 56, duration: Some(Duration { secs: 299, nanos: 624000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/mystery-solution-myself.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 57, duration: Some(Duration { secs: 107, nanos: 50000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/near-2.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 58, duration: Some(Duration { secs: 181, nanos: 969000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/near-s-theme.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 59, duration: Some(Duration { secs: 119, nanos: 980000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/near.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 60, duration: Some(Duration { secs: 172, nanos: 199000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/objection-cross-sword.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 61, duration: Some(Duration { secs: 126, nanos: 851000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/on-the-edge-of-life-and-death.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 62, duration: Some(Duration { secs: 163, nanos: 239000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/on-the-move.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 63, duration: Some(Duration { secs: 111, nanos: 778000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/our-class-trial.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 64, duration: Some(Duration { secs: 119, nanos: 40000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/playing-with-toys.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 65, duration: Some(Duration { secs: 109, nanos: 740000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/pursuit.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 66, duration: Some(Duration { secs: 142, nanos: 54000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/rain-code-title-ver.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 67, duration: Some(Duration { secs: 199, nanos: 131000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/re-distrust.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 68, duration: Some(Duration { secs: 110, nanos: 132000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/re-trial-underground.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 69, duration: Some(Duration { secs: 232, nanos: 150000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/reasoning-death-match-break.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 70, duration: Some(Duration { secs: 246, nanos: 727000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/reasoning-death-match.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 71, duration: Some(Duration { secs: 189, nanos: 48000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/relief.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 72, duration: Some(Duration { secs: 0, nanos: 0 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/return-in-new-colors.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 73, duration: Some(Duration { secs: 139, nanos: 651000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/sadistic-intimacy.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 74, duration: Some(Duration { secs: 80, nanos: 718000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/severance-main-titles.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 75, duration: Some(Duration { secs: 98, nanos: 456000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/smashing-wrench.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 76, duration: Some(Duration { secs: 100, nanos: 571000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/something-strange.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 77, duration: Some(Duration { secs: 253, nanos: 74000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/spirit-praise-and-beauty.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 78, duration: Some(Duration { secs: 175, nanos: 961000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/strange-visage.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 79, duration: Some(Duration { secs: 193, nanos: 123000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/suspicious-looking.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 80, duration: Some(Duration { secs: 157, nanos: 48000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/the-demise-of-mankind.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 81, duration: Some(Duration { secs: 220, nanos: 839000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/the-game-is-on.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 82, duration: Some(Duration { secs: 163, nanos: 161000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/theme-from-agatha-christie-s-marple.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 83, duration: Some(Duration { secs: 149, nanos: 290000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/things-remembered.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 84, duration: Some(Duration { secs: 108, nanos: 565000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/trial-underground.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 85, duration: Some(Duration { secs: 284, nanos: 813000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/v3-argument-blade-lock.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 86, duration: Some(Duration { secs: 177, nanos: 868000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/v3-argument-break.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 87, duration: Some(Duration { secs: 203, nanos: 102000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/v3-argument-hope-vs-despair.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 88, duration: Some(Duration { secs: 176, nanos: 692000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/v3-argument-panic.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 89, duration: Some(Duration { secs: 176, nanos: 614000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/v3-argument-perjury.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 90, duration: Some(Duration { secs: 304, nanos: 901000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/v3-argument-turn-up-the-heat.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 91, duration: Some(Duration { secs: 94, nanos: 537000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/waltz-of-joy.mp3")) }), optional_title: None }, PlaylistAddTrack { at_index: 92, duration: Some(Duration { secs: 137, nanos: 626000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/waltz-of-trickery.flac")) }), optional_title: None }, PlaylistAddTrack { at_index: 93, duration: Some(Duration { secs: 102, nanos: 168000000 }), id: Some(TrackId { source: Some(Path("/home/foxy/music/playlists/../tracks/reasoning/westworld-main-title-theme.mp3")) }), optional_title: None }] }, extensions: Extensions }
[2025-08-15T15:09:14.565+02:00 WARN termusiclib::new_database]: Error scanning path "/home/foxy/music/tracks/reasoning/return-in-new-colors.mp3": FileDecoding(Mpeg: "File contains an invalid frame")
[2025-08-15T15:09:14.568+02:00 INFO termusiclib::new_database]: Finished Scanning "/home/foxy/music" with 0 created or updated
[2025-08-15T15:09:14.572+02:00 WARN termusiclib::track]: Failed to read metadata from "/home/foxy/music/playlists/../tracks/reasoning/return-in-new-colors.mp3": Mpeg: File contains an invalid frame
[2025-08-15T15:09:14.578+02:00 INFO termusic::ui::components::playlist]: index from player is: 34, index in tui is: Some(34)
[2025-08-15T15:09:14.578+02:00 DEBUG termusic::ui]: Stream Event: Ok(TrackChanged(TrackChangedInfo { current_track_index: 34, current_track_updated: true, title: Some("SDR2 OST: -2-20- Discussion -HOPE VS DESPAIR- [2nd mix]"), progress: Some(PlayerProgress { position: Some(0ns), total_duration: Some(201.15446712s) }) }))
[2025-08-15T15:09:14.578+02:00 INFO termusic::ui::components::playlist]: index from player is: 34, index in tui is: Some(34)
[2025-08-15T15:09:14.579+02:00 INFO termusic::ui::music_player_client]: Got response from server: GetProgressResponse { progress: Some(PlayerTime { position: None, total_duration: None }), current_track_index: 0, status: 1, volume: 100, speed: 10, gapless: true, radio_title: "" }

foxyseta avatar Aug 15 '25 13:08 foxyseta

Thanks for the logs. Assuming you waited ~7 seconds (or more) after the pavucontrol opening issue, then it seems like no thread is actually dying, so my best guess would be that the ALSA thread may just be locked-up instead of exiting silently, though i dont know how to detect or properly mitigate that. If that really is the case, then i think something in the ALSA backend is wrong (not in rust?). (likely pipewire in this case)


I just re-read your reproduction instructions:

open termusic and listen to some music. Then, close it via TUI; open pavucontrol reopen termusic

source

Could you clarify if you have (tui) config option behavior.quit_server_on_exit (Kill daemon when quit termusic? in the config editor) enabled or not? (I have tried with both having the server continue running and not running before opening pavucontrol, both result in still working correctly)

Maybe a video of this happening would help, though after that i dont think i will be able to help further debug this without being able to reproduce it.

hasezoey avatar Aug 16 '25 10:08 hasezoey

Kill daemon when quit termusic? is on Yes. I think I might have the time to film this in the next few days, yes.

foxyseta avatar Aug 16 '25 15:08 foxyseta

I couldn't get any of the Wayland screen recorders in my distro's package manager to work, so I filmed the monitor instead.

https://github.com/user-attachments/assets/ae521d42-1d01-49f0-bec8-a8b1a8487f0e

foxyseta avatar Aug 20 '25 10:08 foxyseta

EDIT: will take me a few tries to get the video attachment to work on GitH*b apparently

It seemed to work & display for me, or what issue?

hasezoey avatar Aug 20 '25 10:08 hasezoey

It did not work/display on any of my two devices, but if it works for you, I will upload it again.

foxyseta avatar Aug 20 '25 10:08 foxyseta

Hope it still works for you: https://github.com/tramhao/termusic/issues/552#issuecomment-3205430047.

Let me know if this concludes the investigation, so that I can go back to daily drive the mpv backend.

foxyseta avatar Aug 20 '25 10:08 foxyseta

I couldn't get any of the Wayland screen recorders in my distro's package manager to work, so I filmed the monitor instead.

Let me know if this concludes the investigation, so that I can go back to daily drive the mpv backend.

Thanks for providing the video, this does make it clear on the workflow, but as it literally shows as i had imaged the steps to flow, i have no clue what the issue could be or how to further investigate it.

hasezoey avatar Aug 20 '25 10:08 hasezoey

No problem, I perfectly understand. Thank you so much for all the time you invested in this anyway.

foxyseta avatar Aug 20 '25 10:08 foxyseta