Giter Club home page Giter Club logo

tempo's Introduction

Tempo

Access your music library on all your android devices

Tempo is an open-source and lightweight music client for Subsonic, designed and built natively for Android. It provides a seamless and intuitive music streaming experience, allowing you to access and play your Subsonic music library directly from your Android device.

Tempo does not rely on magic algorithms to decide what you should listen to. Instead, the interface is built around your listening history, randomness, and optionally integrates with services like Last.fm to personalize your music experience.

If you find Tempo useful, please consider starring the project on GitHub. It would mean a lot to me and help promote the app to a wider audience.

Features

  • Subsonic Integration: Tempo seamlessly integrates with your Subsonic server, providing you with easy access to your entire music collection on the go.
  • Sleek and Intuitive UI: Enjoy a clean and user-friendly interface designed to enhance your music listening experience, tailored to your preferences and listening history.
  • Browse and Search: Easily navigate through your music library using various browsing and searching options, including artists, albums, genres, playlists, decades and more.
  • Streaming and Offline Mode: Stream music directly from your Subsonic server. Offline mode is currently under active development and may have limitations when using multiple servers.
  • Playlist Management: Create, edit, and manage playlists to curate your perfect music collection.
  • Gapless Playback: Experience uninterrupted playback with gapless listening mode.
  • Chromecast Support: Stream your music to Chromecast devices. The support is currently in a rudimentary state.
  • Scrobbling Integration: Optionally integrate Tempo with Last.fm to scrobble your played tracks, gather music insights, and further personalize your music recommendations, if supported by your Subsonic server.
  • Podcasts and Radio: If your Subsonic server supports it, listen to podcasts and radio shows directly within Tempo, expanding your audio entertainment options.
  • Transcoding Support: Activate transcoding of tracks on your Subsonic server, allowing you to set a transcoding profile for optimized streaming directly from the app. This feature requires support from your Subsonic server.

Sponsors

Tempo is an open-source project developed and maintained solely by me. I would like to express my heartfelt thanks to all the users who have shown their love and support for Tempo. Your contributions and encouragement mean a lot to me, and they help drive the development and improvement of the app.

If you would like to sponsor the project and show your support, you can make a donation or contribution by visiting the sponsorship page. Your generosity will help cover the costs of development and further enhancements.

Screenshot

Light theme


Dark theme

License

Tempo is released under the GNU General Public License v3.0. Feel free to modify, distribute, and use the app in accordance with the terms of the license. Contributions to the project are also welcome.

tempo's People

Contributors

caiocotts avatar cappielloantonio avatar chengyuhui avatar delightlane avatar dnno avatar gallowsdove avatar ixff avatar kingbluezback avatar timschneeb avatar victoralvesf avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tempo's Issues

Functionality with Azuracast

Tempo is quickly becoming my go-to music app.

I self-host several radio stations using Azuracast. I pull those stations into navidrome after which I can access the streams in the Tempo app.

I'd like to be able to see track metadata in the app: track name, artist name, album cover, track duration, etc. Is there a way to do this? Would Azuracast need to provide more information to the stream?

[Feature Request] Material You

Pretty much the title, material you theming support would be appreciated.

Also, what if it could be synchronized with the album art colors as an option perhaps?

[Feature request] download location

Hey 👋
I found Tempo and I’ve been using it as my primary music player. It’s great! Fast and beautiful.

One thing that I miss is to be able to select where it will save downloads. I use it on my android DAP that has very limited internal storage and would be good if I can save the downloads on my sd card instead.

App not loading when no internet connection available

Thanks for this apps, we really like it here. Better than most music apps with subsonic api.

Problem : When there's no wifi available and no data connection (cellular) The app is not loading and crash at start. (It's still works if loaded before losing internet access)

Step to reproduce :

  1. Flush apps in memory
  2. Turn off wifi
  3. Turn off LTE
  4. Open the app (Should close automatically)

Crash details :

