Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -165,8 +165,8 @@ One tag releases pine and spruce together. Write the release notes for the two p
Commit the notes and push them to `main`. Then use the release script.

```sh
${EDITOR:-vi} docs/releases/v0.8.1.md
./scripts/release.sh v0.8.1
${EDITOR:-vi} docs/releases/v0.8.2.md
./scripts/release.sh v0.8.2
```

When the script publishes the GitHub Release, the `Release` workflow builds the two programs for Linux, macOS, and Windows. It attaches one archive for each program and each system to the release.
Expand Down
149 changes: 149 additions & 0 deletions docs/releases/v0.8.2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
# pine and spruce v0.8.2

This release corrects faults in the bookmarks, the playback, and the text
inputs of pine. It removes the keys `n` and `N` of pine. spruce has two
corrections.

## Installation

```sh
go install github.com/Thelost77/[email protected]
go install github.com/Thelost77/pine/cmd/[email protected]
```

As an alternative, download an archive from the release page. See "Binaries".

## Binaries

The release has one archive for each program and each system. The name of an
archive is `<program>_v0.8.2_<system>_<architecture>`:

| System | Architecture | File type |
|--------|--------------|-----------|
| `linux` | `amd64`, `arm64` | `.tar.gz` |
| `darwin` (macOS) | `amd64`, `arm64` | `.tar.gz` |
| `windows` | `amd64` | `.zip` |

Each archive contains the program, the `LICENSE` file of pine, and a `licenses`
directory. That directory has the license texts of Go and of the modules that
the program links.

- A binary needs libmpv. See "Requirements".
- On Windows, put `libmpv-2.dll` in the directory of the program. The archive
does not contain it.
- The binaries are not signed.
- A GitHub Actions workflow builds the binaries on Linux with `CGO_ENABLED=0`.
No binary of this release has run on a test machine.

## pine

### Reliability and Correctness

Bookmarks:

* **The detail screen showed no bookmarks for an item that has bookmarks.**
pine read the bookmarks from the progress of the item. Audiobookshelf gives
no bookmarks there. A bookmark that the user added was in the list only
until the user left the detail screen. pine now reads the bookmark route,
which Audiobookshelf has from 2.36.0. For an older server, pine reads the
bookmarks of the user and keeps those of the item.
* **The detail screen could show the bookmarks of a different item.** The
answer for an item can come after the user opened a different item. pine
now ignores the bookmarks of an item that the detail screen does not show.
* **`b` made a bookmark on an item that did not play.** The bookmark got the
position of the player. On the detail screen of a different item, `b` made
a bookmark on that item, at a position of the item that plays. pine now
makes no bookmark and shows an error.

Playback:

* **A new player played at the speed 1.0, while the footer showed the speed of
pine.** This occurred after the start of a session, and after the change to
the next file of a book. The key `speed` of the config file had no effect
on the player. pine now sets its speed in each new player.
* **The time of a stalled stream counted as listening time.** mpv reports no
pause while it waits for data. pine now counts no listening time while the
player plays no audio.
* **The close of the terminal lost the last position and the listening
time.** The process ended before pine sent them. pine now quits at the
close of the terminal as it does with `q`.
* **A pause state, a speed, or a volume that the player refused gave no
error.** The footer then showed a state that the player did not have. pine
now shows the error.

Text inputs:

* **The bookmark title editor lost keys.** `q` quit the program, `?` opened
the help overlay, and `esc` went to the previous screen. During a playback,
the playback keys did their function, for example `l`, `h`, `p`, and space.
The left arrow closed the editor, and the text was lost. The editor now
gets each key. `esc` cancels the edit, and the left arrow moves the cursor.
* **The login screen lost the keys `?` and `C`.** `?` opened the help
overlay, and a typed `C` had no effect. So a password with one of these
characters could not be typed.
* **The metadata editor lost the key `?`.** `?` opened the help overlay.
* **`q` in the confirmation dialog of a deletion quit the program.** `q` now
cancels the dialog, as `n` and `esc` do.
* **The error banner took the first key of a text input.** A key closes the
banner. While a text input or the confirmation dialog has the keys, the key
now goes to it, and the banner closes after 5 seconds.

### Changes of Behavior

* The keys `n` and `N` (next and previous chapter) are gone. Use the chapter
list (`C`), or the actions "Next Chapter" and "Previous Chapter" of the
command palette (`ctrl+p`).
* The config keys `next_chapter` and `prev_chapter` are gone. A config file
that has them still loads, and the two keys have no effect. pine wrote the
two keys to each config file that it made.
* While a text input or the confirmation dialog has the keys, the global keys
and the playback keys have no function. `ctrl+p` does not open the command
palette, and space does not pause the playback. `ctrl+c` quits the program
on each screen. The hint line then shows no global key and no playback key.
* `?` closes the help overlay on each screen.
* A stall of the stream can lose up to 1 second of listening time, as a pause
does.
* For Audiobookshelf before 2.36.0, each read of the bookmarks reads the user
with all bookmarks.

## spruce

* **spruce did no cleanup at the close of the terminal.** The process ended
before spruce closed its media cache and its players. spruce now quits its
program at the close of the terminal, and then does the cleanup.
* **A pause state, a speed, or a volume that the player refused gave no
error.** spruce now shows the error.

The shared packages `internal/player` and `internal/ui` have changes for
pine. spruce gets the new idle state of the player in each position tick, and
does not use it.

## Development

* Each correction has a test that failed before the correction, but not the
cleanup of spruce at the close of the terminal. The tests use a fake
Audiobookshelf server and the mock player of the app tests. The test of the
stalled stream plays a stream through the real libmpv.
* No real Audiobookshelf server ran for these corrections. The statements
about Audiobookshelf are from the source of the versions 2.35.1, 2.36.0, and
2.37.1.
* pine and spruce did not run in a terminal for the corrections of the keys
and of the bookmarks. The tests send messages to the models and read the
views.
* The close of a terminal has a test for the function that the two programs
call. No test runs the `main` function of a program, because it needs a
terminal. For the first form of this correction, pine ran one time in a
pseudo-terminal, with no session. spruce did not run.
* No test makes libmpv refuse a pause state, a speed, or a volume. The tests
use a player that fails these calls.
* In CI on Windows, the tests `TestE2E_LoginFailure` and
`TestE2E_CacheSurvivesRestart` failed at times, and passed in the next run
of the same commit. The test helper waits 200 ms for a command. This release
does not change the two tests or the helper.

## Requirements

- Go 1.26.4 or newer, for an installation from source
- libmpv from [mpv](https://mpv.io/) 0.34 or later
- pine: an [Audiobookshelf](https://www.audiobookshelf.org/) server
- spruce: a [Jellyfin](https://jellyfin.org/) account with a music library
2 changes: 1 addition & 1 deletion docs/spruce/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ Commit the notes and all release changes. Push them to `main`. Then use the
release script:

```sh
./scripts/release.sh v0.8.1
./scripts/release.sh v0.8.2
```

The script verifies the repository, creates and pushes the exact annotated tag,
Expand Down
Loading