cappielloantonio / tempo Goto Github PK
View Code? Open in Web Editor NEWAn open source and lightweight music client for Subsonic, designed and built natively for Android.
License: GNU General Public License v3.0
An open source and lightweight music client for Subsonic, designed and built natively for Android.
License: GNU General Public License v3.0
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
Currently only albums and tracks can be downloaded. I wonder if all the files in a folder, at the server level, could be downloaded?
I discovered some problems with playlists:
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.
The ability to view lyrics of songs played.
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?
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.
It took me a while to realize that you have to SWIPE it up to make it appear!
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!
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.
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?
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.
Navidrome (and I assume other servers that follow the Subsonic spec) supports sharing artist, album, song and playlist links. See https://www.navidrome.org/docs/usage/sharing/
Would it be possible for Tempo to support such functionality?
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.)
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.
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
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.
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
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.
When selecting a song in a playlist or a playlist with an index higher than 16 (ex. the 18th song in a playlist), Tempo plays the 16th track instead.
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.
You go to "Download" tab, and select filter by artist, then click on an artist. This shows the albums.
When you hit back button in this situation, it should take you back to the artist view within the "Download" tab
It takes you to the previous tab
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).
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.
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.
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.
I happen to have my subsonic server in a subdirectory, https://example.com/navidrome
, which tends to uncover problems in early versions of players.
https://
- that is, writing example.com/navidrome
- outright causes a crash.https://example.com/navidrome
results in a quickly flashing error message about an IllegalStateException at line 1. Same if I add a trailing slash.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.
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
The consequence is that, when downloading items, the user has to wait for all downloads to complete before they can dismiss the Download Complete notifications. It's a very minor annoyance, but wondering if a solution is simple.
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.
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.
It would be great if we could have a button to shuffle all tracks in the library.
In case it's useful, here is a a thread with the Navidrome developer discussing possible solutions for implementing this in a scalable way.
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
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 :
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
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.
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.
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?
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)
On albums which have no downloaded songs, which should not have the option to remove all, the option flickers and quickly disappears when you open the bottom sheet.
Expected behavior:
It should be removed before the bottom sheet becomes visible to the user.
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
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.
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.
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!
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.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.