Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ if (isFullBuild && System.getenv("PULL_REQUEST") == null) {

android {
namespace = "com.zionhuang.music"
compileSdk = 35
buildToolsVersion = "35.0.0"
compileSdk = 34
buildToolsVersion = "34.0.0"
defaultConfig {
applicationId = "com.zionhuang.music"
minSdk = 24
targetSdk = 35
targetSdk = 34
versionCode = 26
versionName = "0.5.10"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
Expand Down
1 change: 0 additions & 1 deletion app/src/foss/java/com/zionhuang/music/utils/Utils.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.zionhuang.music.utils

import com.zionhuang.music.MainActivity
import java.lang.Exception

fun reportException(throwable: Throwable) {
throwable.printStackTrace()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ object TranslationHelper {

suspend fun translate(lyrics: LyricsEntity): LyricsEntity {
cache[lyrics.id]?.let { return it }
val isSynced = lyrics.lyrics.startsWith("[")
return try {
val isSynced = lyrics.lyrics.startsWith("[")
val sourceLanguage = TranslateLanguage.fromLanguageTag(
LanguageIdentification.getClient().identifyLanguage(
lyrics.lyrics.lines().joinToString(separator = "\n") { it.replace("\\[\\d{2}:\\d{2}.\\d{2,3}\\] *".toRegex(), "") }
Expand Down Expand Up @@ -63,9 +64,12 @@ object TranslationHelper {
.joinToString(separator = "\n")
}
)
}.also {
cache.put(it.id, it)
}
} catch (e: Exception) {
lyrics // Return original lyrics if translation fails
}
}
}

suspend fun clearModels() {
Expand Down
4 changes: 2 additions & 2 deletions innertube/src/main/java/com/zionhuang/innertube/InnerTube.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import com.zionhuang.innertube.utils.sha1
import io.ktor.client.*
import io.ktor.client.engine.okhttp.*
import io.ktor.client.plugins.*
import io.ktor.client.plugins.compression.*
import io.ktor.client.features.compression.*
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.client.request.*
import io.ktor.http.*
Expand Down Expand Up @@ -61,7 +61,7 @@ class InnerTube {
})
}

install(ContentEncoding) {
install(ContentEncoding.Feature) {
brotli(1.0F)
gzip(0.9F)
deflate(0.8F)
Expand Down
20 changes: 11 additions & 9 deletions innertube/src/main/java/com/zionhuang/innertube/YouTube.kt
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ object YouTube {
?.distinctBy { it.id }
?.ifEmpty { null } ?: return@mapNotNull null
)
}!!
} ?: emptyList()
)
}

Expand Down Expand Up @@ -447,15 +447,17 @@ object YouTube {
}
val audioStreams = innerTube.pipedStreams(videoId).body<PipedResponse>().audioStreams
safePlayerResponse.copy(
streamingData = safePlayerResponse.streamingData?.copy(
adaptiveFormats = safePlayerResponse.streamingData.adaptiveFormats.mapNotNull { adaptiveFormat ->
audioStreams.find { it.bitrate == adaptiveFormat.bitrate }?.let {
adaptiveFormat.copy(
url = it.url
)
streamingData = safePlayerResponse.streamingData?.let { streamingData ->
streamingData.copy(
adaptiveFormats = streamingData.adaptiveFormats.mapNotNull { adaptiveFormat ->
audioStreams.find { it.bitrate == adaptiveFormat.bitrate }?.let {
adaptiveFormat.copy(
url = it.url
)
}
}
}
)
)
}
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ data class AccountMenuResponse(
val channelHandle: Runs?,
) {
fun toAccountInfo() = AccountInfo(
name = accountName.runs!!.first().text,
email = email?.runs?.first()?.text,
channelHandle = channelHandle?.runs?.first()?.text
name = accountName.runs?.firstOrNull()?.text ?: "",
email = email?.runs?.firstOrNull()?.text,
channelHandle = channelHandle?.runs?.firstOrNull()?.text
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import kotlinx.serialization.Serializable

@Serializable
data class GetQueueResponse(
val queueDatas: List<QueueData>,
val queueData: List<QueueData>,
) {
@Serializable
data class QueueData(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ data class SearchResponse(

@Serializable
data class ContinuationContents(
val musicShelfContinuation: MusicShelfContinuation,
val musicShelfContinuation: MusicShelfContinuation?,
) {
@Serializable
data class MusicShelfContinuation(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,12 @@ data class AlbumPage(
)
} ?: return null,
album = renderer.flexColumns.getOrNull(2)?.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.firstOrNull()?.let {
Album(
name = it.text,
id = it.navigationEndpoint?.browseEndpoint?.browseId!!
)
it.navigationEndpoint?.browseEndpoint?.browseId?.let { browseId ->
Album(
name = it.text,
id = browseId
)
}
} ?: return null,
duration = renderer.fixedColumns?.firstOrNull()
?.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.firstOrNull()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ data class ArtistItemsPage(
shuffleEndpoint = renderer.menu?.menuRenderer?.items?.find {
it.menuNavigationItemRenderer?.icon?.iconType == "MUSIC_SHUFFLE"
}?.menuNavigationItemRenderer?.navigationEndpoint?.watchPlaylistEndpoint ?: return null,
radioEndpoint = renderer.menu.menuRenderer.items.find {
radioEndpoint = renderer.menu?.menuRenderer?.items?.find {
it.menuNavigationItemRenderer?.icon?.iconType == "MIX"
}?.menuNavigationItemRenderer?.navigationEndpoint?.watchPlaylistEndpoint ?: return null
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.zionhuang.innertube.pages

import com.zionhuang.innertube.models.AlbumItem
import com.zionhuang.innertube.models.MoodAndGenres

data class ExplorePage(
val newReleaseAlbums: List<AlbumItem>,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,12 @@ data class HomePage(
) {
companion object {
fun fromMusicCarouselShelfRenderer(renderer: MusicCarouselShelfRenderer): Section? {
val header = renderer.header?.musicCarouselShelfBasicHeaderRenderer ?: return null
return Section(
title = renderer.header?.musicCarouselShelfBasicHeaderRenderer?.title?.runs?.firstOrNull()?.text ?: return null,
label = renderer.header.musicCarouselShelfBasicHeaderRenderer.strapline?.runs?.firstOrNull()?.text,
thumbnail = renderer.header.musicCarouselShelfBasicHeaderRenderer.thumbnail?.musicThumbnailRenderer?.getThumbnailUrl(),
endpoint = renderer.header.musicCarouselShelfBasicHeaderRenderer.moreContentButton?.buttonRenderer?.navigationEndpoint?.browseEndpoint,
title = header.title?.runs?.firstOrNull()?.text ?: return null,
label = header.strapline?.runs?.firstOrNull()?.text,
thumbnail = header.thumbnail?.musicThumbnailRenderer?.getThumbnailUrl(),
endpoint = header.moreContentButton?.buttonRenderer?.navigationEndpoint?.browseEndpoint,
items = renderer.contents.mapNotNull {
it.musicTwoRowItemRenderer
}.mapNotNull {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ data class MoodAndGenres(
fun fromSectionListRendererContent(content: SectionListRenderer.Content): MoodAndGenres? {
return MoodAndGenres(
title = content.gridRenderer?.header?.gridHeaderRenderer?.title?.runs?.firstOrNull()?.text ?: return null,
items = content.gridRenderer.items
.mapNotNull(GridRenderer.Item::musicNavigationButtonRenderer)
.mapNotNull(::fromMusicNavigationButtonRenderer)
items = content.gridRenderer?.items
?.mapNotNull(GridRenderer.Item::musicNavigationButtonRenderer)
?.mapNotNull(::fromMusicNavigationButtonRenderer) ?: return null
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ object NewReleaseAlbumPage {
id = it.navigationEndpoint?.browseEndpoint?.browseId
)
} ?: return null,
year = renderer.subtitle.runs.lastOrNull()?.text?.toIntOrNull(),
year = renderer.subtitle?.runs?.lastOrNull()?.text?.toIntOrNull(),
thumbnail = renderer.thumbnailRenderer.musicThumbnailRenderer?.getThumbnailUrl() ?: return null,
explicit = renderer.subtitleBadges?.find {
it.musicInlineBadgeRenderer?.icon?.iconType == "MUSIC_EXPLICIT_BADGE"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ object NextPage {
)
},
duration = renderer.lengthText?.runs?.firstOrNull()?.text?.parseTime() ?: return null,
thumbnail = renderer.thumbnail.thumbnails.lastOrNull()?.url ?: return null,
thumbnail = renderer.thumbnail?.thumbnails?.lastOrNull()?.url ?: return null,
explicit = renderer.badges?.find {
it.musicInlineBadgeRenderer?.icon?.iconType == "MUSIC_EXPLICIT_BADGE"
} != null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ data class PlaylistPage(
val continuation: String?,
) {
companion object {
/**
* Converts a MusicResponsiveListItemRenderer to a SongItem.
* @param renderer The renderer to convert
* @return A SongItem if conversion is successful, null otherwise
*/
fun fromMusicResponsiveListItemRenderer(renderer: MusicResponsiveListItemRenderer): SongItem? {
return SongItem(
id = renderer.playlistItemData?.videoId ?: return null,
Expand All @@ -27,11 +32,13 @@ data class PlaylistPage(
id = it.navigationEndpoint?.browseEndpoint?.browseId,
)
}.orEmpty().ifEmpty { return null },
album = renderer.flexColumns.getOrNull(2)?.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.firstOrNull()?.let {
Album(
name = it.text,
id = it.navigationEndpoint?.browseEndpoint?.browseId ?: return@let null
)
album = renderer.flexColumns.getOrNull(2)?.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.firstOrNull()?.let { run ->
run.navigationEndpoint?.browseEndpoint?.browseId?.let { id ->
Album(
name = run.text,
id = id
)
}
},
duration = renderer.fixedColumns?.firstOrNull()?.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.firstOrNull()?.text?.parseTime(),
thumbnail = renderer.thumbnail?.musicThumbnailRenderer?.getThumbnailUrl() ?: return null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ data class RelatedPage(
shuffleEndpoint = renderer.menu?.menuRenderer?.items?.find {
it.menuNavigationItemRenderer?.icon?.iconType == "MUSIC_SHUFFLE"
}?.menuNavigationItemRenderer?.navigationEndpoint?.watchPlaylistEndpoint ?: return null,
radioEndpoint = renderer.menu.menuRenderer.items.find {
radioEndpoint = renderer.menu?.menuRenderer?.items?.find {
it.menuNavigationItemRenderer?.icon?.iconType == "MIX"
}?.menuNavigationItemRenderer?.navigationEndpoint?.watchPlaylistEndpoint ?: return null
)
Expand All @@ -89,7 +89,7 @@ data class RelatedPage(
shuffleEndpoint = renderer.menu?.menuRenderer?.items?.find {
it.menuNavigationItemRenderer?.icon?.iconType == "MUSIC_SHUFFLE"
}?.menuNavigationItemRenderer?.navigationEndpoint?.watchPlaylistEndpoint ?: return null,
radioEndpoint = renderer.menu.menuRenderer.items.find {
radioEndpoint = renderer.menu?.menuRenderer?.items?.find {
it.menuNavigationItemRenderer?.icon?.iconType == "MIX"
}?.menuNavigationItemRenderer?.navigationEndpoint?.watchPlaylistEndpoint ?: return null,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ object SearchPage {
shuffleEndpoint = renderer.menu?.menuRenderer?.items
?.find { it.menuNavigationItemRenderer?.icon?.iconType == "MUSIC_SHUFFLE" }
?.menuNavigationItemRenderer?.navigationEndpoint?.watchPlaylistEndpoint ?: return null,
radioEndpoint = renderer.menu.menuRenderer.items
.find { it.menuNavigationItemRenderer?.icon?.iconType == "MIX" }
radioEndpoint = renderer.menu?.menuRenderer?.items
?.find { it.menuNavigationItemRenderer?.icon?.iconType == "MIX" }
?.menuNavigationItemRenderer?.navigationEndpoint?.watchPlaylistEndpoint ?: return null
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,8 @@ data class SearchSummaryPage(
shuffleEndpoint = renderer.menu?.menuRenderer?.items
?.find { it.menuNavigationItemRenderer?.icon?.iconType == "MUSIC_SHUFFLE" }
?.menuNavigationItemRenderer?.navigationEndpoint?.watchPlaylistEndpoint ?: return null,
radioEndpoint = renderer.menu.menuRenderer.items
.find { it.menuNavigationItemRenderer?.icon?.iconType == "MIX" }
radioEndpoint = renderer.menu?.menuRenderer?.items
?.find { it.menuNavigationItemRenderer?.icon?.iconType == "MIX" }
?.menuNavigationItemRenderer?.navigationEndpoint?.watchPlaylistEndpoint ?: return null
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ fun parseCookieString(cookie: String): Map<String, String> =
cookie.split("; ")
.filter { it.isNotEmpty() }
.associate {
val (key, value) = it.split("=")
key to value
val parts = it.split("=", limit = 2)
if (parts.size == 2) parts[0] to parts[1] else parts[0] to ""
}

fun String.parseTime(): Int? {
Expand Down