Skip to content
Open
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: 4 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,10 @@ jobs:
run: node scripts/write-nightly-config.mjs

- name: Build nightly packages
env:
# Read at compile time; without them Last.fm sign-in stays off in the build.
LASTFM_API_KEY: ${{ secrets.LASTFM_API_KEY }}
LASTFM_API_SECRET: ${{ secrets.LASTFM_API_SECRET }}
run: pnpm tauri build ${{ matrix.args }} --config src-tauri/tauri.nightly.generated.json

- name: Log the bundled media stack versions
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,9 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
# Read at compile time; without them Last.fm sign-in stays off in the build.
LASTFM_API_KEY: ${{ secrets.LASTFM_API_KEY }}
LASTFM_API_SECRET: ${{ secrets.LASTFM_API_SECRET }}
with:
tagName: ${{ needs.prepare.outputs.tag }}
releaseName: ${{ needs.prepare.outputs.is_prerelease == 'true' && 'Flow Beta v__VERSION__' || 'Flow v__VERSION__' }}
Expand Down
3 changes: 3 additions & 0 deletions changelog/v0.1.0-beta3.txt
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ MUSIC
- A new "Resume long tracks" setting, off by default, starts mixes, podcasts and episodes of 10 minutes or more where you left them.
- Music controls in the menu bar or system tray: the current song on top, then Play or Pause, Previous, Next and Show Flow. Turn it off under Integrations with Show music controls in the tray.
- On Linux the tray is off by default and needs the libayatana-appindicator3 library, which the .deb, .rpm and AppImage now bring along. Without it the switch stays off instead of stopping Flow from starting.
- Scrobbling to Last.fm, Libre.fm and ListenBrainz, under Integrations. A song counts once you have heard half of it or four minutes, and songs of 30 seconds or less never count. Videos are never sent.
- Listens wait on your computer while you are offline and go out once you are back, up to 2,000 per service. Show now playing, Love liked songs and Scrobble during Deep Flow are options, and you can use your own Last.fm API key.
- Your Last.fm password is sent once and never stored. Sessions and tokens are kept in the system keychain, never in sync, backups or settings exports.

AUDIO
- Equalizer boosts no longer distort: the music equalizer turns the whole curve down by its highest boost before the filters, and a soft limiter bends any peak that still goes past full scale.
Expand Down
148 changes: 148 additions & 0 deletions src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 6 additions & 1 deletion src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] }
tracing-appender = "0.2"

# HTTP Client
reqwest = { version = "0.13.3", features = ["stream", "json", "brotli", "gzip", "rustls"] }
reqwest = { version = "0.13.3", features = ["stream", "json", "form", "brotli", "gzip", "rustls"] }
mp4 = "0.14"
webm-iterable = "0.6.2"

Expand All @@ -76,6 +76,11 @@ hmac = "0.13"
sha2 = "0.11"
rand = "0.10"
zeroize = { version = "1", features = ["derive"] }
# Scrobbling: Last.fm's api_sig is an MD5 digest, and session keys and tokens live in the OS
# keychain (macOS Keychain, Windows Credential Manager, the Secret Service on Linux).
md-5 = "0.11"
keyring = "4"

# Local Sync (P2P) — transport: plaintext WebSocket (payload is AES-GCM encrypted), gzip
# compression (parity with Android java.util.zip), and LAN IP discovery for the QR.
tokio-tungstenite = "0.30"
Expand Down
27 changes: 27 additions & 0 deletions src-tauri/migrations/0020_scrobble_queue.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
-- Listens and loves waiting to reach Last.fm, Libre.fm or ListenBrainz (Flow for Android's
-- ScrobbleStore queues). A listen is queued the moment it counts and leaves once the service
-- accepts it, so quitting or going offline loses nothing. Device-local, never synced or backed up.
-- service: LASTFM, LIBREFM or LISTENBRAINZ. Each service keeps at most 2,000 rows of each kind.
CREATE TABLE IF NOT EXISTS scrobble_queue (
id INTEGER PRIMARY KEY AUTOINCREMENT,
service TEXT NOT NULL,
artist TEXT NOT NULL,
title TEXT NOT NULL,
album TEXT NOT NULL DEFAULT '',
duration_sec INTEGER NOT NULL DEFAULT 0,
timestamp_sec INTEGER NOT NULL,
from_youtube INTEGER NOT NULL DEFAULT 1
);

CREATE INDEX IF NOT EXISTS idx_scrobble_queue_service ON scrobble_queue (service, id);

-- Likes and unlikes to mirror as loves; Last.fm and Libre.fm only.
CREATE TABLE IF NOT EXISTS scrobble_loves (
id INTEGER PRIMARY KEY AUTOINCREMENT,
service TEXT NOT NULL,
artist TEXT NOT NULL,
title TEXT NOT NULL,
loved INTEGER NOT NULL
);

CREATE INDEX IF NOT EXISTS idx_scrobble_loves_service ON scrobble_loves (service, id);
1 change: 1 addition & 0 deletions src-tauri/src/commands/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ pub mod music_queue;
pub mod notifications;
pub mod pip;
pub mod recommendation;
pub mod scrobble;
pub mod shorts;
pub mod sync;
pub mod tray;
Expand Down
Loading
Loading