Rename youtube-music module to innertube and rewrite it
This commit is contained in:
@@ -1,3 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
val AlbumListSaver = ListSaver.of(AlbumSaver)
|
||||
@@ -1,3 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
val AlbumResultSaver = resultSaver(AlbumSaver)
|
||||
@@ -27,3 +27,7 @@ object AlbumSaver : Saver<Album, List<Any?>> {
|
||||
bookmarkedAt = value[7] as Long?,
|
||||
)
|
||||
}
|
||||
|
||||
val AlbumResultSaver = resultSaver(AlbumSaver)
|
||||
|
||||
val AlbumListSaver = listSaver(AlbumSaver)
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
val ArtistListSaver = ListSaver.of(ArtistSaver)
|
||||
@@ -23,3 +23,5 @@ object ArtistSaver : Saver<Artist, List<Any?>> {
|
||||
bookmarkedAt = value[5] as Long?,
|
||||
)
|
||||
}
|
||||
|
||||
val ArtistListSaver = listSaver(ArtistSaver)
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
val DetailedSongListSaver = ListSaver.of(DetailedSongSaver)
|
||||
@@ -29,3 +29,5 @@ object DetailedSongSaver : Saver<DetailedSong, List<Any?>> {
|
||||
artists = (value[7] as List<List<String>>?)?.let(InfoListSaver::restore)
|
||||
)
|
||||
}
|
||||
|
||||
val DetailedSongListSaver = listSaver(DetailedSongSaver)
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
val InfoListSaver = ListSaver.of(InfoSaver)
|
||||
@@ -11,3 +11,5 @@ object InfoSaver : Saver<Info, List<String>> {
|
||||
return if (value.size == 2) Info(id = value[0], name = value[1]) else null
|
||||
}
|
||||
}
|
||||
|
||||
val InfoListSaver = listSaver(InfoSaver)
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.Innertube
|
||||
|
||||
object InnertubeAlbumItemSaver : Saver<Innertube.AlbumItem, List<Any?>> {
|
||||
override fun SaverScope.save(value: Innertube.AlbumItem): List<Any?> = listOf(
|
||||
value.info?.let { with(InnertubeBrowseInfoSaver) { save(it) } },
|
||||
value.authors?.let { with(InnertubeBrowseInfoListSaver) { save(it) } },
|
||||
value.year,
|
||||
value.thumbnail?.let { with(InnertubeThumbnailSaver) { save(it) } }
|
||||
)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun restore(value: List<Any?>) = Innertube.AlbumItem(
|
||||
info = (value[0] as List<Any?>?)?.let(InnertubeBrowseInfoSaver::restore),
|
||||
authors = (value[1] as List<List<Any?>>?)?.let(InnertubeBrowseInfoListSaver::restore),
|
||||
year = value[2] as String?,
|
||||
thumbnail = (value[3] as List<Any?>?)?.let(InnertubeThumbnailSaver::restore)
|
||||
)
|
||||
}
|
||||
|
||||
val InnertubeAlbumItemListSaver = listSaver(InnertubeAlbumItemSaver)
|
||||
@@ -0,0 +1,21 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.Innertube
|
||||
|
||||
object InnertubeArtistItemSaver : Saver<Innertube.ArtistItem, List<Any?>> {
|
||||
override fun SaverScope.save(value: Innertube.ArtistItem): List<Any?> = listOf(
|
||||
value.info?.let { with(InnertubeBrowseInfoSaver) { save(it) } },
|
||||
value.subscribersCountText,
|
||||
value.thumbnail?.let { with(InnertubeThumbnailSaver) { save(it) } }
|
||||
)
|
||||
|
||||
override fun restore(value: List<Any?>) = Innertube.ArtistItem(
|
||||
info = (value[0] as List<Any?>?)?.let(InnertubeBrowseInfoSaver::restore),
|
||||
subscribersCountText = value[1] as String?,
|
||||
thumbnail = (value[2] as List<Any?>?)?.let(InnertubeThumbnailSaver::restore)
|
||||
)
|
||||
}
|
||||
|
||||
val InnertubeArtistItemListSaver = listSaver(InnertubeArtistItemSaver)
|
||||
@@ -0,0 +1,36 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.Innertube
|
||||
|
||||
object InnertubeArtistPageSaver : Saver<Innertube.ArtistPage, List<Any?>> {
|
||||
override fun SaverScope.save(value: Innertube.ArtistPage) = listOf(
|
||||
value.name,
|
||||
value.description,
|
||||
value.thumbnail?.let { with(InnertubeThumbnailSaver) { save(it) } },
|
||||
value.shuffleEndpoint?.let { with(InnertubeWatchEndpointSaver) { save(it) } },
|
||||
value.radioEndpoint?.let { with(InnertubeWatchEndpointSaver) { save(it) } },
|
||||
value.songs?.let { with(InnertubeSongItemListSaver) { save(it) } },
|
||||
value.songsEndpoint?.let { with(InnertubeBrowseEndpointSaver) { save(it) } },
|
||||
value.albums?.let { with(InnertubeAlbumItemListSaver) { save(it) } },
|
||||
value.albumsEndpoint?.let { with(InnertubeBrowseEndpointSaver) { save(it) } },
|
||||
value.singles?.let { with(InnertubeAlbumItemListSaver) { save(it) } },
|
||||
value.singlesEndpoint?.let { with(InnertubeBrowseEndpointSaver) { save(it) } },
|
||||
)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun restore(value: List<Any?>) = Innertube.ArtistPage(
|
||||
name = value[0] as String?,
|
||||
description = value[1] as String?,
|
||||
thumbnail = (value[2] as List<Any?>?)?.let(InnertubeThumbnailSaver::restore),
|
||||
shuffleEndpoint = (value[3] as List<Any?>?)?.let(InnertubeWatchEndpointSaver::restore),
|
||||
radioEndpoint = (value[4] as List<Any?>?)?.let(InnertubeWatchEndpointSaver::restore),
|
||||
songs = (value[5] as List<List<Any?>>?)?.let(InnertubeSongItemListSaver::restore),
|
||||
songsEndpoint = (value[6] as List<Any?>?)?.let(InnertubeBrowseEndpointSaver::restore),
|
||||
albums = (value[7] as List<List<Any?>>?)?.let(InnertubeAlbumItemListSaver::restore),
|
||||
albumsEndpoint = (value[8] as List<Any?>?)?.let(InnertubeBrowseEndpointSaver::restore),
|
||||
singles = (value[9] as List<List<Any?>>?)?.let(InnertubeAlbumItemListSaver::restore),
|
||||
singlesEndpoint = (value[10] as List<Any?>?)?.let(InnertubeBrowseEndpointSaver::restore),
|
||||
)
|
||||
}
|
||||
@@ -4,7 +4,7 @@ import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.models.NavigationEndpoint
|
||||
|
||||
object YouTubeBrowseEndpointSaver : Saver<NavigationEndpoint.Endpoint.Browse, List<Any?>> {
|
||||
object InnertubeBrowseEndpointSaver : Saver<NavigationEndpoint.Endpoint.Browse, List<Any?>> {
|
||||
override fun SaverScope.save(value: NavigationEndpoint.Endpoint.Browse) = listOf(
|
||||
value.browseId,
|
||||
value.params
|
||||
@@ -0,0 +1,20 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.Innertube
|
||||
import it.vfsfitvnm.youtubemusic.models.NavigationEndpoint
|
||||
|
||||
object InnertubeBrowseInfoSaver : Saver<Innertube.Info<NavigationEndpoint.Endpoint.Browse>, List<Any?>> {
|
||||
override fun SaverScope.save(value: Innertube.Info<NavigationEndpoint.Endpoint.Browse>) = listOf(
|
||||
value.name,
|
||||
value.endpoint?.let { with(InnertubeBrowseEndpointSaver) { save(it) } }
|
||||
)
|
||||
|
||||
override fun restore(value: List<Any?>) = Innertube.Info(
|
||||
name = value[0] as String?,
|
||||
endpoint = (value[1] as List<Any?>?)?.let(InnertubeBrowseEndpointSaver::restore)
|
||||
)
|
||||
}
|
||||
|
||||
val InnertubeBrowseInfoListSaver = listSaver(InnertubeBrowseInfoSaver)
|
||||
@@ -0,0 +1,31 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.Innertube
|
||||
|
||||
object InnertubeSongsPageSaver : Saver<Innertube.ItemsPage<Innertube.SongItem>, List<Any?>> {
|
||||
override fun SaverScope.save(value: Innertube.ItemsPage<Innertube.SongItem>) = listOf(
|
||||
value.items?.let {with(InnertubeSongItemListSaver) { save(it) } },
|
||||
value.continuation
|
||||
)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun restore(value: List<Any?>) = Innertube.ItemsPage(
|
||||
items = (value[0] as List<List<Any?>>?)?.let(InnertubeSongItemListSaver::restore),
|
||||
continuation = value[1] as String?
|
||||
)
|
||||
}
|
||||
|
||||
object InnertubeAlbumsPageSaver : Saver<Innertube.ItemsPage<Innertube.AlbumItem>, List<Any?>> {
|
||||
override fun SaverScope.save(value: Innertube.ItemsPage<Innertube.AlbumItem>) = listOf(
|
||||
value.items?.let {with(InnertubeAlbumItemListSaver) { save(it) } },
|
||||
value.continuation
|
||||
)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun restore(value: List<Any?>) = Innertube.ItemsPage(
|
||||
items = (value[0] as List<List<Any?>>?)?.let(InnertubeAlbumItemListSaver::restore),
|
||||
continuation = value[1] as String?
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.Innertube
|
||||
|
||||
object InnertubePlaylistItemSaver : Saver<Innertube.PlaylistItem, List<Any?>> {
|
||||
override fun SaverScope.save(value: Innertube.PlaylistItem): List<Any?> = listOf(
|
||||
value.info?.let { with(InnertubeBrowseInfoSaver) { save(it) } },
|
||||
value.channel?.let { with(InnertubeBrowseInfoSaver) { save(it) } },
|
||||
value.songCount,
|
||||
value.thumbnail?.let { with(InnertubeThumbnailSaver) { save(it) } }
|
||||
)
|
||||
|
||||
override fun restore(value: List<Any?>) = Innertube.PlaylistItem(
|
||||
info = (value[0] as List<Any?>?)?.let(InnertubeBrowseInfoSaver::restore),
|
||||
channel = (value[1] as List<Any?>?)?.let(InnertubeBrowseInfoSaver::restore),
|
||||
songCount = value[2] as Int?,
|
||||
thumbnail = (value[3] as List<Any?>?)?.let(InnertubeThumbnailSaver::restore)
|
||||
)
|
||||
}
|
||||
|
||||
val InnertubePlaylistItemListSaver = listSaver(InnertubePlaylistItemSaver)
|
||||
@@ -0,0 +1,26 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.Innertube
|
||||
|
||||
object InnertubePlaylistOrAlbumPageSaver : Saver<Innertube.PlaylistOrAlbumPage, List<Any?>> {
|
||||
override fun SaverScope.save(value: Innertube.PlaylistOrAlbumPage): List<Any?> = listOf(
|
||||
value.title,
|
||||
value.authors?.let { with(InnertubeBrowseInfoListSaver) { save(it) } } ,
|
||||
value.year,
|
||||
value.thumbnail?.let { with(InnertubeThumbnailSaver) { save(it) } } ,
|
||||
value.url,
|
||||
value.songsPage?.let { with(InnertubeSongsPageSaver) { save(it) } },
|
||||
)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun restore(value: List<Any?>) = Innertube.PlaylistOrAlbumPage(
|
||||
title = value[0] as String?,
|
||||
authors = (value[1] as List<List<Any?>>?)?.let(InnertubeBrowseInfoListSaver::restore),
|
||||
year = value[2] as String?,
|
||||
thumbnail = (value[3] as List<Any?>?)?.let(InnertubeThumbnailSaver::restore),
|
||||
url = value[4] as String?,
|
||||
songsPage = (value[5] as List<Any?>?)?.let(InnertubeSongsPageSaver::restore),
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.Innertube
|
||||
|
||||
object InnertubeRelatedPageSaver : Saver<Innertube.RelatedPage, List<Any?>> {
|
||||
override fun SaverScope.save(value: Innertube.RelatedPage): List<Any?> = listOf(
|
||||
value.songs?.let { with(InnertubeSongItemListSaver) { save(it) } },
|
||||
value.playlists?.let { with(InnertubePlaylistItemListSaver) { save(it) } },
|
||||
value.albums?.let { with(InnertubeAlbumItemListSaver) { save(it) } },
|
||||
value.artists?.let { with(InnertubeArtistItemListSaver) { save(it) } },
|
||||
)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun restore(value: List<Any?>) = Innertube.RelatedPage(
|
||||
songs = (value[0] as List<List<Any?>>?)?.let(InnertubeSongItemListSaver::restore),
|
||||
playlists = (value[1] as List<List<Any?>>?)?.let(InnertubePlaylistItemListSaver::restore),
|
||||
albums = (value[2] as List<List<Any?>>?)?.let(InnertubeAlbumItemListSaver::restore),
|
||||
artists = (value[3] as List<List<Any?>>?)?.let(InnertubeArtistItemListSaver::restore),
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.Innertube
|
||||
|
||||
object InnertubeSongItemSaver : Saver<Innertube.SongItem, List<Any?>> {
|
||||
override fun SaverScope.save(value: Innertube.SongItem): List<Any?> = listOf(
|
||||
value.info?.let { with(InnertubeWatchInfoSaver) { save(it) } },
|
||||
value.authors?.let { with(InnertubeBrowseInfoListSaver) { save(it) } },
|
||||
value.album?.let { with(InnertubeBrowseInfoSaver) { save(it) } },
|
||||
value.durationText,
|
||||
value.thumbnail?.let { with(InnertubeThumbnailSaver) { save(it) } }
|
||||
)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun restore(value: List<Any?>) = Innertube.SongItem(
|
||||
info = (value[0] as List<Any?>?)?.let(InnertubeWatchInfoSaver::restore),
|
||||
authors = (value[1] as List<List<Any?>>?)?.let(InnertubeBrowseInfoListSaver::restore),
|
||||
album = (value[2] as List<Any?>?)?.let(InnertubeBrowseInfoSaver::restore),
|
||||
durationText = value[3] as String?,
|
||||
thumbnail = (value[4] as List<Any?>?)?.let(InnertubeThumbnailSaver::restore)
|
||||
)
|
||||
}
|
||||
|
||||
val InnertubeSongItemListSaver = listSaver(InnertubeSongItemSaver)
|
||||
@@ -0,0 +1,19 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.models.Thumbnail
|
||||
|
||||
object InnertubeThumbnailSaver : Saver<Thumbnail, List<Any?>> {
|
||||
override fun SaverScope.save(value: Thumbnail) = listOf(
|
||||
value.url,
|
||||
value.width,
|
||||
value.height
|
||||
)
|
||||
|
||||
override fun restore(value: List<Any?>) = Thumbnail(
|
||||
url = value[0] as String,
|
||||
width = value[1] as Int,
|
||||
height = value[2] as Int?,
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.Innertube
|
||||
|
||||
object InnertubeVideoItemSaver : Saver<Innertube.VideoItem, List<Any?>> {
|
||||
override fun SaverScope.save(value: Innertube.VideoItem): List<Any?> = listOf(
|
||||
value.info?.let { with(InnertubeWatchInfoSaver) { save(it) } },
|
||||
value.authors?.let { with(InnertubeBrowseInfoListSaver) { save(it) } },
|
||||
value.viewsText,
|
||||
value.durationText,
|
||||
value.thumbnail?.let { with(InnertubeThumbnailSaver) { save(it) } }
|
||||
)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun restore(value: List<Any?>) = Innertube.VideoItem(
|
||||
info = (value[0] as List<Any?>?)?.let(InnertubeWatchInfoSaver::restore),
|
||||
authors = (value[1] as List<List<Any?>>?)?.let(InnertubeBrowseInfoListSaver::restore),
|
||||
viewsText = value[2] as String?,
|
||||
durationText = value[3] as String?,
|
||||
thumbnail = (value[4] as List<Any?>?)?.let(InnertubeThumbnailSaver::restore)
|
||||
)
|
||||
}
|
||||
|
||||
val InnertubeVideoItemListSaver = listSaver(InnertubeVideoItemSaver)
|
||||
@@ -4,7 +4,7 @@ import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.models.NavigationEndpoint
|
||||
|
||||
object YouTubeWatchEndpointSaver : Saver<NavigationEndpoint.Endpoint.Watch, List<Any?>> {
|
||||
object InnertubeWatchEndpointSaver : Saver<NavigationEndpoint.Endpoint.Watch, List<Any?>> {
|
||||
override fun SaverScope.save(value: NavigationEndpoint.Endpoint.Watch) = listOf(
|
||||
value.params,
|
||||
value.playlistId,
|
||||
@@ -0,0 +1,18 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.Innertube
|
||||
import it.vfsfitvnm.youtubemusic.models.NavigationEndpoint
|
||||
|
||||
object InnertubeWatchInfoSaver : Saver<Innertube.Info<NavigationEndpoint.Endpoint.Watch>, List<Any?>> {
|
||||
override fun SaverScope.save(value: Innertube.Info<NavigationEndpoint.Endpoint.Watch>) = listOf(
|
||||
value.name,
|
||||
value.endpoint?.let { with(InnertubeWatchEndpointSaver) { save(it) } },
|
||||
)
|
||||
|
||||
override fun restore(value: List<Any?>) = Innertube.Info(
|
||||
name = value[0] as String?,
|
||||
endpoint = (value[1] as List<Any?>?)?.let(InnertubeWatchEndpointSaver::restore)
|
||||
)
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
|
||||
interface ListSaver<Original, Saveable : Any> : Saver<List<Original>, List<Saveable>> {
|
||||
override fun SaverScope.save(value: List<Original>): List<Saveable>
|
||||
override fun restore(value: List<Saveable>): List<Original>
|
||||
|
||||
companion object {
|
||||
fun <Original, Saveable : Any> of(saver: Saver<Original, Saveable>): ListSaver<Original, Saveable> {
|
||||
return object : ListSaver<Original, Saveable> {
|
||||
override fun restore(value: List<Saveable>): List<Original> {
|
||||
return value.mapNotNull(saver::restore)
|
||||
}
|
||||
|
||||
override fun SaverScope.save(value: List<Original>): List<Saveable> {
|
||||
return with(saver) { value.mapNotNull { save(it) } }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
|
||||
fun <Original, Saveable : Any> nullableSaver(saver: Saver<Original, Saveable>) =
|
||||
object : Saver<Original?, Saveable> {
|
||||
override fun SaverScope.save(value: Original?): Saveable? =
|
||||
value?.let { with(saver) { save(it) } }
|
||||
|
||||
override fun restore(value: Saveable): Original? =
|
||||
saver.restore(value)
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
val PlaylistPreviewListSaver = ListSaver.of(PlaylistPreviewSaver)
|
||||
@@ -4,18 +4,16 @@ import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.vimusic.models.PlaylistPreview
|
||||
|
||||
object PlaylistPreviewSaver : Saver<PlaylistPreview, List<Any?>> {
|
||||
override fun SaverScope.save(value: PlaylistPreview): List<Any> {
|
||||
return listOf(
|
||||
with(PlaylistSaver) { save(value.playlist) },
|
||||
value.songCount,
|
||||
)
|
||||
}
|
||||
object PlaylistPreviewSaver : Saver<PlaylistPreview, List<Any>> {
|
||||
override fun SaverScope.save(value: PlaylistPreview) = listOf(
|
||||
with(PlaylistSaver) { save(value.playlist) },
|
||||
value.songCount,
|
||||
)
|
||||
|
||||
override fun restore(value: List<Any?>): PlaylistPreview? {
|
||||
return if (value.size == 2) PlaylistPreview(
|
||||
playlist = PlaylistSaver.restore(value[0] as List<Any?>),
|
||||
songCount = value[1] as Int,
|
||||
) else null
|
||||
}
|
||||
override fun restore(value: List<Any>) = PlaylistPreview(
|
||||
playlist = PlaylistSaver.restore(value[0] as List<Any?>),
|
||||
songCount = value[1] as Int,
|
||||
)
|
||||
}
|
||||
|
||||
val PlaylistPreviewListSaver = listSaver(PlaylistPreviewSaver)
|
||||
|
||||
@@ -4,13 +4,11 @@ import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.vimusic.models.PlaylistWithSongs
|
||||
|
||||
object PlaylistWithSongsSaver : Saver<PlaylistWithSongs?, List<Any>> {
|
||||
override fun SaverScope.save(value: PlaylistWithSongs?) = value?.let {
|
||||
listOf(
|
||||
with(PlaylistSaver) { save(value.playlist) },
|
||||
with(DetailedSongListSaver) { save(value.songs) },
|
||||
)
|
||||
}
|
||||
object PlaylistWithSongsSaver : Saver<PlaylistWithSongs, List<Any>> {
|
||||
override fun SaverScope.save(value: PlaylistWithSongs) = listOf(
|
||||
with(PlaylistSaver) { save(value.playlist) },
|
||||
with(DetailedSongListSaver) { save(value.songs) },
|
||||
)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun restore(value: List<Any>): PlaylistWithSongs = PlaylistWithSongs(
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
|
||||
fun <Original, Saveable : Any> resultSaver(saver: Saver<Original, Saveable>) =
|
||||
object : Saver<Result<Original>?, Pair<Saveable?, Throwable?>> {
|
||||
override fun restore(value: Pair<Saveable?, Throwable?>) =
|
||||
value.first?.let(saver::restore)?.let(Result.Companion::success)
|
||||
?: value.second?.let(Result.Companion::failure)
|
||||
|
||||
override fun SaverScope.save(value: Result<Original>?) =
|
||||
with(saver) { value?.getOrNull()?.let { save(it) } } to value?.exceptionOrNull()
|
||||
}
|
||||
37
app/src/main/kotlin/it/vfsfitvnm/vimusic/savers/Savers.kt
Normal file
37
app/src/main/kotlin/it/vfsfitvnm/vimusic/savers/Savers.kt
Normal file
@@ -0,0 +1,37 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
|
||||
interface ListSaver<Original, Saveable : Any> : Saver<List<Original>, List<Saveable>> {
|
||||
override fun SaverScope.save(value: List<Original>): List<Saveable>
|
||||
override fun restore(value: List<Saveable>): List<Original>
|
||||
}
|
||||
|
||||
fun <Original, Saveable : Any> resultSaver(saver: Saver<Original, Saveable>) =
|
||||
object : Saver<Result<Original>?, Pair<Saveable?, Throwable?>> {
|
||||
override fun restore(value: Pair<Saveable?, Throwable?>) =
|
||||
value.first?.let(saver::restore)?.let(Result.Companion::success)
|
||||
?: value.second?.let(Result.Companion::failure)
|
||||
|
||||
override fun SaverScope.save(value: Result<Original>?) =
|
||||
with(saver) { value?.getOrNull()?.let { save(it) } } to value?.exceptionOrNull()
|
||||
}
|
||||
|
||||
fun <Original, Saveable : Any> listSaver(saver: Saver<Original, Saveable>) =
|
||||
object : ListSaver<Original, Saveable> {
|
||||
override fun restore(value: List<Saveable>) =
|
||||
value.mapNotNull(saver::restore)
|
||||
|
||||
override fun SaverScope.save(value: List<Original>) =
|
||||
with(saver) { value.mapNotNull { save(it) } }
|
||||
}
|
||||
|
||||
fun <Original, Saveable : Any> nullableSaver(saver: Saver<Original, Saveable>) =
|
||||
object : Saver<Original?, Saveable> {
|
||||
override fun SaverScope.save(value: Original?): Saveable? =
|
||||
value?.let { with(saver) { save(it) } }
|
||||
|
||||
override fun restore(value: Saveable): Original? =
|
||||
saver.restore(value)
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
val SearchQueryListSaver = ListSaver.of(SearchQuerySaver)
|
||||
@@ -15,3 +15,5 @@ object SearchQuerySaver : Saver<SearchQuery, List<Any?>> {
|
||||
query = value[1] as String
|
||||
)
|
||||
}
|
||||
|
||||
val SearchQueryListSaver = listSaver(SearchQuerySaver)
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.autoSaver
|
||||
|
||||
val StringListResultSaver = resultSaver(autoSaver<List<String>?>())
|
||||
@@ -1,5 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.autoSaver
|
||||
|
||||
val StringResultSaver = resultSaver(autoSaver<String?>())
|
||||
@@ -1,3 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
val YouTubeAlbumListSaver = ListSaver.of(YouTubeAlbumSaver)
|
||||
@@ -1,22 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.YouTube
|
||||
|
||||
object YouTubeAlbumSaver : Saver<YouTube.Item.Album, List<Any?>> {
|
||||
override fun SaverScope.save(value: YouTube.Item.Album): List<Any?> = listOf(
|
||||
value.info?.let { with(YouTubeBrowseInfoSaver) { save(it) } },
|
||||
value.authors?.let { with(YouTubeBrowseInfoListSaver) { save(it) } },
|
||||
value.year,
|
||||
value.thumbnail?.let { with(YouTubeThumbnailSaver) { save(it) } }
|
||||
)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun restore(value: List<Any?>) = YouTube.Item.Album(
|
||||
info = (value[0] as List<Any?>?)?.let(YouTubeBrowseInfoSaver::restore),
|
||||
authors = (value[1] as List<List<Any?>>?)?.let(YouTubeBrowseInfoListSaver::restore),
|
||||
year = value[2] as String?,
|
||||
thumbnail = (value[3] as List<Any?>?)?.let(YouTubeThumbnailSaver::restore)
|
||||
)
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
val YouTubeArtistListSaver = ListSaver.of(YouTubeArtistSaver)
|
||||
@@ -1,36 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.YouTube
|
||||
|
||||
object YouTubeArtistPageSaver : Saver<YouTube.Artist, List<Any?>> {
|
||||
override fun SaverScope.save(value: YouTube.Artist): List<Any?> = listOf(
|
||||
value.name,
|
||||
value.description,
|
||||
value.thumbnail?.let { with(YouTubeThumbnailSaver) { save(it) } },
|
||||
value.shuffleEndpoint?.let { with(YouTubeWatchEndpointSaver) { save(it) } },
|
||||
value.radioEndpoint?.let { with(YouTubeWatchEndpointSaver) { save(it) } },
|
||||
value.songs?.let { with(YouTubeSongListSaver) { save(it) } },
|
||||
value.songsEndpoint?.let { with(YouTubeBrowseEndpointSaver) { save(it) } },
|
||||
value.albums?.let { with(YouTubeAlbumListSaver) { save(it) } },
|
||||
value.albumsEndpoint?.let { with(YouTubeBrowseEndpointSaver) { save(it) } },
|
||||
value.singles?.let { with(YouTubeAlbumListSaver) { save(it) } },
|
||||
value.singlesEndpoint?.let { with(YouTubeBrowseEndpointSaver) { save(it) } },
|
||||
)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun restore(value: List<Any?>) = YouTube.Artist(
|
||||
name = value[0] as String?,
|
||||
description = value[1] as String?,
|
||||
thumbnail = (value[2] as List<Any?>?)?.let(YouTubeThumbnailSaver::restore),
|
||||
shuffleEndpoint = (value[3] as List<Any?>?)?.let(YouTubeWatchEndpointSaver::restore),
|
||||
radioEndpoint = (value[4] as List<Any?>?)?.let(YouTubeWatchEndpointSaver::restore),
|
||||
songs = (value[5] as List<List<Any?>>?)?.let(YouTubeSongListSaver::restore),
|
||||
songsEndpoint = (value[6] as List<Any?>?)?.let(YouTubeBrowseEndpointSaver::restore),
|
||||
albums = (value[7] as List<List<Any?>>?)?.let(YouTubeAlbumListSaver::restore),
|
||||
albumsEndpoint = (value[8] as List<Any?>?)?.let(YouTubeBrowseEndpointSaver::restore),
|
||||
singles = (value[9] as List<List<Any?>>?)?.let(YouTubeAlbumListSaver::restore),
|
||||
singlesEndpoint = (value[10] as List<Any?>?)?.let(YouTubeBrowseEndpointSaver::restore),
|
||||
)
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.vimusic.savers.YouTubeThumbnailSaver.save
|
||||
import it.vfsfitvnm.youtubemusic.YouTube
|
||||
|
||||
object YouTubeArtistSaver : Saver<YouTube.Item.Artist, List<Any?>> {
|
||||
override fun SaverScope.save(value: YouTube.Item.Artist): List<Any?> = listOf(
|
||||
value.info?.let { with(YouTubeBrowseInfoSaver) { save(it) } },
|
||||
value.subscribersCountText,
|
||||
value.thumbnail?.let { with(YouTubeThumbnailSaver) { save(it) } }
|
||||
)
|
||||
|
||||
override fun restore(value: List<Any?>) = YouTube.Item.Artist(
|
||||
info = (value[0] as List<Any?>?)?.let(YouTubeBrowseInfoSaver::restore),
|
||||
subscribersCountText = value[1] as String?,
|
||||
thumbnail = (value[2] as List<Any?>?)?.let(YouTubeThumbnailSaver::restore)
|
||||
)
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
val YouTubeBrowseInfoListSaver = ListSaver.of(YouTubeBrowseInfoSaver)
|
||||
@@ -1,18 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.YouTube
|
||||
import it.vfsfitvnm.youtubemusic.models.NavigationEndpoint
|
||||
|
||||
object YouTubeBrowseInfoSaver : Saver<YouTube.Info<NavigationEndpoint.Endpoint.Browse>, List<Any?>> {
|
||||
override fun SaverScope.save(value: YouTube.Info<NavigationEndpoint.Endpoint.Browse>) = listOf(
|
||||
value.name,
|
||||
value.endpoint?.let { with(YouTubeBrowseEndpointSaver) { save(it) } }
|
||||
)
|
||||
|
||||
override fun restore(value: List<Any?>) = YouTube.Info(
|
||||
name = value[0] as String?,
|
||||
endpoint = (value[1] as List<Any?>?)?.let(YouTubeBrowseEndpointSaver::restore)
|
||||
)
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
val YouTubePlaylistListSaver = ListSaver.of(YouTubePlaylistSaver)
|
||||
@@ -1,27 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.YouTube
|
||||
|
||||
object YouTubePlaylistOrAlbumSaver : Saver<YouTube.PlaylistOrAlbum, List<Any?>> {
|
||||
override fun SaverScope.save(value: YouTube.PlaylistOrAlbum): List<Any?> = listOf(
|
||||
value.title,
|
||||
value.authors?.let { with(YouTubeBrowseInfoListSaver) { save(it) } } ,
|
||||
value.year,
|
||||
value.thumbnail?.let { with(YouTubeThumbnailSaver) { save(it) } } ,
|
||||
value.songs?.let { with(YouTubeSongListSaver) { save(it) } },
|
||||
value.url
|
||||
)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun restore(value: List<Any?>) = YouTube.PlaylistOrAlbum(
|
||||
title = value[0] as String?,
|
||||
authors = (value[1] as List<List<Any?>>?)?.let(YouTubeBrowseInfoListSaver::restore),
|
||||
year = value[2] as String?,
|
||||
thumbnail = (value[3] as List<Any?>?)?.let(YouTubeThumbnailSaver::restore),
|
||||
songs = (value[4] as List<List<Any?>>?)?.let(YouTubeSongListSaver::restore),
|
||||
url = value[5] as String?,
|
||||
continuation = null
|
||||
)
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.YouTube
|
||||
|
||||
object YouTubePlaylistSaver : Saver<YouTube.Item.Playlist, List<Any?>> {
|
||||
override fun SaverScope.save(value: YouTube.Item.Playlist): List<Any?> = listOf(
|
||||
value.info?.let { with(YouTubeBrowseInfoSaver) { save(it) } },
|
||||
value.channel?.let { with(YouTubeBrowseInfoSaver) { save(it) } },
|
||||
value.songCount,
|
||||
value.thumbnail?.let { with(YouTubeThumbnailSaver) { save(it) } }
|
||||
)
|
||||
|
||||
override fun restore(value: List<Any?>) = YouTube.Item.Playlist(
|
||||
info = (value[0] as List<Any?>?)?.let(YouTubeBrowseInfoSaver::restore),
|
||||
channel = (value[1] as List<Any?>?)?.let(YouTubeBrowseInfoSaver::restore),
|
||||
songCount = value[2] as Int?,
|
||||
thumbnail = (value[3] as List<Any?>?)?.let(YouTubeThumbnailSaver::restore)
|
||||
)
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.YouTube
|
||||
|
||||
object YouTubeRelatedSaver : Saver<YouTube.Related, List<Any?>> {
|
||||
override fun SaverScope.save(value: YouTube.Related): List<Any?> = listOf(
|
||||
value.songs?.let { with(YouTubeSongListSaver) { save(it) } },
|
||||
value.playlists?.let { with(YouTubePlaylistListSaver) { save(it) } },
|
||||
value.albums?.let { with(YouTubeAlbumListSaver) { save(it) } },
|
||||
value.artists?.let { with(YouTubeArtistListSaver) { save(it) } },
|
||||
)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun restore(value: List<Any?>) = YouTube.Related(
|
||||
songs = (value[0] as List<List<Any?>>?)?.let(YouTubeSongListSaver::restore),
|
||||
playlists = (value[1] as List<List<Any?>>?)?.let(YouTubePlaylistListSaver::restore),
|
||||
albums = (value[2] as List<List<Any?>>?)?.let(YouTubeAlbumListSaver::restore),
|
||||
artists = (value[3] as List<List<Any?>>?)?.let(YouTubeArtistListSaver::restore),
|
||||
)
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
val YouTubeSongListSaver = ListSaver.of(YouTubeSongSaver)
|
||||
@@ -1,24 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.YouTube
|
||||
|
||||
object YouTubeSongSaver : Saver<YouTube.Item.Song, List<Any?>> {
|
||||
override fun SaverScope.save(value: YouTube.Item.Song): List<Any?> = listOf(
|
||||
value.info?.let { with(YouTubeWatchInfoSaver) { save(it) } },
|
||||
value.authors?.let { with(YouTubeBrowseInfoListSaver) { save(it) } },
|
||||
value.album?.let { with(YouTubeBrowseInfoSaver) { save(it) } },
|
||||
value.durationText,
|
||||
value.thumbnail?.let { with(YouTubeThumbnailSaver) { save(it) } }
|
||||
)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun restore(value: List<Any?>) = YouTube.Item.Song(
|
||||
info = (value[0] as List<Any?>?)?.let(YouTubeWatchInfoSaver::restore),
|
||||
authors = (value[1] as List<List<Any?>>?)?.let(YouTubeBrowseInfoListSaver::restore),
|
||||
album = (value[2] as List<Any?>?)?.let(YouTubeBrowseInfoSaver::restore),
|
||||
durationText = value[3] as String?,
|
||||
thumbnail = (value[4] as List<Any?>?)?.let(YouTubeThumbnailSaver::restore)
|
||||
)
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.models.ThumbnailRenderer
|
||||
|
||||
object YouTubeThumbnailSaver : Saver<ThumbnailRenderer.MusicThumbnailRenderer.Thumbnail.Thumbnail, List<Any?>> {
|
||||
override fun SaverScope.save(value: ThumbnailRenderer.MusicThumbnailRenderer.Thumbnail.Thumbnail) = listOf(
|
||||
value.url,
|
||||
value.width,
|
||||
value.height
|
||||
)
|
||||
|
||||
override fun restore(value: List<Any?>) = ThumbnailRenderer.MusicThumbnailRenderer.Thumbnail.Thumbnail(
|
||||
url = value[0] as String,
|
||||
width = value[1] as Int,
|
||||
height = value[2] as Int?,
|
||||
)
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
val YouTubeVideoListSaver = ListSaver.of(YouTubeVideoSaver)
|
||||
@@ -1,24 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.YouTube
|
||||
|
||||
object YouTubeVideoSaver : Saver<YouTube.Item.Video, List<Any?>> {
|
||||
override fun SaverScope.save(value: YouTube.Item.Video): List<Any?> = listOf(
|
||||
value.info?.let { with(YouTubeWatchInfoSaver) { save(it) } },
|
||||
value.authors?.let { with(YouTubeBrowseInfoListSaver) { save(it) } },
|
||||
value.viewsText,
|
||||
value.durationText,
|
||||
value.thumbnail?.let { with(YouTubeThumbnailSaver) { save(it) } }
|
||||
)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun restore(value: List<Any?>) = YouTube.Item.Video(
|
||||
info = (value[0] as List<Any?>?)?.let(YouTubeWatchInfoSaver::restore),
|
||||
authors = (value[1] as List<List<Any?>>?)?.let(YouTubeBrowseInfoListSaver::restore),
|
||||
viewsText = value[2] as String?,
|
||||
durationText = value[3] as String?,
|
||||
thumbnail = (value[4] as List<Any?>?)?.let(YouTubeThumbnailSaver::restore)
|
||||
)
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
package it.vfsfitvnm.vimusic.savers
|
||||
|
||||
import androidx.compose.runtime.saveable.Saver
|
||||
import androidx.compose.runtime.saveable.SaverScope
|
||||
import it.vfsfitvnm.youtubemusic.YouTube
|
||||
import it.vfsfitvnm.youtubemusic.models.NavigationEndpoint
|
||||
|
||||
object YouTubeWatchInfoSaver : Saver<YouTube.Info<NavigationEndpoint.Endpoint.Watch>, List<Any?>> {
|
||||
override fun SaverScope.save(value: YouTube.Info<NavigationEndpoint.Endpoint.Watch>) = listOf(
|
||||
value.name,
|
||||
value.endpoint?.let { with(YouTubeWatchEndpointSaver) { save(it) } },
|
||||
)
|
||||
|
||||
override fun restore(value: List<Any?>) = YouTube.Info(
|
||||
name = value[0] as String?,
|
||||
endpoint = (value[1] as List<Any?>?)?.let(YouTubeWatchEndpointSaver::restore)
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user