├── .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