mirror of
https://gitlab.com/ultrasonic/ultrasonic.git
synced 2025-04-29 15:11:34 +03:00
Merge branch 'albumKey' into 'develop'
Make sure that Album has set the correct path when being stored in OfflineDB. See merge request ultrasonic/ultrasonic!794
This commit is contained in:
commit
f86f0dfa96
@ -178,14 +178,14 @@ class ImageLoader(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Download a cover art file and cache it on disk
|
* Download a cover art file of a Track and cache it on disk
|
||||||
*/
|
*/
|
||||||
fun cacheCoverArt(track: Track) {
|
fun cacheCoverArt(track: Track) {
|
||||||
cacheCoverArt(track.coverArt!!, FileUtil.getAlbumArtFile(track))
|
cacheCoverArt(track.coverArt!!, FileUtil.getAlbumArtFile(track))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun cacheCoverArt(id: String, file: String) {
|
fun cacheCoverArt(id: String, file: String) {
|
||||||
if (id.isNullOrBlank()) return
|
if (id.isBlank()) return
|
||||||
// Return if have a cache hit
|
// Return if have a cache hit
|
||||||
if (File(file).exists()) return
|
if (File(file).exists()) return
|
||||||
|
|
||||||
@ -230,10 +230,10 @@ class ImageLoader(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun resolveSize(requested: Int, large: Boolean): Int {
|
private fun resolveSize(requested: Int, large: Boolean): Int {
|
||||||
if (requested <= 0) {
|
return if (requested <= 0) {
|
||||||
return if (large) config.largeSize else config.defaultSize
|
if (large) config.largeSize else config.defaultSize
|
||||||
} else {
|
} else {
|
||||||
return requested
|
requested
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@ import android.net.wifi.WifiManager
|
|||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import android.os.SystemClock as SystemClock
|
import android.os.SystemClock as SystemClock
|
||||||
import android.text.TextUtils
|
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import io.reactivex.rxjava3.disposables.CompositeDisposable
|
import io.reactivex.rxjava3.disposables.CompositeDisposable
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
@ -23,6 +22,7 @@ import org.koin.core.component.KoinComponent
|
|||||||
import org.koin.core.component.inject
|
import org.koin.core.component.inject
|
||||||
import org.moire.ultrasonic.data.ActiveServerProvider
|
import org.moire.ultrasonic.data.ActiveServerProvider
|
||||||
import org.moire.ultrasonic.data.MetaDatabase
|
import org.moire.ultrasonic.data.MetaDatabase
|
||||||
|
import org.moire.ultrasonic.domain.Album
|
||||||
import org.moire.ultrasonic.domain.Artist
|
import org.moire.ultrasonic.domain.Artist
|
||||||
import org.moire.ultrasonic.domain.Identifiable
|
import org.moire.ultrasonic.domain.Identifiable
|
||||||
import org.moire.ultrasonic.domain.Track
|
import org.moire.ultrasonic.domain.Track
|
||||||
@ -285,7 +285,7 @@ class Downloader(
|
|||||||
Util.scanMedia(track.getPinnedFile())
|
Util.scanMedia(track.getPinnedFile())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun cancelDownload(track: Track) {
|
private fun cancelDownload(track: Track) {
|
||||||
val key = activelyDownloading.keys.singleOrNull { t -> t.track.id == track.id } ?: return
|
val key = activelyDownloading.keys.singleOrNull { t -> t.track.id == track.id } ?: return
|
||||||
activelyDownloading[key]?.cancel()
|
activelyDownloading[key]?.cancel()
|
||||||
}
|
}
|
||||||
@ -359,7 +359,7 @@ class Downloader(
|
|||||||
|
|
||||||
// Hidden feature: If track is toggled between pinned/saved, refresh the metadata..
|
// Hidden feature: If track is toggled between pinned/saved, refresh the metadata..
|
||||||
try {
|
try {
|
||||||
item.track.cacheMetadata()
|
item.track.cacheMetadataAndArtwork()
|
||||||
} catch (ignore: Exception) {
|
} catch (ignore: Exception) {
|
||||||
Timber.w(ignore)
|
Timber.w(ignore)
|
||||||
}
|
}
|
||||||
@ -427,12 +427,10 @@ class Downloader(
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
item.track.cacheMetadata()
|
item.track.cacheMetadataAndArtwork()
|
||||||
} catch (ignore: Exception) {
|
} catch (ignore: Exception) {
|
||||||
Timber.w(ignore)
|
Timber.w(ignore)
|
||||||
}
|
}
|
||||||
|
|
||||||
downloadAndSaveCoverArt()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.pinned) {
|
if (item.pinned) {
|
||||||
@ -481,11 +479,12 @@ class Downloader(
|
|||||||
return String.format(Locale.ROOT, "DownloadTask (%s)", item)
|
return String.format(Locale.ROOT, "DownloadTask (%s)", item)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Track.cacheMetadata() {
|
private fun Track.cacheMetadataAndArtwork() {
|
||||||
if (artistId.isNullOrEmpty()) return
|
if (artistId.isNullOrEmpty()) return
|
||||||
|
|
||||||
val onlineDB = activeServerProvider.getActiveMetaDatabase()
|
val onlineDB = activeServerProvider.getActiveMetaDatabase()
|
||||||
val offlineDB = activeServerProvider.offlineMetaDatabase
|
val offlineDB = activeServerProvider.offlineMetaDatabase
|
||||||
|
val album: Album?
|
||||||
|
|
||||||
cacheArtist(onlineDB, offlineDB, artistId!!)
|
cacheArtist(onlineDB, offlineDB, artistId!!)
|
||||||
|
|
||||||
@ -493,9 +492,12 @@ class Downloader(
|
|||||||
if (albumId?.isNotEmpty() == true) {
|
if (albumId?.isNotEmpty() == true) {
|
||||||
// This is a cached call
|
// This is a cached call
|
||||||
val albums = musicService.getAlbumsOfArtist(artistId!!, null, false)
|
val albums = musicService.getAlbumsOfArtist(artistId!!, null, false)
|
||||||
val album = albums.find { it.id == albumId }
|
album = albums.find { it.id == albumId }
|
||||||
|
|
||||||
if (album != null) {
|
if (album != null) {
|
||||||
|
// Often the album entity returned from the server won't have the path set.
|
||||||
|
if (album.path.isNullOrEmpty()) album.path = FileUtil.getParentPath(path)
|
||||||
|
|
||||||
offlineDB.albumDao().insert(album)
|
offlineDB.albumDao().insert(album)
|
||||||
|
|
||||||
// If the album is a Compilation, also cache the Album artist
|
// If the album is a Compilation, also cache the Album artist
|
||||||
@ -506,6 +508,9 @@ class Downloader(
|
|||||||
|
|
||||||
// Now cache the track data
|
// Now cache the track data
|
||||||
offlineDB.trackDao().insert(this)
|
offlineDB.trackDao().insert(this)
|
||||||
|
|
||||||
|
// Download the largest size that we can display in the UI
|
||||||
|
imageLoaderProvider.getImageLoader().cacheCoverArt(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun cacheArtist(onlineDB: MetaDatabase, offlineDB: MetaDatabase, artistId: String) {
|
private fun cacheArtist(onlineDB: MetaDatabase, offlineDB: MetaDatabase, artistId: String) {
|
||||||
@ -526,17 +531,6 @@ class Downloader(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun downloadAndSaveCoverArt() {
|
|
||||||
try {
|
|
||||||
if (!TextUtils.isEmpty(item.track.coverArt)) {
|
|
||||||
// Download the largest size that we can display in the UI
|
|
||||||
imageLoaderProvider.getImageLoader().cacheCoverArt(item.track)
|
|
||||||
}
|
|
||||||
} catch (all: Exception) {
|
|
||||||
Timber.e(all, "Failed to get cover art.")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Throws(IOException::class)
|
@Throws(IOException::class)
|
||||||
fun InputStream.copyTo(out: OutputStream, onCopy: (totalBytesCopied: Long) -> Any): Long {
|
fun InputStream.copyTo(out: OutputStream, onCopy: (totalBytesCopied: Long) -> Any): Long {
|
||||||
var bytesCopied: Long = 0
|
var bytesCopied: Long = 0
|
||||||
|
@ -209,7 +209,8 @@ object FileUtil {
|
|||||||
|
|
||||||
private fun getAlbumDirectory(entry: MusicDirectory.Child): String {
|
private fun getAlbumDirectory(entry: MusicDirectory.Child): String {
|
||||||
val dir: String
|
val dir: String
|
||||||
if (!TextUtils.isEmpty(entry.path) && getParentPath(entry.path!!) != null) {
|
val isFileInRoot = !entry.isDirectory && (getParentPath(entry.path) == null)
|
||||||
|
if (!TextUtils.isEmpty(entry.path) && !isFileInRoot) {
|
||||||
val f = fileSystemSafeDir(entry.path)
|
val f = fileSystemSafeDir(entry.path)
|
||||||
dir = String.format(
|
dir = String.format(
|
||||||
Locale.ROOT,
|
Locale.ROOT,
|
||||||
@ -413,8 +414,8 @@ object FileUtil {
|
|||||||
return path.substringAfterLast('/')
|
return path.substringAfterLast('/')
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getParentPath(path: String): String? {
|
fun getParentPath(path: String?): String? {
|
||||||
if (!path.contains('/')) return null
|
if (path == null || !path.contains('/')) return null
|
||||||
return path.substringBeforeLast('/')
|
return path.substringBeforeLast('/')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user