diff --git a/app/src/main/java/com/zionhuang/music/MainActivity.kt b/app/src/main/java/com/zionhuang/music/MainActivity.kt index dcf544ddc..d60d7398f 100644 --- a/app/src/main/java/com/zionhuang/music/MainActivity.kt +++ b/app/src/main/java/com/zionhuang/music/MainActivity.kt @@ -196,7 +196,6 @@ class MainActivity : ComponentActivity() { super.onDestroy() if (dataStore.get(StopMusicOnTaskClearKey, false) && playerConnection?.isPlaying?.value == true && isFinishing) { stopService(Intent(this, MusicService::class.java)) - unbindService(serviceConnection) playerConnection = null } } diff --git a/app/src/main/java/com/zionhuang/music/lyrics/LyricsHelper.kt b/app/src/main/java/com/zionhuang/music/lyrics/LyricsHelper.kt index cc42e45d3..62d0d1f27 100644 --- a/app/src/main/java/com/zionhuang/music/lyrics/LyricsHelper.kt +++ b/app/src/main/java/com/zionhuang/music/lyrics/LyricsHelper.kt @@ -27,6 +27,7 @@ class LyricsHelper @Inject constructor( mediaMetadata.artists.joinToString { it.name }, mediaMetadata.duration ).onSuccess { lyrics -> + cache.put(mediaMetadata.id, listOf(LyricsResult(provider.name, lyrics))) return lyrics }.onFailure { reportException(it) @@ -43,8 +44,7 @@ class LyricsHelper @Inject constructor( duration: Int, callback: (LyricsResult) -> Unit, ) { - val cacheKey = "$songArtists-$songTitle".replace(" ", "") - cache.get(cacheKey)?.let { results -> + cache.get(mediaId)?.let { results -> results.forEach { callback(it) } @@ -60,7 +60,7 @@ class LyricsHelper @Inject constructor( } } } - cache.put(cacheKey, allResult) + cache.put(mediaId, allResult) } companion object { diff --git a/app/src/main/java/com/zionhuang/music/playback/MusicService.kt b/app/src/main/java/com/zionhuang/music/playback/MusicService.kt index dbae89d14..4a6523d86 100644 --- a/app/src/main/java/com/zionhuang/music/playback/MusicService.kt +++ b/app/src/main/java/com/zionhuang/music/playback/MusicService.kt @@ -630,7 +630,7 @@ class MusicService : MediaLibraryService(), return@Factory dataSpec } - songUrlCache[mediaId]?.takeIf { it.second < System.currentTimeMillis() }?.let { + songUrlCache[mediaId]?.takeIf { it.second > System.currentTimeMillis() }?.let { scope.launch(Dispatchers.IO) { recoverSong(mediaId) } return@Factory dataSpec.withUri(it.first.toUri()) } @@ -675,24 +675,32 @@ class MusicService : MediaLibraryService(), } } ?: throw PlaybackException(getString(R.string.error_no_stream), null, ERROR_CODE_NO_STREAM) - database.query { - upsert( - FormatEntity( - id = mediaId, - itag = format.itag, - mimeType = format.mimeType.split(";")[0], - codecs = format.mimeType.split("codecs=")[1].removeSurrounding("\""), - bitrate = format.bitrate, - sampleRate = format.audioSampleRate, - contentLength = format.contentLength!!, - loudnessDb = playerResponse.playerConfig?.audioConfig?.loudnessDb - ) - ) + val streamUrl = format.url + ?: throw PlaybackException(getString(R.string.error_no_stream), null, ERROR_CODE_NO_STREAM) + + if (format.contentLength != null) { + val codecs = format.mimeType.split("codecs=").getOrNull(1)?.removeSurrounding("\"") + if (codecs != null) { + database.query { + upsert( + FormatEntity( + id = mediaId, + itag = format.itag, + mimeType = format.mimeType.split(";")[0], + codecs = codecs, + bitrate = format.bitrate, + sampleRate = format.audioSampleRate, + contentLength = format.contentLength, + loudnessDb = playerResponse.playerConfig?.audioConfig?.loudnessDb + ) + ) + } + } } scope.launch(Dispatchers.IO) { recoverSong(mediaId, playerResponse) } - songUrlCache[mediaId] = format.url!! to playerResponse.streamingData!!.expiresInSeconds * 1000L - dataSpec.withUri(format.url!!.toUri()).subrange(dataSpec.uriPositionOffset, CHUNK_LENGTH) + songUrlCache[mediaId] = streamUrl to System.currentTimeMillis() + playerResponse.streamingData!!.expiresInSeconds * 1000L + dataSpec.withUri(streamUrl.toUri()).subrange(dataSpec.uriPositionOffset, CHUNK_LENGTH) } }