A streamlined Spotify client and browser with a focus on performance and integrations.
Tune is a Spotify browser and remote application with a focus on performance
and integration with other services.
You can see it in action at https://tune.fullyforged.com.
In many ways Tune copies the official Spotify application: many views (e.g.
search or details for artists and albums) are tightly based on the equivalent
sections in the Spotify application. This is an intentional choice aimed at
reducing friction between applications.
Tune differs in these areas:
Feature | Free subscription | Premium Subscription |
---|---|---|
Search | ✅ | ✅ |
Artist/Album/etc. details | ✅ | ✅ |
Suggestions | ✅ | ✅ |
Release radar | ✅ | ✅ |
Miniplayer controls | ❌ | ✅ |
Device chooser | ❌ | ✅ |
Embedded audio player | ❌ | ✅ (on some browsers) |
Due to limitations imposed by Spotify, users with free subscriptions cannot use the embedded
audio player, nor they can control other devices via Tune’s UI. If you have a
free subscription, those UI elements are not visible as they’re ineffective.
For users with Premium subscriptions, Tune can be used as a standalone player by selecting the
appropriate option in the device switch section in the mini player (note that only some browsers are
supported).
Tune doesn’t have any persistent storage: upon successful authentication,
credentials are only stored in your browser’s cookies and kept in memory in the application.
Credentials are cleared at most 30 seconds after you close the last browser
session, even if you don’t explicitly logout.
At this point in time, credentials may be printed in logs and/or crash reports.
In some cases, search results or specific listings will display duplicated
content (e.g. the exact same album twice). This is due to the Spotify API
returning duplicated results which only differ in the ID.
It’s not clear why this happens: it could be that the artist uploaded the same
album multiple times, it could be that different editions are available in
specific territories.
If you use Tune in combination with official Spotify clients, you will notice
that if nothing is playing, after a while the miniplayer controls stop
responding and you can’t even play any song. This is due to a quirk in the
Spotify devices API, which reports client devices as still connected.
If you’re running Tune on a platform where it can load the built-in audio
player, you can just refresh the page for the player to reload, which has the
side effect of “waking up” all other clients as well. At that point, you can
select them from the device switcher and resume normal operation.
If you’re running Tune on a mobile device, your only option is to open the
dormant client application, do a quick play/pause to wake it up and go back
to Tune.
More information on the related Spotify documentation
page.
First of all, we need working installations of Elixir and Erlang. The
recommended way to achieve this is via asdf. Once
it’s installed and working, you can run asdf install
from the project root to
install the correct versions required (see the .tool-versions
file for
details).
Next, make sure you setup the required environment variables as detailed in.env
by copying the file to .env.local
and adjusting values as needed.
Please see the Vapor
docs for more
detail on the dotenv configuration provider.
To create secrets, (e.g. for SECRET_KEY_BASE
), use mix phx.gen.secret
.
Next you can install all dependencies with mix setup
.
mix phx.server
iex -S mix phx.server
Now you can visit localhost:4000
from your browser.
You can run tests with mix test
, dialyzer with mix dialyzer
and Credo with mix credo
.
The application also includes a minimal JS test suite (currently used as a
playground to understand how to effectively test Phoenix LiveView hooks). You
can run it with cd assets
and then npm test
.
The Tune
namespace defines the domain logic responsible to interact with the
Spotify API and maintain running sessions for each logged-in user.
The TuneWeb
namespace defines authentication endpoints and the mainLiveView
(TuneWeb.ExplorerLive
) that powers the entire user interface.
Tune assumes multiple browser sessions for the same user, which is why it
defines a Tune.Spotify.Session
behaviour with Tune.Spotify.Session.HTTP
as its main runtime implementation.
Each worker is responsible to proxy interaction with the Spotify API,
periodically poll for data changes, and broadcast corresponding events.
When a user opens a browser session, TuneWeb.ExplorerLive
either starts or
simply reuses a worker named with the same session ID.
Each worker monitors its subscribers, so that it can shutdown when a user
closes their last browser window.
This architecture ensures that:
The application exposes TuneWeb.Telemetry
module with definitions for relevant metrics.
An instance of
Phoenix.LiveDashboard
is mounted at /dashboard
. In production, the endpoint is protected by basic
auth (see .env
for relevant environment variables).
The project is setup to deploy on Heroku, please make sure you:
SENTRY_DSN
environment variableAll content and metadata is provided by Spotify unless explicitly stated.
Content is owned by many different right holders.
Icons:
Available at https://github.com/fully-forged/tune/blob/main/CODE_OF_CONDUCT.md.
Available at https://github.com/fully-forged/tune/blob/main/LICENSE.