type: crash
osVersion: google/bluejay/bluejay:13/TQ3A.230705.001/2023072600:user/release-keys
package: com.cappielloantonio.tempo:14
process: com.cappielloantonio.tempo
processUptime: 168 + 384 ms
installer: com.android.packageinstaller

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.cappielloantonio.tempo/com.cappielloantonio.tempo.ui.activity.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.net.NetworkInfo.getType()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3655)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:138)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2313)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7940)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ExecInit.main(ExecInit.java:49)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:355)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.net.NetworkInfo.getType()' on a null object reference
at com.cappielloantonio.tempo.ui.activity.MainActivity.onCreate(MainActivity.java:369)
at android.app.Activity.performCreate(Activity.java:8389)
at android.app.Activity.performCreate(Activity.java:8368)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1422)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3636)
... 14 more

Thanks in advance

Screen Rotation

Hi Antonio,

A really minor bug. An artifact is left behind when rotating portrait/landscape/portrait.

Screenshot attached:

Navigation Improvements

When utilizing the folder view, it would be nice to have the option to choose between the default list view of albums under an artist and a thumbnail grid view similar to what is done in DSub.

When hitting the back button from the folder view, you a) go to the very beginning of the library (letter A instead of where in the list you entered) and b) go to the beginning of the music folder instead of one directory up. For instance, if I navigate to /Music/Iron Maiden/1982 - The Number of the Beast/ directory and hit back, instead of going one directory up to /Music/Iron Maiden/, I'm sent all the way back to /Music/ and at the very top of the list as well. Both of these scenarios appear unique to folder browsing. The Artist browsing appears to work correctly with remembering your index.

When in the Artist view, underneath the Bio and top songs (which is fantastic BTW), there is a nice thumbnail view, however, you can't expand that into a list that you can vertically scroll through. So an artist with a large library of albums you are doing a lot of side scrolling on that one page.

Cannot play podcasts

I am trying Tempo for the first time so I might have configured something incorrectly but I cannot get podcasts to play at all. Tempo can navigate the feeds on my Airsonic-advanced server just fine and it has no problem playing music from the same server.

When I click the play button next to an episode it takes me to the playing screen but nothing happens and the logs on my server suggest that the audio was never requested.

Feature Request: Synced Lyrics

I just discovered that this has lyrics too, nice !

But they're not synced i.e. current line doesn't get highlighted / scrolled. Would love that.

Downloading indicator

Hey! The download feature seems to be working fine, however, there's no indicator to let me know if a song is downloaded or is being downloaded. Tracks simply appear in the downloads section and in the notification shade after they're downloaded. I think it would be nice to have download indicators.

Edit: There appears to be a “Downloading” progress notification, but still, none of the notifications tell me which song they are downloading (other than the song ID), and when I download a lot of songs, the notification channel quickly fills up with tons of notifications.

Request - Album artwork in Notification player

Having the artwork appear in the player in the Notification area would be a great addition for aesthetics.

This is the current behavior
Screenshot_20230828-001044

This is the expected behavior (dSub, for example, does this, along with many "Major" streaming platforms)
Screenshot_20230828-001428

non-free components

First thanks for providing this app under a FOSS license! It has some non-free (proprietary) components, though, which I'm not sure if they're really needed for the app's functionality. Maybe they could be removed/replaced?

Offending libs:
---------------
* Firebase Data Transport (/com/google/android/datatransport): NonFreeNet
* Google Cast (/com/google/android/gms/cast): NonFreeDep
* Google Mobile Services (/com/google/android/gms): NonFreeDep
* Firebase (/com/google/firebase): NonFreeNet,NonFreeDep

4 offenders.

My guess is your intention was just to add support for Google Cast, which then dragged in the other 3 – so they cannot be easily removed without losing that functionality. But a possibility could e.g. be to have a "FOSS build flavor" without Cast then, and make that APK also available? Thanks in advance!

Cannot seek during podcast playback

