├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.yml
│ ├── config.yml
│ └── feature_request.yml
└── workflows
│ ├── build.yml
│ └── build_pr.yml
├── .gitignore
├── LICENSE
├── README.md
├── app
├── .gitignore
├── CMakeLists.txt
├── build.gradle.kts
├── lint.xml
├── proguard-rules.pro
├── schemas
│ └── com.zionhuang.music.db.InternalDatabase
│ │ ├── 1.json
│ │ ├── 10.json
│ │ ├── 11.json
│ │ ├── 12.json
│ │ ├── 2.json
│ │ ├── 3.json
│ │ ├── 4.json
│ │ ├── 5.json
│ │ ├── 6.json
│ │ ├── 7.json
│ │ ├── 8.json
│ │ └── 9.json
└── src
│ ├── debug
│ └── res
│ │ ├── values
│ │ └── app_name.xml
│ │ └── xml-v25
│ │ └── shortcuts.xml
│ ├── foss
│ └── java
│ │ └── com
│ │ └── zionhuang
│ │ └── music
│ │ └── utils
│ │ ├── TranslationHelper.kt
│ │ └── Utils.kt
│ ├── full
│ └── java
│ │ └── com
│ │ └── zionhuang
│ │ └── music
│ │ └── utils
│ │ ├── TranslationHelper.kt
│ │ └── Utils.kt
│ └── main
│ ├── AndroidManifest.xml
│ ├── ic_launcher-playstore.png
│ ├── java
│ └── com
│ │ └── zionhuang
│ │ └── music
│ │ ├── App.kt
│ │ ├── MainActivity.kt
│ │ ├── constants
│ │ ├── Dimensions.kt
│ │ ├── MediaSessionConstants.kt
│ │ ├── PreferenceKeys.kt
│ │ └── StatPeriod.kt
│ │ ├── db
│ │ ├── Converters.kt
│ │ ├── DatabaseDao.kt
│ │ ├── MusicDatabase.kt
│ │ └── entities
│ │ │ ├── Album.kt
│ │ │ ├── AlbumArtistMap.kt
│ │ │ ├── AlbumEntity.kt
│ │ │ ├── AlbumWithSongs.kt
│ │ │ ├── Artist.kt
│ │ │ ├── ArtistEntity.kt
│ │ │ ├── Event.kt
│ │ │ ├── EventWithSong.kt
│ │ │ ├── FormatEntity.kt
│ │ │ ├── LocalItem.kt
│ │ │ ├── LyricsEntity.kt
│ │ │ ├── Playlist.kt
│ │ │ ├── PlaylistEntity.kt
│ │ │ ├── PlaylistSong.kt
│ │ │ ├── PlaylistSongMap.kt
│ │ │ ├── PlaylistSongMapPreview.kt
│ │ │ ├── RelatedSongMap.kt
│ │ │ ├── SearchHistory.kt
│ │ │ ├── Song.kt
│ │ │ ├── SongAlbumMap.kt
│ │ │ ├── SongArtistMap.kt
│ │ │ ├── SongEntity.kt
│ │ │ ├── SortedSongAlbumMap.kt
│ │ │ └── SortedSongArtistMap.kt
│ │ ├── di
│ │ └── AppModule.kt
│ │ ├── extensions
│ │ ├── CoroutineExt.kt
│ │ ├── FileExt.kt
│ │ ├── ListExt.kt
│ │ ├── MediaItemExt.kt
│ │ ├── PlayerExt.kt
│ │ ├── StringExt.kt
│ │ └── UtilExt.kt
│ │ ├── lyrics
│ │ ├── KuGouLyricsProvider.kt
│ │ ├── LrcLibLyricsProvider.kt
│ │ ├── LyricsEntry.kt
│ │ ├── LyricsHelper.kt
│ │ ├── LyricsProvider.kt
│ │ ├── LyricsUtils.kt
│ │ ├── YouTubeLyricsProvider.kt
│ │ └── YouTubeSubtitleLyricsProvider.kt
│ │ ├── models
│ │ ├── ItemsPage.kt
│ │ ├── MediaMetadata.kt
│ │ ├── PersistQueue.kt
│ │ └── SimilarRecommendation.kt
│ │ ├── playback
│ │ ├── DownloadUtil.kt
│ │ ├── ExoDownloadService.kt
│ │ ├── MediaLibrarySessionCallback.kt
│ │ ├── MusicService.kt
│ │ ├── PlayerConnection.kt
│ │ ├── SleepTimer.kt
│ │ └── queues
│ │ │ ├── EmptyQueue.kt
│ │ │ ├── ListQueue.kt
│ │ │ ├── LocalAlbumRadio.kt
│ │ │ ├── Queue.kt
│ │ │ ├── YouTubeAlbumRadio.kt
│ │ │ └── YouTubeQueue.kt
│ │ ├── ui
│ │ ├── component
│ │ │ ├── AutoResizeText.kt
│ │ │ ├── BigSeekBar.kt
│ │ │ ├── BottomSheet.kt
│ │ │ ├── BottomSheetMenu.kt
│ │ │ ├── ChipsRow.kt
│ │ │ ├── Dialog.kt
│ │ │ ├── EmptyPlaceholder.kt
│ │ │ ├── GridMenu.kt
│ │ │ ├── HideOnScrollFAB.kt
│ │ │ ├── IconButton.kt
│ │ │ ├── Items.kt
│ │ │ ├── Lyrics.kt
│ │ │ ├── NavigationTile.kt
│ │ │ ├── NavigationTitle.kt
│ │ │ ├── PlayingIndicator.kt
│ │ │ ├── Preference.kt
│ │ │ ├── SearchBar.kt
│ │ │ ├── SortHeader.kt
│ │ │ └── shimmer
│ │ │ │ ├── ButtonPlaceholder.kt
│ │ │ │ ├── GridItemPlaceholder.kt
│ │ │ │ ├── ListItemPlaceholder.kt
│ │ │ │ ├── ShimmerHost.kt
│ │ │ │ └── TextPlaceholder.kt
│ │ ├── menu
│ │ │ ├── AddToPlaylistDialog.kt
│ │ │ ├── AlbumMenu.kt
│ │ │ ├── ArtistMenu.kt
│ │ │ ├── LyricsMenu.kt
│ │ │ ├── MediaMetadataMenu.kt
│ │ │ ├── PlayerMenu.kt
│ │ │ ├── PlaylistMenu.kt
│ │ │ ├── QueueSelectionMenu.kt
│ │ │ ├── SongMenu.kt
│ │ │ ├── SongSelectionMenu.kt
│ │ │ ├── YouTubeAlbumMenu.kt
│ │ │ ├── YouTubeArtistMenu.kt
│ │ │ ├── YouTubePlaylistMenu.kt
│ │ │ ├── YouTubeSongMenu.kt
│ │ │ └── YouTubeSongSelectionMenu.kt
│ │ ├── player
│ │ │ ├── MiniPlayer.kt
│ │ │ ├── PlaybackError.kt
│ │ │ ├── Player.kt
│ │ │ ├── Queue.kt
│ │ │ └── Thumbnail.kt
│ │ ├── screens
│ │ │ ├── AccountScreen.kt
│ │ │ ├── AlbumScreen.kt
│ │ │ ├── HistoryScreen.kt
│ │ │ ├── HomeScreen.kt
│ │ │ ├── LoginScreen.kt
│ │ │ ├── MoodAndGenresScreen.kt
│ │ │ ├── NavigationBuilder.kt
│ │ │ ├── NewReleaseScreen.kt
│ │ │ ├── Screens.kt
│ │ │ ├── StatsScreen.kt
│ │ │ ├── YouTubeBrowseScreen.kt
│ │ │ ├── artist
│ │ │ │ ├── ArtistItemsScreen.kt
│ │ │ │ ├── ArtistScreen.kt
│ │ │ │ └── ArtistSongsScreen.kt
│ │ │ ├── library
│ │ │ │ ├── LibraryAlbumsScreen.kt
│ │ │ │ ├── LibraryArtistsScreen.kt
│ │ │ │ ├── LibraryPlaylistsScreen.kt
│ │ │ │ └── LibrarySongsScreen.kt
│ │ │ ├── playlist
│ │ │ │ ├── LocalPlaylistScreen.kt
│ │ │ │ └── OnlinePlaylistScreen.kt
│ │ │ ├── search
│ │ │ │ ├── LocalSearchScreen.kt
│ │ │ │ ├── OnlineSearchResult.kt
│ │ │ │ └── OnlineSearchScreen.kt
│ │ │ └── settings
│ │ │ │ ├── AboutScreen.kt
│ │ │ │ ├── AppearanceSettings.kt
│ │ │ │ ├── BackupAndRestore.kt
│ │ │ │ ├── ContentSettings.kt
│ │ │ │ ├── DiscordLoginScreen.kt
│ │ │ │ ├── DiscordSettings.kt
│ │ │ │ ├── PlayerSettings.kt
│ │ │ │ ├── PrivacySettings.kt
│ │ │ │ ├── SettingsScreen.kt
│ │ │ │ └── StorageSettings.kt
│ │ ├── theme
│ │ │ └── Theme.kt
│ │ └── utils
│ │ │ ├── AppBar.kt
│ │ │ ├── FadingEdge.kt
│ │ │ ├── LazyGridSnapLayoutInfoProvider.kt
│ │ │ ├── NavControllerUtils.kt
│ │ │ ├── ScrollUtils.kt
│ │ │ ├── ShapeUtils.kt
│ │ │ ├── StringUtils.kt
│ │ │ └── YouTubeUtils.kt
│ │ ├── utils
│ │ ├── CoilBitmapLoader.kt
│ │ ├── ComposeDebugUtils.kt
│ │ ├── DataStore.kt
│ │ ├── DiscordRPC.kt
│ │ ├── NetworkUtils.kt
│ │ ├── StringUtils.kt
│ │ └── Updater.kt
│ │ └── viewmodels
│ │ ├── AccountViewModel.kt
│ │ ├── AlbumViewModel.kt
│ │ ├── ArtistItemsViewModel.kt
│ │ ├── ArtistViewModel.kt
│ │ ├── BackupRestoreViewModel.kt
│ │ ├── HistoryViewModel.kt
│ │ ├── HomeViewModel.kt
│ │ ├── LibraryViewModels.kt
│ │ ├── LocalPlaylistViewModel.kt
│ │ ├── LocalSearchViewModel.kt
│ │ ├── LyricsMenuViewModel.kt
│ │ ├── MoodAndGenresViewModel.kt
│ │ ├── NewReleaseViewModel.kt
│ │ ├── OnlinePlaylistViewModel.kt
│ │ ├── OnlineSearchSuggestionViewModel.kt
│ │ ├── OnlineSearchViewModel.kt
│ │ ├── StatsViewModel.kt
│ │ └── YouTubeBrowseViewModel.kt
│ └── res
│ ├── drawable
│ ├── add.xml
│ ├── album.xml
│ ├── arrow_back.xml
│ ├── arrow_downward.xml
│ ├── arrow_forward.xml
│ ├── arrow_top_left.xml
│ ├── arrow_upward.xml
│ ├── artist.xml
│ ├── backup.xml
│ ├── bedtime.xml
│ ├── bookmark.xml
│ ├── bookmark_filled.xml
│ ├── buymeacoffee.xml
│ ├── cached.xml
│ ├── casino.xml
│ ├── clear_all.xml
│ ├── close.xml
│ ├── contrast.xml
│ ├── dark_mode.xml
│ ├── delete.xml
│ ├── delete_history.xml
│ ├── discord.xml
│ ├── discover_tune.xml
│ ├── download.xml
│ ├── drag_handle.xml
│ ├── edit.xml
│ ├── equalizer.xml
│ ├── error.xml
│ ├── expand_less.xml
│ ├── expand_more.xml
│ ├── explicit.xml
│ ├── fast_forward.xml
│ ├── favorite.xml
│ ├── favorite_border.xml
│ ├── format_align_center.xml
│ ├── format_align_left.xml
│ ├── github.xml
│ ├── graphic_eq.xml
│ ├── grid_view.xml
│ ├── history.xml
│ ├── home.xml
│ ├── info.xml
│ ├── input.xml
│ ├── language.xml
│ ├── launcher_foreground.xml
│ ├── launcher_monochrome.xml
│ ├── liberapay.xml
│ ├── library_add.xml
│ ├── library_add_check.xml
│ ├── library_music.xml
│ ├── list.xml
│ ├── location_on.xml
│ ├── lock.xml
│ ├── lock_open.xml
│ ├── lyrics.xml
│ ├── manage_search.xml
│ ├── mood.xml
│ ├── more_horiz.xml
│ ├── more_vert.xml
│ ├── music_note.xml
│ ├── navigate_next.xml
│ ├── offline.xml
│ ├── palette.xml
│ ├── pause.xml
│ ├── person.xml
│ ├── play.xml
│ ├── playlist_add.xml
│ ├── playlist_play.xml
│ ├── playlist_remove.xml
│ ├── queue_music.xml
│ ├── radio.xml
│ ├── radio_button_checked.xml
│ ├── radio_button_unchecked.xml
│ ├── remove.xml
│ ├── repeat.xml
│ ├── repeat_on.xml
│ ├── repeat_one.xml
│ ├── repeat_one_on.xml
│ ├── replay.xml
│ ├── restore.xml
│ ├── screenshot.xml
│ ├── search.xml
│ ├── search_off.xml
│ ├── security.xml
│ ├── settings.xml
│ ├── share.xml
│ ├── shortcut_albums.xml
│ ├── shortcut_playlists.xml
│ ├── shortcut_search.xml
│ ├── shortcut_songs.xml
│ ├── shuffle.xml
│ ├── shuffle_on.xml
│ ├── skip_next.xml
│ ├── skip_previous.xml
│ ├── sliders.xml
│ ├── slow_motion_video.xml
│ ├── small_icon.xml
│ ├── speed.xml
│ ├── storage.xml
│ ├── sync.xml
│ ├── tab.xml
│ ├── translate.xml
│ ├── trending_up.xml
│ ├── tune.xml
│ ├── update.xml
│ ├── volume_up.xml
│ └── wifi_proxy.xml
│ ├── mipmap-anydpi-v26
│ ├── ic_launcher.xml
│ └── ic_launcher_round.xml
│ ├── mipmap-hdpi
│ ├── ic_launcher.webp
│ └── ic_launcher_round.webp
│ ├── mipmap-mdpi
│ ├── ic_launcher.webp
│ └── ic_launcher_round.webp
│ ├── mipmap-xhdpi
│ ├── ic_launcher.webp
│ └── ic_launcher_round.webp
│ ├── mipmap-xxhdpi
│ ├── ic_launcher.webp
│ └── ic_launcher_round.webp
│ ├── mipmap-xxxhdpi
│ ├── ic_launcher.webp
│ └── ic_launcher_round.webp
│ ├── values-ar
│ └── strings.xml
│ ├── values-b+sr+Latn
│ └── strings.xml
│ ├── values-be
│ └── strings.xml
│ ├── values-bg
│ └── strings.xml
│ ├── values-bn-rIN
│ └── strings.xml
│ ├── values-bn
│ └── strings.xml
│ ├── values-bs
│ └── strings.xml
│ ├── values-cs
│ └── strings.xml
│ ├── values-de
│ └── strings.xml
│ ├── values-el
│ └── strings.xml
│ ├── values-es
│ └── strings.xml
│ ├── values-et
│ └── strings.xml
│ ├── values-fa
│ └── strings.xml
│ ├── values-fi
│ └── strings.xml
│ ├── values-fr
│ └── strings.xml
│ ├── values-hi
│ └── strings.xml
│ ├── values-hr
│ └── strings.xml
│ ├── values-hu
│ └── strings.xml
│ ├── values-in
│ └── strings.xml
│ ├── values-it
│ └── strings.xml
│ ├── values-ja
│ └── strings.xml
│ ├── values-ko
│ └── strings.xml
│ ├── values-ml
│ └── strings.xml
│ ├── values-nb-rNO
│ └── strings.xml
│ ├── values-ne
│ └── strings.xml
│ ├── values-nl
│ └── strings.xml
│ ├── values-or
│ └── strings.xml
│ ├── values-pa
│ └── strings.xml
│ ├── values-pl
│ └── strings.xml
│ ├── values-pt-rBR
│ └── strings.xml
│ ├── values-pt
│ └── strings.xml
│ ├── values-ru
│ └── strings.xml
│ ├── values-sv
│ └── strings.xml
│ ├── values-ta
│ └── strings.xml
│ ├── values-tr
│ └── strings.xml
│ ├── values-uk
│ └── strings.xml
│ ├── values-vi
│ └── strings.xml
│ ├── values-zh-rCN
│ └── strings.xml
│ ├── values-zh-rTW
│ └── strings.xml
│ ├── values
│ ├── app_name.xml
│ ├── ic_launcher_background.xml
│ ├── strings.xml
│ ├── styles.xml
│ └── values.xml
│ ├── xml-v25
│ └── shortcuts.xml
│ └── xml
│ ├── automotive_app_desc.xml
│ ├── backup_rules.xml
│ ├── data_extraction_rules.xml
│ └── provider_paths.xml
├── assets
├── buymeacoffee.png
└── liberapay.png
├── build.gradle.kts
├── crowdin.yml
├── fastlane
└── metadata
│ └── android
│ ├── ar
│ ├── full_description.txt
│ └── short_description.txt
│ ├── bg
│ ├── full_description.txt
│ └── short_description.txt
│ ├── bs
│ ├── full_description.txt
│ └── short_description.txt
│ ├── cs-CZ
│ ├── full_description.txt
│ └── short_description.txt
│ ├── de-DE
│ ├── full_description.txt
│ └── short_description.txt
│ ├── el-GR
│ ├── full_description.txt
│ └── short_description.txt
│ ├── en-US
│ ├── changelogs
│ │ ├── 10.txt
│ │ ├── 11.txt
│ │ ├── 12.txt
│ │ ├── 13.txt
│ │ ├── 14.txt
│ │ ├── 15.txt
│ │ ├── 16.txt
│ │ ├── 17.txt
│ │ ├── 18.txt
│ │ ├── 19.txt
│ │ ├── 20.txt
│ │ ├── 21.txt
│ │ ├── 22.txt
│ │ ├── 23.txt
│ │ ├── 24.txt
│ │ ├── 25.txt
│ │ ├── 26.txt
│ │ ├── 5.txt
│ │ ├── 6.txt
│ │ ├── 7.txt
│ │ ├── 8.txt
│ │ └── 9.txt
│ ├── full_description.txt
│ ├── images
│ │ ├── icon.png
│ │ └── phoneScreenshots
│ │ │ ├── 01.png
│ │ │ ├── 02.png
│ │ │ ├── 03.png
│ │ │ ├── 04.png
│ │ │ └── 05.png
│ ├── short_description.txt
│ └── title.txt
│ ├── es
│ ├── changelogs
│ │ ├── 11.txt
│ │ ├── 12.txt
│ │ ├── 13.txt
│ │ ├── 14.txt
│ │ ├── 15.txt
│ │ ├── 16.txt
│ │ ├── 17.txt
│ │ ├── 18.txt
│ │ ├── 19.txt
│ │ ├── 20.txt
│ │ ├── 21.txt
│ │ ├── 22.txt
│ │ ├── 23.txt
│ │ ├── 24.txt
│ │ ├── 25.txt
│ │ ├── 26.txt
│ │ ├── 5.txt
│ │ ├── 6.txt
│ │ ├── 7.txt
│ │ ├── 8.txt
│ │ └── 9.txt
│ ├── full_description.txt
│ └── short_description.txt
│ ├── et
│ ├── full_description.txt
│ └── short_description.txt
│ ├── fi-FI
│ ├── full_description.txt
│ └── short_description.txt
│ ├── fr-FR
│ ├── full_description.txt
│ └── short_description.txt
│ ├── hi-IN
│ ├── full_description.txt
│ └── short_description.txt
│ ├── hr
│ ├── full_description.txt
│ └── short_description.txt
│ ├── id
│ ├── full_description.txt
│ └── short_description.txt
│ ├── it
│ ├── full_description.txt
│ └── short_description.txt
│ ├── ja
│ ├── full_description.txt
│ └── short_description.txt
│ ├── ko
│ ├── full_description.txt
│ └── short_description.txt
│ ├── nl-NL
│ ├── full_description.txt
│ └── short_description.txt
│ ├── no-NO
│ ├── full_description.txt
│ └── short_description.txt
│ ├── pa
│ ├── full_description.txt
│ └── short_description.txt
│ ├── pl-PL
│ ├── full_description.txt
│ └── short_description.txt
│ ├── pt-BR
│ ├── changelogs
│ │ ├── 19.txt
│ │ └── 23.txt
│ ├── full_description.txt
│ └── short_description.txt
│ ├── pt
│ ├── full_description.txt
│ └── short_description.txt
│ ├── ru-RU
│ ├── full_description.txt
│ └── short_description.txt
│ ├── sr-Latn
│ ├── full_description.txt
│ └── short_description.txt
│ ├── tr
│ ├── changelogs
│ │ ├── 11.txt
│ │ ├── 12.txt
│ │ ├── 13.txt
│ │ └── 14.txt
│ ├── full_description.txt
│ └── short_description.txt
│ ├── uk-UA
│ ├── full_description.txt
│ └── short_description.txt
│ ├── vi
│ ├── full_description.txt
│ └── short_description.txt
│ ├── zh-CN
│ ├── full_description.txt
│ └── short_description.txt
│ └── zh-TW
│ ├── full_description.txt
│ └── short_description.txt
├── gradle.properties
├── gradle
├── libs.versions.toml
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── innertube
├── .gitignore
├── build.gradle.kts
└── src
│ ├── main
│ └── java
│ │ └── com
│ │ └── zionhuang
│ │ └── innertube
│ │ ├── InnerTube.kt
│ │ ├── YouTube.kt
│ │ ├── encoder
│ │ └── BrotliEncoder.kt
│ │ ├── models
│ │ ├── AccountInfo.kt
│ │ ├── AutomixPreviewVideoRenderer.kt
│ │ ├── Badges.kt
│ │ ├── Button.kt
│ │ ├── Context.kt
│ │ ├── Continuation.kt
│ │ ├── Endpoint.kt
│ │ ├── GridRenderer.kt
│ │ ├── Icon.kt
│ │ ├── Menu.kt
│ │ ├── MusicCardShelfRenderer.kt
│ │ ├── MusicCarouselShelfRenderer.kt
│ │ ├── MusicDescriptionShelfRenderer.kt
│ │ ├── MusicNavigationButtonRenderer.kt
│ │ ├── MusicPlaylistShelfRenderer.kt
│ │ ├── MusicQueueRenderer.kt
│ │ ├── MusicResponsiveListItemRenderer.kt
│ │ ├── MusicShelfRenderer.kt
│ │ ├── MusicTwoRowItemRenderer.kt
│ │ ├── NavigationEndpoint.kt
│ │ ├── PlaylistPanelRenderer.kt
│ │ ├── PlaylistPanelVideoRenderer.kt
│ │ ├── ResponseContext.kt
│ │ ├── Runs.kt
│ │ ├── SearchSuggestions.kt
│ │ ├── SearchSuggestionsSectionRenderer.kt
│ │ ├── SectionListRenderer.kt
│ │ ├── Tabs.kt
│ │ ├── ThumbnailRenderer.kt
│ │ ├── Thumbnails.kt
│ │ ├── YTItem.kt
│ │ ├── YouTubeClient.kt
│ │ ├── YouTubeLocale.kt
│ │ ├── body
│ │ │ ├── AccountMenuBody.kt
│ │ │ ├── BrowseBody.kt
│ │ │ ├── GetQueueBody.kt
│ │ │ ├── GetSearchSuggestionsBody.kt
│ │ │ ├── GetTranscriptBody.kt
│ │ │ ├── NextBody.kt
│ │ │ ├── PlayerBody.kt
│ │ │ └── SearchBody.kt
│ │ └── response
│ │ │ ├── AccountMenuResponse.kt
│ │ │ ├── BrowseResponse.kt
│ │ │ ├── GetQueueResponse.kt
│ │ │ ├── GetSearchSuggestionsResponse.kt
│ │ │ ├── GetTranscriptResponse.kt
│ │ │ ├── NextResponse.kt
│ │ │ ├── PipedResponse.kt
│ │ │ ├── PlayerResponse.kt
│ │ │ └── SearchResponse.kt
│ │ ├── pages
│ │ ├── AlbumPage.kt
│ │ ├── ArtistItemsContinuationPage.kt
│ │ ├── ArtistItemsPage.kt
│ │ ├── ArtistPage.kt
│ │ ├── BrowseResult.kt
│ │ ├── ExplorePage.kt
│ │ ├── HomePage.kt
│ │ ├── MoodAndGenres.kt
│ │ ├── NewReleaseAlbumPage.kt
│ │ ├── NextPage.kt
│ │ ├── PlaylistContinuationPage.kt
│ │ ├── PlaylistPage.kt
│ │ ├── RelatedPage.kt
│ │ ├── SearchPage.kt
│ │ ├── SearchSuggestionPage.kt
│ │ └── SearchSummaryPage.kt
│ │ └── utils
│ │ └── Utils.kt
│ └── test
│ └── java
│ └── com
│ └── zionhuang
│ └── innertube
│ └── YouTubeTest.kt
├── kizzy
├── .gitignore
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── java
│ └── com
│ └── my
│ └── kizzy
│ ├── gateway
│ ├── DiscordWebSocket.kt
│ └── entities
│ │ ├── HeartBeat.kt
│ │ ├── Identify.kt
│ │ ├── Payload.kt
│ │ ├── Ready.kt
│ │ ├── Resume.kt
│ │ ├── op
│ │ ├── OpCode.kt
│ │ └── OpCodesSerializer.kt
│ │ └── presence
│ │ ├── Activity.kt
│ │ ├── Assets.kt
│ │ ├── Metadata.kt
│ │ ├── Presence.kt
│ │ └── Timestamps.kt
│ ├── remote
│ ├── ApiResponse.kt
│ └── ApiService.kt
│ ├── repository
│ └── KizzyRepository.kt
│ ├── rpc
│ ├── KizzyRPC.kt
│ ├── RpcImage.kt
│ └── UserInfo.kt
│ └── utils
│ └── Ext.kt
├── kugou
├── .gitignore
├── build.gradle.kts
└── src
│ ├── main
│ └── java
│ │ └── com
│ │ └── zionhuang
│ │ └── kugou
│ │ ├── KuGou.kt
│ │ └── models
│ │ ├── DownloadLyricsResponse.kt
│ │ ├── SearchLyricsResponse.kt
│ │ └── SearchSongResponse.kt
│ └── test
│ └── java
│ └── Test.kt
├── lrclib
├── .gitignore
├── build.gradle.kts
└── src
│ └── main
│ └── java
│ └── com
│ └── zionhuang
│ └── lrclib
│ ├── LrcLib.kt
│ └── models
│ └── Track.kt
├── material-color-utilities
├── .gitignore
├── build.gradle.kts
└── src
│ └── main
│ └── java
│ └── com
│ └── google
│ └── material
│ └── color
│ ├── LICENSE
│ ├── blend
│ └── Blend.java
│ ├── contrast
│ └── Contrast.java
│ ├── dislike
│ └── DislikeAnalyzer.java
│ ├── dynamiccolor
│ ├── ContrastCurve.java
│ ├── DynamicColor.java
│ ├── DynamicScheme.java
│ ├── MaterialDynamicColors.java
│ ├── ToneDeltaPair.java
│ ├── TonePolarity.java
│ └── Variant.java
│ ├── hct
│ ├── Cam16.java
│ ├── Hct.java
│ ├── HctSolver.java
│ └── ViewingConditions.java
│ ├── palettes
│ ├── CorePalette.java
│ ├── CorePalettes.java
│ └── TonalPalette.java
│ ├── quantize
│ ├── PointProvider.java
│ ├── PointProviderLab.java
│ ├── Quantizer.java
│ ├── QuantizerCelebi.java
│ ├── QuantizerMap.java
│ ├── QuantizerResult.java
│ ├── QuantizerWsmeans.java
│ └── QuantizerWu.java
│ ├── scheme
│ ├── Scheme.java
│ ├── SchemeContent.java
│ ├── SchemeExpressive.java
│ ├── SchemeFidelity.java
│ ├── SchemeFruitSalad.java
│ ├── SchemeMonochrome.java
│ ├── SchemeNeutral.java
│ ├── SchemeRainbow.java
│ ├── SchemeTonalSpot.java
│ └── SchemeVibrant.java
│ ├── score
│ └── Score.java
│ ├── temperature
│ └── TemperatureCache.java
│ └── utils
│ ├── ColorUtils.java
│ ├── MathUtils.java
│ └── StringUtils.java
└── settings.gradle.kts
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: # Replace with a single Patreon username
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: zionhuang
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
13 | custom: ['https://www.buymeacoffee.com/zionhuang']
14 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 |
--------------------------------------------------------------------------------
/.github/workflows/build_pr.yml:
--------------------------------------------------------------------------------
1 | name: Build PR
2 | on:
3 | pull_request:
4 | branches:
5 | - '**'
6 |
7 | jobs:
8 | build:
9 | runs-on: ubuntu-latest
10 | steps:
11 | - uses: actions/checkout@v4
12 |
13 | - name: set up JDK 17
14 | uses: actions/setup-java@v4
15 | with:
16 | java-version: 17
17 | distribution: "zulu"
18 | cache: 'gradle'
19 |
20 | - name: Build debug APK and run jvm tests
21 | run: ./gradlew assembleDebug lintFullDebug testFullDebugUnitTest --stacktrace -DskipFormatKtlint
22 | env:
23 | PULL_REQUEST: 'true'
24 |
25 | - name: Upload APK
26 | uses: actions/upload-artifact@v4
27 | with:
28 | name: app
29 | path: app/build/outputs/apk/full/debug/*.apk
30 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/CMakeLists.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/app/CMakeLists.txt
--------------------------------------------------------------------------------
/app/lint.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/debug/res/values/app_name.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | InnerTune Debug
4 |
--------------------------------------------------------------------------------
/app/src/foss/java/com/zionhuang/music/utils/TranslationHelper.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.utils
2 |
3 | import com.zionhuang.music.db.entities.LyricsEntity
4 |
5 | object TranslationHelper {
6 | suspend fun translate(lyrics: LyricsEntity): LyricsEntity = lyrics
7 | suspend fun clearModels() {}
8 | }
--------------------------------------------------------------------------------
/app/src/foss/java/com/zionhuang/music/utils/Utils.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.utils
2 |
3 | import com.zionhuang.music.MainActivity
4 | import java.lang.Exception
5 |
6 | fun reportException(throwable: Throwable) {
7 | throwable.printStackTrace()
8 | }
9 |
--------------------------------------------------------------------------------
/app/src/full/java/com/zionhuang/music/utils/Utils.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.utils
2 |
3 | import com.google.firebase.crashlytics.ktx.crashlytics
4 | import com.google.firebase.ktx.Firebase
5 |
6 | fun reportException(throwable: Throwable) {
7 | Firebase.crashlytics.recordException(throwable)
8 | throwable.printStackTrace()
9 | }
10 |
--------------------------------------------------------------------------------
/app/src/main/ic_launcher-playstore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/app/src/main/ic_launcher-playstore.png
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/constants/MediaSessionConstants.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.constants
2 |
3 | import android.os.Bundle
4 | import androidx.media3.session.SessionCommand
5 |
6 | object MediaSessionConstants {
7 | const val ACTION_TOGGLE_LIBRARY = "TOGGLE_LIBRARY"
8 | const val ACTION_TOGGLE_LIKE = "TOGGLE_LIKE"
9 | const val ACTION_TOGGLE_SHUFFLE = "TOGGLE_SHUFFLE"
10 | const val ACTION_TOGGLE_REPEAT_MODE = "TOGGLE_REPEAT_MODE"
11 | val CommandToggleLibrary = SessionCommand(ACTION_TOGGLE_LIBRARY, Bundle.EMPTY)
12 | val CommandToggleLike = SessionCommand(ACTION_TOGGLE_LIKE, Bundle.EMPTY)
13 | val CommandToggleShuffle = SessionCommand(ACTION_TOGGLE_SHUFFLE, Bundle.EMPTY)
14 | val CommandToggleRepeatMode = SessionCommand(ACTION_TOGGLE_REPEAT_MODE, Bundle.EMPTY)
15 | }
16 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/constants/StatPeriod.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.constants
2 |
3 | import java.time.LocalDateTime
4 | import java.time.ZoneOffset
5 |
6 | enum class StatPeriod {
7 | `1_WEEK`, `1_MONTH`, `3_MONTH`, `6_MONTH`, `1_YEAR`, ALL;
8 |
9 | fun toTimeMillis(): Long =
10 | when (this) {
11 | `1_WEEK` -> LocalDateTime.now().minusWeeks(1).toInstant(ZoneOffset.UTC).toEpochMilli()
12 | `1_MONTH` -> LocalDateTime.now().minusMonths(1).toInstant(ZoneOffset.UTC).toEpochMilli()
13 | `3_MONTH` -> LocalDateTime.now().minusMonths(3).toInstant(ZoneOffset.UTC).toEpochMilli()
14 | `6_MONTH` -> LocalDateTime.now().minusMonths(6).toInstant(ZoneOffset.UTC).toEpochMilli()
15 | `1_YEAR` -> LocalDateTime.now().minusMonths(12).toInstant(ZoneOffset.UTC).toEpochMilli()
16 | ALL -> 0
17 | }
18 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/Converters.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db
2 |
3 | import androidx.room.TypeConverter
4 | import java.time.Instant
5 | import java.time.LocalDateTime
6 | import java.time.ZoneOffset
7 |
8 | class Converters {
9 | @TypeConverter
10 | fun fromTimestamp(value: Long?): LocalDateTime? =
11 | if (value != null) LocalDateTime.ofInstant(Instant.ofEpochMilli(value), ZoneOffset.UTC)
12 | else null
13 |
14 | @TypeConverter
15 | fun dateToTimestamp(date: LocalDateTime?): Long? =
16 | date?.atZone(ZoneOffset.UTC)?.toInstant()?.toEpochMilli()
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/Album.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.compose.runtime.Immutable
4 | import androidx.room.Embedded
5 | import androidx.room.Junction
6 | import androidx.room.Relation
7 |
8 | @Immutable
9 | data class Album(
10 | @Embedded
11 | val album: AlbumEntity,
12 | @Relation(
13 | entity = ArtistEntity::class,
14 | entityColumn = "id",
15 | parentColumn = "id",
16 | associateBy = Junction(
17 | value = AlbumArtistMap::class,
18 | parentColumn = "albumId",
19 | entityColumn = "artistId"
20 | )
21 | )
22 | val artists: List,
23 | ) : LocalItem() {
24 | override val id: String
25 | get() = album.id
26 | override val title: String
27 | get() = album.title
28 | override val thumbnailUrl: String?
29 | get() = album.thumbnailUrl
30 | }
31 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/AlbumArtistMap.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.room.ColumnInfo
4 | import androidx.room.Entity
5 | import androidx.room.ForeignKey
6 |
7 | @Entity(
8 | tableName = "album_artist_map",
9 | primaryKeys = ["albumId", "artistId"],
10 | foreignKeys = [
11 | ForeignKey(
12 | entity = AlbumEntity::class,
13 | parentColumns = ["id"],
14 | childColumns = ["albumId"],
15 | onDelete = ForeignKey.CASCADE),
16 | ForeignKey(
17 | entity = ArtistEntity::class,
18 | parentColumns = ["id"],
19 | childColumns = ["artistId"],
20 | onDelete = ForeignKey.CASCADE
21 | )
22 | ]
23 | )
24 | data class AlbumArtistMap(
25 | @ColumnInfo(index = true) val albumId: String,
26 | @ColumnInfo(index = true) val artistId: String,
27 | val order: Int,
28 | )
29 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/AlbumEntity.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.compose.runtime.Immutable
4 | import androidx.room.Entity
5 | import androidx.room.PrimaryKey
6 | import java.time.LocalDateTime
7 |
8 | @Immutable
9 | @Entity(tableName = "album")
10 | data class AlbumEntity(
11 | @PrimaryKey val id: String,
12 | val title: String,
13 | val year: Int? = null,
14 | val thumbnailUrl: String? = null,
15 | val themeColor: Int? = null,
16 | val songCount: Int,
17 | val duration: Int,
18 | val lastUpdateTime: LocalDateTime = LocalDateTime.now(),
19 | val bookmarkedAt: LocalDateTime? = null,
20 | ) {
21 | fun toggleLike() = copy(
22 | bookmarkedAt = if (bookmarkedAt != null) null else LocalDateTime.now()
23 | )
24 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/Artist.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.compose.runtime.Immutable
4 | import androidx.room.Embedded
5 |
6 | @Immutable
7 | data class Artist(
8 | @Embedded
9 | val artist: ArtistEntity,
10 | val songCount: Int,
11 | ) : LocalItem() {
12 | override val id: String
13 | get() = artist.id
14 | override val title: String
15 | get() = artist.name
16 | override val thumbnailUrl: String?
17 | get() = artist.thumbnailUrl
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/ArtistEntity.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.compose.runtime.Immutable
4 | import androidx.room.Entity
5 | import androidx.room.PrimaryKey
6 | import org.apache.commons.lang3.RandomStringUtils
7 | import java.time.LocalDateTime
8 |
9 | @Immutable
10 | @Entity(tableName = "artist")
11 | data class ArtistEntity(
12 | @PrimaryKey val id: String,
13 | val name: String,
14 | val thumbnailUrl: String? = null,
15 | val lastUpdateTime: LocalDateTime = LocalDateTime.now(),
16 | val bookmarkedAt: LocalDateTime? = null,
17 | ) {
18 | val isYouTubeArtist: Boolean
19 | get() = id.startsWith("UC")
20 |
21 | val isLocalArtist: Boolean
22 | get() = id.startsWith("LA")
23 |
24 | fun toggleLike() = copy(
25 | bookmarkedAt = if (bookmarkedAt != null) null else LocalDateTime.now()
26 | )
27 |
28 | companion object {
29 | fun generateArtistId() = "LA" + RandomStringUtils.random(8, true, false)
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/Event.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.compose.runtime.Immutable
4 | import androidx.room.ColumnInfo
5 | import androidx.room.Entity
6 | import androidx.room.ForeignKey
7 | import androidx.room.PrimaryKey
8 | import java.time.LocalDateTime
9 |
10 | @Immutable
11 | @Entity(
12 | tableName = "event",
13 | foreignKeys = [
14 | ForeignKey(
15 | entity = SongEntity::class,
16 | parentColumns = ["id"],
17 | childColumns = ["songId"],
18 | onDelete = ForeignKey.CASCADE
19 | )
20 | ]
21 | )
22 | data class Event(
23 | @PrimaryKey(autoGenerate = true) val id: Long = 0,
24 | @ColumnInfo(index = true) val songId: String,
25 | val timestamp: LocalDateTime,
26 | val playTime: Long,
27 | )
28 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/EventWithSong.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.compose.runtime.Immutable
4 | import androidx.room.Embedded
5 | import androidx.room.Relation
6 |
7 | @Immutable
8 | data class EventWithSong(
9 | @Embedded
10 | val event: Event,
11 | @Relation(
12 | entity = SongEntity::class,
13 | parentColumn = "songId",
14 | entityColumn = "id"
15 | )
16 | val song: Song,
17 | )
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/FormatEntity.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.room.Entity
4 | import androidx.room.PrimaryKey
5 |
6 | @Entity(tableName = "format")
7 | data class FormatEntity(
8 | @PrimaryKey val id: String,
9 | val itag: Int,
10 | val mimeType: String,
11 | val codecs: String,
12 | val bitrate: Int,
13 | val sampleRate: Int?,
14 | val contentLength: Long,
15 | val loudnessDb: Double?,
16 | )
17 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/LocalItem.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | sealed class LocalItem {
4 | abstract val id: String
5 | abstract val title: String
6 | abstract val thumbnailUrl: String?
7 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/LyricsEntity.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.room.Entity
4 | import androidx.room.PrimaryKey
5 |
6 | @Entity(tableName = "lyrics")
7 | data class LyricsEntity(
8 | @PrimaryKey val id: String,
9 | val lyrics: String,
10 | ) {
11 | companion object {
12 | const val LYRICS_NOT_FOUND = "LYRICS_NOT_FOUND"
13 | }
14 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/Playlist.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.compose.runtime.Immutable
4 | import androidx.room.Embedded
5 | import androidx.room.Junction
6 | import androidx.room.Relation
7 |
8 | @Immutable
9 | data class Playlist(
10 | @Embedded
11 | val playlist: PlaylistEntity,
12 | val songCount: Int,
13 | @Relation(
14 | entity = SongEntity::class,
15 | entityColumn = "id",
16 | parentColumn = "id",
17 | projection = ["thumbnailUrl"],
18 | associateBy = Junction(
19 | value = PlaylistSongMapPreview::class,
20 | parentColumn = "playlistId",
21 | entityColumn = "songId"
22 | )
23 | )
24 | val thumbnails: List,
25 | ) : LocalItem() {
26 | override val id: String
27 | get() = playlist.id
28 | override val title: String
29 | get() = playlist.name
30 | override val thumbnailUrl: String?
31 | get() = null
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/PlaylistEntity.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.compose.runtime.Immutable
4 | import androidx.room.Entity
5 | import androidx.room.PrimaryKey
6 | import org.apache.commons.lang3.RandomStringUtils
7 |
8 | @Immutable
9 | @Entity(tableName = "playlist")
10 | data class PlaylistEntity(
11 | @PrimaryKey val id: String = generatePlaylistId(),
12 | val name: String,
13 | val browseId: String? = null,
14 | ) {
15 | companion object {
16 | const val LIKED_PLAYLIST_ID = "LP_LIKED"
17 | const val DOWNLOADED_PLAYLIST_ID = "LP_DOWNLOADED"
18 |
19 | fun generatePlaylistId() = "LP" + RandomStringUtils.random(8, true, false)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/PlaylistSong.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.room.Embedded
4 | import androidx.room.Relation
5 |
6 | data class PlaylistSong(
7 | @Embedded val map: PlaylistSongMap,
8 | @Relation(
9 | parentColumn = "songId",
10 | entityColumn = "id",
11 | entity = SongEntity::class
12 | )
13 | val song: Song,
14 | )
15 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/PlaylistSongMap.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.room.ColumnInfo
4 | import androidx.room.Entity
5 | import androidx.room.ForeignKey
6 | import androidx.room.PrimaryKey
7 |
8 | @Entity(
9 | tableName = "playlist_song_map",
10 | foreignKeys = [
11 | ForeignKey(
12 | entity = PlaylistEntity::class,
13 | parentColumns = ["id"],
14 | childColumns = ["playlistId"],
15 | onDelete = ForeignKey.CASCADE
16 | ),
17 | ForeignKey(
18 | entity = SongEntity::class,
19 | parentColumns = ["id"],
20 | childColumns = ["songId"],
21 | onDelete = ForeignKey.CASCADE)
22 | ]
23 | )
24 | data class PlaylistSongMap(
25 | @PrimaryKey(autoGenerate = true) val id: Int = 0,
26 | @ColumnInfo(index = true) val playlistId: String,
27 | @ColumnInfo(index = true) val songId: String,
28 | val position: Int = 0,
29 | )
30 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/PlaylistSongMapPreview.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.room.ColumnInfo
4 | import androidx.room.DatabaseView
5 |
6 | @DatabaseView(
7 | viewName = "playlist_song_map_preview",
8 | value = "SELECT * FROM playlist_song_map WHERE position <= 3 ORDER BY position")
9 | data class PlaylistSongMapPreview(
10 | @ColumnInfo(index = true) val playlistId: String,
11 | @ColumnInfo(index = true) val songId: String,
12 | val idInPlaylist: Int = 0,
13 | )
14 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/RelatedSongMap.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.room.ColumnInfo
4 | import androidx.room.Entity
5 | import androidx.room.ForeignKey
6 | import androidx.room.PrimaryKey
7 |
8 | @Entity(
9 | tableName = "related_song_map",
10 | foreignKeys = [
11 | ForeignKey(
12 | entity = SongEntity::class,
13 | parentColumns = ["id"],
14 | childColumns = ["songId"],
15 | onDelete = ForeignKey.CASCADE
16 | ),
17 | ForeignKey(
18 | entity = SongEntity::class,
19 | parentColumns = ["id"],
20 | childColumns = ["relatedSongId"],
21 | onDelete = ForeignKey.CASCADE
22 | )
23 | ]
24 | )
25 | data class RelatedSongMap(
26 | @PrimaryKey(autoGenerate = true) val id: Long = 0,
27 | @ColumnInfo(index = true) val songId: String,
28 | @ColumnInfo(index = true) val relatedSongId: String,
29 | )
30 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/SearchHistory.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.room.Entity
4 | import androidx.room.Index
5 | import androidx.room.PrimaryKey
6 |
7 | @Entity(
8 | tableName = "search_history",
9 | indices = [Index(
10 | value = ["query"],
11 | unique = true
12 | )]
13 | )
14 | data class SearchHistory(
15 | @PrimaryKey(autoGenerate = true) val id: Long = 0,
16 | val query: String,
17 | )
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/SongAlbumMap.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.room.ColumnInfo
4 | import androidx.room.Entity
5 | import androidx.room.ForeignKey
6 |
7 | @Entity(
8 | tableName = "song_album_map",
9 | primaryKeys = ["songId", "albumId"],
10 | foreignKeys = [
11 | ForeignKey(
12 | entity = SongEntity::class,
13 | parentColumns = ["id"],
14 | childColumns = ["songId"],
15 | onDelete = ForeignKey.CASCADE),
16 | ForeignKey(
17 | entity = AlbumEntity::class,
18 | parentColumns = ["id"],
19 | childColumns = ["albumId"],
20 | onDelete = ForeignKey.CASCADE
21 | )
22 | ]
23 | )
24 | data class SongAlbumMap(
25 | @ColumnInfo(index = true) val songId: String,
26 | @ColumnInfo(index = true) val albumId: String,
27 | val index: Int,
28 | )
29 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/SongArtistMap.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.room.ColumnInfo
4 | import androidx.room.Entity
5 | import androidx.room.ForeignKey
6 |
7 | @Entity(
8 | tableName = "song_artist_map",
9 | primaryKeys = ["songId", "artistId"],
10 | foreignKeys = [
11 | ForeignKey(
12 | entity = SongEntity::class,
13 | parentColumns = ["id"],
14 | childColumns = ["songId"],
15 | onDelete = ForeignKey.CASCADE),
16 | ForeignKey(
17 | entity = ArtistEntity::class,
18 | parentColumns = ["id"],
19 | childColumns = ["artistId"],
20 | onDelete = ForeignKey.CASCADE
21 | )
22 | ]
23 | )
24 | data class SongArtistMap(
25 | @ColumnInfo(index = true) val songId: String,
26 | @ColumnInfo(index = true) val artistId: String,
27 | val position: Int,
28 | )
29 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/SortedSongAlbumMap.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.room.ColumnInfo
4 | import androidx.room.DatabaseView
5 |
6 | @DatabaseView(
7 | viewName = "sorted_song_album_map",
8 | value = "SELECT * FROM song_album_map ORDER BY `index`")
9 | data class SortedSongAlbumMap(
10 | @ColumnInfo(index = true) val songId: String,
11 | @ColumnInfo(index = true) val albumId: String,
12 | val index: Int,
13 | )
14 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/db/entities/SortedSongArtistMap.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.db.entities
2 |
3 | import androidx.room.ColumnInfo
4 | import androidx.room.DatabaseView
5 |
6 | @DatabaseView(
7 | viewName = "sorted_song_artist_map",
8 | value = "SELECT * FROM song_artist_map ORDER BY position")
9 | data class SortedSongArtistMap(
10 | @ColumnInfo(index = true) val songId: String,
11 | @ColumnInfo(index = true) val artistId: String,
12 | val position: Int,
13 | )
14 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/extensions/CoroutineExt.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.extensions
2 |
3 | import kotlinx.coroutines.CoroutineExceptionHandler
4 | import kotlinx.coroutines.CoroutineScope
5 | import kotlinx.coroutines.flow.Flow
6 | import kotlinx.coroutines.flow.collectLatest
7 | import kotlinx.coroutines.launch
8 |
9 | fun Flow.collect(scope: CoroutineScope, action: suspend (value: T) -> Unit) {
10 | scope.launch {
11 | collect(action)
12 | }
13 | }
14 |
15 | fun Flow.collectLatest(scope: CoroutineScope, action: suspend (value: T) -> Unit) {
16 | scope.launch {
17 | collectLatest(action)
18 | }
19 | }
20 |
21 | val SilentHandler = CoroutineExceptionHandler { _, _ -> }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/extensions/FileExt.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.extensions
2 |
3 | import java.io.File
4 | import java.io.InputStream
5 | import java.io.OutputStream
6 | import java.util.zip.ZipInputStream
7 | import java.util.zip.ZipOutputStream
8 |
9 | operator fun File.div(child: String): File = File(this, child)
10 |
11 | fun InputStream.zipInputStream(): ZipInputStream = ZipInputStream(this)
12 | fun OutputStream.zipOutputStream(): ZipOutputStream = ZipOutputStream(this)
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/extensions/ListExt.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.extensions
2 |
3 | fun List.reversed(reversed: Boolean) = if (reversed) asReversed() else this
4 |
5 | fun MutableList.move(fromIndex: Int, toIndex: Int): MutableList {
6 | add(toIndex, removeAt(fromIndex))
7 | return this
8 | }
9 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/extensions/StringExt.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.extensions
2 |
3 | import androidx.sqlite.db.SimpleSQLiteQuery
4 | import java.net.InetSocketAddress
5 | import java.net.InetSocketAddress.createUnresolved
6 |
7 | inline fun > String?.toEnum(defaultValue: T): T =
8 | if (this == null) defaultValue
9 | else try {
10 | enumValueOf(this)
11 | } catch (e: IllegalArgumentException) {
12 | defaultValue
13 | }
14 |
15 | fun String.toSQLiteQuery(): SimpleSQLiteQuery = SimpleSQLiteQuery(this)
16 |
17 | fun String.toInetSocketAddress(): InetSocketAddress {
18 | val (host, port) = split(":")
19 | return createUnresolved(host, port.toInt())
20 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/extensions/UtilExt.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.extensions
2 |
3 | fun tryOrNull(block: () -> T): T? =
4 | try {
5 | block()
6 | } catch (e: Exception) {
7 | null
8 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/lyrics/KuGouLyricsProvider.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.lyrics
2 |
3 | import android.content.Context
4 | import com.zionhuang.kugou.KuGou
5 | import com.zionhuang.music.constants.EnableKugouKey
6 | import com.zionhuang.music.utils.dataStore
7 | import com.zionhuang.music.utils.get
8 |
9 | object KuGouLyricsProvider : LyricsProvider {
10 | override val name = "Kugou"
11 | override fun isEnabled(context: Context): Boolean =
12 | context.dataStore[EnableKugouKey] ?: true
13 |
14 | override suspend fun getLyrics(id: String, title: String, artist: String, duration: Int): Result =
15 | KuGou.getLyrics(title, artist, duration)
16 |
17 | override suspend fun getAllLyrics(id: String, title: String, artist: String, duration: Int, callback: (String) -> Unit) {
18 | KuGou.getAllLyrics(title, artist, duration, callback)
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/lyrics/LyricsEntry.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.lyrics
2 |
3 | data class LyricsEntry(
4 | val time: Long,
5 | val text: String,
6 | ) : Comparable {
7 | override fun compareTo(other: LyricsEntry): Int = (time - other.time).toInt()
8 |
9 | companion object {
10 | val HEAD_LYRICS_ENTRY = LyricsEntry(0L, "")
11 | }
12 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/lyrics/LyricsProvider.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.lyrics
2 |
3 | import android.content.Context
4 |
5 | interface LyricsProvider {
6 | val name: String
7 | fun isEnabled(context: Context): Boolean
8 | suspend fun getLyrics(id: String, title: String, artist: String, duration: Int): Result
9 | suspend fun getAllLyrics(id: String, title: String, artist: String, duration: Int, callback: (String) -> Unit) {
10 | getLyrics(id, title, artist, duration).onSuccess(callback)
11 | }
12 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/lyrics/YouTubeLyricsProvider.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.lyrics
2 |
3 | import android.content.Context
4 | import com.zionhuang.innertube.YouTube
5 | import com.zionhuang.innertube.models.WatchEndpoint
6 |
7 | object YouTubeLyricsProvider : LyricsProvider {
8 | override val name = "YouTube Music"
9 | override fun isEnabled(context: Context) = true
10 | override suspend fun getLyrics(id: String, title: String, artist: String, duration: Int): Result = runCatching {
11 | val nextResult = YouTube.next(WatchEndpoint(videoId = id)).getOrThrow()
12 | YouTube.lyrics(
13 | endpoint = nextResult.lyricsEndpoint ?: throw IllegalStateException("Lyrics endpoint not found")
14 | ).getOrThrow() ?: throw IllegalStateException("Lyrics unavailable")
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/lyrics/YouTubeSubtitleLyricsProvider.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.lyrics
2 |
3 | import android.content.Context
4 | import com.zionhuang.innertube.YouTube
5 |
6 | object YouTubeSubtitleLyricsProvider : LyricsProvider {
7 | override val name = "YouTube Subtitle"
8 | override fun isEnabled(context: Context) = true
9 | override suspend fun getLyrics(id: String, title: String, artist: String, duration: Int): Result =
10 | YouTube.transcript(id)
11 | }
12 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/models/ItemsPage.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.models
2 |
3 | import com.zionhuang.innertube.models.YTItem
4 |
5 | data class ItemsPage(
6 | val items: List,
7 | val continuation: String?,
8 | )
9 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/models/PersistQueue.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.models
2 |
3 | import java.io.Serializable
4 |
5 | data class PersistQueue(
6 | val title: String?,
7 | val items: List,
8 | val mediaItemIndex: Int,
9 | val position: Long,
10 | ) : Serializable
11 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/models/SimilarRecommendation.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.models
2 |
3 | import com.zionhuang.innertube.models.YTItem
4 | import com.zionhuang.music.db.entities.LocalItem
5 |
6 | data class SimilarRecommendation(
7 | val title: LocalItem,
8 | val items: List,
9 | )
10 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/playback/queues/EmptyQueue.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.playback.queues
2 |
3 | import androidx.media3.common.MediaItem
4 | import com.zionhuang.music.models.MediaMetadata
5 |
6 | object EmptyQueue : Queue {
7 | override val preloadItem: MediaMetadata? = null
8 | override suspend fun getInitialStatus() = Queue.Status(null, emptyList(), -1)
9 | override fun hasNextPage() = false
10 | override suspend fun nextPage() = emptyList()
11 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/playback/queues/ListQueue.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.playback.queues
2 |
3 | import androidx.media3.common.MediaItem
4 | import com.zionhuang.music.models.MediaMetadata
5 |
6 | class ListQueue(
7 | val title: String? = null,
8 | val items: List,
9 | val startIndex: Int = 0,
10 | val position: Long = 0L,
11 | ) : Queue {
12 | override val preloadItem: MediaMetadata? = null
13 | override suspend fun getInitialStatus() = Queue.Status(title, items, startIndex, position)
14 | override fun hasNextPage(): Boolean = false
15 | override suspend fun nextPage() = throw UnsupportedOperationException()
16 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/ui/component/shimmer/ButtonPlaceholder.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.ui.component.shimmer
2 |
3 | import androidx.compose.foundation.background
4 | import androidx.compose.foundation.layout.Spacer
5 | import androidx.compose.foundation.layout.height
6 | import androidx.compose.foundation.shape.RoundedCornerShape
7 | import androidx.compose.material3.ButtonDefaults
8 | import androidx.compose.material3.MaterialTheme
9 | import androidx.compose.runtime.Composable
10 | import androidx.compose.ui.Modifier
11 | import androidx.compose.ui.draw.clip
12 |
13 | @Composable
14 | fun ButtonPlaceholder(
15 | modifier: Modifier = Modifier,
16 | ) {
17 | Spacer(modifier
18 | .height(ButtonDefaults.MinHeight)
19 | .clip(RoundedCornerShape(50))
20 | .background(MaterialTheme.colorScheme.onSurface))
21 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/ui/screens/Screens.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.ui.screens
2 |
3 | import androidx.annotation.DrawableRes
4 | import androidx.annotation.StringRes
5 | import androidx.compose.runtime.Immutable
6 | import com.zionhuang.music.R
7 |
8 | @Immutable
9 | sealed class Screens(
10 | @StringRes val titleId: Int,
11 | @DrawableRes val iconId: Int,
12 | val route: String,
13 | ) {
14 | object Home : Screens(R.string.home, R.drawable.home, "home")
15 | object Songs : Screens(R.string.songs, R.drawable.music_note, "songs")
16 | object Artists : Screens(R.string.artists, R.drawable.artist, "artists")
17 | object Albums : Screens(R.string.albums, R.drawable.album, "albums")
18 | object Playlists : Screens(R.string.playlists, R.drawable.queue_music, "playlists")
19 |
20 | companion object {
21 | val MainScreens = listOf(Home, Songs, Artists, Albums, Playlists)
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/ui/utils/NavControllerUtils.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.ui.utils
2 |
3 | import androidx.compose.ui.util.fastAny
4 | import androidx.navigation.NavController
5 | import com.zionhuang.music.ui.screens.Screens
6 |
7 | fun NavController.backToMain() {
8 | while (!Screens.MainScreens.fastAny { it.route == currentBackStackEntry?.destination?.route }) {
9 | navigateUp()
10 | }
11 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/ui/utils/ShapeUtils.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.ui.utils
2 |
3 | import androidx.compose.foundation.shape.CornerBasedShape
4 | import androidx.compose.foundation.shape.CornerSize
5 | import androidx.compose.ui.unit.dp
6 |
7 | fun CornerBasedShape.top(): CornerBasedShape =
8 | copy(bottomStart = CornerSize(0.dp), bottomEnd = CornerSize(0.dp))
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/ui/utils/StringUtils.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.ui.utils
2 |
3 | import kotlin.math.absoluteValue
4 |
5 | fun formatFileSize(sizeBytes: Long): String {
6 | val prefix = if (sizeBytes < 0) "-" else ""
7 | var result: Long = sizeBytes.absoluteValue
8 | var suffix = "B"
9 | if (result > 900) {
10 | suffix = "KB"
11 | result /= 1024
12 | }
13 | if (result > 900) {
14 | suffix = "MB"
15 | result /= 1024
16 | }
17 | if (result > 900) {
18 | suffix = "GB"
19 | result /= 1024
20 | }
21 | if (result > 900) {
22 | suffix = "TB"
23 | result /= 1024
24 | }
25 | if (result > 900) {
26 | suffix = "PB"
27 | result /= 1024
28 | }
29 | return "$prefix$result $suffix"
30 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/ui/utils/YouTubeUtils.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.ui.utils
2 |
3 | fun String.resize(
4 | width: Int? = null,
5 | height: Int? = null,
6 | ): String {
7 | if (width == null && height == null) return this
8 | "https://lh3\\.googleusercontent\\.com/.*=w(\\d+)-h(\\d+).*".toRegex().matchEntire(this)?.groupValues?.let { group ->
9 | val (W, H) = group.drop(1).map { it.toInt() }
10 | var w = width
11 | var h = height
12 | if (w != null && h == null) h = (w / W) * H
13 | if (w == null && h != null) w = (h / H) * W
14 | return "${split("=w")[0]}=w$w-h$h-p-l90-rj"
15 | }
16 | if (this matches "https://yt3\\.ggpht\\.com/.*=s(\\d+)".toRegex()) {
17 | return "$this-s${width ?: height}"
18 | }
19 | return this
20 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/utils/NetworkUtils.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.utils
2 |
3 | import android.content.Context
4 | import android.net.ConnectivityManager
5 | import android.net.NetworkCapabilities
6 | import androidx.core.content.getSystemService
7 |
8 | fun isInternetAvailable(context: Context): Boolean {
9 | val connectivityManager = context.getSystemService() ?: return false
10 | val activeNetwork = connectivityManager.activeNetwork ?: return false
11 | val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork) ?: return false
12 |
13 | return when {
14 | networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
15 | networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
16 | networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
17 | else -> false
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/utils/Updater.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.utils
2 |
3 | import io.ktor.client.HttpClient
4 | import io.ktor.client.request.get
5 | import io.ktor.client.statement.bodyAsText
6 | import org.json.JSONObject
7 |
8 | object Updater {
9 | private val client = HttpClient()
10 | var lastCheckTime = -1L
11 | private set
12 |
13 | suspend fun getLatestVersionName(): Result = runCatching {
14 | val response = client.get("https://api.github.com/repos/z-huang/InnerTune/releases/latest").bodyAsText()
15 | val json = JSONObject(response)
16 | val versionName = json.getString("name")
17 | lastCheckTime = System.currentTimeMillis()
18 | versionName
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/viewmodels/AccountViewModel.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.viewmodels
2 |
3 | import androidx.lifecycle.ViewModel
4 | import androidx.lifecycle.viewModelScope
5 | import com.zionhuang.innertube.YouTube
6 | import com.zionhuang.innertube.models.PlaylistItem
7 | import com.zionhuang.music.utils.reportException
8 | import dagger.hilt.android.lifecycle.HiltViewModel
9 | import kotlinx.coroutines.flow.MutableStateFlow
10 | import kotlinx.coroutines.launch
11 | import javax.inject.Inject
12 |
13 | @HiltViewModel
14 | class AccountViewModel @Inject constructor() : ViewModel() {
15 | val playlists = MutableStateFlow?>(null)
16 |
17 | init {
18 | viewModelScope.launch {
19 | YouTube.likedPlaylists().onSuccess {
20 | playlists.value = it
21 | }.onFailure {
22 | reportException(it)
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/java/com/zionhuang/music/viewmodels/MoodAndGenresViewModel.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.music.viewmodels
2 |
3 | import androidx.lifecycle.ViewModel
4 | import androidx.lifecycle.viewModelScope
5 | import com.zionhuang.innertube.YouTube
6 | import com.zionhuang.innertube.pages.MoodAndGenres
7 | import com.zionhuang.music.utils.reportException
8 | import dagger.hilt.android.lifecycle.HiltViewModel
9 | import kotlinx.coroutines.flow.MutableStateFlow
10 | import kotlinx.coroutines.launch
11 | import javax.inject.Inject
12 |
13 | @HiltViewModel
14 | class MoodAndGenresViewModel @Inject constructor() : ViewModel() {
15 | val moodAndGenres = MutableStateFlow?>(null)
16 |
17 | init {
18 | viewModelScope.launch {
19 | YouTube.moodAndGenres().onSuccess {
20 | moodAndGenres.value = it
21 | }.onFailure {
22 | reportException(it)
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/add.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/album.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/arrow_back.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/arrow_downward.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/arrow_forward.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/arrow_top_left.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/arrow_upward.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/artist.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/backup.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/bedtime.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/bookmark.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/bookmark_filled.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/cached.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/clear_all.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/close.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/contrast.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/dark_mode.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/delete.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/delete_history.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/discord.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/discover_tune.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/download.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/drag_handle.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/edit.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/equalizer.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/error.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/expand_less.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/expand_more.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/explicit.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/fast_forward.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/favorite.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/format_align_center.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/format_align_left.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/github.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/graphic_eq.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/grid_view.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/history.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/home.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/info.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/input.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/library_add_check.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/library_music.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/list.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/location_on.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/lyrics.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/manage_search.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/more_horiz.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/more_vert.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/music_note.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/navigate_next.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/offline.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/pause.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/person.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/play.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/playlist_add.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/playlist_play.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/playlist_remove.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/queue_music.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/radio.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/radio_button_checked.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/radio_button_unchecked.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/remove.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/repeat.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/repeat_on.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/repeat_one.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/repeat_one_on.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/replay.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/restore.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/search.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/search_off.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/security.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/share.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shortcut_albums.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shortcut_playlists.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shortcut_search.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shortcut_songs.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shuffle.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shuffle_on.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/skip_next.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/skip_previous.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/sliders.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/slow_motion_video.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/storage.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/sync.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/tab.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/translate.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/trending_up.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/tune.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/update.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/volume_up.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/wifi_proxy.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/app/src/main/res/mipmap-hdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/app/src/main/res/mipmap-mdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/values/app_name.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | InnerTune
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFFFFF
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/values/values.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | @drawable/play
5 | @drawable/pause
6 | @drawable/skip_previous
7 | @drawable/skip_next
8 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/automotive_app_desc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/backup_rules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
9 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/data_extraction_rules.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
11 |
14 |
17 |
18 |
19 |
22 |
25 |
28 |
29 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/provider_paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
9 |
12 |
--------------------------------------------------------------------------------
/assets/buymeacoffee.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/assets/buymeacoffee.png
--------------------------------------------------------------------------------
/assets/liberapay.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/assets/liberapay.png
--------------------------------------------------------------------------------
/crowdin.yml:
--------------------------------------------------------------------------------
1 | files:
2 | - source: /app/src/main/res/values/strings.xml
3 | translation: /app/src/main/res/values-%android_code%/strings.xml
4 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ar/full_description.txt:
--------------------------------------------------------------------------------
1 | عميل YouTube Music بتصميم Material 3 لنظام Android
2 |
3 |
المميزات:
4 |
5 | تشغيل الأغاني من يوتيوب / يوتيوب موسيقى بدون إعلانات
6 | تشغيل في الخلفية
7 | البحث عن الأغاني، الفيديوهات، الألبومات، وقوائم التشغيل من يوتيوب ميوزيك
8 | إدارة المكتبة
9 | تخزين وتحميل الأغاني للاستماع بدون إنترنت
10 | كلمات الأغاني المتزامنة
11 | تخطي الصمت
12 | تطبيع الصوت
13 | ثيم ديناميكي
14 | دعم اللغات
15 | دعم أندرويد أوتو
16 | اختيارات سريعة مخصصة
17 | تصميم Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ar/short_description.txt:
--------------------------------------------------------------------------------
1 | عميل YouTube Music بتصميم Material 3 لنظام أندرويد
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/bg/full_description.txt:
--------------------------------------------------------------------------------
1 | Клиент на YouTube Music Material 3 за Android
2 |
3 |
Характеристики:
4 |
5 | - Изпълнение на песни от YT/YT Music без реклами
6 | - Възпроизвеждане във фонов режим
7 | - Търсете песни, видеоклипове, албуми и плейлисти от YouTube Music
8 | - Управление на библиотеката
9 | - Кеширане и изтегляне на песни за офлайн възпроизвеждане
10 | - Синхронизирани текстове
11 | - Пропуснете мълчанието
12 | - Нормализация на звука
13 | - Динамична тема
14 | - Локализация
15 | - Поддръжка на Android Auto
16 | - Персонализирани бързи избори
17 | - Материал 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/bg/short_description.txt:
--------------------------------------------------------------------------------
1 | Клиент на YouTube Music Material 3 за Android
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/bs/full_description.txt:
--------------------------------------------------------------------------------
1 | Materijal 3 YouTube Music klijent za Android
2 |
3 |
Karakteristike:
4 |
5 | - Slušajte pjesme s YT/YT Music bez reklama
6 | - Slušajte u pozadini
7 | - Pretraživanje pjesama, videozapisa, albuma i popisa na YouTube Music-u
8 | - Upravljanje bibliotekom
9 | - Predmemorija i preuzimanje pjesama za izvanmrežno slušanje
10 | - Sinkronizirani tekstovi
11 | - Preskočite tišinu
12 | - Normalizacija zvuka
13 | - Dinamična tema
14 | -Lokalizacija
15 | - Podrška za Android Auto
16 | - Personalizirani brzi odabiri
17 | - Materijal 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/bs/short_description.txt:
--------------------------------------------------------------------------------
1 | Materijal 3 YouTube Music klijent za Android
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/cs-CZ/full_description.txt:
--------------------------------------------------------------------------------
1 | Material 3 klient YouTube Music pro Android
2 |
3 |
Funkce:
4 |
5 | - Přehrávání skladeb z YT / YT Music bez reklam
6 | - Přehrávání na pozadí
7 | - Vyhledávání skladeb, videí, alb a playlistů z YouTube Music
8 | - Správa knihovny
9 | - Mezipaměť a stahování skladeb pro offline přehrávání
10 | - Synchronizované texty
11 | - Přeskakování ticha
12 | - Normalizace zvuku
13 | - Dynamický motiv
14 | - Přeloženo do češtiny
15 | - Podpora Android Auto
16 | - Personalizovaný rychlý výběr
17 | - Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/cs-CZ/short_description.txt:
--------------------------------------------------------------------------------
1 | Material 3 klient YouTube Music pro Android
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/de-DE/full_description.txt:
--------------------------------------------------------------------------------
1 | Ein Material 3 YouTube Music-Client für Android
2 |
3 | <br><b>Funktionen:</b>
4 |
5 | - Songs von YT/YT Music ohne Werbung abspielen
6 | - Hintergrundwiedergabe
7 | - Songs, Videos, Alben und Playlists von YouTube Music suchen
8 | - Bibliotheksverwaltung
9 | - Songs zwischenspeichern und herunterladen für die Offline-Wiedergabe
10 | - Synchronisierte Liedtexte
11 | - Stille überspringen
12 | - Audionormalisierung
13 | - Dynamisches Design
14 | - Lokalisierung
15 | - Android Auto-Unterstützung
16 | - Personalisierte Schnellauswahl
17 | - Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/de-DE/short_description.txt:
--------------------------------------------------------------------------------
1 | Ein Material 3 YouTube Musik-Client für Android
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/el-GR/full_description.txt:
--------------------------------------------------------------------------------
1 | Ένα πρόγραμμα Material 3 YouTube Μουσικής για το Android
2 |
3 |
Λειτουργίες:
4 |
5 | - Αναπαραγωγή τραγουδιών από YT/YT Music χωρίς διαφημίσεις
6 | - Αναπαραγωγή στο παρασκήνιο
7 | - Αναζήτηση τραγουδιών, βίντεο, άλμπουμ και λίστες αναπαραγωγής από το YouTube Music
8 | - Διαχείριση βιβλιοθήκης
9 | - Προσωρινή αποθήκευση και λήψη τραγουδιών για αναπαραγωγή εκτός σύνδεσης
10 | - Συγχρονισμένοι στίχοι
11 | - Παράλειψη σιωπής
12 | - Κανονικοποίηση ήχου
13 | - Δυναμικό θέμα
14 | - Μετάφραση στίχων στην γλώσσα σας
15 | - Υποστήριξη Android Auto
16 | - Εξατομικευμένες γρήγορες επιλογές
17 | - Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/el-GR/short_description.txt:
--------------------------------------------------------------------------------
1 | Ένα πρόγραμμα Material 3 YouTube Μουσικής για το Android
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/10.txt:
--------------------------------------------------------------------------------
1 |
Improved
2 |
3 | * Support Android 13 themed icon (#157)
4 |
5 |
Fixed
6 |
7 | * Fix stream can't be played (#161)
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/11.txt:
--------------------------------------------------------------------------------
1 | In this version, we are using a new library: Innertube, which makes more powerful features possible!
2 | * Browse everything as in YouTube Music
3 | * New home page to browse suggestions and find new music releases
4 | * Search result summary tab
5 | * Loading stream is faster
6 |
7 | Credit: vfsfitvnm/ViMusic, tombulled/innertube, zerodytrash/YouTube-Internal-Clients
8 |
9 | ⚠️ Note: For users upgrading from <0.3.3, please select all songs in your library and do "Refetch" to get thumbnails shown.
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/12.txt:
--------------------------------------------------------------------------------
1 | * Start radio from library songs
2 | * Default open tab setting
3 | * Audio quality setting
4 | * Pause or clear search history
5 | * Backup and restore
6 | * Support SOCKS proxy
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/13.txt:
--------------------------------------------------------------------------------
1 | Music is now renamed to InnerTune!
2 |
3 | - Player redesign
4 | - Queue redesign
5 | - Cache songs
6 | - Stats for nerds
7 | - Persistent queue
8 | - Add built-in playlist (liked, downloaded)
9 | - Set cache limits
10 | - Sort songs by play time
11 | - Customize navigation tabs
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/14.txt:
--------------------------------------------------------------------------------
1 | - Lyrics
2 | - Android Auto support
3 | - Skip silence
4 | - Audio normalization
5 | - Export downloaded songs via SAF
6 | - Improve player view layout
7 | - Add wake lock for player
8 | - Option to hide buttons in player notification
9 | - Delete persistent queue when restoring database
10 | - Show itag in stats for nerds
11 | - Minor changes and fixes
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/15.txt:
--------------------------------------------------------------------------------
1 | Improvement
2 |
3 | - Add shuffle button in Android Auto
4 |
5 | Fixed
6 |
7 | - Fix apostrophe displayed as HTML entity in lyrics #401
8 | - Update YouTube search filter key #436
9 | - Fix #432
10 |
11 | Translation
12 |
13 | - Update Hungarian translation #407 #425
14 | - Add Indonesia translation #415
15 | - Update Simplified Chinese translation #416
16 | - Update Japanese translation #419
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/16.txt:
--------------------------------------------------------------------------------
1 | - New app icon
2 | - Rewrite UI using Jetpack Compose
3 | - Better UI/UX
4 | - Dynamic theme
5 | - Redesigned home screen
6 | - Improved download experience
7 | - New lyrics source: YouTube subtitle
8 | - Show replay button when playing ended
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/17.txt:
--------------------------------------------------------------------------------
1 | - Login support
2 | - Mood & Genres
3 | - Better stats screen
4 | - Bookmark artists
5 | - Minor enhancement and bug fixes
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/18.txt:
--------------------------------------------------------------------------------
1 | - Improve library design
2 | - Lyrics translator (full version only)
3 | - Minor enhancement and bug fixes
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/19.txt:
--------------------------------------------------------------------------------
1 | - Better UI
2 | - Grid layout for albums and playlists
3 | - Minor enhancement and bug fixes
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/20.txt:
--------------------------------------------------------------------------------
1 | - Fix YouTube API changes
2 | - Show library artist albums first in new releases
3 | - More actions in Android Auto
4 | - Long click on back arrow to go to home
5 | - More improvements and fixes
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/21.txt:
--------------------------------------------------------------------------------
1 | - Fix radio not working
2 | - Playlist duplicate warning
3 | - Add LrcLib lyrics provider
4 | - Add marquee
5 | - Add haptic feedback
6 | - Black player in pure black mode
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/22.txt:
--------------------------------------------------------------------------------
1 | - Fix frequent random crash
2 | - Fix crash when searching lyrics
3 | - Upgrade Material 3
4 | - Automatically scroll to the currently playing song in the queue
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/23.txt:
--------------------------------------------------------------------------------
1 | - Discord RPC support
2 | - In-app update checker
3 | - Player text alignment customization
4 | - Exclude downloaded files in auto backup
5 | - Fix random crash
6 | - Other fixes and enhancements
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/24.txt:
--------------------------------------------------------------------------------
1 | - Smoother navigation animation
2 | - Option to hide explicit content
3 | - Add squiggly slider
4 | - Fix album artist error and add refetch album button
5 | - Fix color mismatch
6 | - Other fixes and enhancements
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/25.txt:
--------------------------------------------------------------------------------
1 | - Revamped home screen
2 | - Multi-select in queue and playlists
3 | - Add queue item menu
4 | - Search in playlists
5 | - Option to change grid cell size
6 | - Option to stop music when the app is killed
7 | - Option to auto skip to next song on error
8 | - Click on bottom navigation item again to scroll to top
9 | - Refetch song button
10 | - Fix repetitions in history
11 | - Other fixes and enhancements
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/26.txt:
--------------------------------------------------------------------------------
1 | - Multi-select in library songs, artist songs, albums, and history
2 | - Search in history
3 | - Auto scroll up or down when reordering
4 | - Show other versions of an album
5 | - Add cancel button for download notification
6 | - Better audio normalization
7 | - Option to disable screenshot for privacy
8 | - Option to disable auto-loading more songs
9 | - Other fixes and enhancements
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/5.txt:
--------------------------------------------------------------------------------
1 | * App updater (Preview)
2 | * Share button function in bottom control fragment
3 | * Open YouTube urls by this app #11
4 | * You can now search for YouTube Music albums
5 | * Remove download of a song
6 | * Show channel or playlist name in search fragment title
7 | * Scrollable search filter chip group
8 | * Minor fixes
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/6.txt:
--------------------------------------------------------------------------------
1 |
Fixed
2 |
3 | * Fix YouTube not playing any streams #27, TeamNewPipe/NewPipe#8202
4 | * Fix YouTube age restricted videos being throttled TeamNewPipe/NewPipeExtractor#832
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/7.txt:
--------------------------------------------------------------------------------
1 | * Material You #25
2 | * Dark mode settings
3 | * Show an icon indicating if a song is in your library in search fragment
4 | * Make search filter bar fixed
5 | * Move song downloaded icon to second line
6 | * Smoother transition animation
7 | * Merge artists with same name (#50)
8 | * Minor fixes
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/8.txt:
--------------------------------------------------------------------------------
1 |
Fixed
2 |
3 | * Fix main content resize animation
4 | * Fix dark theme malfunction #69
5 | * Fix renaming an artist can lead to lose songs #75
6 |
7 |
Translation updates
8 |
9 | * Finnish (by @teemue) #67
10 | * Italian (by @airon90) #71
11 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/9.txt:
--------------------------------------------------------------------------------
1 |
Fixed
2 |
3 | * Fix stream can't be played (#148)
4 | * Fix bottom navigation item isn't checked when clicked (#12)
5 |
6 |
Translation updates
7 |
8 | * Korean (by @dongsu8142) #107
9 | * Spanish (by @DD21S) #120
10 | * Japanese (by @HiSubway) #138
11 | * Swedish (by @Itroublve) #143
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/full_description.txt:
--------------------------------------------------------------------------------
1 | A Material 3 YouTube Music client for Android
2 |
3 |
Features:
4 |
5 | - Play songs from YT/YT Music without ads
6 | - Background playback
7 | - Search songs, videos, albums, and playlists from YouTube Music
8 | - Library management
9 | - Cache and download songs for offline playback
10 | - Synchronized lyrics
11 | - Skip silence
12 | - Audio normalization
13 | - Dynamic theme
14 | - Localization
15 | - Android Auto support
16 | - Personalized quick picks
17 | - Material 3
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/fastlane/metadata/android/en-US/images/icon.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/short_description.txt:
--------------------------------------------------------------------------------
1 | A Material 3 YouTube Music client for Android
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/title.txt:
--------------------------------------------------------------------------------
1 | InnerTune
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/11.txt:
--------------------------------------------------------------------------------
1 | En esta versión, estamos usando una nueva biblioteca: Innertube, ¡que hace posible funciones más potentes!
2 | * Navegar todo como en YouTube Music
3 | * Nueva página de inicio para buscar sugerencias y encontrar nuevos lanzamientos musicales
4 | * Resumen de resultados de búsqueda
5 | * La carga del flujo es más rápida
6 |
7 | Crédito: vfsfitvnm/ViMusic, tombulled/innertube, zerodytrash/YouTube-Internal-Clients
8 |
9 | ⚠️ Nota: Para los usuarios que actualicen desde <0.3.3, seleccione todas las canciones de su biblioteca y haga "Recuperar" para que se muestren las miniaturas.
10 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/12.txt:
--------------------------------------------------------------------------------
1 | * Iniciar la radio desde las canciones de la biblioteca
2 | * Configuración de pestaña abierta por defecto
3 | * Configuración de la calidad del audio
4 | * Pausa o borrar el historial de búsqueda
5 | * Copia de seguridad y restauración
6 | * Admite proxy SOCKS
7 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/13.txt:
--------------------------------------------------------------------------------
1 | ¡La aplicación Music ahora se llama InnerTune!
2 |
3 | - Rediseño del reproductor
4 | - Rediseño de la cola
5 | - Almacenar canciones en caché
6 | - Estadísticas para nerds
7 | - Cola persistente
8 | - Añadir listas de reproducción (me gusta, descargadas)
9 | - Establecer límites de caché
10 | - Ordenar canciones por tiempo de reproducción
11 | - Personalizar pestañas de navegación
12 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/14.txt:
--------------------------------------------------------------------------------
1 | - Letras
2 | - Compatibilidad con Android Auto
3 | - Saltar silencio
4 | - Normalización de audio
5 | - Exportar canciones descargadas mediante SAF
6 | - Mejora del diseño de la vista del reproductor
7 | - Añadir bloqueo de despertador para el reproductor
8 | - Opción de ocultar botones en la notificación del reproductor
9 | - Eliminar la cola persistente al restaurar la base de datos
10 | - Mostrar itag en estadísticas para nerds
11 | - Cambios y correcciones menores
12 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/15.txt:
--------------------------------------------------------------------------------
1 | Mejora
2 |
3 | - Añadir botón de reproducción aleatoria en Android Auto
4 |
5 | Corregido
6 |
7 | - Solucionado el apóstrofe que muestra como entidad HTML en letras #401
8 | - Actualización de la clave de filtro de búsqueda de YouTube #436
9 | - Corregido #432
10 |
11 | Traducción
12 |
13 | - Actualización de la traducción al Húngaro #407 #425
14 | - Añadir traducción Indonesia #415
15 | - Actualización de la traducción de Chino simplificado #416
16 | - Actualización de la traducción del Japonés #419
17 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/16.txt:
--------------------------------------------------------------------------------
1 | - Nuevo icono de la aplicación
2 | - Reescritura de la interfaz de usuario con Jetpack Compose
3 | - Mejor UI/UX
4 | - Tema dinámico
5 | - Pantalla de inicio rediseñada
6 | - Experiencia de descarga mejorada
7 | - Nueva fuente de letras: Subtítulos de YouTube
8 | - Mostrar el botón de repetición al finalizar la reproducción
9 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/17.txt:
--------------------------------------------------------------------------------
1 | - Soporte de inicio de sesión
2 | - Estado de ánimo y géneros
3 | - Mejor pantalla de estadísticas
4 | - Artistas favoritos
5 | - Pequeñas mejoras y correcciones de errores
6 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/18.txt:
--------------------------------------------------------------------------------
1 | - Mejorar el diseño de la biblioteca
2 | - Traductor de letras (en versión completa)
3 | - Mejoras menores y corrección de errores
4 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/19.txt:
--------------------------------------------------------------------------------
1 | - Mejor interfaz de usuario
2 | - Diseño de cuadrícula para álbumes y listas de reproducción
3 | - Mejoras menores y corrección de errores
4 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/20.txt:
--------------------------------------------------------------------------------
1 | - Corregir los cambios de la API de YouTube
2 | - Mostrar primero los álbumes de artistas de la biblioteca en las novedades
3 | - Más acciones en Android Auto
4 | - Pulsación larga en la flecha atrás para ir al inicio
5 | - Más mejoras y correcciones
6 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/21.txt:
--------------------------------------------------------------------------------
1 | - Arreglar la radio no funciona
2 | - Aviso de lista de reproducción duplicada
3 | - Añadir proveedor de letras LrcLib
4 | - Añadir marquesina
5 | - Añadir retroalimentación háptica
6 | - Reproductor negro en modo negro puro
7 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/22.txt:
--------------------------------------------------------------------------------
1 | - Corrección de fallos aleatorios frecuentes
2 | - Arreglar fallo al buscar letras
3 | - Actualización Material 3
4 | - Desplazamiento automático a la canción que se está reproduciendo en la cola
5 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/23.txt:
--------------------------------------------------------------------------------
1 | - Compatibilidad con Discord RPC
2 | - Comprobador de actualizaciones en la aplicación
3 | - Personalización de la alineación del texto del reproductor
4 | - Excluir archivos descargados en la copia de seguridad automática
5 | - Corrección de fallos aleatorios
6 | - Otras correcciones y mejoras
7 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/24.txt:
--------------------------------------------------------------------------------
1 | - Animación de navegación más fluida
2 | - Opción para ocultar contenido explícito
3 | - Añadir control deslizante
4 | - Arreglar el error del artista del álbum y añadir un botón para recuperar el álbum
5 | - Corrección del desajuste de colores
6 | - Otras correcciones y mejoras
7 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/25.txt:
--------------------------------------------------------------------------------
1 | - Pantalla de inicio renovada
2 | - Selección múltiple en la cola y las listas de reproducción
3 | - Menú para añadir elementos a la cola
4 | - Búsqueda en listas de reproducción
5 | - Opción de cambiar el tamaño de las celdas de la cuadrícula
6 | - Opción de detener la música al cerrar la aplicación
7 | - Opción de salto automático a la canción siguiente en caso de error
8 | - Vuelve a pulsar en el elemento de navegación inferior para desplazarte a la parte superior
9 | - Botón para recuperar canciones
10 | - Corrección de repeticiones en el historial
11 | - Otras correcciones y mejoras
12 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/26.txt:
--------------------------------------------------------------------------------
1 | - Selección múltiple de canciones en la biblioteca, Historial, álbumes Y artistas
2 | - Búsqueda en el historial
3 | - Desplazamiento automático hacia arriba o abajo al reordenar
4 | - Mostrar otras versiones de un álbum
5 | - Añadir botón de cancelar para la notificación de descarga
6 | - Mejor normalización de audio
7 | - Opción para desactivar capturas de pantalla por privacidad
8 | - Opción para desactivar la Reproducción automática de más canciones
9 | - Otras correcciones y mejoras
10 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/5.txt:
--------------------------------------------------------------------------------
1 | * Actualizador de aplicaciones (Previsualizar)
2 | * Compartir la función del botón en el fragmento de control inferior
3 | * Abrir URL de YouTube por esta aplicación #11
4 | * Ahora puedes buscar álbumes de YouTube Music
5 | * Eliminar la descarga de una canción
6 | * Mostrar el nombre del canal o lista de reproducción en el título del fragmento de búsqueda
7 | * Búsqueda desplazable filtro chip grupo
8 | * Correcciones menores
9 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/6.txt:
--------------------------------------------------------------------------------
1 |
Reparado
2 |
3 | * Se solucionó el problema de que YouTube no reproducía ninguna transmisión #27, TeamNewPipe/NewPipe#8202
4 | * Se soluciona el problema de la limitación de edad de los videos de YouTube TeamNewPipe/NewPipeExtractor#832
5 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/7.txt:
--------------------------------------------------------------------------------
1 | * Material You #25
2 | * Configuración del modo oscuro
3 | * Mostrar un icono indicando si una canción está en su biblioteca en fragmento de búsqueda
4 | * Hacer fija la barra de filtros de búsqueda
5 | * Mover el icono de canción descargada a la segunda línea
6 | * Animación de transición más suave
7 | * Fusionar artistas con el mismo nombre (#50)
8 | * Correcciones menores
9 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/8.txt:
--------------------------------------------------------------------------------
1 |
Reparado
2 |
3 | * Corregir la animación de cambio de tamaño del contenido principal
4 | * Se solucionó el problema del tema oscuro n.° 69
5 | * Se solucionó que cambiar el nombre de un artista pudiera provocar la pérdida de canciones #75
6 |
7 |
Actualizaciones de traducción
8 |
9 | * Finlandés (por @teemue) #67
10 | * Italiano (por @airon90) #71
11 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/changelogs/9.txt:
--------------------------------------------------------------------------------
1 |
Reparado
2 |
3 | * Se solucionó el problema de que la transmisión no se puede reproducir (#148)
4 | * Se solucionó que el elemento de navegación inferior no se marcara al hacer clic (#12)
5 |
6 |
Actualizaciones de traducción
7 |
8 | * Coreano (por @dongsu8142) #107
9 | * Español(por @DD21S) #120
10 | * Japonés (por @HiSubway) #138
11 | * Sueco (por @Itroublve) #143
12 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/full_description.txt:
--------------------------------------------------------------------------------
1 | Un cliente de YouTube Music con Material 3 para Android
2 |
3 |
Características:
4 |
5 | - Reproduce canciones de YT/YT Music sin anuncios
6 | - Reproducción en segundo plano
7 | - Busca canciones, vídeos, álbumes y listas de reproducción de YouTube Music
8 | - Gestión de biblioteca
9 | - Guarda en caché y descarga canciones para reproducirlas sin conexión
10 | - Letras sincronizadas
11 | - Saltar silencio
12 | - Normalización de audio
13 | - Tema dinámico
14 | - Localización
15 | - Compatibilidad con Android Auto
16 | - Selecciones rápidas personalizadas
17 | - Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es/short_description.txt:
--------------------------------------------------------------------------------
1 | Un cliente de YouTube Music con Material 3 para Android
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/et/full_description.txt:
--------------------------------------------------------------------------------
1 | Material 3 põhine YouTube Musicu klient Androidile
2 |
3 |
Funktsionaalsused:
4 |
5 | - Vaata YT/YT Musicu lugusid ilma reklaamideta
6 | - Esitus taustal
7 | - Otsu lugusid, videoid, albumeid ja esitusloendeid YouTube Musicust
8 | - Muusikakogu haldus
9 | - Puhverda ja laadi alla lugusid kasutamiseks vallasrežiimis
10 | - Sünkroniseeritud laulusõnad
11 | - Võimalus jätta vaikus vahele
12 | - Heli normaliseerimine
13 | - Dünaamiline kujundus
14 | - Asukohast sõltuv sisu ja keel
15 | - Android Auto tugi
16 | - Personaliseeritud kiirvalikud
17 | - Material 3 kujundus
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/et/short_description.txt:
--------------------------------------------------------------------------------
1 | Material 3 põhine YouTube Musicu klient Androidile
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fi-FI/full_description.txt:
--------------------------------------------------------------------------------
1 | Material 3 YouTube Music -asiakasohjelma Androidille
2 |
3 |
Ominaisuudet:
4 |
5 | - Toista kappaleita YT/YT Musicista ilman mainoksia
6 | - Taustatoisto
7 | - Hae kappaleita, videoita, albumeja ja soittolistoja YouTube Musicista
8 | - Kirjaston hallinta
9 | - Tallenna välimuistiin ja lataa kappaleita ei-verkkotoistoa varten
10 | - Synkronoidut sanoitukset
11 | - Ohita hiljaisuus
12 | - Äänen normalisointi
13 | - Dynaaminen teema
14 | - Lokalisointi
15 | - Android Auto -tuki
16 | - Henkilökohtaiset pikavalinnat
17 | - Materiaali 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fi-FI/short_description.txt:
--------------------------------------------------------------------------------
1 | Material 3 YouTube Music -asiakasohjelma Androidille
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fr-FR/full_description.txt:
--------------------------------------------------------------------------------
1 | Un client YouTube Music pour Android utilisant Material 3
2 |
3 |
Fonctionnalités :
4 |
5 | - Jouer des titres de YouTube / YouTube Music sans pub
6 | - Lecture en arrière-plan
7 | - Recherche de titres, de vidéos, d'albums et des playlists depuis YouTube Music
8 | - Gestion de la bibliothèque
9 | - Mise en cache et téléchargement des titres pour une lecture hors ligne
10 | - Affichage des paroles en temps réel
11 | - Saute les silences
12 | - Normalisation audio
13 | - Thème dynamique
14 | - Localisation
15 | - Prise en charge d'Android Auto
16 | - Sélection rapide personnalisée
17 | - Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fr-FR/short_description.txt:
--------------------------------------------------------------------------------
1 | Un client YouTube Music pour Android utilisant Material 3
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/hi-IN/full_description.txt:
--------------------------------------------------------------------------------
1 | एंड्रॉयड के लिए एक यूट्यूब म्यूजिक का मटीरीअल ३ से बना पात्र
2 |
3 |
गुंण:
4 |
5 | - प्रचार बिना यूट्यूब और यूट्यूब म्यूजिक से गाने बजाएँ
6 | - ऐप बंद करके बजायें
7 | - गानों , वीडिओ, एलबमों, और चाल सूचियों की खोज करें यूट्यूब म्यूजिक से
8 | - संग्रह प्रबंधन
9 | - ऑफलाइन बजाने के लिए गाने निजी भंडार मे डालें और डाउनलोड करें
10 | - समकालिक गीतिकाव्य
11 | - शांत हिस्सा आगे बढ़ाएं
12 | - प्रबलता सामान्यीकरण
13 | - अनुकूलिक थीम
14 | - स्थानीकरण
15 | - एंड्रॉयड ऑटो मान्य
16 | - खास आपके लिए झटपट चलाने हेतु चुनिंदा गाने
17 | - मटीरीअल ३ से बना
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/hi-IN/short_description.txt:
--------------------------------------------------------------------------------
1 | एंड्रॉयड के लिए एक यूट्यूब म्यूजिक का पात्र
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/hr/full_description.txt:
--------------------------------------------------------------------------------
1 | Materijal 3 YouTube Music klijent za Android
2 |
3 |
Značajke:
4 |
5 | - Reproducirajte pjesme s YT/YT glazbe bez oglasa
6 | - Reprodukcija u pozadini
7 | - Pretraživanje pjesama, videozapisa, albuma i popisa na YouTube Musicu
8 | - Upravljanje knjižnicom
9 | - Predmemorija i preuzimanje pjesama za izvanmrežnu reprodukciju
10 | - Sinkronizirani tekstovi
11 | - Preskoči tišinu
12 | - Normalizacija zvuka
13 | - Dinamička tema
14 | -Lokalizacija
15 | - Podrška za Android Auto
16 | - Personalizirani brzi odabiri
17 | - Materijal 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/hr/short_description.txt:
--------------------------------------------------------------------------------
1 | Materijal 3 YouTube Music klijent za Android
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/id/full_description.txt:
--------------------------------------------------------------------------------
1 | Klien Material 3 YouTube Music untuk Android
2 |
3 | Fitur:
4 |
5 | - Memutar lagu dari YT/YT Music tanpa iklan
6 | - Pemutaran di latar belakang
7 | - Cari lagu, video, album, dan playlist dari YouTube Music
8 | - Pengelolaan pustaka lagu
9 | - Tembolok dan unduh lagu untuk pemutaran offline
10 | - Lirik yang disinkronkan
11 | - Lewati keheningan
12 | - Normalisasi audio
13 | - Tema dinamis
14 | - Penerjemahan lokal
15 | - Dukungan Android Auto
16 | - Pilihan cepat yang dipersonalisasi
17 | - Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/id/short_description.txt:
--------------------------------------------------------------------------------
1 | Klien Material 3 YouTube Music untuk Android
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/it/full_description.txt:
--------------------------------------------------------------------------------
1 | Un client di YouTube Music in Material 3 per Android
2 |
3 |
Caratteristiche:
4 |
5 | - Ascolto dei brani da YT/YT Music senza pubblicità
6 | - Riproduzione in background
7 | - Ricerca dei brani, video, album e playlist da YouTube Music
8 | - Gestione della libreria
9 | - Cache e download dei brani per la riproduzione offline
10 | - Testi sincronizzati
11 | - Salto del silenzio
12 | - Normalizzazione dell'audio
13 | - Tema dinamico
14 | - Varie lingue disponibili
15 | - Supporto per Android Auto
16 | - Scelte rapide personalizzate
17 | - Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/it/short_description.txt:
--------------------------------------------------------------------------------
1 | Un client di YouTube Music in Material 3 per Android
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ja/full_description.txt:
--------------------------------------------------------------------------------
1 | Material 3 を使った Android 用 YouTube Music クライアント
2 |
3 |
機能:
4 |
5 | - YouTubeとYT Music から広告なしで音楽視聴
6 | - バックグラウンドで再生
7 | - YouTube Musicから、曲、アルバム、動画、再生リストを検索
8 | - 音楽のライブラリを管理
9 | - 曲をダウンロードしてオフラインで再生
10 | - 歌詞を同期して表示
11 | - 無音部分を飛ばす
12 | - 音声を正規化
13 | - 動的なテーマ
14 | - 多言語対応
15 | - Android Auto に対応
16 | - あなたにおすすめの曲を提案
17 | - Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ja/short_description.txt:
--------------------------------------------------------------------------------
1 | YouTube Musicから音楽をストリーミング再生するMaterial Designの音楽プレイヤー
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ko/full_description.txt:
--------------------------------------------------------------------------------
1 | Android용 Material 3 YouTube Music 클라이언트
2 |
3 |
기능
4 |
5 | - YT/YT Music의 곡을 광고 없이 재생
6 | - 백그라운드 재생
7 | - YouTube Music의 음악, 동영상, 앨범, 재생목록 검색
8 | - 보관함 관리
9 | - 오프라인 재생을 위해 음악 캐시 및 다운로드
10 | - 실시간 가사
11 | - 무음 구간 건너뛰기
12 | - 오디오 노멀라이즈
13 | - 동적 테마
14 | - 현지화
15 | - Android Auto 지원
16 | - 개인화된 추천
17 | - Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ko/short_description.txt:
--------------------------------------------------------------------------------
1 | Android용 Material 3 YouTube Music 클라이언트
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/nl-NL/full_description.txt:
--------------------------------------------------------------------------------
1 | Een Material 3 YouTube Muziek-client voor Android
2 |
3 |
Functies:
4 |
5 | - Nummers van YT/YT Music afspelen zonder advertenties
6 | - Afspelen op achtergrond
7 | - Zoek nummers, video's, albums en afspeellijsten van YouTube Muziek
8 | - Bibliotheekbeheer
9 | - Nummers opslaan en downloaden voor offline afspelen
10 | - Gesynchroniseerde songteksten
11 | - Stilte overslaan
12 | - Audionormalisatie
13 | - Dynamisch thema
14 | - Lokalisatie
15 | - Android Auto ondersteuning
16 | - Gepersonaliseerde snelkeuzes
17 | - Materiaal 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/nl-NL/short_description.txt:
--------------------------------------------------------------------------------
1 | Een Material 3 YouTube Muziek-client voor Android
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/no-NO/full_description.txt:
--------------------------------------------------------------------------------
1 | En Material 3 YouTube Music-klient for Android
2 |
3 |
Funksjoner:
4 |
5 | - Spill sanger fra YouTube og YouTube Music uten reklame
6 | - Avspilling i bakgrunnen
7 | - Søk etter sanger, videoer, album, og spillelister fra YouTube Music
8 | - Bibliotekshåndtering
9 | - Hurtiglagring og lagring av sanger for frakoblet avspilling
10 | - Synkroniserte sangtekster
11 | - Hopp over stillhet
12 | - Audionormalisering
13 | - Dynamisk tema
14 | - Lokalisering
15 | - Støtte for Android Auto
16 | - Tilpassede hurtigvalg
17 | - Materiell 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/no-NO/short_description.txt:
--------------------------------------------------------------------------------
1 | En YouTube Music-klient i Materiell-3-stil for Android
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pa/full_description.txt:
--------------------------------------------------------------------------------
1 | ਇਸ ਐਪ ਦੇ ਨਾਲ, ਤੁਸੀਂ ਇੱਕ ਮੁਫਤ ਸੰਗੀਤ ਸਟ੍ਰੀਮਿੰਗ ਸੇਵਾ ਪ੍ਰਾਪਤ ਕਰਨ ਜਾ ਰਹੇ ਹੋ। ਤੁਸੀਂ ਯੂਟਿਊਬ ਮਿਊਜ਼ਕ ਤੋਂ ਸੰਗੀਤ ਸੁਣ ਸਕਦੇ ਹੋ ਅਤੇ ਆਪਣੀ ਖੁਦ ਦੀ ਲਾਇਬ੍ਰੇਰੀ ਬਣਾ ਸਕਦੇ ਹੋ। ਇਸ ਤੋਂ ਇਲਾਵਾ, ਆਫਲਾਈਨ ਪਲੇਬੈਕ ਲਈ ਗਾਣੇ ਡਾਊਨਲੋਡ ਕੀਤੇ ਜਾ ਸਕਦੇ ਹਨ। ਤੁਸੀਂ ਆਪਣੇ ਗੀਤਾਂ ਨੂੰ ਸੰਗਠਿਤ ਕਰਨ ਲਈ ਪਲੇਲਿਸਟਾਂ ਵੀ ਬਣਾ ਸਕਦੇ ਹੋ। ਇਨਰਟਿਊਨ ਦਾ ਉਦੇਸ਼ ਹਰ ਕਿਸੇ ਨੂੰ ਬਿਨਾਂ ਕਿਸੇ ਕੀਮਤ 'ਤੇ ਵਰਤੋਂ-ਵਿੱਚ-ਆਸਾਨ, ਵਿਹਾਰਕ ਅਤੇ ਵਿਗਿਆਪਨ-ਮੁਕਤ ਐਪਲੀਕੇਸ਼ਨ ਦੁਆਰਾ ਸੰਗੀਤ ਸੁਣਨ ਦੇ ਯੋਗ ਬਣਾਉਣਾ ਹੈ।
2 |
3 |
ਨੋਟ:
4 |
5 | ਪ੍ਰੋਜੈਕਟ ਇਸ ਸਮੇਂ ਇੱਕ ਅਸਥਿਰ ਪੜਾਅ ਵਿੱਚ ਹੈ। ਜੇਕਰ ਤੁਹਾਨੂੰ ਬੱਗ ਨਜ਼ਰ ਆਉਂਦੇ ਹਨ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ ਗਿਟਹੱਬਉੱਪਰ ਕੋਈ ਸਮੱਸਿਆ ਖੋਲ੍ਹ ਕੇ ਰਿਪੋਰਟ ਕਰੋ।
6 |
7 |
ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ:
8 |
9 | * ਬਿਨਾਂ ਵਿਗਿਆਪਨਾਂ ਦੇ ਗੀਤ ਚਲਾਓ
10 | * ਔਫਲਾਈਨ ਪਲੇਬੈਕ ਲਈ ਸੰਗੀਤ ਡਾਊਨਲੋਡ ਕਰੋ
11 | * ਲੋਕਲ ਲਾਇਬ੍ਰੇਰੀ ਪ੍ਰਬੰਧ
12 | * ਗੀਤ ਕੈਸ਼ੇ ਕਰੋ
13 | * ਸਮਵਰਤੀ ਬੋਲ
14 | * ਆਡੀਓ ਨਾਰਮੇਲਾਈਜ਼ੇਸ਼ਨ
15 | * ਚੁੱਪ ਨੂੰ ਅੱਗੇ ਲੰਘਾਓ
16 | * ਬੈਕਅੱਪ ਅਤੇ ਰੀਸਟੋਰ
17 | * ਪ੍ਰੌਕਸੀ ਸਮਰਥਨ
18 | * ਐਂਡਰਾਇਡ ਆਟੋ ਦਾ ਸਮਰਥਨ
19 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pa/short_description.txt:
--------------------------------------------------------------------------------
1 | ਇੱਕ ਮਟੀਰੀਅਲ ਡਿਜ਼ਾਈਨ ਵਾਲਾ ਯੂਟਿਊਬ ਮਿਊਜ਼ਕ ਕਲਾਈਂਟ
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pl-PL/full_description.txt:
--------------------------------------------------------------------------------
1 | Aplikacja YouTube Music wykorzystująca Material 3
2 |
3 |
Funkcje:
4 |
5 | - Odtwarzanie piosenek z YouTube/YouTube Music bez reklam
6 | - Odtwarzanie w tle
7 | - Wyszukiwanie piosenek, filmów, albumów i playlist w YouTube Music
8 | - Zarządzanie biblioteką
9 | - Pobieranie i przechowywanie piosenek w pamięci podręcznej umożliwiające odtwarzanie offline
10 | - Zsynchronizowane wyświetlanie tekstów
11 | - Pomijanie ciszy
12 | - Normalizacja głośności
13 | - Dynamiczny wygląd
14 | - Obsługa wielu języków
15 | - Wsparcie dla Android Auto
16 | - Dopasowane rekomendacje
17 | - Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pl-PL/short_description.txt:
--------------------------------------------------------------------------------
1 | Aplikacja YouTube Music wykorzystująca Material 3
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-BR/changelogs/19.txt:
--------------------------------------------------------------------------------
1 | - IU melhorada
2 | - Layout de grade para álbuns e playlists
3 | - Pequenas melhoras e correção de bugs
4 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-BR/changelogs/23.txt:
--------------------------------------------------------------------------------
1 | - Suporte ao Discord RPC
2 | - Verificação de atualizações no app
3 | - Customização do alinhamento do texto do reprodutor
4 | - Downloads agora são excluídos do backup do Android
5 | - Corrigir um crash aleatório
6 | - Outras correções e melhorias
7 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-BR/full_description.txt:
--------------------------------------------------------------------------------
1 | Um cliente do YouTube Music em Material 3 para Android
2 |
3 |
Recursos:
4 |
5 | - Toque músicas do YT/YT Music sem anúncios
6 | - Reprodução em segundo plano
7 | - Pesquise músicas, vídeos, álbuns, e playlists do YouTube Music
8 | - Gerenciamento de biblioteca
9 | - Download e cache de músicas para reprodução off-line
10 | - Letras sincronizadas
11 | - Pular o silêncio em músicas
12 | - Normalização do áudio
13 | - Tema dinâmico
14 | - Tradução (^^)
15 | - Suporte ao Android Auto
16 | - Escolhas rápidas personalizadas
17 | - Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-BR/short_description.txt:
--------------------------------------------------------------------------------
1 | Um cliente do YouTube Music em Material 3 para Android
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt/full_description.txt:
--------------------------------------------------------------------------------
1 | Um reprodutor de música YouTube Music para Android
2 |
3 |
Funcionalidades:
4 |
5 | - Reprodução de músicas no YouTube/YouTube Music sem anúncios
6 | - Reprodução em segundo plano
7 | - Pesquisa de músicas, vídeos, álbuns e listas de reprodução direto de YT Music
8 | - Gestão de biblioteca
9 | - Descarga de músicas para reprodução offline
10 | - Letras sincronizadas
11 | - Ignorar silêncio em músicas
12 | - Normalização de áudio
13 | - Tema dinâmico
14 | - Localização
15 | - Suporte a Android Auto
16 | - Recomendações personalizadas
17 | - Interface Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt/short_description.txt:
--------------------------------------------------------------------------------
1 | Cliente Android Material 3 para Youtube Music
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ru-RU/full_description.txt:
--------------------------------------------------------------------------------
1 | Клиент YouTube Music для Android в стиле Material 3
2 |
3 |
Особенности:
4 |
5 | - Воспроизведение песен с YT/YT Music без рекламы
6 | - Фоновое воспроизведение
7 | - Поиск песен, видео, альбомов и плейлистов в YouTube Music
8 | - Управление библиотекой
9 | - Кэширование и загрузка песен для офлайн-воспроизведения
10 | - Синхронизированный текст песен
11 | - Пропуск тишины
12 | - Нормализация аудио
13 | - Динамическая тема
14 | - Локализация
15 | - Поддержка Android Auto
16 | - Персонализированные быстрые выборки
17 | - Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ru-RU/short_description.txt:
--------------------------------------------------------------------------------
1 | Клиент YouTube Music для Android в стиле Material 3
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/sr-Latn/full_description.txt:
--------------------------------------------------------------------------------
1 | Material 3 YouTube Music klijent za Android
2 |
3 |
Karakteristike.
4 |
5 | -Slušajte pesme sa YT/YT Music-a bez reklama
6 | -Slušajte u pozadini
7 | -Pretražujte pesme, videe, albume, i plejliste sa YouTube Music-a
8 | -Menadzment biblioteke
9 | -Keš i preuzete pesme za oflajn slušanje
10 | -Sinhronizovan tekst
11 | -Preskočite tišinu
12 | -Normalizacija zvuka
13 | -Dinamična tema
14 | -Lokalizacija
15 | -Podrška za Android Auto
16 | -Personalizovani brzi izbori
17 | -Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/sr-Latn/short_description.txt:
--------------------------------------------------------------------------------
1 | Material 3 YouTube Music klijent za Android
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/tr/changelogs/11.txt:
--------------------------------------------------------------------------------
1 | Bu sürümde daha güçlü özelliklere sahip yeni bir kütüphane kullanıyoruz!
2 | *Her şeyi Youtube Music kullanıyor gibi kullanın.
3 | *Yeni çıkan müzikleri ve önerilenleri keşfetmek için yeni ana menü
4 | *Arama sonucu özet sekmesi
5 | *Yayın yükleme hızı arttırıldı
6 |
7 | *Kredi: vfsfitvnm/ViMusic, tombulled/innertube, zerodytrash/YouTube-Internal-Clients
8 |
9 | Not: 0.3.3 sürümünden güncelleyen kullanıcılar, thumbnail görüntülemek için lütfen kitaplığınızdaki tüm şarkıları seçin ve “Yeniden Getir” tuşuna basın.
10 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/tr/changelogs/12.txt:
--------------------------------------------------------------------------------
1 | *Kütüphaneden, radyo özelliğini başlatma
2 | *Varsayılan başlangıç sekmesi
3 | *Ses kalitesi ayarı
4 | *Arama geçmişi durdurma ve temizleme
5 | *Yedekle ve geri yükle
6 | *SOCKS proxy desteği
7 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/tr/changelogs/13.txt:
--------------------------------------------------------------------------------
1 | Müziğin ismi artık InnerTune oldu!
2 |
3 | -Oynatma arayüzü değiştirildi
4 | -Çalma sırası değiştirildi
5 | -Meraklısı için istatistikler
6 | -Kalıcı çalma sırası
7 | -Dahili oynatma listesi (beğenilenler, indirilenler)
8 | -Önbellek sınırı ayarlama
9 | -En son çalmaya göre sıralama
10 | -Navigasyon sekmelerini kişiselleştirme
11 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/tr/changelogs/14.txt:
--------------------------------------------------------------------------------
1 | -Altyazılar
2 | -Android Auto desteği
3 | -Sessizliği atla özelliği
4 | -Ses normalleştirme özelliği
5 | -SAF üzerinden indirilen müzikleri dışa aktarma
6 | -Oynatıcı görüntüsünde geliştirmeler
7 | -Oynatıcıya uyanma kilidi ekle
8 | -Oynatıcı bildirimini gizleme ayarı
9 | -Yedek geri yüklendiğinde çalma listesindeki kalıcı müziği silme
10 | -Meraklısı için istatistiklerde itag eklendi
11 | -Diğer ufak değişikliler ve düzeltmeler
12 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/tr/full_description.txt:
--------------------------------------------------------------------------------
1 | Android için bir Materyal 3 YouTube Müzik istemcisi
2 |
3 |
Özellikler:
4 |
5 | - YT/YT Müzik'teki şarkıları reklamsız dinleyin
6 | - Arka planda oynatma
7 | - YouTube Müzik'te şarkı, video, albüm ve çalma listesi arama
8 | - Kütüphane yönetimi
9 | - Çevrimdışı çalmak için şarkıları önbelleğe alma ve indirme
10 | - Senkronize şarkı sözleri
11 | - Sessizliği atlama
12 | - Ses normalleştirme
13 | - Dinamik tema
14 | - Yerelleştirme
15 | - Android Auto desteği
16 | - Kişiselleştirilmiş hızlı seçimler
17 | - Material 3 Tasarım
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/tr/short_description.txt:
--------------------------------------------------------------------------------
1 | Android için bir Material 3 tasarımlı YouTube Müzik istemcisi
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/uk-UA/full_description.txt:
--------------------------------------------------------------------------------
1 | Клієнт YouTube Music для Android у стилі Material 3
2 |
3 | Особливості:
4 |
5 | - Відтворення пісень з YT/YT Music без реклами
6 | - Фонове відтворення
7 | - Пошук пісень, відео, альбомів та плейлистів в YouTube Music
8 | - Керування бібліотекою
9 | - Кешування та завантаження пісень для офлайн-відтворення
10 | - Синхронізований текст пісень
11 | - Пропуск тиші
12 | - Нормалізація аудіо
13 | - Динамічна тема
14 | - Локалізація
15 | - Підтримка Android Auto
16 | - Персоналізовані швидкі вибірки
17 | - Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/uk-UA/short_description.txt:
--------------------------------------------------------------------------------
1 | Клієнт YouTube Music для Android у стилі Material 3
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/vi/full_description.txt:
--------------------------------------------------------------------------------
1 | Ứng dụng YouTube Music Material 3 dành cho Android
2 |
3 |
Tính năng:
4 |
5 | - Phát bài hát từ YT/YT Music không có quảng cáo
6 | - Phát lại trong nền
7 | - Tìm kiếm bài hát, video, album và danh sách phát từ YouTube Music
8 | - Quản lý thư viện
9 | - Bộ đệm và tải xuống bài hát để phát lại ngoại tuyến
10 | - Đồng bộ lời bài hát
11 | - Bỏ qua khoảng lặng
12 | - Chuẩn hóa âm lượng
13 | - Chủ đề động
14 | - Bản địa hóa
15 | - Hỗ trợ Android Auto
16 | - Chọn nhanh được cá nhân hóa
17 | - Material 3
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/vi/short_description.txt:
--------------------------------------------------------------------------------
1 | Ứng dụng YouTube Music Material 3 dành cho Android
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/zh-CN/full_description.txt:
--------------------------------------------------------------------------------
1 | 适用于 Android 的 YouTube Music 客户端,采用 Material 3 设计
2 |
3 |
特点:
4 |
5 | - 无广告播放 YouTube/YouTube Music 中的歌曲
6 | - 后台播放
7 | - 从 YouTube Music 搜索歌曲、视频、专辑和播放列表
8 | - 媒体库管理
9 | - 缓存和下载歌曲以供离线播放
10 | - 同步歌词
11 | - 跳过无声片段
12 | - 标准化音量
13 | - 动态主题
14 | - 良好的本地化
15 | - 支持 Android Auto
16 | - 个性化歌曲快选
17 | - Material 3 设计
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/zh-CN/short_description.txt:
--------------------------------------------------------------------------------
1 | 适用于 Android 的 YouTube Music 客户端,采用 Material 3 设计
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/zh-TW/full_description.txt:
--------------------------------------------------------------------------------
1 | 一個 YouTube Music 用戶端,使用 Material 3 風格
2 |
3 |
功能:
4 |
5 | - 無廣告播放 Youtube/Youtube Music 中的歌曲
6 | - 背景播放
7 | - 搜尋歌曲、影片、專輯和播放清單
8 | - 可下載並離線播放
9 | - 同步歌詞
10 | - 跳過無聲片段
11 | - 標準化音量
12 | - 動態主題
13 | - 支援 Android Auto
14 | - 個人化推薦曲目
15 | - Material 3 風格
16 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/zh-TW/short_description.txt:
--------------------------------------------------------------------------------
1 | 一個 YouTube Music 用戶端,使用 Material 3 設計
2 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | ## For more details on how to configure your build environment visit
2 | # http://www.gradle.org/docs/current/userguide/build_environment.html
3 | #
4 | # Specifies the JVM arguments used for the daemon process.
5 | # The setting is particularly useful for tweaking memory settings.
6 | # Default value: -Xmx1024m -XX:MaxPermSize=256m
7 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
8 | #
9 | # When configured, Gradle will run in incubating parallel mode.
10 | # This option should only be used with decoupled projects. More details, visit
11 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
12 | # org.gradle.parallel=true
13 | #Sat Nov 19 15:59:34 CST 2022
14 |
15 | org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M"
16 | android.useAndroidX=true
17 | android.enableJetifier=true
18 | org.gradle.unsafe.configuration-cache=true
19 | android.nonTransitiveRClass=false
20 | android.nonFinalResIds=false
21 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/z-huang/InnerTune/f053fada983d5a1d348402843bf84e37af5b5b52/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Tue Oct 04 14:57:57 CST 2022
2 | distributionBase=GRADLE_USER_HOME
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
4 | distributionPath=wrapper/dists
5 | zipStorePath=wrapper/dists
6 | zipStoreBase=GRADLE_USER_HOME
7 |
--------------------------------------------------------------------------------
/innertube/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/innertube/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | kotlin("jvm")
3 | @Suppress("DSL_SCOPE_VIOLATION")
4 | alias(libs.plugins.kotlin.serialization)
5 | }
6 |
7 | kotlin {
8 | jvmToolchain(17)
9 | }
10 |
11 | dependencies {
12 | implementation(libs.ktor.client.core)
13 | implementation(libs.ktor.client.okhttp)
14 | implementation(libs.ktor.client.content.negotiation)
15 | implementation(libs.ktor.serialization.json)
16 | implementation(libs.ktor.client.encoding)
17 | implementation(libs.brotli)
18 | testImplementation(libs.junit)
19 | }
--------------------------------------------------------------------------------
/innertube/src/main/java/com/zionhuang/innertube/encoder/BrotliEncoder.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.innertube.encoder
2 |
3 | import io.ktor.client.plugins.compression.*
4 | import io.ktor.utils.io.*
5 | import io.ktor.utils.io.jvm.javaio.*
6 | import kotlinx.coroutines.CoroutineScope
7 | import org.brotli.dec.BrotliInputStream
8 |
9 | object BrotliEncoder : ContentEncoder {
10 | override val name: String = "br"
11 |
12 | override fun CoroutineScope.decode(source: ByteReadChannel): ByteReadChannel =
13 | BrotliInputStream(source.toInputStream()).toByteReadChannel()
14 |
15 | override fun CoroutineScope.encode(source: ByteReadChannel): ByteReadChannel =
16 | throw UnsupportedOperationException("Encode not implemented by the library yet.")
17 | }
18 |
19 | fun ContentEncoding.Config.brotli(quality: Float? = null) {
20 | customEncoder(BrotliEncoder, quality)
21 | }
--------------------------------------------------------------------------------
/innertube/src/main/java/com/zionhuang/innertube/models/AccountInfo.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.innertube.models
2 |
3 | data class AccountInfo(
4 | val name: String,
5 | val email: String?,
6 | val channelHandle: String?,
7 | )
8 |
--------------------------------------------------------------------------------
/innertube/src/main/java/com/zionhuang/innertube/models/AutomixPreviewVideoRenderer.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.innertube.models
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class AutomixPreviewVideoRenderer(
7 | val content: Content,
8 | ) {
9 | @Serializable
10 | data class Content(
11 | val automixPlaylistVideoRenderer: AutomixPlaylistVideoRenderer,
12 | ) {
13 | @Serializable
14 | data class AutomixPlaylistVideoRenderer(
15 | val navigationEndpoint: NavigationEndpoint,
16 | )
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/innertube/src/main/java/com/zionhuang/innertube/models/Badges.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.innertube.models
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class Badges(
7 | val musicInlineBadgeRenderer: MusicInlineBadgeRenderer?,
8 | ) {
9 | @Serializable
10 | data class MusicInlineBadgeRenderer(
11 | val icon: Icon,
12 | )
13 | }
14 |
--------------------------------------------------------------------------------
/innertube/src/main/java/com/zionhuang/innertube/models/Button.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.innertube.models
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class Button(
7 | val buttonRenderer: ButtonRenderer,
8 | ) {
9 | @Serializable
10 | data class ButtonRenderer(
11 | val text: Runs,
12 | val navigationEndpoint: NavigationEndpoint?,
13 | val command: NavigationEndpoint?,
14 | val icon: Icon?,
15 | )
16 | }
--------------------------------------------------------------------------------
/innertube/src/main/java/com/zionhuang/innertube/models/Context.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.innertube.models
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class Context(
7 | val client: Client,
8 | val thirdParty: ThirdParty? = null,
9 | ) {
10 | @Serializable
11 | data class Client(
12 | val clientName: String,
13 | val clientVersion: String,
14 | val osVersion: String?,
15 | val gl: String,
16 | val hl: String,
17 | val visitorData: String?,
18 | )
19 |
20 | @Serializable
21 | data class ThirdParty(
22 | val embedUrl: String,
23 | )
24 | }
25 |
--------------------------------------------------------------------------------
/innertube/src/main/java/com/zionhuang/innertube/models/Continuation.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.innertube.models
2 |
3 | import kotlinx.serialization.ExperimentalSerializationApi
4 | import kotlinx.serialization.Serializable
5 | import kotlinx.serialization.json.JsonNames
6 |
7 | @OptIn(ExperimentalSerializationApi::class)
8 | @Serializable
9 | data class Continuation(
10 | @JsonNames("nextContinuationData", "nextRadioContinuationData")
11 | val nextContinuationData: NextContinuationData?,
12 | ) {
13 | @Serializable
14 | data class NextContinuationData(
15 | val continuation: String,
16 | )
17 | }
18 |
--------------------------------------------------------------------------------
/innertube/src/main/java/com/zionhuang/innertube/models/GridRenderer.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.innertube.models
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class GridRenderer(
7 | val header: Header?,
8 | val items: List- ,
9 | val continuations: List?,
10 | ) {
11 | @Serializable
12 | data class Header(
13 | val gridHeaderRenderer: GridHeaderRenderer,
14 | ) {
15 | @Serializable
16 | data class GridHeaderRenderer(
17 | val title: Runs,
18 | )
19 | }
20 |
21 | @Serializable
22 | data class Item(
23 | val musicNavigationButtonRenderer: MusicNavigationButtonRenderer?,
24 | val musicTwoRowItemRenderer: MusicTwoRowItemRenderer?,
25 | )
26 | }
27 |
--------------------------------------------------------------------------------
/innertube/src/main/java/com/zionhuang/innertube/models/Icon.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.innertube.models
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class Icon(
7 | val iconType: String,
8 | )
--------------------------------------------------------------------------------
/innertube/src/main/java/com/zionhuang/innertube/models/MusicCardShelfRenderer.kt:
--------------------------------------------------------------------------------
1 | package com.zionhuang.innertube.models
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class MusicCardShelfRenderer(
7 | val title: Runs,
8 | val subtitle: Runs,
9 | val thumbnail: ThumbnailRenderer,
10 | val header: Header,
11 | val contents: List?,
12 | val buttons: List