All Projects → fully-forged → Tune

fully-forged / Tune

Licence: mit
A streamlined Spotify client and browser with a focus on performance and integrations.

Programming Languages

elixir
2628 projects

Projects that are alternatives of or similar to Tune

Whisperify
An interactive way to learn about your favourite songs on Spotify. Quiz yourself on your favourite playlists and share quizzes with friends.
Stars: ✭ 91 (-45.18%)
Mutual labels:  spotify-api, spotify
Spartan
An Elegant Spotify Web API Library Written in Swift for iOS and macOS
Stars: ✭ 100 (-39.76%)
Mutual labels:  spotify-api, spotify
Spotify Web Api Js
A client-side JS wrapper for the Spotify Web API
Stars: ✭ 1,313 (+690.96%)
Mutual labels:  spotify-api, spotify
Exportify
Export Spotify playlists using the Web API. Analyze them in the Jupyter notebook.
Stars: ✭ 80 (-51.81%)
Mutual labels:  spotify-api, spotify
Phoenix Liveview Counter Tutorial
🤯 beginners tutorial building a real time counter in Phoenix 1.5.5 + LiveView 0.14.7 ⚡️
Stars: ✭ 115 (-30.72%)
Mutual labels:  phoenix, phoenix-framework
Spotify Web Api Kotlin
Spotify Web API wrapper for Kotlin/JVM, Kotlin/Android, Kotlin/JS, and Kotlin/Native. Includes a Spotify Web Playback SDK wrapper for Kotlin/JS, and a spotify-auth wrapper for Kotlin/Android
Stars: ✭ 86 (-48.19%)
Mutual labels:  spotify-api, spotify
Phoenixsharp
C# Phoenix Channels client. Unity Compatible.
Stars: ✭ 96 (-42.17%)
Mutual labels:  phoenix, phoenix-framework
Phoenix In Action
Code snippets and examples from the book Phoenix in Action from Manning and Geoffrey Lessel
Stars: ✭ 60 (-63.86%)
Mutual labels:  phoenix, phoenix-framework
Elixir Companies
A list of companies currently using Elixir in production.
Stars: ✭ 1,475 (+788.55%)
Mutual labels:  phoenix, phoenix-framework
Spotify Dart
A dart library for interfacing with the Spotify API.
Stars: ✭ 109 (-34.34%)
Mutual labels:  spotify-api, spotify
Vibe
Get insights into your Spotify listening history 🎶
Stars: ✭ 67 (-59.64%)
Mutual labels:  spotify-api, spotify
Spotify.py
🌐 API wrapper for Spotify 🎶
Stars: ✭ 131 (-21.08%)
Mutual labels:  spotify-api, spotify
Spotivy
🎼 Download music videos from Spotify playlists
Stars: ✭ 64 (-61.45%)
Mutual labels:  spotify-api, spotify
Memento
Collect saved items from different sources around the web
Stars: ✭ 89 (-46.39%)
Mutual labels:  phoenix, phoenix-framework
Shorten api tutorial
🔗How to make a link shortener using Elixir, Phoenix and Mnesia
Stars: ✭ 60 (-63.86%)
Mutual labels:  phoenix, phoenix-framework
Pasta For Spotify
A material design Spotify client for Android
Stars: ✭ 93 (-43.98%)
Mutual labels:  spotify-api, spotify
Elixirbooks
List of Elixir books
Stars: ✭ 1,021 (+515.06%)
Mutual labels:  phoenix, phoenix-framework
Spotify Tui
Spotify for the terminal written in Rust 🚀
Stars: ✭ 11,061 (+6563.25%)
Mutual labels:  spotify-api, spotify
Exportify
Export/Backup Spotify playlists using the Web API
Stars: ✭ 1,611 (+870.48%)
Mutual labels:  spotify-api, spotify
Soundize
🎧 A homemade Spotify application. It's a server side rendering client made with React and Redux, powered by the Spotify API
Stars: ✭ 121 (-27.11%)
Mutual labels:  spotify-api, spotify

Tune

CI Status

About

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.

Album details

Album details

Global Search

Search

Artist details

Artist details

Top albums and recommendations

Top albums and recommendations

Release radar

Release radar

Usage

Scope and features

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:

  • Performance: Tune is extremely light, as for the most part is a server-rendered application, which makes it suitable to use on a wide range of devices and operating systems (think Linux on a Raspberry PI). Most of its functionality works without JavaScript and is exposed via a proper URL.
  • Integration: Tune tries to connect items like artists, albums or songs to other sources of information, so that for example you can use convenient links to read the history of a band on Wikipedia.
  • Recommendations: Tune offers suggestions based on a combination of what's provided by Spotify and some custom logic (loosely based on what you've been listening in a specific time period). The logic is an almost direct porting of how I search for new music, so it might not work for you.

Keyboard shortcuts

  • Space: Play/Pause
  • h: Home
  • a: Prev
  • d: Next
  • w: Volume up
  • s: Volume down
  • /: Focus search input
  • q: Focus device selector
  • n: When available, go to the next page
  • p: When available, go to the previous page
  • ?: Display a modal dialog with available shortcuts

Free vs. Premium Subscriptions

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).

Data retention and privacy

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.

Issues with devices and playback

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.

Development

Setup

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.

Running the application

  • Start the application with mix phx.server
  • To start the application and an IEx console connected to it, use iex -S mix phx.server

Now you can visit localhost:4000 from your browser.

Tests, dialyzer and Credo

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.

Documentation

Available at https://tune-docs.fullyforged.com, gets automatically updated with every push on the main branch.

Application structure

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 main LiveView (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 amount of automatic API calls against the Spotify API for a given user is constant and independent from the number of user sessions for the same user.
  • Credential renewal happens in the background
  • The explorer implementation remains entirely focused on UI interaction

Telemetry

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).

Deployment

The project is setup to deploy on Heroku, please make sure you:

Credits

Code of Conduct

Available at https://github.com/fully-forged/tune/blob/main/CODE_OF_CONDUCT.md.

License

Available at https://github.com/fully-forged/tune/blob/main/LICENSE.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].