This could be related to #55 but I am not certain. Podcast playback starts but I cannot seek or fast forward during playback. Also, the track length stays at 00:00.

Can't play (downloaded?) Tracks on Android 13

Hey, the app so far.

I have a problem that did occur the second time now.

First time i did delete whole appdata to fix..

A song i did play doesnt start anymore. I think it might have something todo with the permissions? The app only has permmissions for notifications.

When i try to play the file/song the play icon does change and instant change back to not playing.

How can I provide you logs?

Swipe to Go to Next Track on Now Playing Screen

This is more of an enhancement/personal preference.

I'd really like to be able to swipe left/right to go to next/previous track.
I notice you already had swipe left to go to a description. Perhaps change this to swipe down?

If we could have an option in the settings to change the behavior, that would be nice

Otherwise, the app looks pretty slick. Thanks!

Unusual Chromecast behaviour

Hi Antonio,

I flick between bluetooth and Chromecast frequently. Therefore, I'll move away from the playing screen to (in this example, Home) turn Chromecast on, but when I go back to the playing screen it displays "null" and won't play anything.

Could I also request that casting is made available from the playing screen?

Thanks

java.lang.IllegalStateException

Ever since I started self-hosting my music with Subsonic a few years ago, I've been longing for a new modern-looking and fully-functional Subsonic client for Android. This might be it! However, it's not working for me. The Home section is empty, and the library section is able to show a list of folders and albums, but not the albums themselves. Whenever I click “Scan library,” it throws this error:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NUMBER at line 1 column 40 path $.subsonic-response.error.code

I'm using Supysonic 0.7.2, which targets Subsonic API version 0.12.0, so I need to enable the low-security mode to use plain-text passwords (at least that's what my intuition tells me the mode is for).

Some Problems with playlists

I discovered some problems with playlists:

  • When you delete a playlist in Tempo, it is remotely deleted but not removed from the app UI.
  • New playlists created on the server only show up once the app is restarted (same problem as above really)
  • Clicking the dot menu of an empty playlist crashes the Tempo
  • Renaming a playlist doesn't work. In fact it deletes the playlist.

For issues 1 and 2 The UI needs to be refreshable, I think. Refreshing should happen automatically after playlist deletion or should be manually triggerable (pull down to reload?) by the user.

Crash on opening subsonic server

I happen to have my subsonic server in a subdirectory, https://example.com/navidrome, which tends to uncover problems in early versions of players.

  1. Omitting https:// - that is, writing example.com/navidrome - outright causes a crash.
  2. https://example.com/navidrome results in a quickly flashing error message about an IllegalStateException at line 1. Same if I add a trailing slash.

Dot menu is too small

Oftentimes when I want to click on the dot menu of a song, I accidentally click on the song itself triggering playback. I think it would be a good idea to increase the clickable area of the dot-menu to make this easier to work with.

[Feature Request] Add an "Auto" option for replay gain

There are apps that I've used that have this feature. Basically, it checkes the queue to see if the next song is from the same album, and if it is: use "album replay gain", if not: use "track replay gain,".

Alternatively, it could check if an album is playing, and if not, to default to "track".

It's not foollroof, but it's works reasonably well.

Feature Request: Queue

Spotify, DSub etc all have a play queue that you can sort, add songs to, remove, etc. Would love it if tempo had one too.

PS: thanks for making this

Search on top of app doesn't work

If I try to search for anything using the aforementioned search, it won't return anything.

If I go into Library, Albums, then search there, it will work. Same with artists

D-Sub-like shuffle

Hey, you've been doing such a great job with this app! Now it has almost everything I need for it to be my daily driver and finally replace the old and aging D-Sub. However, I would really like to have a similar shuffle feature, where clicking the shuffle button shuffles the entire queue rather than playing random items from it. Subsequent clicks will result in more shuffles. This allows you to know in advance which tracks are next beforehand.

