diff --git a/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessRouting.kt b/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessRouting.kt index cbfe36f28918148633843d3a846fc53ed3435f3a..1d60bf14a2eaaec54ee37ebec467e412453a1f7a 100644 --- a/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessRouting.kt +++ b/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessRouting.kt @@ -118,6 +118,16 @@ import org.videolan.vlc.providers.BrowserProvider import org.videolan.vlc.providers.FileBrowserProvider import org.videolan.vlc.providers.StorageProvider import org.videolan.vlc.providers.medialibrary.sanitizeGroups +import org.videolan.vlc.remoteaccessserver.RemoteAccessServer.Companion.getServerFiles +import org.videolan.vlc.remoteaccessserver.RemoteAccessServer.PlayerStatus +import org.videolan.vlc.remoteaccessserver.RemoteAccessSession.verifyLogin +import org.videolan.vlc.remoteaccessserver.utils.MediaZipUtils +import org.videolan.vlc.remoteaccessserver.utils.serveAudios +import org.videolan.vlc.remoteaccessserver.utils.servePlaylists +import org.videolan.vlc.remoteaccessserver.utils.serveSearch +import org.videolan.vlc.remoteaccessserver.utils.serveVideos +import org.videolan.vlc.remoteaccessserver.websockets.RemoteAccessWebSockets +import org.videolan.vlc.remoteaccessserver.websockets.WSIncomingMessage import org.videolan.vlc.util.FileUtils import org.videolan.vlc.util.Permissions import org.videolan.vlc.util.RemoteAccessUtils @@ -132,16 +142,6 @@ import org.videolan.vlc.util.slugify import org.videolan.vlc.util.toByteArray import org.videolan.vlc.viewmodels.browser.FavoritesProvider import org.videolan.vlc.viewmodels.browser.PathOperationDelegate -import org.videolan.vlc.remoteaccessserver.RemoteAccessServer.Companion.getServerFiles -import org.videolan.vlc.remoteaccessserver.RemoteAccessServer.PlayerStatus -import org.videolan.vlc.remoteaccessserver.RemoteAccessSession.verifyLogin -import org.videolan.vlc.remoteaccessserver.utils.MediaZipUtils -import org.videolan.vlc.remoteaccessserver.utils.serveAudios -import org.videolan.vlc.remoteaccessserver.utils.servePlaylists -import org.videolan.vlc.remoteaccessserver.utils.serveSearch -import org.videolan.vlc.remoteaccessserver.utils.serveVideos -import org.videolan.vlc.remoteaccessserver.websockets.RemoteAccessWebSockets -import org.videolan.vlc.remoteaccessserver.websockets.WSIncomingMessage import java.io.BufferedWriter import java.io.File import java.io.FileNotFoundException @@ -850,7 +850,7 @@ fun Route.setupRouting(appContext: Context, scope: CoroutineScope) { } val list = ArrayList<RemoteAccessServer.PlayQueueItem>(stream.size) stream.forEachIndexed { index, mediaLibraryItem -> - list.add(RemoteAccessServer.PlayQueueItem(3000L + index, mediaLibraryItem.title, " ", 0, mediaLibraryItem.artworkMrl + list.add(RemoteAccessServer.PlayQueueItem(mediaLibraryItem.id, mediaLibraryItem.title, " ", 0, mediaLibraryItem.artworkMrl ?: "", false, "", (mediaLibraryItem as MediaWrapper).uri.toString(), true, favorite = mediaLibraryItem.isFavorite)) } call.respondJson(convertToJson(list)) @@ -950,7 +950,10 @@ fun Route.setupRouting(appContext: Context, scope: CoroutineScope) { val medias = appContext.getFromMl { if (path?.isNotBlank() == true) { - arrayOf(MLServiceLocator.getAbstractMediaWrapper(Uri.parse(path))) + if (id.toLong() > 0) + arrayOf(getMedia(id.toLong())) + else + arrayOf(MLServiceLocator.getAbstractMediaWrapper(Uri.parse(path))) } else when (type) { "album" -> getAlbum(id.toLong()).tracks "artist" -> getArtist(id.toLong()).tracks @@ -969,7 +972,7 @@ fun Route.setupRouting(appContext: Context, scope: CoroutineScope) { } if (medias.isEmpty()) call.respond(HttpStatusCode.NotFound) else { - if (medias.size == 1 && medias[0].id == RemoteAccessServer.getInstance(appContext).service?.currentMediaWrapper?.id) { + if (medias.size == 1 && medias[0].id == RemoteAccessServer.getInstance(appContext).service?.currentMediaWrapper?.id && medias[0].uri == RemoteAccessServer.getInstance(appContext).service?.currentMediaWrapper?.uri) { call.respond(HttpStatusCode.OK) return@get } diff --git a/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessServer.kt b/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessServer.kt index f79545101914f409c5b32c2e457a7f7dbb3d8586..609087140d125ed6900d4899e966023ce0467fe6 100644 --- a/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessServer.kt +++ b/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessServer.kt @@ -59,7 +59,6 @@ import io.ktor.server.plugins.cachingheaders.CachingHeaders import io.ktor.server.plugins.callloging.CallLogging import io.ktor.server.plugins.compression.Compression import io.ktor.server.plugins.compression.matchContentType -import io.ktor.server.plugins.compression.minimumSize import io.ktor.server.plugins.cors.routing.CORS import io.ktor.server.plugins.origin import io.ktor.server.plugins.partialcontent.PartialContent @@ -152,6 +151,7 @@ class RemoteAccessServer(private val context: Context) : PlaybackService.Callbac var service: PlaybackService? = null private val networkSharesResult = ArrayList<MediaLibraryItem>() private val networkDiscoveryRunning = AtomicBoolean(false) + private var lastPlayedLocation = "" private val _serverStatus = MutableLiveData(ServerStatus.NOT_INIT) @@ -709,6 +709,14 @@ class RemoteAccessServer(private val context: Context) : PlaybackService.Callbac * @param event the event sent */ override fun onMediaPlayerEvent(event: MediaPlayer.Event) { + service?.currentMediaLocation?.let { + if (it.isNotEmpty() && lastPlayedLocation != service?.currentMediaLocation) { + lastPlayedLocation = it + } + } + if (event.type == MediaPlayer.Event.EncounteredError) { + AppScope.launch { RemoteAccessWebSockets.sendToAll(GenericError(context.getString(R.string.invalid_location, lastPlayedLocation))) } + } if (event.type != MediaPlayer.Event.TimeChanged) return if (System.currentTimeMillis() - lastNowPlayingSendTime < NOW_PLAYING_TIMEOUT) return lastNowPlayingSendTime = System.currentTimeMillis() @@ -913,6 +921,7 @@ class RemoteAccessServer(private val context: Context) : PlaybackService.Callbac data class MLRefreshNeeded(val refreshNeeded: Boolean = true) : WSMessage(WSMessageType.ML_REFRESH_NEEDED) data class BrowserDescription(val path: String, val description: String) : WSMessage(WSMessageType.BROWSER_DESCRIPTION) data class PlaybackControlForbidden(val forbidden: Boolean = true): WSMessage(WSMessageType.PLAYBACK_CONTROL_FORBIDDEN) + data class GenericError(val text: String): WSMessage(WSMessageType.ERROR) data class NetworkShares(val shares: List<PlayQueueItem>): WSMessage(WSMessageType.NETWORK_SHARES) data class SearchResults(val albums: List<PlayQueueItem>, val artists: List<PlayQueueItem>, val genres: List<PlayQueueItem>, val playlists: List<PlayQueueItem>, val videos: List<PlayQueueItem>, val tracks: List<PlayQueueItem>) data class BreadcrumbItem(val title: String, val path: String) @@ -961,6 +970,8 @@ class RemoteAccessServer(private val context: Context) : PlaybackService.Callbac BROWSER_DESCRIPTION, @Json(name = "playback-control-forbidden") PLAYBACK_CONTROL_FORBIDDEN, + @Json(name = "error") + ERROR, @Json(name = "network-shares") NETWORK_SHARES } diff --git a/build.gradle b/build.gradle index 27fd9e7d87152332887d4eccf84bb8445bd9fb90..227e656f4b0a5ee4b77c0488144baf4e87c2a6b4 100644 --- a/build.gradle +++ b/build.gradle @@ -42,7 +42,7 @@ ext { versionCode = 3060330 versionName = project.hasProperty('forceVlc4') && project.getProperty('forceVlc4') ? '4.0.0-preview - ' + versionCode : '3.6.4 Beta 3' vlcMajorVersion = project.hasProperty('forceVlc4') && project.getProperty('forceVlc4') ? 4 : 3 - remoteAccessVersion = '0.4.0' + remoteAccessVersion = '0.5.0' libvlcVersion = vlcMajorVersion == 3 ? '3.6.0' :'4.0.0-eap18' medialibraryVersion = vlcMajorVersion == 3 ? '0.13.13-rc15' : '0.13.13-vlc4-rc15' minSdkVersion = 17 diff --git a/buildsystem/compile-remoteaccess.sh b/buildsystem/compile-remoteaccess.sh index 1ebe51f2ec8213e23b2c414ee15b58f26212570f..81a716491451443bce163c921a53370da9534671 100755 --- a/buildsystem/compile-remoteaccess.sh +++ b/buildsystem/compile-remoteaccess.sh @@ -57,7 +57,7 @@ done ############################## diagnostic "Setting up the Remote Access project" - REMOTE_ACCESS_TESTED_HASH=c0e259d9af41d24fc82d7bbafc7df2345d129bc2 + REMOTE_ACCESS_TESTED_HASH=a0fb5c209f506da0dd1cb1f9ff01b9f9a49eb489 REMOTE_ACCESS_REPOSITORY=https://code.videolan.org/videolan/remoteaccess : ${VLC_REMOTE_ACCESS_PATH:="$(pwd -P)/application/remote-access-client/remoteaccess"}