Skip to content

Commit

Permalink
This rewert 21a9053
Browse files Browse the repository at this point in the history
  • Loading branch information
MaloyBegonia committed Feb 15, 2025
1 parent e88fb8e commit ef0779e
Show file tree
Hide file tree
Showing 51 changed files with 1,472 additions and 173 deletions.
3 changes: 2 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,8 @@ dependencies {
implementation(libs.compose.ui)
implementation(libs.compose.ui.util)
implementation(libs.compose.ui.tooling)
implementation(libs.compose.reorderable)
implementation(libs.compose.reorderable1)
implementation(libs.compose.reorderable2)

implementation(libs.viewmodel)
implementation(libs.viewmodel.compose)
Expand Down
8 changes: 7 additions & 1 deletion app/src/main/java/com/maloy/muzza/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ import com.maloy.muzza.ui.theme.ColorSaver
import com.maloy.muzza.ui.theme.DefaultThemeColor
import com.maloy.muzza.ui.theme.MuzzaTheme
import com.maloy.muzza.ui.theme.extractThemeColor
import com.maloy.muzza.utils.SyncUtils
import com.maloy.muzza.ui.utils.appBarScrollBehavior
import com.maloy.muzza.ui.utils.backToMain
import com.maloy.muzza.ui.utils.resetHeightOffset
Expand Down Expand Up @@ -186,6 +187,9 @@ class MainActivity : ComponentActivity() {
@Inject
lateinit var downloadUtil: DownloadUtil

@Inject
lateinit var syncUtils: SyncUtils

private var playerConnection by mutableStateOf<PlayerConnection?>(null)
private val serviceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
Expand Down Expand Up @@ -531,7 +535,8 @@ class MainActivity : ComponentActivity() {
LocalPlayerConnection provides playerConnection,
LocalPlayerAwareWindowInsets provides playerAwareWindowInsets,
LocalDownloadUtil provides downloadUtil,
LocalShimmerTheme provides ShimmerTheme
LocalShimmerTheme provides ShimmerTheme,
LocalSyncUtils provides syncUtils
) {
NavHost(
navController = navController,
Expand Down Expand Up @@ -915,6 +920,7 @@ val LocalDatabase = staticCompositionLocalOf<MusicDatabase> { error("No database
val LocalPlayerConnection = staticCompositionLocalOf<PlayerConnection?> { error("No PlayerConnection provided") }
val LocalPlayerAwareWindowInsets = compositionLocalOf<WindowInsets> { error("No WindowInsets provided") }
val LocalDownloadUtil = staticCompositionLocalOf<DownloadUtil> { error("No DownloadUtil provided") }
val LocalSyncUtils = staticCompositionLocalOf<SyncUtils> { error("No SyncUtils provided") }

@Composable
fun NotificationPermissionPreference() {
Expand Down
37 changes: 34 additions & 3 deletions app/src/main/java/com/maloy/muzza/db/DatabaseDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import androidx.room.Transaction
import androidx.room.Update
import androidx.room.Upsert
import androidx.sqlite.db.SupportSQLiteQuery
import com.maloy.innertube.models.PlaylistItem
import com.maloy.innertube.models.SongItem
import com.maloy.innertube.pages.AlbumPage
import com.maloy.innertube.pages.ArtistPage
Expand All @@ -34,6 +35,7 @@ import com.maloy.muzza.db.entities.PlaylistSong
import com.maloy.muzza.db.entities.PlaylistSongMap
import com.maloy.muzza.db.entities.RelatedSongMap
import com.maloy.muzza.db.entities.SearchHistory
import com.maloy.muzza.db.entities.SetVideoIdEntity
import com.maloy.muzza.db.entities.Song
import com.maloy.muzza.db.entities.SongAlbumMap
import com.maloy.muzza.db.entities.SongArtistMap
Expand Down Expand Up @@ -266,10 +268,17 @@ interface DatabaseDao {
@Query("SELECT * FROM song_artist_map WHERE songId = :songId")
fun songArtistMap(songId: String): List<SongArtistMap>

@Transaction
@Query("SELECT * FROM song WHERE liked AND dateDownload IS NULL")
fun likedSongsNotDownloaded(): Flow<List<Song>>

@Transaction
@Query("SELECT * FROM song")
fun allSongs(): Flow<List<Song>>

@Query("SELECT * FROM set_video_id WHERE videoId = :videoId")
suspend fun getSetVideoId(videoId: String): SetVideoIdEntity?

@Query("SELECT * FROM format WHERE id = :id")
fun format(id: String?): Flow<FormatEntity?>

Expand Down Expand Up @@ -483,15 +492,15 @@ interface DatabaseDao {
fun albumArtistMaps(albumId: String): List<AlbumArtistMap>

@Transaction
@Query("SELECT *, (SELECT COUNT(*) FROM playlist_song_map WHERE playlistId = playlist.id) AS songCount FROM playlist ORDER BY rowId")
@Query("SELECT *, (SELECT COUNT(*) FROM playlist_song_map WHERE playlistId = playlist.id) AS songCount FROM playlist WHERE bookmarkedAt IS NOT NULL ORDER BY rowId")
fun playlistsByCreateDateAsc(): Flow<List<Playlist>>

@Transaction
@Query("SELECT *, (SELECT COUNT(*) FROM playlist_song_map WHERE playlistId = playlist.id) AS songCount FROM playlist ORDER BY name")
@Query("SELECT *, (SELECT COUNT(*) FROM playlist_song_map WHERE playlistId = playlist.id) AS songCount FROM playlist WHERE bookmarkedAt IS NOT NULL ORDER BY name")
fun playlistsByNameAsc(): Flow<List<Playlist>>

@Transaction
@Query("SELECT *, (SELECT COUNT(*) FROM playlist_song_map WHERE playlistId = playlist.id) AS songCount FROM playlist ORDER BY songCount")
@Query("SELECT *, (SELECT COUNT(*) FROM playlist_song_map WHERE playlistId = playlist.id) AS songCount FROM playlist WHERE bookmarkedAt IS NOT NULL ORDER BY songCount")
fun playlistsBySongCountAsc(): Flow<List<Playlist>>

fun playlists(sortType: PlaylistSortType, descending: Boolean) =
Expand All @@ -505,6 +514,10 @@ interface DatabaseDao {
@Query("SELECT *, (SELECT COUNT(*) FROM playlist_song_map WHERE playlistId = playlist.id) AS songCount FROM playlist WHERE id = :playlistId")
fun playlist(playlistId: String): Flow<Playlist?>

@Transaction
@Query("SELECT *, (SELECT COUNT(*) FROM playlist_song_map WHERE playlistId = playlist.id) AS songCount FROM playlist WHERE browseId = :browseId")
fun playlistByBrowseId(browseId: String): Flow<Playlist?>

@Query("SELECT songId from playlist_song_map WHERE playlistId = :playlistId AND songId IN (:songIds)")
fun playlistDuplicates(
playlistId: String,
Expand All @@ -525,6 +538,15 @@ interface DatabaseDao {
}
}

@Update
fun update(playlistEntity: PlaylistEntity, playlistItem: PlaylistItem) {
update(playlistEntity.copy(
name = playlistItem.title,
browseId = playlistItem.id,
isEditable = playlistItem.isEditable,
))
}

@Transaction
@Query("SELECT * FROM song WHERE title LIKE '%' || :query || '%' AND inLibrary IS NOT NULL LIMIT :previewSize")
fun searchSongs(query: String, previewSize: Int = Int.MAX_VALUE): Flow<List<Song>>
Expand Down Expand Up @@ -567,6 +589,10 @@ interface DatabaseDao {
@Query("SELECT COUNT(1) FROM related_song_map WHERE songId = :songId LIMIT 1")
fun hasRelatedSongs(songId: String): Boolean

@Transaction
@Query("SELECT *, (SELECT COUNT(*) FROM playlist_song_map WHERE playlistId = playlist.id) AS songCount FROM playlist WHERE isEditable AND bookmarkedAt IS NOT NULL ORDER BY rowId")
fun editablePlaylistsByCreateDateAsc(): Flow<List<Playlist>>

@Query(
"""
UPDATE playlist_song_map SET position =
Expand Down Expand Up @@ -644,6 +670,7 @@ interface DatabaseDao {
fun insert(albumPage: AlbumPage) {
if (insert(AlbumEntity(
id = albumPage.album.browseId,
playlistId = albumPage.album.playlistId,
title = albumPage.album.title,
year = albumPage.album.year,
thumbnailUrl = albumPage.album.thumbnail,
Expand Down Expand Up @@ -739,6 +766,7 @@ interface DatabaseDao {
update(
album.copy(
id = albumPage.album.browseId,
playlistId = albumPage.album.playlistId,
title = albumPage.album.title,
year = albumPage.album.year,
thumbnailUrl = albumPage.album.thumbnail,
Expand Down Expand Up @@ -821,6 +849,9 @@ interface DatabaseDao {
@Query("SELECT EXISTS(SELECT 1 FROM artist WHERE id = :artistId LIMIT 1)")
suspend fun artistIdExists(artistId: String):Boolean

@Query("SELECT * FROM playlist_song_map WHERE playlistId = :playlistId AND position >= :from ORDER BY position")
fun playlistSongMaps(playlistId: String, from: Int): List<PlaylistSongMap>

@RawQuery
fun raw(supportSQLiteQuery: SupportSQLiteQuery): Int

Expand Down
16 changes: 15 additions & 1 deletion app/src/main/java/com/maloy/muzza/db/entities/AlbumEntity.kt
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
package com.maloy.muzza.db.entities

import androidx.compose.runtime.Immutable
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.maloy.innertube.YouTube
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
import java.time.LocalDateTime

@Immutable
@Entity(tableName = "album")
data class AlbumEntity(
@PrimaryKey val id: String,
val playlistId: String? = null,
val title: String,
val year: Int? = null,
val thumbnailUrl: String? = null,
Expand All @@ -18,7 +25,14 @@ data class AlbumEntity(
val lastUpdateTime: LocalDateTime = LocalDateTime.now(),
val bookmarkedAt: LocalDateTime? = null,
) {
fun toggleLike() = copy(
fun localToggleLike() = copy(
bookmarkedAt = if (bookmarkedAt != null) null else LocalDateTime.now()
)
fun toggleLike() = localToggleLike().also {
CoroutineScope(Dispatchers.IO).launch {
if (playlistId != null)
YouTube.likePlaylist(playlistId, bookmarkedAt == null)
this.cancel()
}
}
}
18 changes: 17 additions & 1 deletion app/src/main/java/com/maloy/muzza/db/entities/ArtistEntity.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
package com.maloy.muzza.db.entities

import androidx.compose.runtime.Immutable
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import org.apache.commons.lang3.RandomStringUtils
import java.time.LocalDateTime
import com.maloy.innertube.YouTube
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch

@Suppress("DEPRECATION")
@Immutable
Expand All @@ -13,16 +19,26 @@ data class ArtistEntity(
@PrimaryKey val id: String,
val name: String,
val thumbnailUrl: String? = null,
val channelId: String? = null,
val lastUpdateTime: LocalDateTime = LocalDateTime.now(),
val bookmarkedAt: LocalDateTime? = null,
) {

val isYouTubeArtist: Boolean
get() = id.startsWith("UC")

fun toggleLike() = copy(
fun localToggleLike() = copy(
bookmarkedAt = if (bookmarkedAt != null) null else LocalDateTime.now(),
)
fun toggleLike() = localToggleLike().also {
CoroutineScope(Dispatchers.IO).launch {
if (channelId == null)
YouTube.subscribeChannel(YouTube.getChannelId(id), bookmarkedAt == null)
else
YouTube.subscribeChannel(channelId, bookmarkedAt == null)
this.cancel()
}
}

companion object {
fun generateArtistId() = "LA" + RandomStringUtils.random(8, true, false)
Expand Down
20 changes: 20 additions & 0 deletions app/src/main/java/com/maloy/muzza/db/entities/PlaylistEntity.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
package com.maloy.muzza.db.entities

import androidx.compose.runtime.Immutable
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.maloy.innertube.YouTube
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
import org.apache.commons.lang3.RandomStringUtils
import java.time.LocalDateTime

@Suppress("DEPRECATION")
@Immutable
Expand All @@ -12,11 +19,24 @@ data class PlaylistEntity(
@PrimaryKey val id: String = generatePlaylistId(),
val name: String,
val browseId: String? = null,
@ColumnInfo(name = "isEditable", defaultValue = true.toString())
val isEditable: Boolean = true,
val bookmarkedAt: LocalDateTime? = null,
) {
companion object {
const val LIKED_PLAYLIST_ID = "LP_LIKED"
const val DOWNLOADED_PLAYLIST_ID = "LP_DOWNLOADED"

fun generatePlaylistId() = "LP" + RandomStringUtils.random(8, true, false)
}
fun localToggleLike() = copy(
bookmarkedAt = if (bookmarkedAt != null) null else LocalDateTime.now()
)
fun toggleLike() = localToggleLike().also {
CoroutineScope(Dispatchers.IO).launch {
if (browseId != null)
YouTube.likePlaylist(browseId, bookmarkedAt == null)
this.cancel()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,5 @@ data class PlaylistSongMap(
@ColumnInfo(index = true) val playlistId: String,
@ColumnInfo(index = true) val songId: String,
val position: Int = 0,
val setVideoId: String? = null,
)
10 changes: 10 additions & 0 deletions app/src/main/java/com/maloy/muzza/db/entities/SetVideoIdEntity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.maloy.muzza.db.entities

import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "set_video_id")
data class SetVideoIdEntity(
@PrimaryKey(autoGenerate = false)
val videoId: String = "",
val setVideoId: String? = null,
)
23 changes: 21 additions & 2 deletions app/src/main/java/com/maloy/muzza/db/entities/SongEntity.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
package com.maloy.muzza.db.entities

import androidx.compose.runtime.Immutable
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.Index
import androidx.room.PrimaryKey
import com.maloy.innertube.YouTube
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
import kotlinx.coroutines.GlobalScope
import java.time.LocalDateTime

@Immutable
Expand All @@ -27,10 +34,22 @@ data class SongEntity(
val inLibrary: LocalDateTime? = null,
val dateDownload: LocalDateTime? = null, // doubles as "isDownloaded"
) {
fun toggleLike() = copy(
fun localToggleLike() = copy(
liked = !liked,
inLibrary = if (!liked) inLibrary ?: LocalDateTime.now() else inLibrary
)
).also {
CoroutineScope(Dispatchers.IO).launch() {
YouTube.likeVideo(id, !liked)
this.cancel()
}
}

fun toggleLike() = localToggleLike().also {
CoroutineScope(Dispatchers.IO).launch() {
YouTube.likeVideo(id, !liked)
this.cancel()
}
}

fun toggleLibrary() = copy(inLibrary = if (inLibrary == null) LocalDateTime.now() else null)
}
6 changes: 5 additions & 1 deletion app/src/main/java/com/maloy/muzza/models/MediaMetadata.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,21 @@ data class MediaMetadata(
val duration: Int,
val thumbnailUrl: String? = null,
val album: Album? = null,
val setVideoId: String? = null,
val explicit: Boolean = false,
val blurSync: Boolean = false,
val blurThumbnail: String? = null,
) : Serializable {
data class Artist(
val id: String?,
val name: String,
val isLocal: Boolean = false,
) : Serializable

data class Album(
val id: String,
val title: String,
val isLocal: Boolean = false,
) : Serializable

fun toSongEntity() = SongEntity(
Expand Down Expand Up @@ -79,5 +82,6 @@ fun SongItem.toMediaMetadata() = MediaMetadata(
title = it.name
)
},
explicit = explicit
explicit = explicit,
setVideoId = setVideoId
)
Loading

0 comments on commit ef0779e

Please sign in to comment.