(Actually, I'll see if I can do it myself, so I can figure out the source code and contribute more in the future.)

Server Side Transcoding

Hi, love what you have going here. I might add quite a few separate issues so I hope you don't mind.

For this one, is there a way to let the server decide what gets transcoded? This app seems similar to Symfonium in that you can either get the raw file with no transcoding or select one of the prebuilt profiles on the client for the trancoding to occur. DSub has always been my go-to because it just pulls in whatever the server sends over.

I have profiles setup that transcodes 24/96 FLAC to 16/44 FLAC, MP3's to MP3's, DSD Wavpack files decompressed to PCM with filters applied then transcoded to 16/44 FLAC, Obscure files such as AC3 Audio from DVD's that get converted to FLAC. All this is handled by what I specify on the server and the client (DSub in this case) just takes the final transcode and streams it for me.

Tempo can handle my 24/96 FLAC files but not necessarily with my preferred dithering mechanism that I specify in my current transcodes. It's unable to handle my WAVPACK DSD files entirely because it doesn't know how to convert this to a PCM format that can be streamed. For obscure formats such as AC3 and MKA, Tempo just shows the files as (null) and can't handle them at all.

Browsing by Folder shows all subfolders, not just the subfolders under the main folder

Not sure how to explain it. Let's say I have these Folders in my Subsonic setup:

Jazz
-John Coltrane
-Miles Davis

Classical
-Beethoven
-Mozart

When clicking "Classical" to browse by folder in Tempo, I should see only Mozart and Beethoven. However, I see:
-Beethoven
-John Coltrane
-Miles Davis
-Mozart

Same things happens when browsing by folder for "Jazz"

Other Subsonic compatible apps handle it fine.

Information:
-Tempo: 3.5.3
-OS: CalyxOS 4.12.0 (Android 13)
-Server: Gonic 0.15.2

"Download" causes Tempo to crash

Hi Antonio,

Obviously this issue is because I have so many downloaded items (approx 6000) but selecting "Download" causes Tempo to crash.

Here's what I see:

Cheers

Quick Scroll Bar When Navigating Folder LIbrary

I apologize as I do not know the correct terminology here. When scrolling through the Music Library, you currently have to scroll for quite a while to get to your artist if you have a large library. Most scroll bars give you the ability to scroll from the far right of the screen and does a "quick scroll" which starts navigating on an index (usually 0-9,A-Z) to quickly get to where you need to go.

Alphabet List Scroll View may be the correct term.

Back button behavior in "Download" section is unintuitive

When you're in a "Download" section and use the back button (The hardware one, or gestures on newer androids), it should take you back one step within the "Download" tab, instead of taking you straight to the previous tab.

Example:

You go to "Download" tab, and select filter by artist, then click on an artist. This shows the albums.

Expected behavior

When you hit back button in this situation, it should take you back to the artist view within the "Download" tab

Actual behavior:

It takes you to the previous tab

Consistently crashing

Pixel 7 - GrapheneOS Version: 2023072600
Tempo Release v.3.4.7

Part of my music library is in WAV format which seems to cause the app to crash. I've attempted to play several WAV tracks and the app will crash, I go to reopen the app and it will immediately crash again. I will uninstall, reinstall, and successfully play an MP3 track. As soon as I attempt to play a WAV track, the app will crash again.

Here is the crash report I get:

type: crash
osVersion: google/panther/panther:13/TQ3A.230705.001/2023072600:user/release-keys
package: com.cappielloantonio.tempo:14
process: com.cappielloantonio.tempo
processUptime: 144314 + 392 ms
installer: com.android.packageinstaller

java.lang.NullPointerException: Attempt to read from field 'androidx.media3.common.n$b[] androidx.media3.common.n.k' on a null object reference in method 'void o5.f.b0(androidx.media3.common.y)'
	at o5.f.b0(MediaService.kt:74)
	at p1.q.b(R8$$SyntheticClass:38)
	at j1.l.run(R8$$SyntheticClass:189)
	at j1.m.b(ListenerSet.java:58)
	at p1.y.p1(ExoPlayerImpl.java:893)
	at c0.g.run(R8$$SyntheticClass:941)
	at android.os.Handler.handleCallback(Handler.java:942)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:201)
	at android.os.Looper.loop(Looper.java:288)
	at android.app.ActivityThread.main(ActivityThread.java:7940)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
	at com.android.internal.os.ExecInit.main(ExecInit.java:49)
	at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
	at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:355)

