Commit graph

2057 commits

Author SHA1 Message Date
Felix Prillwitz
710e2fc7be
connect: fixes for context and transfer
- fix context_metadata and restriction incorrect reset
- do some state updates earlier
- add more logging
2024-12-16 18:58:43 +01:00
Felix Prillwitz
08624ddf36
fix typo and find_next 2024-12-16 00:19:21 +01:00
Felix Prillwitz
0752b8d753
connect: adjust behavior
- rename `handle_context` to `handle_next_context`
- disconnect should only pause the playback
- find_next should not exceed queue length
2024-12-14 16:13:33 +01:00
Felix Prillwitz
932c6fa25f
connect: always handle player seek event 2024-12-12 17:52:19 +01:00
Felix Prillwitz
b13ab3aa1b
connect: fix incorrect stopping 2024-12-12 17:33:15 +01:00
Felix Prillwitz
cd9f822c90
general logging and comment fixups 2024-12-12 00:03:30 +01:00
Felix Prillwitz
11040d994e
connect: rework aftermath 2024-12-12 00:03:30 +01:00
Felix Prillwitz
d3ae5c0820
connect: resolve context rework
- resolved contexts independently, by that we don't block our main loop
- move resolve logic into own file
- polish handling for play and transfer
2024-12-12 00:03:30 +01:00
Felix Prillwitz
673ded3d57
connect: handle metadata correct 2024-12-12 00:03:30 +01:00
Felix Prillwitz
d2f1dee43c
connect: move ResolveContext in own file 2024-12-11 17:37:14 +01:00
Felix Prillwitz
c73871c516
connect: use is_playing from connect_state 2024-12-11 00:28:47 +01:00
Felix Prillwitz
28588c4a8e
connect: load entire context at once 2024-12-11 00:28:47 +01:00
Felix Prillwitz
d8969dab0c
connect: reduce/group state updates by delaying them slightly 2024-12-11 00:28:47 +01:00
Felix Prillwitz
29cd9b3da3
connect: set playback_speed according to player state 2024-12-11 00:28:47 +01:00
Felix Prillwitz
c8131beebb
connect: handle_player_event update log entries 2024-12-11 00:28:47 +01:00
Felix Prillwitz
e0f11f12c9
connect: simplify handle_player_event 2024-12-11 00:28:47 +01:00
Felix Prillwitz
2f24606180
connect: simplify handle_command for SpircCommand 2024-12-11 00:28:47 +01:00
dependabot[bot]
72b6ad9397
Bump actions/cache from 4.1.2 to 4.2.0 (#1412)
Bumps [actions/cache](https://github.com/actions/cache) from 4.1.2 to 4.2.0.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v4.1.2...v4.2.0)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-10 20:45:28 +01:00
Felix Prillwitz
5839b36192
Spirc: Replace Mecury with Dealer (#1356)
This was a huge effort by photovoltex@gmail.com with help from the community.
Over 140 commits were squashed. Below, their commit messages are kept unchanged.

---

* dealer wrapper for ease of use

* improve sending protobuf requests

* replace connect config with connect_state config

* start integrating dealer into spirc

* payload handling, gzip support

* put connect state consistent

* formatting

* request payload handling, gzip support

* expose dealer::protocol, move request in own file

* integrate handle of connect-state commands

* spirc: remove ident field

* transfer playing state better

* spirc: remove remote_update stream

* spirc: replace command sender with connect state update

* spirc: remove device state and remaining unused methods

* spirc: remove mercury sender

* add repeat track state

* ConnectState: add methods to replace state in spirc

* spirc: move context into connect_state, update load and next

* spirc: remove state, adjust remaining methods

* spirc: handle more dealer request commands

* revert rustfmt.toml

* spirc: impl shuffle

- impl shuffle again
- extracted fill up of next tracks in own method
- moved queue revision update into next track fill up
- removed unused method `set_playing_track_index`
- added option to specify index when resetting the playback context
- reshuffle after repeat context

* spirc: handle device became inactive

* dealer: adjust payload handling

* spirc: better set volume handling

* dealer: box PlayCommand (clippy warning)

* dealer: always respect queued tracks

* spirc: update duration of track

* ConnectState: update more restrictions

* cleanup

* spirc: handle queue requests

* spirc: skip next with track

* proto: exclude spirc.proto
- move "deserialize_with" functions into own file
- replace TrackRef with ProvidedTrack

* spirc: stabilize transfer/context handling

* core: cleanup some remains

* connect: improvements to code structure and performance

- use VecDeque for next and prev tracks

* connect: delayed volume update

* connect: move context resolve into own function

* connect: load context asynchronous

* connect: handle reconnect

- might currently steal the active devices playback

* connect: some fixes and adjustments

- fix wrong offset when transferring playback
- fix missing displayed context in web-player
- remove access_token from log
- send correct state reason when updating volume
- queue track correctly
- fix wrong assumption for skip_to

* connect: replace error case with option

* connect: use own context state

* connect: more stabilising

- handle SkipTo having no Index
- handle no transferred restrictions
- handle no transferred index
- update state before shutdown, for smoother reacquiring

* connect: working autoplay

* connect: handle repeat context/track

* connect: some quick fixes

- found self-named uid in collection after reconnecting

* connect: handle add_to_queue via set_queue

* fix clippy warnings

* fix check errors, fix/update example

* fix 1.75 specific error

* connect: position update improvements

* connect: handle unavailable

* connect: fix incorrect status handling for desktop and mobile

* core: fix dealer reconnect

- actually acquire new token
- use login5 token retrieval

* connect: split state into multiple files

* connect: encapsulate provider logic

* connect: remove public access to next and prev tracks

* connect: remove public access to player

* connect: move state only commands into own file

* connect: improve logging

* connect: handle transferred queue again

* connect: fix all-features specific error

* connect: extract transfer  handling into own file

* connect: remove old context model

* connect: handle more transfer cases correctly

* connect: do auth_token pre-acquiring earlier

* connect: handle play with skip_to by uid

* connect: simplified cluster update log

* core/connect: add remaining set value commands

* connect: position update workaround/fix

* connect: some queue cleanups

* connect: add uid to queue

* connect: duration as volume delay const

* connect: some adjustments and todo cleanups

- send volume update before general update
- simplify queue revision to use the track uri
- argument why copying the prev/next tracks is fine

* connect: handle shuffle from set_options

* connect: handle context update

* connect: move other structs into model.rs

* connect: reduce SpircCommand visibility

* connect: fix visibility of model

* connect: fix: shuffle on startup isn't applied

* connect: prevent loading a context with no tracks

* connect: use the first page of a context

* connect: improve context resolving

- support multiple pages
- support page_url of context
- handle single track

* connect: prevent integer underflow

* connect: rename method for better clarity

* connect: handle mutate and update messages

* connect: fix 1.75 problems

* connect: fill, instead of replace next page

* connect: reduce context update to single method

* connect: remove unused SpircError, handle local files

* connect: reduce nesting, adjust initial transfer handling

* connect: don't update volume initially

* core: disable trace logging of handled mercury responses

* core/connect: prevent takeover from other clients, handle session-update

* connect: add queue-uid for set_queue command

* connect: adjust fields for PlayCommand

* connect: preserve context position after update_context

* connect: unify metadata modification

- only handle `is_queued` `true` items for queue

* connect: polish request command handling

 - reply to all request endpoints
 - adjust some naming
 - add some docs

* connect: add uid to tracks without

* connect: simpler update of current index

* core/connect: update log msg, fix wrong behavior

- handle became inactive separately
- remove duplicate stop
- adjust docs for websocket request

* core: add option to request without metrics and salt

* core/context: adjust context requests and update

- search should now return the expected context
- removed workaround for single track playback
- move local playback check into update_context
- check track uri for invalid characters
- early return with `?`

* connect: handle possible search context uri

* connect: remove logout support

- handle logout command
- disable support for logout
- add todos for logout

* connect: adjust detailed tracks/context handling

- always allow next
- handle no prev track available
- separate active and fill up context

* connect: adjust context resolve handling, again

* connect: add autoplay metadata to tracks

- transfer into autoplay again

* core/connect: cleanup session after spirc stops

* update CHANGELOG.md

* playback: fix clippy warnings

* connect: adjust metadata

- unify naming
- move more metadata infos into metadata.rs

* connect: add delimiter between context and autoplay playback

* connect: stop and resume correctly

* connect: adjust context resolving

- improved certain logging parts
- preload autoplay when autoplay attribute mutates
- fix transfer context uri
- fix typo
- handle empty strings for resolve uri
- fix unexpected stop of playback

* connect: ignore failure during stop

* connect: revert resolve_uri changes

* connect: correct context reset

* connect: reduce boiler code

* connect: fix some incorrect states

- uid getting replaced by empty value
- shuffle/repeat clearing autoplay context
- fill_up updating and using incorrect index

* core: adjust incorrect separator

* connect: move `add_to_queue` and `mark_unavailable` into tracks.rs

* connect: refactor - directly modify PutStateRequest

- replace `next_tracks`, `prev_tracks`, `player` and `device` with `request`
- provide helper methods for the removed fields

* connect: adjust handling of context metadata/restrictions

* connect: fix incorrect context states

* connect: become inactive when no cluster is reported

* update CHANGELOG.md

* core/playback: preemptively fix clippy warnings

* connect: minor adjustment to session changed

* connect: change return type changing active context

* connect: handle unavailable contexts

* connect: fix previous restrictions blocking load with shuffle

* connect: update comments and logging

* core/connect: reduce some more duplicate code

* more docs around the dealer
2024-12-10 20:36:09 +01:00
SilverMira
f646ef2b5a
fix: streaming on Android devices (#1403)
* fix: android Session::connect failure from TryAnotherAP

It appears that a combination of `Platform::PLATFORM_ANDROID_ARM` and
connecting with `Credentials::with_access_token` causes all AP to error
TryAnotherAP

* fix: getting api access token should respect client id

If we are trying to get an access token from login5 using stored
credentials, ie: from oauth flow, we should use the oauth's client ID,
this matches with the semantics as described in
`Login5Manager::auth_token`

* fix: cpu_family arm64 should be aarch64

* Fix audio streaming on Android platform (#1399)
2024-12-05 14:20:03 +01:00
SilverMira
705e68ec65
feat: use webpki as rustls roots on non-desktop platforms (#1402)
* feat: use webpki as rustls roots on non-desktop platforms

Silently switch over to using `rustls-webpki` when building for
target_os that is not Windows/Linux/Mac because `rustls-native-certs`
doesn't support them.

Ideally we should use `rustls-platform-verifier` as it's now the
recommended crate even on `rustls-native-certs` repository, since it
chooses the right implementation for the platform. But currently it
doesn't seem like `hyper-proxy2` or `tokio-tungstenite` doesn't support
them yet.

* Fix "no native root CA certificates found" (#1399)
2024-12-05 14:11:40 +01:00
dependabot[bot]
4c0d8ebf1a
Bump hashbrown from 0.15.0 to 0.15.2 (#1409)
Bumps [hashbrown](https://github.com/rust-lang/hashbrown) from 0.15.0 to 0.15.2.
- [Changelog](https://github.com/rust-lang/hashbrown/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/hashbrown/commits)

---
updated-dependencies:
- dependency-name: hashbrown
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-05 07:57:11 +01:00
Roderick van Domburg
82076e882f
docs: recommend at least one audio and discovery backend (#1390) 2024-11-03 20:15:48 +01:00
Roderick van Domburg
e2eca65d11
chore: bump to v0.6.0-dev 2024-10-31 23:14:13 +01:00
Roderick van Domburg
383a6f6969
Update Cargo.lock 2024-10-30 21:11:33 +01:00
Roderick van Domburg
797efeafaf
chore: prepare for 0.6.0 release 2024-10-30 21:11:04 +01:00
fivebanger
1d3771a83b
Get token with client (#1385)
Co-authored-by: fivebanger <fivebanger@gmx-topmail.de>
2024-10-30 20:24:01 +01:00
Roderick van Domburg
f96f36c064
Fix "source slice length does not match destination" panic on some tracks
Fixes #1188

Co-authored-by: thedtvn <duongtuan30306@gmail.com>
2024-10-27 15:59:25 +01:00
Roderick van Domburg
cd57f706f6
Clarify dependency ordering 2024-10-27 15:50:27 +01:00
Benedikt
94d174c33d
Discovery: Refactor and add Avahi DBus backend (#1347)
* discovery: use opaque error type for DnsSdError

This helps to decouple discovery and core by not leaking implementation
details of the zeroconf backend into Error conversion impls in core.

* discovery: map all MDNS/DNS-SD errors to DiscoveryError::DnsSdError

previously, libmdns errors would use a generic conversion
from std::io::Error to core::Error

* discovery: use an opaque type for the handle to the DNS-SD service

* discovery: make features additive

i.e. add with-libmdns instead of using not(with-dns-sd).

The logic is such that enabling with-dns-sd in addition to the default
with-libmdns will still end up using dns-sd, as before.
If only with-libmdns is enabled, that will be the default.
If none of the features is enabled, attempting to build a `Discovery`
will yield an error.

* discovery: add --zeroconf-backend CLI flag

* discovery: Add minimal Avahi zeroconf backend

* bump MSRV to 1.75

required by zbus >= 4

* discovery: ensure that server and dns-sd backend shutdown gracefully

Previously, on drop the the shutdown_tx/close_tx, it wasn't guaranteed
the corresponding tasks would continue to be polled until they actually
completed their shutdown.

Since dns_sd::Service is not Send and non-async, and because libmdns is
non-async, put them on their own threads.

* discovery: use a shared channel for server and zeroconf status messages

* discovery: add Avahi reconnection logic

This deals gracefully with the case where the Avahi daemon is restarted
or not running initially.

* discovery: allow running when compiled without zeroconf backend...

...but exit with an error if there's no way to authenticate

* better error messages for invalid options with no short flag
2024-10-26 16:45:02 +02:00
dependabot[bot]
d2324ddd1b
Bump actions/cache from 4.1.1 to 4.1.2 (#1383) 2024-10-26 16:35:32 +02:00
dependabot[bot]
082141e6a5
Bump actions/checkout from 4.2.1 to 4.2.2 (#1384) 2024-10-26 16:35:10 +02:00
Felix Prillwitz
2e655e7f80
Easier mocking of platforms (#1378)
* core: move OS info into config.rs
2024-10-21 22:11:38 +02:00
Felix Prillwitz
4580dab73f
Get access token via login5 (#1344)
* core: Obtain spclient access token using login5 instead of keymaster (Fixes #1179)
* core: move solving hashcash into util
* login5: add login for mobile

---------

Co-authored-by: Nick Steel <nick@nsteel.co.uk>
2024-10-19 20:27:26 +02:00
Artur H.
d8e84238ab
Fix initial volume showing zero but playing full volume (#1373) 2024-10-17 17:02:56 +02:00
Guillaume Desmottes
1912065248
Cargo: use rust-version from workspace (#1375)
Make it easier to check and update.
2024-10-17 17:01:56 +02:00
Roderick van Domburg
09e4c3e12b
Prevent garbage toml-e files on macOS
Newer macOS versions output `uname` as "Darwin", while older
versions output "darwin".
2024-10-15 21:47:02 +02:00
Roderick van Domburg
1d80a4075f
Create new changelog entry for next release 2024-10-15 21:32:50 +02:00
Roderick van Domburg
e73a08d43a
Remove garbage toml-e files from last publish 2024-10-15 21:23:09 +02:00
Roderick van Domburg
d8d9ec7335
Update Cargo.lock 2024-10-15 20:48:48 +02:00
Roderick van Domburg
2c20e3b612
Merge branch 'dev' 2024-10-15 20:48:27 +02:00
Roderick van Domburg
e846900a2d
Specify tokio-tungstenite version
crates.io does not allow wildcard versions
2024-10-15 20:47:57 +02:00
Roderick van Domburg
a974a71cc4
Update Cargo.lock 2024-10-15 20:38:42 +02:00
Roderick van Domburg
eae43a7612
Merge branch 'dev' 2024-10-15 20:38:08 +02:00
Roderick van Domburg
c38a3be1b1
Fix publish script: core depends on oauth 2024-10-15 20:37:47 +02:00
Roderick van Domburg
84d28e887b
Update Cargo.lock 2024-10-15 20:34:15 +02:00
Roderick van Domburg
b629f61f67
Prepare for v0.5.0 release 2024-10-15 19:00:51 +02:00
Benedikt
ed766d2b2a
Rework session keep-alive logic (#1359)
we don't really know what the server expects and how quickly it usually reacts, so add some safety margin to avoid timing out too early
2024-10-15 13:36:17 +02:00
dependabot[bot]
f43ed29970
Bump actions/checkout from 4.2.0 to 4.2.1 (#1369) 2024-10-12 18:45:41 +02:00
dependabot[bot]
8ed5fef624
Bump actions/cache from 4.1.0 to 4.1.1 (#1370) 2024-10-12 18:45:30 +02:00