bleeez / amperfy Goto Github PK
View Code? Open in Web Editor NEWAmperfy is an iOS app to play songs from an Ampache or Subsonic server
License: GNU General Public License v3.0
Amperfy is an iOS app to play songs from an Ampache or Subsonic server
License: GNU General Public License v3.0
To refresh a playlist there are currently two options:
...
symbol and select Update from server
I propose to remove either one of these, not only because these actions are duplicated but also because it's quite easy to accidentally trigger a refresh by pulling down. Refreshing big playlists is currently very slow, so it's something which I think should be harder to do accidentally. Even better would be to refresh playlists automatically but I think this is a lot more work (and might not be possible due to limitations of ampache?)
Running Ampache 4.2.0-develop
After I logged in, the app crashed and I can’t reopen it.
Subsonic and Airsonic Advance, crash during Album sync at very large Database.
See message TestFlight
This is by far the most polished iOS client I've seen for airsonic/subsonic/libresonic! However, I use the podcasts feature pretty heavily. Are there any plans to implement the podcast listening apis on this client?
i have a problem with the LNPopupController.
He can't find it.
Skype: iprinz96
würde mich über jede Hilfe freuen & ich würde mich auch sehr freuen an dem Projekt mit machen zu dürfen.
Bin selbst dabei an einer App für Ampache zu tüfteln. Bin dabei auf das Project gestoßen & Design technisch hab ich mir das genau so vorgestellt.
I've fiddled a little with the codebase and had a macOS version running quite easily.
It's not perfect but it works!
I had to ditch Carthage and use SwiftPM to make the dependencies compile for Catalyst, but I'm not really used to it - maybe you might be able to keep running on Carthage!
Are you planning a full-blown macOS version in the future?
After updating ampache to the newest develop version (API version 500000
) and amperfy 1.0.5 (5)
my session seems to have expired, how do I refresh this without resetting app data that is. Is this a bug or some missing functionality?
Amperfy seems to have saved some logs to the event log, can you access those?
Using amperfy version 1.0.5(3) together with the latest Ampache main version it seems that songs (or mixes in my case) which are long don't play or download. This seems to depend on both the length and bitrate e.g. a 30 min 128kbps mp3 plays fine but a 30 min 320kbps mp3 or 2 hour 128kbps mp3 doesn't Amperfy isn't able to download those either and simply adds them to the completed download list despite failing to download them (the text stays gray).
can't repeat single song. song automatically stops.
despite having an "artist.jpg" oder Artist-Name".jpg" in the artist folder on the ampache server, the default artist image provided by amperfy is being displayed.
the album images are displayed correctly.
Currently, the albums of an artist are sorted alphabetically.
Please make albums sortable by year, either per default or permanent setting.
I'm making a call out to all the xml-api client software devs to come over the the repo and make their issues known.
I'm working on updating Ampache to version 4 and would like feedback on those who use the API to actually tell me what they need to make it better.
So far i've added smart playlists to the playlist calls as well as recording/flagging songs.
Please come by when you can and I hope to make all ampache-related software better for everyone! :)
A night version would be great to avoid dizzying eyes at night or when waking up^^Just inverting colors should do it.
I don't know all the names of these GUI elements so I hope this makes sense. But what I'd like to see is the time changing when seeking trough a song. Currently it continues to show the current time in the song. To illustrate I've annotated a screenshot of my desktop music player:
Here the time in red changes when moving the blue circled gui element, I think amperfy should do so too.
Currently it is not clear whether shuffle is toggled on or of. I think the shuffle toggle in apples own Music app suffers of the same problem, Spotify is a bit more clear. But best would be the following (Unfortunately I only could find an example of this symbol in the KDE music player Elisa so it's a screenshot of the app itself):
Full details below. This happens when I attempt to play a track for the first time after refreshing a playlist. The relevant bit appears here :
2019-06-10 13:11:49.216194+0000 Amperfy[2675:112209] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'song' between objects in different contexts (source = <PlaylistElement: 0x600000d094f0>
2019-06-10 13:03:43.422449+0000 Amperfy[2528:105604] [BackendProxy] Ampache is active backend api
2019-06-10 13:03:43.422778+0000 Amperfy[2528:105604] [BackgroundSyncer] SyncInBackground start
2019-06-10 13:03:43.425361+0000 Amperfy[2528:105766] [Ampache] https://cloud.redshift.is/apps/music/ampache/server/xml.server.php?action=handshake&auth=f5a8972f9938f78ff4f557a862f3865ea5fc5c1ddb2a0339973c2106e55c5b48×tamp=1560171823&version=350001&user=ncp
2019-06-10 13:03:43.428708+0000 Amperfy[2528:105777] [Ampache] https://cloud.redshift.is/apps/music/ampache/server/xml.server.php?action=handshake&auth=f5a8972f9938f78ff4f557a862f3865ea5fc5c1ddb2a0339973c2106e55c5b48×tamp=1560171823&version=350001&user=ncp
2019-06-10 13:03:43.902051+0000 Amperfy[2528:105777] [LibrarySyncer] Lib resync: New changes on server
2019-06-10 13:03:43.906400+0000 Amperfy[2528:105777] [LibrarySyncer] Lib resync: 0 Artists parsed
2019-06-10 13:03:44.204496+0000 Amperfy[2528:105777] [Parser] Found album id 20 with unknown artist 39
2019-06-10 13:03:44.206156+0000 Amperfy[2528:105777] [Parser] Found album id 29 with unknown artist 57
2019-06-10 13:03:44.207338+0000 Amperfy[2528:105777] [Parser] Found album id 35 with unknown artist 41
2019-06-10 13:03:44.208440+0000 Amperfy[2528:105777] [Parser] Found album id 21 with unknown artist 41
2019-06-10 13:03:44.209711+0000 Amperfy[2528:105777] [Parser] Found album id 25 with unknown artist 41
2019-06-10 13:03:44.211076+0000 Amperfy[2528:105777] [Parser] Found album id 22 with unknown artist 41
2019-06-10 13:03:44.212787+0000 Amperfy[2528:105777] [Parser] Found album id 34 with unknown artist 41
2019-06-10 13:03:44.214312+0000 Amperfy[2528:105777] [Parser] Found album id 27 with unknown artist 41
2019-06-10 13:03:44.215627+0000 Amperfy[2528:105777] [Parser] Found album id 28 with unknown artist 41
2019-06-10 13:03:44.216975+0000 Amperfy[2528:105777] [Parser] Found album id 23 with unknown artist 41
2019-06-10 13:03:44.218504+0000 Amperfy[2528:105777] [Parser] Found album id 24 with unknown artist 41
2019-06-10 13:03:44.219798+0000 Amperfy[2528:105777] [Parser] Found album id 26 with unknown artist 41
2019-06-10 13:03:44.220200+0000 Amperfy[2528:105777] [LibrarySyncer] Lib resync: 12 Albums parsed
2019-06-10 13:03:44.590939+0000 Amperfy[2528:105777] [Parser] Found song id 22 with unknown artist 41
2019-06-10 13:03:44.595233+0000 Amperfy[2528:105777] [Parser] Found song id 21 with unknown artist 41
2019-06-10 13:03:44.597298+0000 Amperfy[2528:105777] [Parser] Found song id 23 with unknown artist 41
2019-06-10 13:03:44.599158+0000 Amperfy[2528:105777] [Parser] Found song id 35 with unknown artist 41
2019-06-10 13:03:44.601130+0000 Amperfy[2528:105777] [Parser] Found song id 36 with unknown artist 57
2019-06-10 13:03:44.602950+0000 Amperfy[2528:105777] [Parser] Found song id 32 with unknown artist 57
2019-06-10 13:03:44.603958+0000 Amperfy[2528:105777] [Parser] Found song id 24 with unknown artist 41
2019-06-10 13:03:44.605519+0000 Amperfy[2528:105777] [Parser] Found song id 25 with unknown artist 41
2019-06-10 13:03:44.607175+0000 Amperfy[2528:105777] [Parser] Found song id 26 with unknown artist 41
2019-06-10 13:03:44.609061+0000 Amperfy[2528:105777] [Parser] Found song id 27 with unknown artist 41
2019-06-10 13:03:44.610666+0000 Amperfy[2528:105777] [Parser] Found song id 28 with unknown artist 41
2019-06-10 13:03:44.613099+0000 Amperfy[2528:105777] [Parser] Found song id 31 with unknown artist 57
2019-06-10 13:03:44.614204+0000 Amperfy[2528:105777] [Parser] Found song id 30 with unknown artist 57
2019-06-10 13:03:44.615306+0000 Amperfy[2528:105777] [Parser] Found song id 29 with unknown artist 57
2019-06-10 13:03:44.616334+0000 Amperfy[2528:105777] [Parser] Found song id 33 with unknown artist 57
2019-06-10 13:03:44.617374+0000 Amperfy[2528:105777] [Parser] Found song id 34 with unknown artist 41
2019-06-10 13:03:44.618902+0000 Amperfy[2528:105777] [Parser] Found song id 20 with unknown artist 39
2019-06-10 13:03:44.619492+0000 Amperfy[2528:105777] [LibrarySyncer] Lib resync: 17 Songs parsed
2019-06-10 13:03:44.685905+0000 Amperfy[2528:105766] [LibrarySyncer] All artworks are synced
2019-06-10 13:04:16.120482+0000 Amperfy[2528:105604] Play song: Unknown artist - Edge Of The Dream
2019-06-10 13:04:40.418412+0000 Amperfy[2528:105604] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x60000291fd90 UIView:0x7fcf0793a200.width == - 16 (active)>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x60000291fd90 UIView:0x7fcf0793a200.width == - 16 (active)>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
2019-06-10 13:05:28.136731+0000 Amperfy[2528:105604] [AXMediaCommon] Unable to look up screen scale
2019-06-10 13:05:28.136827+0000 Amperfy[2528:105604] [AXMediaCommon] Unexpected physical screen orientation
2019-06-10 13:05:28.160506+0000 Amperfy[2528:105604] [AXMediaCommon] Unable to look up screen scale
2019-06-10 13:05:28.163483+0000 Amperfy[2528:105604] [AXMediaCommon] Unable to look up screen scale
2019-06-10 13:05:28.163574+0000 Amperfy[2528:105604] [AXMediaCommon] Unexpected physical screen orientation
2019-06-10 13:05:49.859681+0000 Amperfy[2528:107169] [AmpacheLibSyncer] Download playlist "rosecross" from server
2019-06-10 13:05:50.207395+0000 Amperfy[2528:107169] [AmpacheLibSyncer] Sync songs of playlist "rosecross"
2019-06-10 13:05:52.264957+0000 Amperfy[2528:105604] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'song' between objects in different contexts (source = <PlaylistElement: 0x6000029b68f0> (entity: PlaylistElement; id: 0x600000aaaee0 <x-coredata:///PlaylistElement/tC3B05E8F-E8B0-4FA2-85AF-6EDB2C70769B8> ; data: {
order = 0;
playlist = "0xc11353cbb0b2bf20 <x-coredata://9BE5A25C-7615-4BA3-A96D-733D73C4AB8D/PlaylistManaged/p2>";
song = nil;
}) , destination = <Song: 0x6000029b5f90> (entity: Song; id: 0xc11353cbb0cabf2a <x-coredata://9BE5A25C-7615-4BA3-A96D-733D73C4AB8D/Song/p28> ; data: {
album = "0xc11353cbb0a2bf2e <x-coredata://9BE5A25C-7615-4BA3-A96D-733D73C4AB8D/Album/p6>";
artist = nil;
artwork = nil;
dataMO = nil;
id = 36;
playlistElements = (
"0xc11353cbb09ebf24 <x-coredata://9BE5A25C-7615-4BA3-A96D-733D73C4AB8D/PlaylistElement/p9>"
);
syncInfo = "0xc11353cbb0b2bf26 <x-coredata://9BE5A25C-7615-4BA3-A96D-733D73C4AB8D/SyncWaveMO/p2>";
title = Decani;
track = 6;
url = "https://cloud.redshift.is/apps/music/ampache/server/xml.server.php?action=play&filter=36&auth=a10c5313a78248ba469522ed9aa93285";
}))'
*** First throw call stack:
(
0 CoreFoundation 0x000000010649d6fb __exceptionPreprocess + 331
1 libobjc.A.dylib 0x0000000104ca7ac5 objc_exception_throw + 48
2 CoreData 0x0000000105e613a1 _PFManagedObject_coerceValueForKeyWithDescription + 2481
3 CoreData 0x0000000105e3de15 _sharedIMPL_setvfk_core + 229
4 Amperfy 0x00000001040d4d86 $s7Amperfy8PlaylistC6append4songyAA4SongC_tF + 582
5 Amperfy 0x00000001040c74a4 $s7Amperfy6PlayerC13addToPlaylist4songyAA4SongC_tF + 84
6 Amperfy 0x00000001040c7e39 $s7Amperfy6PlayerC4play4songyAA4SongC_tF + 105
7 Amperfy 0x000000010415a94b $s7Amperfy13SongTableCellC12touchesEnded_4withyShySo7UITouchCG_So7UIEventCSgtF + 507
8 Amperfy 0x000000010415ab5c $s7Amperfy13SongTableCellC12touchesEnded_4withyShySo7UITouchCG_So7UIEventCSgtFTo + 124
9 UIKitCore 0x000000010fcc0a09 forwardTouchMethod + 353
10 UIKitCore 0x000000010fcc0ad8 -[UIResponder touchesEnded:withEvent:] + 49
11 UIKitCore 0x000000010f8789c9 _UIGestureEnvironmentUpdate + 10367
12 UIKitCore 0x000000010f876108 -[UIGestureEnvironment _deliverEvent:toGestureRecognizers:usingBlock:] + 478
13 UIKitCore 0x000000010f875e96 -[UIGestureEnvironment _updateForEvent:window:] + 200
14 UIKitCore 0x000000010fcd15bc -[UIWindow sendEvent:] + 4057
15 UIKitCore 0x000000010fcafd16 -[UIApplication sendEvent:] + 356
16 UIKit 0x00000001289c14af -[UIApplicationAccessibility sendEvent:] + 85
17 UIKitCore 0x000000010fd80293 __dispatchPreprocessedEventFromEventQueue + 3232
18 UIKitCore 0x000000010fd82bb9 __handleEventQueueInternal + 5911
19 CoreFoundation 0x0000000106404be1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
20 CoreFoundation 0x0000000106404463 __CFRunLoopDoSources0 + 243
21 CoreFoundation 0x00000001063feb1f __CFRunLoopRun + 1231
22 CoreFoundation 0x00000001063fe302 CFRunLoopRunSpecific + 626
23 GraphicsServices 0x000000010c1742fe GSEventRunModal + 65
24 UIKitCore 0x000000010fc95ba2 UIApplicationMain + 140
25 Amperfy 0x0000000104192f6b main + 75
26 libdyld.dylib 0x00000001098ab541 start + 1
27 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
The last two days I had some trouble with error messages
something regarding "token based" and then today "Entity not found, error 70".
Newly added songs were not loaded, so I tried to uninstall the app and install the newest version, but after entering the server info and login credentials, the app crashes immediately when the loading bar "syncing artists" appears.
I cannot even access the app to read the log files.
Any ideas what I can do? Thanks
Genre is currently not supported in either the library view or search, I think adding it would be a great improvement.
I just installed this on my phone to listen to music on my Airsonic server, but while the song list does load (after a while), nothing actually plays. I also see no logs on the server.
I run a Subsonic-compatible server (Navidrome) behind an Nginx reverse proxy with a self-signed certificate (Synology NAS). Login attempt from Amperfy fails with a "Login failed, Not able to login, please check credentials! message". There is no option to review or accept the certificate. Login works as expected when pointing Amperfy directly at Navidrome HTTP port.
I was wondering whether you'd be interested in implementing queuing such as is done in the Spotify app and whether you are already familiar with this behavior (if not I could describe it in detail to make implementation easier).
It basically works like the following:
I could elaborate more on the exact behavior and arguments on why I think this is better behavior than for instance the Apple Music app queuing if you might be interested in implementing this.
This is roughly what the sign-in dialogue looks like when a password manager is installed:
(the "Log In" button is hidden underneath the "Passwords" panel)
It would be nice if the dialogue could either be scrolled somehow or if the keyboard could be hidden after the password is entered. Or if pressing "Return" after the password would submit the form. Right now, selecting the URL again makes the "Password" panel disappear and the "Log In" button becomes visible again :)
Also, the text fields have a slightly different feel to the "usual" fields in the sense that they don't have a blinking cursor and are slightly smaller than the ones in search field for example.
URL is not escaped and therefore fails to login if your password contains special characters.
Hello,
Been using for few weeks now and Amperphy is really cool. I just wanted to play the lastest songs I added on ampache using a smart list but it seems they dont show up on the playlists tab in the app. Is there a way to add them ?
Many Thanks !
Currently the keyboard stays up when clicking on a song after a search even though it should disappear.
At this place the public TestFlight links for Amperfy beta versions will be published.
Details for how to participate with TestFlight can be found here.
Please create separate issue tickets for bugs in beta for the following reasons:
Hello , thanks for this cool project.
I tried it but didn't succeed to access the Ampache server 4.2.2 using Amperphy (using last master version) I think it must be a config issue, could you document or just say what's required to make it works with an Apache server in the config side ?
Mine is a simple http
Thanks
As you can see in the screenshot the contrast between the gray text and symbols is quite bad, this hinders readability. For me personally it's only a hindrance, but for someone who's visually impaired I'd imagine it could become unreadable. There are some good guidelines available online such as this one, although I think the easiest fix would be to simply set the color to black. You might still want to look into whether this still delivers the desired contrasts given the changing colors of the backgrounds.
Looking at the library settings page crashes the app. I suspect it has something to do with the cache information code given that these don't display any numbers but only the waiting symbol before crashing.
Creating a new playlist in the app, does not synchronize with the ampache server.
The playlist is only available in the app, until the app is restarted.
After successfully connecting to an ampache endpoint and syncing my library, when I attempt to play a song in m4a or mp3 format the progress bar fails to move beyond 0:00
This result is the same whether running in an iOS simulator or on my iOS device.
2019-06-08 17:10:52.534701+0000 Amperfy[2454:646954] Error Player: The operation couldn’t be completed. (OSStatus error -50.) 2019-06-08 17:10:59.956367+0000 Amperfy[2454:646954] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles 2019-06-08 17:10:59.958217+0000 Amperfy[2454:646954] [MC] Reading from public effective user settings. 2019-06-08 17:12:55.275214+0000 Amperfy[2454:646954] [Ampache] https://cloud.redshift.is/apps/music/ampache/server/xml.server.php?action=handshake&auth=9a45f4e915282c05887dcc005d3008f35a73cf6115bfd69fce04108ccf27507a×tamp=1560013975&version=350001&user=ncp 2019-06-08 17:12:55.696373+0000 Amperfy[2454:646954] [BackendProxy] Ampache is active backend api 2019-06-08 17:12:56.251650+0000 Amperfy[2454:646954] [BackgroundSyncer] SyncInBackground stopped 2019-06-08 17:12:56.612037+0000 Amperfy[2454:647432] [Parser] Found album id 18 with unknown artist 35 2019-06-08 17:12:56.919351+0000 Amperfy[2454:647432] [Parser] Found song id 18 with unknown artist 35 2019-06-08 17:12:57.637359+0000 Amperfy[2454:647432] [BackgroundSyncer] SyncInBackground start 2019-06-08 17:12:57.642885+0000 Amperfy[2454:647276] [LibrarySyncer] Lib resync: No changes 2019-06-08 17:12:58.240410+0000 Amperfy[2454:647464] [LibrarySyncer] Not able to fetch img 2019-06-08 17:12:58.241501+0000 Amperfy[2454:647464] [LibrarySyncer] All artworks are synced 2019-06-08 17:13:04.811039+0000 Amperfy[2454:646954] [Snapshotting] Snapshotting a view (0x1050bec00, UIKeyboardImpl) that is not in a visible window requires afterScreenUpdates:YES. 2019-06-08 17:13:06.114191+0000 Amperfy[2454:646954] [BackgroundSyncer] SyncInBackground start 2019-06-08 17:13:06.116564+0000 Amperfy[2454:647464] [LibrarySyncer] Lib resync: No changes 2019-06-08 17:13:06.741182+0000 Amperfy[2454:647645] [LibrarySyncer] All artworks are synced 2019-06-08 17:13:11.563333+0000 Amperfy[2454:647647] [DownloadManager] DownloadManager start 2019-06-08 17:13:11.563543+0000 Amperfy[2454:647434] [DownloadManager] Fetching - Agnus Dei - Samuel Barber LIVE ... 2019-06-08 17:13:12.873787+0000 Amperfy[2454:647434] [DownloadManager] Fetching - Agnus Dei - Samuel Barber LIVE SUCCESS (6.82 MiB) 2019-06-08 17:13:12.917757+0000 Amperfy[2454:647647] [DownloadManager] DownloadManager done 2019-06-08 17:13:17.802026+0000 Amperfy[2454:647646] TIC Read Status [9:0x280c1ad00]: 1:57 2019-06-08 17:13:17.802096+0000 Amperfy[2454:647646] TIC Read Status [9:0x280c1ad00]: 1:57 2019-06-08 17:13:17.802109+0000 Amperfy[2454:647646] TIC Read Status [9:0x280c1ad00]: 1:57 2019-06-08 17:13:17.803105+0000 Amperfy[2454:647646] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301) [C9.1:2][0x104c93260] get output frames failed, state 8196 2019-06-08 17:13:17.803177+0000 Amperfy[2454:647646] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301) [C9.1:2][0x104c93260] get output frames failed, state 8196 2019-06-08 17:13:17.803608+0000 Amperfy[2454:647646] TIC Read Status [9:0x0]: 1:57 2019-06-08 17:13:17.803630+0000 Amperfy[2454:647646] TIC Read Status [9:0x0]: 1:57 2019-06-08 17:13:17.803642+0000 Amperfy[2454:647646] TIC Read Status [9:0x0]: 1:57 2019-06-08 17:13:17.803654+0000 Amperfy[2454:647646] TIC Read Status [9:0x0]: 1:57
I was wondering whether amperfy is compatible with the latest Ampache 5 db updates which were merged 3 days ago:
ampache/ampache#2926
I could imagine that this would only be a backend change which would change any API details but I don't know for sure and I'd like to know before upgrading my Ampache server to the latest version.
This might be a bit of an odd request. But since you don't seem to be hosting the App on the official App Store. Would you possibly consider hosting it for Jailbroken devices? Or perhaps just have an IPA file available for download.
Thanks for the client either way!
First test.
Connection to my server ok.
Ok
Syncing, ok, found a lot of artist and albums, but only 4 track/songs !
There are about 8000 tracks, but all albums show 0 track, the 4 in ramdomly on 4 diffetent albums.
Using the latest testflight beta (1.0.4) when a download is done it doesn't get cleared of the list of active downloads.
The app Will not Update, i have to delete the app, and install it again.
This bug has been reported by @Canorus.
.m4a songs are streamed with reduced quality and can not be played from cache.
Server API Ampache.
Thank you for creating this app for ampache!! I'm trying to setup an music streaming service, but my family uses iphones and I do not have a Mac. Is there a way you can put this app on the apple store? Thank you again!
I tried to leave this on 1.0.5(5) through testflight but it seems didn't make it. Now that official 1.0.5 is released I decided to leave the issue on github(maybe I should've done it this way from the first place).
As seen from the video above, songs list is empty but when I start typing in the search bar it will show some results. I'm not sure if it's my server causing this but I'm reporting it anyway. Please let me know what to do if that's the case.
backend API Ampache
Server API version 441000
Client API version 500000
thanks.
I might be missing something, but when viewing an album, it appears that tracks are listed alphabetically (by track title). Is there a way to get them listed by track number order?
First of all thanks for your work. I'm a total newbie when it comes to iOS development and could not get the project deployed to my phone. The error seemed to be something with app IDs:
Could you provide instructions on how to deploy the app to a device?
How hard/cumbersome would it be to place the app on the official store?
Kind regards and again thanks for your work -
Jonas
Currently smart playlists don't seem to be supported.
When queuing a big playlist the gui of the app gets blocked, I suspect this is because the whole playlist gets added to the queue at once. I don't know how hard/ easy this would be but a solution I could think of is queuing lazily, since the results aren't actually needed until:
Although this might also be solved by changing the queuing code to be non-blocking.
While looking trough the code I saw quite some functions which seemed to have roughly the same code but only differed in types, while I don't have any experience (other than looking trough this code :)) with swift I know from programming in C# that in the case of mostly the same functions but differing types I'd use generics. It seems that these exist in swift too: https://docs.swift.org/swift-book/LanguageGuide/Generics.html
Although functionally by changing these functions into generic ones there might not be any change I still think it would be a good idea with the whole DRY
(D
on't R
epeat Y
ourself) principle and all. Having less code means you need to maintain less.
An example:
private func playAllSongsInAlbum(album: Album) {
guard let player = player else { return }
player.cleanPlaylist()
addAlbumSongsToPlaylist(album: album)
player.play()
}
private func playAllSongsInPlaylist(playlist: Playlist) {
guard let player = player else { return }
player.cleanPlaylist()
addPlaylistSongsToPlaylist(playlist: playlist)
player.play()
}
private func addArtistSongsToPlaylist(artist: Artist) {
guard let player = player else { return }
player.addToPlaylist(songs: artist.songs)
}
private func addAlbumSongsToPlaylist(album: Album) {
guard let player = player else { return }
player.addToPlaylist(songs: album.songs)
}
I think it would become something such as the following (although I'm not at all sure about the syntax/ whether this even compiles):
private func addItemSongsToPlaylist<T>(item: T) {
guard let player = player else { return }
player.addToPlaylist(songs: item.songs)
}
private func playAllSongsInItem<T>(item: T) {
guard let player = player else { return }
player.cleanPlaylist()
addItemSongsToPlaylist(item: item)
player.play()
}
If the behavior of the function is dependent on the type of the argument such as is the case in the following functions:
func prepare(toWorkOnArtist artist: Artist?, with player: MusicPlayer) {
self.artist = artist
self.player = player
}
func prepare(toWorkOnAlbum album: Album?, with player: MusicPlayer) {
self.album = album
self.player = player
}
func prepare(toWorkOnPlaylist playlist: Playlist?, with player: MusicPlayer) {
self.playlist = playlist
self.player = player
}
Then I think pattern matching on the types using a switch
statement can be used (again not even sure whether this compiles):
func prepare<T>(toWorkOnItem item: T, with player: MusicPlayer) {
switch item {
case let artist as Artist:
self.artist = artist
case let album as Album:
self.album = album
case let playlist as Playlist:
self.playlist = playlist
}
self.player = player
}
In general I think this would improve the overall quality of the code base. Although there might be some arguments against this which I have missed given my inexperience in regards to swift.
I'm running a Navidrome server and cannot login using Amperfy (Login failed, Not able to login, please check credentials! message). I can connect using the same address and credentials in iSub and SubStreamer as well as the web app. There are no logs server-side.
Playlists are not loaded correctly from the server and appear to be empty in the app (see issue #42).
Adding songs to such a playlist in the app will work, but removes all other songs from the playlist on the server.
Because the synchronisation of newly added songs does not work properly, the user ends up with an empty playlist on the server.
The next time the app is started, the songs added via the app are gone too (see issue #43).
Playlists are not loaded correctly from the ampache server.
The playlist Title is loaded and displayed along with the number of songs, but missing the duration ("0s").
Opening a playlist will show an empty list, so the individal songs are not being displayed and thus cannot be played.
This happens when toggling shuffle on a smart playlist but it seems like the result is either cached or it's not 100% reproducible since I had no problem shuffling a smart playlist after I'd shuffled it before.
I'd be great if you could download the whole library in one go and if amperfy would do this automatically when new songs are added, similarly to iTunes match. Currently the only way to do this is creating a playlist containing all songs and downloading this manually but this is finicky and unreliable.
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.