Calls to getCoverArt (and possibly other API methods) don't URL-encode the username

I received a support request for someone testing Tempo against Astiga. They were able to connect to Astiga and browse their library, but unable to show cover art or stream music. This was odd because when I tested Tempo it worked for me.

Trying to replicate, I found I was able to do so when I replicated their email address, which has a "+" suffix many people use to file their email, e.g. [email protected] . I tested this with Postman and sure enough the call didn't work:

{{host}}/rest/[email protected]&s=...&t=...&v=1.15.0&c=Tempo&id=109508

When I manually URL encoded the username it worked fine:

{{host}}/rest/getCoverArt?u=myname%[email protected]&s=...&t=...&v=1.15.0&c=Tempo&id=109508

In the Astiga code, if I output the username without the encoding I get myname astiga rather than myname+astiga - that's because "+" is typically used to mean a space in a query string.

Looking at the Tempo code, URLs and calls for getCoverArt appear to be built here:

. There's no URL encoding I can see.

I think this should be encoded to %2b really - what do you think?

If you don't want to do that, is there a workaround by somehow configuring a different authentication approach?

As I mentioned this also appears to affect playback. Browsing the library works fine.

How to view/play not yet downloaded podcast episodes

I'm not sure if this is a server-side or client-side issue, or intended behavior in *sonic

I'm using Gonic. If I add a podcast RSS feed URL into it, it can only download ALL existing episodes, or download the latest one when it's been published.

If I don't download all the existing episodes, I see nothing in Tempo when I select the podcast. I have to download episodes for them to appear in Tempo.

Selecting "Library" causes Tempo to halt

Pixel Pro 7.

Was hoping the latest version fixed this, but unfortunately no.

Selecting "Library" causes "Tempo keeps stopping" - I have not been able to see the library view yet!

How can I help isolate this issue?

Cheers

Suggested Workflow

Hi Antonio,

You already know me and have access to my server ;)

I would like to understand how to use Tempo to suit my workflow.

I want to shuffle starred items (artist, album and track). If I turn on "Sync starred tracks.." how do I use Tempo to play them?

Thanks,

c0utta

Album Overview for Downloaded music

I hear a lot music by album and therefore would like to have an album overview of downloaded albums. Would be great to have something like this here.

ReplayGain Pre-Amp

Would be a useful feature to be able to set a ReplayGain Pre-Amp in the settings. Most music apps usually have this as an option.

[Feature request] Support adding songs as favorites while offline

Hi, thanks for building this awesome project!

It would be great to be able to add new songs as favorites even while offline.
The app could temporarily store the new favorites in a backlog and sync them to the server once the internet connection has been restored, similar to DSub. This would be useful for trips to remote places with bad or no mobile reception.
At the moment, attempting to do this results in the favorite button resetting to whatever state it was before.

Podcast playback fails part way through

I am using the kagemoji Airsonic advanced fork server.

Using the latest update I can get a podcast to start playing but some time in the podcast will restart from the beginning. I believe that the first stream chunk is downloaded but nothing following.

Battery optimizations

On Oneplus 9 Pro, Android 12, every time I start or switch to Tempo, a pop-up asks me to disable battery optimizations. But then it takes me to a list of applications which does not include Tempo.

Manually disabling battery optimizations where it actually should be done does not stop this.

Transcoded downloads

This downloaded tracks shows up as playing in FLAC. However, I would like to be able to download tracks in Opus. Is that possible with the current implementation of downloads? Are you downloading the original file from the server? I believe other clients use the stream endpoint instead.

Screenshot_20230624-120808

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.