├── app ├── CMakeLists.txt ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── resources.properties │ │ │ ├── values-es-rUS │ │ │ │ └── strings.xml │ │ │ ├── values-nb-rNO │ │ │ │ └── strings.xml │ │ │ ├── drawable │ │ │ │ ├── casa.webp │ │ │ │ ├── loudly_picutre_1.jpg │ │ │ │ ├── loudly_picutre_2.jpg │ │ │ │ ├── loudly_picutre_3.jpg │ │ │ │ ├── loudly_picutre_4.jpg │ │ │ │ ├── loudly_picutre_5.jpg │ │ │ │ ├── loudly_picutre_6.jpg │ │ │ │ ├── app_widget_background.xml │ │ │ │ ├── app_widget_inner_view_background.xml │ │ │ │ ├── widget_album_art_background.xml │ │ │ │ ├── album_art_gradient.xml │ │ │ │ ├── signal_cellular_alt.xml │ │ │ │ ├── home_filled.xml │ │ │ │ ├── widget_icon_background.xml │ │ │ │ ├── remove.xml │ │ │ │ ├── wifi.xml │ │ │ │ ├── widget_background.xml │ │ │ │ ├── tag.xml │ │ │ │ ├── widget_control_chip_background.xml │ │ │ │ ├── arrow_upward.xml │ │ │ │ ├── arrow_downward.xml │ │ │ │ ├── arrow_top_left.xml │ │ │ │ ├── navigate_next.xml │ │ │ │ ├── headphones.xml │ │ │ │ ├── logout.xml │ │ │ │ ├── arrow_forward.xml │ │ │ │ ├── save.xml │ │ │ │ ├── content_copy.xml │ │ │ │ ├── notification_on.xml │ │ │ │ ├── download_done.xml │ │ │ │ ├── security.xml │ │ │ │ ├── shortcut_songs.xml │ │ │ │ ├── play.xml │ │ │ │ ├── bookmark.xml │ │ │ │ ├── music_note.xml │ │ │ │ ├── explore_filled.xml │ │ │ │ ├── nav_bar.xml │ │ │ │ ├── add_link.xml │ │ │ │ ├── shuffle.xml │ │ │ │ ├── sliders.xml │ │ │ │ ├── format_align_center.xml │ │ │ │ ├── add.xml │ │ │ │ ├── arrow_back.xml │ │ │ │ ├── close.xml │ │ │ │ ├── drag_handle.xml │ │ │ │ ├── notifications_off.xml │ │ │ │ ├── playlist_remove.xml │ │ │ │ ├── rounded_corner.xml │ │ │ │ ├── account_circle.xml │ │ │ │ ├── ic_autorenew.xml │ │ │ │ ├── contrast.xml │ │ │ │ ├── format_align_left.xml │ │ │ │ ├── home_outlined.xml │ │ │ │ ├── boosty.xml │ │ │ │ ├── wifi_off.xml │ │ │ │ ├── gradient.xml │ │ │ │ ├── edit.xml │ │ │ │ ├── library_music_filled.xml │ │ │ │ ├── search.xml │ │ │ │ ├── trending_up.xml │ │ │ │ ├── high_quality.xml │ │ │ │ ├── skip_next.xml │ │ │ │ ├── tips.xml │ │ │ │ ├── badge.xml │ │ │ │ ├── skip_previous.xml │ │ │ │ ├── ic_battery_charging.xml │ │ │ │ ├── bedtime.xml │ │ │ │ ├── pause.xml │ │ │ │ ├── widget_progress_bar.xml │ │ │ │ ├── favorite.xml │ │ │ │ ├── home.xml │ │ │ │ ├── equalizer.xml │ │ │ │ ├── codigo.xml │ │ │ │ ├── clear_all.xml │ │ │ │ ├── ic_low_battery.xml │ │ │ │ ├── shortcut_search.xml │ │ │ │ ├── tune.xml │ │ │ │ ├── fast_forward.xml │ │ │ │ ├── dark_mode.xml │ │ │ │ ├── shuffle_on.xml │ │ │ │ ├── lock.xml │ │ │ │ ├── token.xml │ │ │ │ ├── translate.xml │ │ │ │ ├── library_music_outlined.xml │ │ │ │ ├── offline.xml │ │ │ │ ├── download.xml │ │ │ │ ├── bookmark_filled.xml │ │ │ │ ├── ic_smart_hub.xml │ │ │ │ ├── explicit.xml │ │ │ │ ├── replay.xml │ │ │ │ ├── location_on.xml │ │ │ │ ├── lock_open.xml │ │ │ │ ├── upgrade.xml │ │ │ │ ├── schedule.xml │ │ │ │ ├── ic_battery.xml │ │ │ │ ├── directions_run.xml │ │ │ │ ├── expand_less.xml │ │ │ │ ├── expand_more.xml │ │ │ │ ├── more_vert.xml │ │ │ │ ├── input.xml │ │ │ │ ├── more_horiz.xml │ │ │ │ ├── manage_search.xml │ │ │ │ ├── radio.xml │ │ │ │ ├── library_add_check.xml │ │ │ │ ├── swipe.xml │ │ │ │ ├── update.xml │ │ │ │ ├── playlist_play.xml │ │ │ │ ├── library_music.xml │ │ │ │ ├── delete.xml │ │ │ │ ├── grid_view.xml │ │ │ │ ├── error.xml │ │ │ │ ├── tab.xml │ │ │ │ ├── album.xml │ │ │ │ ├── shortcut_albums.xml │ │ │ │ ├── extension.xml │ │ │ │ ├── info.xml │ │ │ │ ├── queue_music.xml │ │ │ │ ├── shortcut_playlists.xml │ │ │ │ ├── backup.xml │ │ │ │ ├── repeat.xml │ │ │ │ ├── cached.xml │ │ │ │ ├── library_add.xml │ │ │ │ ├── graphic_eq.xml │ │ │ │ ├── slow_motion_video.xml │ │ │ │ ├── history.xml │ │ │ │ └── radio_button_unchecked.xml │ │ │ ├── mipmap-xhdpi │ │ │ │ └── ic_banner.png │ │ │ ├── xml │ │ │ │ ├── automotive_app_desc.xml │ │ │ │ ├── file_paths.xml │ │ │ │ ├── backup_rules.xml │ │ │ │ ├── widget_info.xml │ │ │ │ └── provider_paths.xml │ │ │ ├── drawable-nodpi │ │ │ │ └── example_appwidget_preview.png │ │ │ ├── values │ │ │ │ ├── app_name.xml │ │ │ │ ├── ic_banner_background.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── attrs.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── values.xml │ │ │ │ ├── colors.xml │ │ │ │ └── themes.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_banner.xml │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── values-night-v31 │ │ │ │ └── themes.xml │ │ │ ├── values-v31 │ │ │ │ ├── themes.xml │ │ │ │ └── styles.xml │ │ │ └── values-v21 │ │ │ │ └── styles.xml │ │ ├── ic_launcher-playstore.png │ │ └── java │ │ │ └── com │ │ │ └── babelsoftware │ │ │ └── loudly │ │ │ ├── constants │ │ │ ├── HistorySource.kt │ │ │ └── StatPeriod.kt │ │ │ ├── extensions │ │ │ ├── UtilExt.kt │ │ │ ├── ListExt.kt │ │ │ ├── FileExt.kt │ │ │ ├── NavControllerExt.kt │ │ │ └── StringExt.kt │ │ │ ├── models │ │ │ ├── spotify │ │ │ │ ├── tracks │ │ │ │ │ ├── Artists.kt │ │ │ │ │ ├── Track.kt │ │ │ │ │ ├── TrackItem.kt │ │ │ │ │ └── SpotifyResultPaginatedResponse.kt │ │ │ │ ├── playlists │ │ │ │ │ ├── Images.kt │ │ │ │ │ ├── SpotifyPlaylistPaginatedResponse.kt │ │ │ │ │ └── SpotifyPlaylistItem.kt │ │ │ │ └── Tracks.kt │ │ │ ├── ItemsPage.kt │ │ │ ├── SongWithPlayCount.kt │ │ │ ├── PersistQueue.kt │ │ │ ├── SpotifyUserProfile.kt │ │ │ ├── SimilarRecommendation.kt │ │ │ └── SpotifyAuthResponse.kt │ │ │ ├── db │ │ │ ├── entities │ │ │ │ ├── LocalItem.kt │ │ │ │ ├── SetVideoIdEntity.kt │ │ │ │ ├── LyricsEntity.kt │ │ │ │ ├── PlaylistSong.kt │ │ │ │ ├── EventWithSong.kt │ │ │ │ ├── SearchHistory.kt │ │ │ │ ├── SortedSongAlbumMap.kt │ │ │ │ ├── SortedSongArtistMap.kt │ │ │ │ ├── FormatEntity.kt │ │ │ │ ├── PlaylistSongMapPreview.kt │ │ │ │ ├── Artist.kt │ │ │ │ ├── RecentActivityEntity.kt │ │ │ │ └── Event.kt │ │ │ └── Converters.kt │ │ │ ├── ui │ │ │ ├── screens │ │ │ │ └── settings │ │ │ │ │ └── import_from_spotify │ │ │ │ │ └── model │ │ │ │ │ ├── Playlist.kt │ │ │ │ │ ├── ImportProgressEvent.kt │ │ │ │ │ └── ImportFromSpotifyScreenState.kt │ │ │ ├── utils │ │ │ │ ├── ShapeUtils.kt │ │ │ │ ├── NavControllerUtils.kt │ │ │ │ └── YouTubeUtils.kt │ │ │ └── component │ │ │ │ └── shimmer │ │ │ │ └── ButtonPlaceholder.kt │ │ │ ├── utils │ │ │ ├── ItemWrapper.kt │ │ │ ├── Updater.kt │ │ │ └── StringUtils.kt │ │ │ ├── lyrics │ │ │ ├── LyricsEntry.kt │ │ │ ├── YouTubeSubtitleLyricsProvider.kt │ │ │ ├── LyricsProvider.kt │ │ │ └── YouTubeLyricsProvider.kt │ │ │ └── playback │ │ │ └── queues │ │ │ ├── EmptyQueue.kt │ │ │ └── ListQueue.kt │ ├── debug │ │ └── res │ │ │ └── values │ │ │ └── app_name.xml │ ├── foss │ │ └── java │ │ │ └── com │ │ │ └── babelsoftware │ │ │ └── loudly │ │ │ ├── Utils.kt │ │ │ └── TranslationHelper.kt │ └── full │ │ └── java │ │ └── com │ │ └── babelsoftware │ │ └── loudly │ │ └── Utils.kt ├── foss │ └── release │ │ └── baselineProfiles │ │ ├── 0 │ │ └── app-foss-release.dm │ │ └── 1 │ │ └── app-foss-release.dm └── full │ └── release │ └── baselineProfiles │ ├── 0 │ └── app-full-release.dm │ └── 1 │ └── app-full-release.dm ├── kizzy ├── .gitignore ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── my │ │ └── kizzy │ │ ├── rpc │ │ └── UserInfo.kt │ │ ├── remote │ │ └── ApiResponse.kt │ │ └── gateway │ │ └── entities │ │ ├── presence │ │ ├── Metadata.kt │ │ ├── Timestamps.kt │ │ ├── Presence.kt │ │ └── Assets.kt │ │ ├── Resume.kt │ │ ├── Payload.kt │ │ ├── HeartBeat.kt │ │ └── Ready.kt └── build.gradle.kts ├── kugou ├── .gitignore ├── src │ ├── main │ │ └── java │ │ │ └── com │ │ │ └── babelsoftware │ │ │ └── kugou │ │ │ └── models │ │ │ ├── DownloadLyricsResponse.kt │ │ │ ├── SearchSongResponse.kt │ │ │ └── SearchLyricsResponse.kt │ └── test │ │ └── java │ │ └── Test.kt └── build.gradle.kts ├── lrclib ├── .gitignore ├── build.gradle.kts └── src │ └── main │ └── java │ └── com │ └── babelsoftware │ └── lrclib │ └── models │ └── Track.kt ├── innertube ├── .gitignore ├── src │ └── main │ │ └── java │ │ └── com │ │ └── babelsoftware │ │ └── innertube │ │ ├── models │ │ ├── Icon.kt │ │ ├── AccountInfo.kt │ │ ├── SearchSuggestions.kt │ │ ├── YouTubeLocale.kt │ │ ├── response │ │ │ ├── CreatePlaylistResponse.kt │ │ │ ├── GetQueueResponse.kt │ │ │ ├── GetSearchSuggestionsResponse.kt │ │ │ └── AddItemYouTubePlaylistResponse.kt │ │ ├── body │ │ │ ├── PlaylistDeleteBody.kt │ │ │ ├── SubscribeBody.kt │ │ │ ├── GetTranscriptBody.kt │ │ │ ├── GetSearchSuggestionsBody.kt │ │ │ ├── SearchBody.kt │ │ │ ├── GetQueueBody.kt │ │ │ ├── BrowseBody.kt │ │ │ ├── AccountMenuBody.kt │ │ │ ├── NextBody.kt │ │ │ ├── CreatePlaylistBody.kt │ │ │ ├── LikeBody.kt │ │ │ └── PlayerBody.kt │ │ ├── MusicDescriptionShelfRenderer.kt │ │ ├── Badges.kt │ │ ├── Thumbnails.kt │ │ ├── MusicPlaylistShelfRenderer.kt │ │ ├── SubscriptionButton.kt │ │ ├── Button.kt │ │ ├── ContinuationItemRenderer.kt │ │ ├── AutomixPreviewVideoRenderer.kt │ │ ├── MusicNavigationButtonRenderer.kt │ │ ├── ResponseContext.kt │ │ ├── Context.kt │ │ ├── PlaylistPanelVideoRenderer.kt │ │ ├── SearchSuggestionsSectionRenderer.kt │ │ ├── MusicQueueRenderer.kt │ │ ├── Continuation.kt │ │ ├── PlaylistPanelRenderer.kt │ │ ├── Tabs.kt │ │ └── GridRenderer.kt │ │ └── pages │ │ ├── LibraryContinuationPage.kt │ │ ├── PlaylistContinuationPage.kt │ │ ├── ExplorePage.kt │ │ ├── ArtistItemsContinuationPage.kt │ │ └── BrowseResult.kt └── build.gradle.kts ├── material-color-utilities ├── .gitignore ├── build.gradle.kts └── src │ └── main │ └── java │ └── com │ └── google │ └── material │ └── color │ └── quantize │ └── Quantizer.java ├── fastlane └── metadata │ └── android │ ├── en-US │ ├── title.txt │ ├── short_description.txt │ ├── changelogs │ │ ├── 19.txt │ │ ├── 18.txt │ │ ├── 17.txt │ │ ├── 10.txt │ │ ├── 22.txt │ │ ├── 21.txt │ │ ├── 12.txt │ │ ├── 6.txt │ │ ├── 20.txt │ │ ├── 23.txt │ │ ├── 24.txt │ │ ├── 16.txt │ │ ├── 8.txt │ │ ├── 13.txt │ │ ├── 7.txt │ │ ├── 9.txt │ │ ├── 5.txt │ │ ├── 14.txt │ │ ├── 15.txt │ │ ├── 25.txt │ │ └── 11.txt │ ├── images │ │ ├── icon.png │ │ └── phoneScreenshots │ │ │ ├── 01.png │ │ │ ├── 02.png │ │ │ ├── 03.png │ │ │ ├── 04.png │ │ │ ├── 05.png │ │ │ └── 06.png │ └── full_description.txt │ ├── it │ ├── title.txt │ ├── short_description.txt │ └── full_description.txt │ ├── pt-BR │ ├── title.txt │ ├── short_description.txt │ ├── changelogs │ │ ├── 19.txt │ │ └── 23.txt │ └── full_description.txt │ ├── ru-RU │ ├── title.txt │ ├── short_description.txt │ └── full_description.txt │ ├── uk-UA │ ├── title.txt │ ├── short_description.txt │ └── full_description.txt │ ├── zh-CN │ ├── title.txt │ ├── short_description.txt │ └── full_description.txt │ ├── zh-TW │ ├── title.txt │ ├── short_description.txt │ └── full_description.txt │ ├── pa │ └── short_description.txt │ ├── bg │ ├── short_description.txt │ └── full_description.txt │ ├── ja │ ├── short_description.txt │ └── full_description.txt │ ├── ko │ ├── short_description.txt │ └── full_description.txt │ ├── de-DE │ └── short_description.txt │ ├── pl-PL │ ├── short_description.txt │ └── full_description.txt │ ├── es │ ├── short_description.txt │ ├── changelogs │ │ ├── 18.txt │ │ ├── 19.txt │ │ ├── 17.txt │ │ ├── 22.txt │ │ ├── 21.txt │ │ ├── 6.txt │ │ ├── 20.txt │ │ ├── 12.txt │ │ ├── 24.txt │ │ ├── 23.txt │ │ ├── 16.txt │ │ ├── 7.txt │ │ ├── 8.txt │ │ ├── 13.txt │ │ ├── 9.txt │ │ ├── 5.txt │ │ ├── 14.txt │ │ ├── 26.txt │ │ ├── 15.txt │ │ ├── 25.txt │ │ └── 11.txt │ └── full_description.txt │ └── tr │ ├── short_description.txt │ ├── changelogs │ ├── 12.txt │ ├── 13.txt │ ├── 14.txt │ └── 11.txt │ └── full_description.txt ├── assets └── Loudly-icon.jpg ├── image ├── loudly_banner.png ├── loudly_dark_mode.png └── loudly_light_mode.png ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── crowdin.yml ├── lint.xml └── settings.gradle.kts /app/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /kizzy/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /kugou/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /lrclib/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /innertube/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /material-color-utilities/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/title.txt: -------------------------------------------------------------------------------- 1 | Loudly -------------------------------------------------------------------------------- /fastlane/metadata/android/it/title.txt: -------------------------------------------------------------------------------- 1 | Loudly 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pt-BR/title.txt: -------------------------------------------------------------------------------- 1 | Loudly 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ru-RU/title.txt: -------------------------------------------------------------------------------- 1 | Loudly 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/uk-UA/title.txt: -------------------------------------------------------------------------------- 1 | Loudly 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/title.txt: -------------------------------------------------------------------------------- 1 | Loudly 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-TW/title.txt: -------------------------------------------------------------------------------- 1 | Loudly 2 | -------------------------------------------------------------------------------- /app/src/main/res/resources.properties: -------------------------------------------------------------------------------- 1 | unqualifiedResLocale=en -------------------------------------------------------------------------------- /assets/Loudly-icon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/assets/Loudly-icon.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-TW/short_description.txt: -------------------------------------------------------------------------------- 1 | 一個 YouTube Music 用戶端,使用 Material 3 設計 -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | A Material 3 YouTube Music client for Android -------------------------------------------------------------------------------- /fastlane/metadata/android/pa/short_description.txt: -------------------------------------------------------------------------------- 1 | ਇੱਕ ਮਟੀਰੀਅਲ ਡਿਜ਼ਾਈਨ ਵਾਲਾ ਯੂਟਿਊਬ ਮਿਊਜ਼ਕ ਕਲਾਈਂਟ -------------------------------------------------------------------------------- /image/loudly_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/image/loudly_banner.png -------------------------------------------------------------------------------- /fastlane/metadata/android/bg/short_description.txt: -------------------------------------------------------------------------------- 1 | Клиент на YouTube Music Material 3 за Android 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ja/short_description.txt: -------------------------------------------------------------------------------- 1 | YouTube Musicから音楽をストリーミング再生するMaterial Designの音楽プレイヤー -------------------------------------------------------------------------------- /fastlane/metadata/android/ko/short_description.txt: -------------------------------------------------------------------------------- 1 | YouTube/YouTube Music의 음악이 포함된 머티리얼 디자인 뮤직 플레이어 2 | -------------------------------------------------------------------------------- /image/loudly_dark_mode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/image/loudly_dark_mode.png -------------------------------------------------------------------------------- /image/loudly_light_mode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/image/loudly_light_mode.png -------------------------------------------------------------------------------- /app/src/main/res/values-es-rUS/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-nb-rNO/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/short_description.txt: -------------------------------------------------------------------------------- 1 | Ein Material 3 YouTube Musik-Client für Android 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/it/short_description.txt: -------------------------------------------------------------------------------- 1 | Un client di YouTube Music in Material 3 per Android 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pl-PL/short_description.txt: -------------------------------------------------------------------------------- 1 | Aplikacja YouTube Music wykorzystująca Material 3 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/short_description.txt: -------------------------------------------------------------------------------- 1 | 适用于 Android 的 YouTube Music 客户端,采用 Material 3 设计 2 | -------------------------------------------------------------------------------- /kizzy/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /fastlane/metadata/android/es/short_description.txt: -------------------------------------------------------------------------------- 1 | Un cliente de YouTube Music con Material 3 para Android 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pt-BR/short_description.txt: -------------------------------------------------------------------------------- 1 | Um cliente do YouTube Music em Material 3 para Android 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ru-RU/short_description.txt: -------------------------------------------------------------------------------- 1 | Клиент YouTube Music для Android в стиле Material 3 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/uk-UA/short_description.txt: -------------------------------------------------------------------------------- 1 | Клієнт YouTube Music для Android у стилі Material 3 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/short_description.txt: -------------------------------------------------------------------------------- 1 | Android için bir Material 3 tasarımlı YouTube Müzik istemcisi 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/drawable/casa.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/app/src/main/res/drawable/casa.webp -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/app/src/main/res/mipmap-xhdpi/ic_banner.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/loudly_picutre_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/app/src/main/res/drawable/loudly_picutre_1.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/loudly_picutre_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/app/src/main/res/drawable/loudly_picutre_2.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/loudly_picutre_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/app/src/main/res/drawable/loudly_picutre_3.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/loudly_picutre_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/app/src/main/res/drawable/loudly_picutre_4.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/loudly_picutre_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/app/src/main/res/drawable/loudly_picutre_5.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/loudly_picutre_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/app/src/main/res/drawable/loudly_picutre_6.jpg -------------------------------------------------------------------------------- /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/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/fastlane/metadata/android/en-US/images/icon.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 | -------------------------------------------------------------------------------- /app/src/main/res/xml/automotive_app_desc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /app/foss/release/baselineProfiles/0/app-foss-release.dm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/app/foss/release/baselineProfiles/0/app-foss-release.dm -------------------------------------------------------------------------------- /app/foss/release/baselineProfiles/1/app-foss-release.dm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/app/foss/release/baselineProfiles/1/app-foss-release.dm -------------------------------------------------------------------------------- /app/full/release/baselineProfiles/0/app-full-release.dm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/app/full/release/baselineProfiles/0/app-full-release.dm -------------------------------------------------------------------------------- /app/full/release/baselineProfiles/1/app-full-release.dm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/app/full/release/baselineProfiles/1/app-full-release.dm -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/example_appwidget_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/app/src/main/res/drawable-nodpi/example_appwidget_preview.png -------------------------------------------------------------------------------- /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/images/phoneScreenshots/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RRechz/Loudly/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/constants/HistorySource.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.constants 2 | 3 | enum class HistorySource { 4 | LOCAL, REMOTE 5 | } -------------------------------------------------------------------------------- /app/src/main/res/values/app_name.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Loudly 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/ic_banner_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #000000 4 | -------------------------------------------------------------------------------- /app/src/debug/res/values/app_name.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Loudly Debug 4 | -------------------------------------------------------------------------------- /app/src/foss/java/com/babelsoftware/loudly/Utils.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly 2 | 3 | fun reportException(throwable: Throwable) { 4 | throwable.printStackTrace() 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | -------------------------------------------------------------------------------- /app/src/main/res/xml/file_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 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/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/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/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/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/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/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 -------------------------------------------------------------------------------- /kizzy/src/main/java/com/my/kizzy/rpc/UserInfo.kt: -------------------------------------------------------------------------------- 1 | package com.my.kizzy.rpc 2 | 3 | /** 4 | * Created by Zion Huang 5 | */ 6 | data class UserInfo( 7 | val username: String, 8 | val name: String, 9 | ) 10 | -------------------------------------------------------------------------------- /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 -------------------------------------------------------------------------------- /lint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/Icon.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class Icon( 7 | val iconType: String, 8 | ) -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/extensions/UtilExt.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.extensions 2 | 3 | fun tryOrNull(block: () -> T): T? = 4 | try { 5 | block() 6 | } catch (e: Exception) { 7 | null 8 | } -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/AccountInfo.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.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/babelsoftware/innertube/models/SearchSuggestions.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models 2 | 3 | data class SearchSuggestions( 4 | val queries: List, 5 | val recommendedItems: List, 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/models/spotify/tracks/Artists.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.models.spotify.tracks 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class Artist( 7 | val name: String 8 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/db/entities/LocalItem.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/babelsoftware/loudly/models/spotify/playlists/Images.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.models.spotify.playlists 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class Images( 7 | val url:String 8 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/ui/screens/settings/import_from_spotify/model/Playlist.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.ui.screens.settings.import_from_spotify.model 2 | 3 | data class Playlist( 4 | val name: String, 5 | val id: String 6 | ) -------------------------------------------------------------------------------- /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 -------------------------------------------------------------------------------- /kugou/src/main/java/com/babelsoftware/kugou/models/DownloadLyricsResponse.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.kugou.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class DownloadLyricsResponse( 7 | val content: String, 8 | ) 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/models/ItemsPage.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.models 2 | 3 | import com.babelsoftware.innertube.models.YTItem 4 | 5 | data class ItemsPage( 6 | val items: List, 7 | val continuation: String?, 8 | ) 9 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/app_widget_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | -------------------------------------------------------------------------------- /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 -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/YouTubeLocale.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class YouTubeLocale( 7 | val gl: String, 8 | val hl: String, 9 | ) 10 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/response/CreatePlaylistResponse.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.response 2 | 3 | import kotlinx.serialization.Serializable 4 | @Serializable 5 | data class CreatePlaylistResponse( 6 | val playlistId: String 7 | ) -------------------------------------------------------------------------------- /kizzy/src/main/java/com/my/kizzy/remote/ApiResponse.kt: -------------------------------------------------------------------------------- 1 | package com.my.kizzy.remote 2 | 3 | import kotlinx.serialization.SerialName 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class ApiResponse( 8 | @SerialName("id") 9 | val id: String, 10 | ) -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/src/foss/java/com/babelsoftware/loudly/TranslationHelper.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly 2 | 3 | import com.babelsoftware.loudly.db.entities.LyricsEntity 4 | 5 | object TranslationHelper { 6 | fun translate(lyrics: LyricsEntity): LyricsEntity = lyrics 7 | fun clearModels() {} 8 | } -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sun Jun 29 11:18:28 MSK 2025 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-rc-1-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/pages/LibraryContinuationPage.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.pages 2 | 3 | import com.babelsoftware.innertube.models.YTItem 4 | 5 | data class LibraryContinuationPage( 6 | val items: List, 7 | val continuation: String?, 8 | ) -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/pages/PlaylistContinuationPage.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.pages 2 | 3 | import com.babelsoftware.innertube.models.SongItem 4 | 5 | data class PlaylistContinuationPage( 6 | val songs: List, 7 | val continuation: String?, 8 | ) 9 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/pages/ExplorePage.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.pages 2 | 3 | import com.babelsoftware.innertube.models.AlbumItem 4 | 5 | data class ExplorePage( 6 | val newReleaseAlbums: List, 7 | val moodAndGenres: List, 8 | ) 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/app_widget_inner_view_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/models/SongWithPlayCount.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.models 2 | 3 | import androidx.room.Embedded 4 | import com.babelsoftware.loudly.db.entities.Song 5 | 6 | data class SongWithPlayCount( 7 | @Embedded 8 | val song: Song, 9 | val playCount: Int 10 | ) -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_banner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/widget_album_art_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/pages/ArtistItemsContinuationPage.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.pages 2 | 3 | 4 | import com.babelsoftware.innertube.models.YTItem 5 | 6 | data class ArtistItemsContinuationPage( 7 | val items: List, 8 | val continuation: String?, 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/models/spotify/Tracks.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.models.spotify 2 | 3 | import kotlinx.serialization.SerialName 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class Tracks( 8 | @SerialName("total") 9 | val totalTracksCount: Int 10 | ) -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/13.txt: -------------------------------------------------------------------------------- 1 | Music is now renamed to Loudly! 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 -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/models/PersistQueue.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/res/drawable/album_art_gradient.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 0dp 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/models/SpotifyUserProfile.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.models 2 | 3 | import kotlinx.serialization.SerialName 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class SpotifyUserProfile( 8 | @SerialName("display_name") 9 | val displayName: String 10 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/models/spotify/tracks/Track.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.models.spotify.tracks 2 | 3 | import kotlinx.serialization.SerialName 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class Track( 8 | @SerialName("track") 9 | val trackItem: TrackItem 10 | ) -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /kizzy/src/main/java/com/my/kizzy/gateway/entities/presence/Metadata.kt: -------------------------------------------------------------------------------- 1 | package com.my.kizzy.gateway.entities.presence 2 | 3 | import kotlinx.serialization.SerialName 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class Metadata( 8 | @SerialName("button_urls") 9 | val buttonUrls: List?, 10 | ) -------------------------------------------------------------------------------- /app/src/full/java/com/babelsoftware/loudly/Utils.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly 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/java/com/babelsoftware/loudly/extensions/ListExt.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/babelsoftware/loudly/models/SimilarRecommendation.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.models 2 | 3 | import com.babelsoftware.innertube.models.YTItem 4 | import com.babelsoftware.loudly.db.entities.LocalItem 5 | 6 | data class SimilarRecommendation( 7 | val title: LocalItem, 8 | val items: List, 9 | ) 10 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/body/PlaylistDeleteBody.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.body 2 | 3 | import com.babelsoftware.innertube.models.Context 4 | import kotlinx.serialization.Serializable 5 | @Serializable 6 | data class PlaylistDeleteBody( 7 | val context: Context, 8 | val playlistId: String 9 | ) -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/body/SubscribeBody.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.body 2 | 3 | import com.babelsoftware.innertube.models.Context 4 | import kotlinx.serialization.Serializable 5 | @Serializable 6 | data class SubscribeBody( 7 | val channelIds: List, 8 | val context: Context, 9 | ) -------------------------------------------------------------------------------- /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 -------------------------------------------------------------------------------- /material-color-utilities/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("java-library") 3 | } 4 | 5 | java { 6 | sourceCompatibility = JavaVersion.VERSION_1_8 7 | targetCompatibility = JavaVersion.VERSION_1_8 8 | } 9 | 10 | dependencies { 11 | compileOnly("com.google.errorprone:error_prone_core:2.37.0") 12 | implementation(libs.annotation) 13 | } -------------------------------------------------------------------------------- /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 -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/body/GetTranscriptBody.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.body 2 | 3 | import com.babelsoftware.innertube.models.Context 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class GetTranscriptBody( 8 | val context: Context, 9 | val params: String, 10 | ) 11 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/signal_cellular_alt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/xml/backup_rules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 12 | -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/changelogs/13.txt: -------------------------------------------------------------------------------- 1 | Müziğin ismi artık Loudly 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/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 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/body/GetSearchSuggestionsBody.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.body 2 | 3 | import com.babelsoftware.innertube.models.Context 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class GetSearchSuggestionsBody( 8 | val context: Context, 9 | val input: String, 10 | ) 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/home_filled.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/widget_icon_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/MusicDescriptionShelfRenderer.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class MusicDescriptionShelfRenderer( 7 | val header: Runs?, 8 | val subheader: Runs?, 9 | val description: Runs, 10 | val footer: Runs?, 11 | ) 12 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/body/SearchBody.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.body 2 | 3 | import com.babelsoftware.innertube.models.Context 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class SearchBody( 8 | val context: Context, 9 | val query: String?, 10 | val params: String?, 11 | ) 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/db/entities/SetVideoIdEntity.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.db.entities 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | @Entity(tableName = "set_video_id") 6 | data class SetVideoIdEntity( 7 | @PrimaryKey(autoGenerate = false) 8 | val videoId: String = "", 9 | val setVideoId: String? = null, 10 | ) -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/ui/utils/ShapeUtils.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /kizzy/src/main/java/com/my/kizzy/gateway/entities/presence/Timestamps.kt: -------------------------------------------------------------------------------- 1 | package com.my.kizzy.gateway.entities.presence 2 | 3 | import kotlinx.serialization.SerialName 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class Timestamps( 8 | @SerialName("end") 9 | val end: Long? = null, 10 | @SerialName("start") 11 | val start: Long? = null, 12 | ) -------------------------------------------------------------------------------- /app/src/main/res/drawable/remove.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/wifi.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/body/GetQueueBody.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.body 2 | 3 | import com.babelsoftware.innertube.models.Context 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class GetQueueBody( 8 | val context: Context, 9 | val videoIds: List?, 10 | val playlistId: String?, 11 | ) 12 | -------------------------------------------------------------------------------- /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 -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/Badges.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.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/babelsoftware/innertube/models/Thumbnails.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class Thumbnails( 7 | val thumbnails: List, 8 | ) 9 | 10 | @Serializable 11 | data class Thumbnail( 12 | val url: String, 13 | val width: Int?, 14 | val height: Int?, 15 | ) 16 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/body/BrowseBody.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.body 2 | 3 | import com.babelsoftware.innertube.models.Context 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class BrowseBody( 8 | val context: Context, 9 | val browseId: String?, 10 | val params: String?, 11 | val continuation: String? 12 | ) 13 | -------------------------------------------------------------------------------- /kizzy/src/main/java/com/my/kizzy/gateway/entities/Resume.kt: -------------------------------------------------------------------------------- 1 | package com.my.kizzy.gateway.entities 2 | 3 | import kotlinx.serialization.SerialName 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class Resume( 8 | @SerialName("seq") 9 | val seq: Int, 10 | @SerialName("session_id") 11 | val sessionId: String?, 12 | @SerialName("token") 13 | val token: String, 14 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/utils/ItemWrapper.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.utils 2 | 3 | import androidx.compose.runtime.mutableStateOf 4 | 5 | class ItemWrapper(val item: T) { 6 | private val _isSelected = mutableStateOf(false) 7 | 8 | var isSelected: Boolean 9 | get() = _isSelected.value 10 | set(value) { 11 | _isSelected.value = value 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/widget_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tag.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /fastlane/metadata/android/es/changelogs/13.txt: -------------------------------------------------------------------------------- 1 | ¡La aplicación Music ahora se llama Loudly! 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 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/db/entities/LyricsEntity.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/res/drawable/widget_control_chip_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/MusicPlaylistShelfRenderer.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class MusicPlaylistShelfRenderer( 7 | val playlistId: String?, 8 | val contents: List, 9 | val collapsedItemCount: Int, 10 | val continuations: List?, 11 | ) 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/db/entities/PlaylistSong.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/res/drawable/arrow_upward.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/arrow_downward.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/arrow_top_left.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /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 -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/SubscriptionButton.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models 2 | 3 | import kotlinx.serialization.Serializable 4 | @Serializable 5 | data class SubscriptionButton( 6 | val subscribeButtonRenderer: SubscribeButtonRenderer, 7 | ) { 8 | @Serializable 9 | data class SubscribeButtonRenderer( 10 | val subscribed: Boolean, 11 | val channelId: String, 12 | ) 13 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/navigate_next.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /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 -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/ui/utils/NavControllerUtils.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.ui.utils 2 | 3 | import androidx.compose.ui.util.fastAny 4 | import androidx.navigation.NavController 5 | import com.babelsoftware.loudly.ui.screens.Screens 6 | 7 | fun NavController.backToMain() { 8 | while (!Screens.Companion.MainScreens.fastAny { it.route == currentBackStackEntry?.destination?.route }) { 9 | navigateUp() 10 | } 11 | } -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/body/AccountMenuBody.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.body 2 | 3 | import com.babelsoftware.innertube.models.Context 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class AccountMenuBody( 8 | val context: Context, 9 | val deviceTheme: String = "DEVICE_THEME_SELECTED", 10 | val userInterfaceTheme: String = "USER_INTERFACE_THEME_DARK", 11 | ) 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/headphones.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/logout.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/xml/widget_info.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/arrow_forward.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 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 | -------------------------------------------------------------------------------- /lrclib/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") 3 | alias(libs.plugins.kotlin.serialization) 4 | } 5 | 6 | kotlin { 7 | jvmToolchain(17) 8 | } 9 | 10 | dependencies { 11 | implementation(libs.ktor.client.core) 12 | implementation(libs.ktor.client.okhttp) 13 | implementation(libs.ktor.client.content.negotiation) 14 | implementation(libs.ktor.serialization.json) 15 | implementation(libs.ktor.client.encoding) 16 | testImplementation(libs.junit) 17 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/save.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/Button.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.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/babelsoftware/innertube/models/response/GetQueueResponse.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.response 2 | 3 | import com.babelsoftware.innertube.models.PlaylistPanelRenderer 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class GetQueueResponse( 8 | val queueDatas: List, 9 | ) { 10 | @Serializable 11 | data class QueueData( 12 | val content: PlaylistPanelRenderer.Content, 13 | ) 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/lyrics/LyricsEntry.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.lyrics 2 | 3 | data class LyricsEntry( 4 | val time: Long, 5 | val text: String, 6 | var translatedText: String? = null, 7 | var isTranslation: Boolean = false 8 | ) : Comparable { 9 | override fun compareTo(other: LyricsEntry): Int = (time - other.time).toInt() 10 | 11 | companion object { 12 | val HEAD_LYRICS_ENTRY = LyricsEntry(0L, "") 13 | } 14 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/content_copy.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/notification_on.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/download_done.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/security.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/db/entities/EventWithSong.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/babelsoftware/loudly/db/entities/SearchHistory.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/babelsoftware/loudly/db/entities/SortedSongAlbumMap.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/babelsoftware/loudly/extensions/FileExt.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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) -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/body/NextBody.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.body 2 | 3 | import com.babelsoftware.innertube.models.Context 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class NextBody( 8 | val context: Context, 9 | val videoId: String?, 10 | val playlistId: String?, 11 | val playlistSetVideoId: String?, 12 | val index: Int?, 13 | val params: String?, 14 | val continuation: String?, 15 | ) 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/models/spotify/tracks/TrackItem.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.models.spotify.tracks 2 | 3 | import kotlinx.serialization.SerialName 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class TrackItem( 8 | val type: String, 9 | @SerialName("id") 10 | val trackId: String, 11 | @SerialName("name") 12 | val trackName: String, 13 | @SerialName("is_local") 14 | val isLocal: Boolean, 15 | val artists:List 16 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/playback/queues/EmptyQueue.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.playback.queues 2 | 3 | import androidx.media3.common.MediaItem 4 | import com.babelsoftware.loudly.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 | } -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/db/entities/SortedSongArtistMap.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/babelsoftware/loudly/models/SpotifyAuthResponse.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.models 2 | 3 | import kotlinx.serialization.SerialName 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class SpotifyAuthResponse( 8 | @SerialName("access_token") 9 | val accessToken: String 10 | 11 | /* 12 | only `access_token` is required for the import process. 13 | the spotify servers will be triggered again if a new import needs to be made. 14 | */ 15 | 16 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/models/spotify/tracks/SpotifyResultPaginatedResponse.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.models.spotify.tracks 2 | 3 | import kotlinx.serialization.SerialName 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class SpotifyResultPaginatedResponse( 8 | @SerialName("total") 9 | val totalCountOfLikedSongs: Int, 10 | @SerialName("next") 11 | val nextPaginatedUrl: String? = null, 12 | @SerialName("items") 13 | val tracks: List 14 | ) -------------------------------------------------------------------------------- /app/src/main/res/drawable/shortcut_songs.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /kizzy/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") 3 | alias(libs.plugins.kotlin.serialization) 4 | } 5 | 6 | kotlin { 7 | jvmToolchain(17) 8 | } 9 | 10 | dependencies { 11 | implementation(libs.ktor.client.core) 12 | implementation(libs.ktor.client.okhttp) 13 | implementation(libs.ktor.client.content.negotiation) 14 | implementation(libs.ktor.serialization.json) 15 | implementation(libs.ktor.client.encoding) 16 | implementation(libs.json) 17 | 18 | testImplementation(libs.junit) 19 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/play.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /kizzy/src/main/java/com/my/kizzy/gateway/entities/presence/Presence.kt: -------------------------------------------------------------------------------- 1 | package com.my.kizzy.gateway.entities.presence 2 | 3 | import kotlinx.serialization.SerialName 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class Presence( 8 | @SerialName("activities") 9 | val activities: List?, 10 | @SerialName("afk") 11 | val afk: Boolean? = true, 12 | @SerialName("since") 13 | val since: Long? = 0L, 14 | @SerialName("status") 15 | val status: String? = "online", 16 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/lyrics/YouTubeSubtitleLyricsProvider.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.lyrics 2 | 3 | import android.content.Context 4 | import com.babelsoftware.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/res/drawable/bookmark.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/music_note.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/db/entities/FormatEntity.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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 | val playbackUrl: String? 17 | ) 18 | -------------------------------------------------------------------------------- /lrclib/src/main/java/com/babelsoftware/lrclib/models/Track.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.lrclib.models 2 | 3 | import kotlinx.serialization.Serializable 4 | import kotlin.math.abs 5 | 6 | @Serializable 7 | data class Track( 8 | val id: Int, 9 | val trackName: String, 10 | val artistName: String, 11 | val duration: Double, 12 | val plainLyrics: String?, 13 | val syncedLyrics: String?, 14 | ) 15 | 16 | internal fun List.bestMatchingFor(duration: Int) = firstOrNull { abs(it.duration.toInt() - duration) <= 2 } 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/explore_filled.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/nav_bar.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/body/CreatePlaylistBody.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.body 2 | 3 | import com.babelsoftware.innertube.models.Context 4 | import kotlinx.serialization.Serializable 5 | @Serializable 6 | data class CreatePlaylistBody( 7 | val context: Context, 8 | val title: String, 9 | val privacyStatus: String = PrivacyStatus.PRIVATE, 10 | val videoIds: List? = null 11 | ) { 12 | object PrivacyStatus { 13 | const val PRIVATE = "PRIVATE" 14 | } 15 | } -------------------------------------------------------------------------------- /kizzy/src/main/java/com/my/kizzy/gateway/entities/presence/Assets.kt: -------------------------------------------------------------------------------- 1 | package com.my.kizzy.gateway.entities.presence 2 | 3 | import kotlinx.serialization.SerialName 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class Assets( 8 | @SerialName("large_image") 9 | val largeImage: String?, 10 | @SerialName("small_image") 11 | val smallImage: String?, 12 | @SerialName("large_text") 13 | val largeText: String? = null, 14 | @SerialName("small_text") 15 | val smallText: String? = null, 16 | ) -------------------------------------------------------------------------------- /kugou/src/test/java/Test.kt: -------------------------------------------------------------------------------- 1 | import com.babelsoftware.kugou.KuGou 2 | import com.babelsoftware.kugou.KuGou.generateKeyword 3 | import kotlinx.coroutines.runBlocking 4 | import org.junit.Assert.assertTrue 5 | import org.junit.Test 6 | 7 | class Test { 8 | @Test 9 | fun test() = runBlocking { 10 | val candidates = KuGou.getLyricsCandidate(generateKeyword("千年以後 (After A Thousand Years)", "陳零九"), 285) 11 | assertTrue(candidates != null) 12 | assertTrue(KuGou.getLyrics("楊丞琳", "點水", 259).isSuccess) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/add_link.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 12 | 15 | 16 | 19 | -------------------------------------------------------------------------------- /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. -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/response/GetSearchSuggestionsResponse.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.response 2 | 3 | import com.babelsoftware.innertube.models.SearchSuggestionsSectionRenderer 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class GetSearchSuggestionsResponse( 8 | val contents: List?, 9 | ) { 10 | @Serializable 11 | data class Content( 12 | val searchSuggestionsSectionRenderer: SearchSuggestionsSectionRenderer, 13 | ) 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shuffle.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | @file:Suppress("UnstableApiUsage") 2 | enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") 3 | dependencyResolutionManagement { 4 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 5 | 6 | repositories { 7 | google() 8 | mavenCentral() 9 | maven { setUrl("https://jitpack.io") } 10 | } 11 | } 12 | 13 | rootProject.name = "Loudly" 14 | include(":app") 15 | include(":innertube") 16 | include(":kugou") 17 | include(":lrclib") 18 | include(":material-color-utilities") 19 | include(":kizzy") 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/db/entities/PlaylistSongMapPreview.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/res/values-night-v31/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/db/entities/Artist.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/babelsoftware/loudly/lyrics/LyricsProvider.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/res/drawable/sliders.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /kugou/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.opencc4j) 18 | testImplementation(libs.junit) 19 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/format_align_center.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/add.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/arrow_back.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/close.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/drag_handle.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /innertube/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") 3 | alias(libs.plugins.kotlin.serialization) 4 | } 5 | 6 | kotlin { 7 | jvmToolchain(17) 8 | } 9 | 10 | dependencies { 11 | implementation(libs.ktor.client.core) 12 | implementation(libs.ktor.client.okhttp) 13 | implementation(libs.ktor.client.content.negotiation) 14 | implementation(libs.ktor.serialization.json) 15 | implementation(libs.ktor.client.encoding) 16 | implementation(libs.brotli) 17 | testImplementation(libs.junit) 18 | implementation(libs.newpipe.extractor) 19 | } -------------------------------------------------------------------------------- /kizzy/src/main/java/com/my/kizzy/gateway/entities/Payload.kt: -------------------------------------------------------------------------------- 1 | package com.my.kizzy.gateway.entities 2 | 3 | import com.my.kizzy.gateway.entities.op.OpCode 4 | import kotlinx.serialization.SerialName 5 | import kotlinx.serialization.Serializable 6 | import kotlinx.serialization.json.JsonElement 7 | 8 | @Serializable 9 | data class Payload( 10 | @SerialName("t") 11 | val t: String? = null, 12 | @SerialName("s") 13 | val s: Int? = null, 14 | @SerialName("op") 15 | val op: OpCode? = null, 16 | @SerialName("d") 17 | val d: JsonElement? = null, 18 | ) -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/ContinuationItemRenderer.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class ContinuationItemRenderer( 7 | val continuationEndpoint: ContinuationEndpoint?, 8 | ) { 9 | @Serializable 10 | data class ContinuationEndpoint( 11 | val continuationCommand: ContinuationCommand?, 12 | ) { 13 | @Serializable 14 | data class ContinuationCommand( 15 | val token: String?, 16 | ) 17 | } 18 | } -------------------------------------------------------------------------------- /kugou/src/main/java/com/babelsoftware/kugou/models/SearchSongResponse.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.kugou.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class SearchSongResponse( 7 | val status: Int, 8 | val errcode: Int, 9 | val error: String, 10 | val data: Data, 11 | ) { 12 | @Serializable 13 | data class Data( 14 | val info: List, 15 | ) { 16 | @Serializable 17 | data class Info( 18 | val duration: Int, 19 | val hash: String, 20 | ) 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/notifications_off.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/playlist_remove.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_corner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/account_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/models/spotify/playlists/SpotifyPlaylistPaginatedResponse.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.models.spotify.playlists 2 | 3 | import kotlinx.serialization.SerialName 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class SpotifyPlaylistPaginatedResponse( 8 | @SerialName("next") 9 | var nextUrl: String? = null, 10 | @SerialName("previous") 11 | var previousUrl: String? = null, 12 | @SerialName("total") 13 | var totalResults: Int? = null, 14 | var items: List = emptyList() 15 | ) -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_autorenew.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/body/LikeBody.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.body 2 | 3 | import com.babelsoftware.innertube.models.Context 4 | import kotlinx.serialization.Serializable 5 | @Serializable 6 | data class LikeBody( 7 | val context: Context, 8 | val target: Target, 9 | ) { 10 | @Serializable 11 | sealed class Target { 12 | @Serializable 13 | data class VideoTarget(val videoId: String) : Target() 14 | @Serializable 15 | data class PlaylistTarget(val playlistId: String) : Target() 16 | } 17 | } -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/AutomixPreviewVideoRenderer.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.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 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/contrast.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/format_align_left.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/home_outlined.xml: -------------------------------------------------------------------------------- 1 | 7 | 13 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/MusicNavigationButtonRenderer.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class MusicNavigationButtonRenderer( 7 | val buttonText: Runs, 8 | val solid: Solid?, 9 | val iconStyle: IconStyle?, 10 | val clickCommand: NavigationEndpoint, 11 | ) { 12 | @Serializable 13 | data class Solid( 14 | val leftStripeColor: Long, 15 | ) 16 | 17 | @Serializable 18 | data class IconStyle( 19 | val icon: Icon, 20 | ) 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/boosty.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/wifi_off.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/gradient.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/edit.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/library_music_filled.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/search.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/trending_up.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/high_quality.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/db/Converters.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/res/drawable/skip_next.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tips.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/badge.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/ResponseContext.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class ResponseContext( 7 | val visitorData: String?, 8 | val serviceTrackingParams: List?, 9 | ) { 10 | @Serializable 11 | data class ServiceTrackingParam( 12 | val params: List, 13 | val service: String, 14 | ) { 15 | @Serializable 16 | data class Param( 17 | val key: String, 18 | val value: String, 19 | ) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/skip_previous.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-v31/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_battery_charging.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/ui/screens/settings/import_from_spotify/model/ImportProgressEvent.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.ui.screens.settings.import_from_spotify.model 2 | 3 | sealed class ImportProgressEvent { 4 | data class LikedSongsProgress(val completed: Boolean, val currentCount: Int,val totalTracksCount: Int) : 5 | ImportProgressEvent() 6 | 7 | data class PlaylistsProgress( 8 | val completed: Boolean, 9 | val playlistName: String, 10 | val progressedTrackCount: Int, 11 | val totalTracksCount: Int, 12 | val currentPlaylistIndex: Int 13 | ) : ImportProgressEvent() 14 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/bedtime.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pause.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/widget_progress_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/favorite.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/home.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/Context.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.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/babelsoftware/innertube/models/PlaylistPanelVideoRenderer.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class PlaylistPanelVideoRenderer( 7 | val title: Runs?, 8 | val lengthText: Runs?, 9 | val longBylineText: Runs?, 10 | val shortBylineText: Runs?, 11 | val badges: List?, 12 | val videoId: String?, 13 | val playlistSetVideoId: String?, 14 | val selected: Boolean, 15 | val thumbnail: Thumbnails, 16 | val unplayableText: Runs?, 17 | val menu: Menu?, 18 | val navigationEndpoint: NavigationEndpoint, 19 | ) 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/equalizer.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/codigo.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/ui/screens/settings/import_from_spotify/model/ImportFromSpotifyScreenState.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.ui.screens.settings.import_from_spotify.model 2 | 3 | import com.babelsoftware.loudly.models.spotify.playlists.SpotifyPlaylistItem 4 | 5 | data class ImportFromSpotifyScreenState( 6 | val isRequesting: Boolean, 7 | val accessToken: String, 8 | val error: Boolean, 9 | val exception: Exception?, 10 | val userName:String, 11 | val isObtainingAccessTokenSuccessful:Boolean, 12 | val playlists:List, 13 | val totalPlaylistsCount:Int, 14 | val reachedEndForPlaylistPagination:Boolean 15 | ) -------------------------------------------------------------------------------- /app/src/main/res/drawable/clear_all.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_low_battery.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shortcut_search.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tune.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/playback/queues/ListQueue.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.playback.queues 2 | 3 | import androidx.media3.common.MediaItem 4 | import com.babelsoftware.loudly.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 | } -------------------------------------------------------------------------------- /kugou/src/main/java/com/babelsoftware/kugou/models/SearchLyricsResponse.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.kugou.models 2 | 3 | import kotlinx.serialization.SerialName 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class SearchLyricsResponse( 8 | val status: Int, 9 | val info: String, 10 | val errcode: Int, 11 | val errmsg: String, 12 | val expire: Int, 13 | val candidates: List, 14 | ) { 15 | @Serializable 16 | data class Candidate( 17 | val id: Long, 18 | @SerialName("product_from") 19 | val productFrom: String, 20 | val duration: Long, 21 | val accesskey: String, 22 | ) 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/extensions/NavControllerExt.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.extensions 2 | 3 | import androidx.navigation.NavController 4 | import androidx.navigation.NavGraph.Companion.findStartDestination 5 | 6 | fun NavController.backToMain(route: String) { 7 | navigate(route) { 8 | popUpTo(graph.findStartDestination().id) { 9 | saveState = true 10 | } 11 | launchSingleTop = true 12 | restoreState = true 13 | } 14 | } 15 | 16 | fun NavController.backToMain() { 17 | navigate(graph.startDestinationRoute!!) { 18 | popUpTo(graph.findStartDestination().id) 19 | launchSingleTop = true 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/models/spotify/playlists/SpotifyPlaylistItem.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.models.spotify.playlists 2 | 3 | import com.babelsoftware.loudly.models.spotify.Tracks 4 | import kotlinx.serialization.SerialName 5 | import kotlinx.serialization.Serializable 6 | 7 | @Serializable 8 | data class SpotifyPlaylistItem( 9 | @SerialName("description") 10 | var playlistDescription: String, 11 | @SerialName("id") 12 | var playlistId: String, 13 | var images: List = emptyList(), 14 | @SerialName("name") 15 | var playlistName: String, 16 | var tracks: Tracks? = Tracks(0), 17 | var type: String, 18 | var uri: String 19 | ) -------------------------------------------------------------------------------- /app/src/main/res/drawable/fast_forward.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/response/AddItemYouTubePlaylistResponse.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.response 2 | 3 | import kotlinx.serialization.Serializable 4 | @Serializable 5 | data class AddItemYouTubePlaylistResponse( 6 | val status: String, 7 | val playlistEditResults: List 8 | ) { 9 | @Serializable 10 | data class PlaylistEditResult( 11 | val playlistEditVideoAddedResultData: PlaylistEditVideoAddedResultData, 12 | ) { 13 | @Serializable 14 | data class PlaylistEditVideoAddedResultData( 15 | val setVideoId: String, 16 | val videoId: String 17 | ) 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | #FFE1F5FE 3 | #FF81D4FA 4 | #FF039BE5 5 | #FF01579B 6 | #FFFFFF 7 | #4DFFFFFF 8 | 9 | 10 | #FFFFFF 11 | #E0E0E0 12 | 13 | 14 | #FFFFFF 15 | #80FFFFFF 16 | -------------------------------------------------------------------------------- /kizzy/src/main/java/com/my/kizzy/gateway/entities/HeartBeat.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * ****************************************************************** 4 | * * * Copyright (C) 2022 5 | * * * HeartBeat.kt is part of Kizzy 6 | * * * and can not be copied and/or distributed without the express 7 | * * * permission of yzziK(Vaibhav) 8 | * * ***************************************************************** 9 | * 10 | * 11 | */ 12 | 13 | package com.my.kizzy.gateway.entities 14 | 15 | import kotlinx.serialization.SerialName 16 | import kotlinx.serialization.Serializable 17 | 18 | @Serializable 19 | data class Heartbeat( 20 | @SerialName("heartbeat_interval") 21 | val heartbeatInterval: Long, 22 | ) -------------------------------------------------------------------------------- /app/src/main/res/drawable/dark_mode.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shuffle_on.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/lock.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/SearchSuggestionsSectionRenderer.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class SearchSuggestionsSectionRenderer( 7 | val contents: List, 8 | ) { 9 | @Serializable 10 | data class Content( 11 | val searchSuggestionRenderer: SearchSuggestionRenderer?, 12 | val musicResponsiveListItemRenderer: MusicResponsiveListItemRenderer?, 13 | ) { 14 | @Serializable 15 | data class SearchSuggestionRenderer( 16 | val suggestion: Runs, 17 | val navigationEndpoint: NavigationEndpoint, 18 | ) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/token.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/translate.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/library_music_outlined.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 16 | 17 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/MusicQueueRenderer.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class MusicQueueRenderer( 7 | val content: Content?, 8 | val header: Header?, 9 | ) { 10 | @Serializable 11 | data class Content( 12 | val playlistPanelRenderer: PlaylistPanelRenderer, 13 | ) 14 | 15 | @Serializable 16 | data class Header( 17 | val musicQueueHeaderRenderer: MusicQueueHeaderRenderer?, 18 | ) { 19 | @Serializable 20 | data class MusicQueueHeaderRenderer( 21 | val title: Runs?, 22 | val subtitle: Runs?, 23 | ) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/extensions/StringExt.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/res/drawable/offline.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/Continuation.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.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 | 19 | fun List.getContinuation() = 20 | firstOrNull()?.nextContinuationData?.continuation 21 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/PlaylistPanelRenderer.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class PlaylistPanelRenderer( 7 | val title: String?, 8 | val titleText: Runs?, 9 | val shortBylineText: Runs?, 10 | val contents: List, 11 | val isInfinite: Boolean, 12 | val numItemsToShow: Int?, 13 | val playlistId: String?, 14 | val continuations: List?, 15 | ) { 16 | @Serializable 17 | data class Content( 18 | val playlistPanelVideoRenderer: PlaylistPanelVideoRenderer?, 19 | val automixPreviewVideoRenderer: AutomixPreviewVideoRenderer?, 20 | ) 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/download.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bookmark_filled.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_smart_hub.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/explicit.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/replay.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/location_on.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/lock_open.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/upgrade.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/schedule.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_battery.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /kizzy/src/main/java/com/my/kizzy/gateway/entities/Ready.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * ****************************************************************** 4 | * * * Copyright (C) 2022 5 | * * * Ready.kt is part of Kizzy 6 | * * * and can not be copied and/or distributed without the express 7 | * * * permission of yzziK(Vaibhav) 8 | * * ***************************************************************** 9 | * 10 | * 11 | */ 12 | 13 | package com.my.kizzy.gateway.entities 14 | 15 | 16 | import kotlinx.serialization.SerialName 17 | import kotlinx.serialization.Serializable 18 | 19 | @Serializable 20 | data class Ready( 21 | @SerialName("resume_gateway_url") 22 | val resumeGatewayUrl: String? = null, 23 | @SerialName("session_id") 24 | val sessionId: String? = null, 25 | ) -------------------------------------------------------------------------------- /app/src/main/res/drawable/directions_run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/expand_less.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/expand_more.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/Tabs.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class Tabs( 7 | val tabs: List, 8 | ) { 9 | @Serializable 10 | data class Tab( 11 | val tabRenderer: TabRenderer, 12 | ) { 13 | @Serializable 14 | data class TabRenderer( 15 | val title: String?, 16 | val content: Content?, 17 | val endpoint: NavigationEndpoint?, 18 | ) { 19 | @Serializable 20 | data class Content( 21 | val sectionListRenderer: SectionListRenderer?, 22 | val musicQueueRenderer: MusicQueueRenderer?, 23 | ) 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/utils/Updater.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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 = 14 | runCatching { 15 | val response = client.get("https://api.github.com/repos/RRechz/Loudly/releases/latest").bodyAsText() 16 | val json = JSONObject(response) 17 | val versionName = json.getString("name") 18 | lastCheckTime = System.currentTimeMillis() 19 | versionName 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/more_vert.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/models/GridRenderer.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.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/babelsoftware/innertube/models/body/PlayerBody.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.models.body 2 | 3 | import com.babelsoftware.innertube.models.Context 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class PlayerBody( 8 | val context: Context, 9 | val videoId: String, 10 | val playlistId: String?, 11 | val playbackContext: PlaybackContext? = null, 12 | val contentCheckOk: Boolean = true, 13 | val racyCheckOk: Boolean = true, 14 | ) { 15 | @Serializable 16 | data class PlaybackContext( 17 | val contentPlaybackContext: ContentPlaybackContext 18 | ) { 19 | @Serializable 20 | data class ContentPlaybackContext( 21 | val signatureTimestamp: Int 22 | ) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/input.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/more_horiz.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/manage_search.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/radio.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/library_add_check.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/swipe.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/update.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/playlist_play.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/library_music.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/db/entities/RecentActivityEntity.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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 | enum class RecentActivityType { 10 | PLAYLIST, ALBUM, ARTIST 11 | } 12 | 13 | @Entity(tableName = "recent_activity") 14 | @Immutable 15 | data class RecentActivityEntity( 16 | @PrimaryKey val id: String, 17 | val title: String, 18 | val thumbnail: String?, 19 | val explicit: Boolean, 20 | val shareLink: String, 21 | val type: RecentActivityType, 22 | val playlistId: String?, 23 | val radioPlaylistId: String?, 24 | val shufflePlaylistId: String?, 25 | val date: LocalDateTime = LocalDateTime.now() 26 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/ui/utils/YouTubeUtils.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/res/drawable/delete.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/grid_view.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/error.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/album.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shortcut_albums.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values-v31/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/extension.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/info.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/db/entities/Event.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/res/drawable/queue_music.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shortcut_playlists.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/lyrics/YouTubeLyricsProvider.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.lyrics 2 | 3 | import android.content.Context 4 | import com.babelsoftware.innertube.YouTube 5 | import com.babelsoftware.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/babelsoftware/loudly/ui/component/shimmer/ButtonPlaceholder.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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 | } -------------------------------------------------------------------------------- /fastlane/metadata/android/ko/full_description.txt: -------------------------------------------------------------------------------- 1 | Music은 YouTube/YouTube Music에서 정보를 검색하고 데이터를 스트리밍하기 위해 NewPipe Extractor를 사용합니다. 또한 음악 플레이어이므로 재생 목록을 직접 만들고 만든 아티스트별로 노래를 구성할 수 있습니다. Music의 목적은 사용하기 쉽고 실용적이며 광고 없이 모든 사람이 무료로 음악을 들을 수 있도록 하는 것입니다. 2 | 3 |
메모: 4 | 5 | 그 프로젝트는 현재 불안정한 단계에 있습니다. 버그가 발생하면 GitHub에서 이슈를 열어 보고해주세요. 6 | 7 |
특징: 8 | 9 | * 광고 없음 10 | * YouTube/YouTube Music에서 노래, 비디오, 재생 목록 및 채널 검색 11 | * YouTube에서 대기열의 마지막 5곡을 재생할 때 더 많은 노래를 자동으로 로드 12 | * 머티리얼 디자인 플레이어 13 | * 잠금 화면에서 재생 14 | * 알림의 미디어 컨트롤 15 | * 다음/이전 노래로 건너뛰기 16 | * 반복/셔플 모드 17 | * 지금 재생 중인 대기열 편집 18 | * YouTube/YouTube Music에서 노래 재생 및 저장 19 | * 오프라인 재생을 위한 음악 다운로드 20 | * 로컬 데이터베이스에 재생 목록 만들기 21 | * 노래 이름 및 노래 아티스트 편집 22 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ja/full_description.txt: -------------------------------------------------------------------------------- 1 | このアプリを使ったら、無料の音楽ストリーミングサービスを手に入れたようなものです。YouTube Musicの音楽を聴いたり、自分だけのライブラリを作り上げたりできます。さらには、音楽をダウンロードし、オフラインで再生することもできます。また、プレイリストを作って、曲を整理することも可能です。簡単で、実用的で、広告のないアプリで、誰もが無料で音楽を聴くことができるようにすることが、Loudlyの目的です。 2 | 3 | 4 |
注意: 5 | 6 | 現在、プロジェクトはまだ安定しない段階です。もし不具合が発生したら、GitHubからissueを報告してください。 7 | 8 |
機能: 9 | 10 | * 広告なしで音楽を再生 11 | * YouTube Musicのほぼすべてのページを閲覧 12 | * YouTube Musicから、曲、アルバム、動画、プレイリストを検索 13 | * YouTube Musicのリンクを開く 14 | * 曲、アルバム、動画、プレイリストをローカルデータベースに保存 15 | * 曲をダウンロードしてオフラインで再生 16 | * 曲のタイトルを編集 17 | * YouTube Musicのお気に入りプレイリストへのリンクを追加 18 | * Material Designに準拠したプレイヤー 19 | * ロック画面での再生 20 | * 通知パネルで音楽をコントロール 21 | * 次の/前の曲にスキップ 22 | * リピート/シャッフルモード 23 | * 再生中のキューを編集 24 | * カスタムテーマ 25 | * ダークモード 26 | * 多言語対応 27 | * プロキシ 28 | * バックアップとリストア -------------------------------------------------------------------------------- /app/src/main/res/drawable/backup.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/repeat.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/utils/StringUtils.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.utils 2 | 3 | import java.net.URLEncoder 4 | 5 | fun makeTimeString(duration: Long?): String { 6 | if (duration == null || duration < 0) return "" 7 | var sec = duration / 1000 8 | val day = sec / 86400 9 | sec %= 86400 10 | val hour = sec / 3600 11 | sec %= 3600 12 | val minute = sec / 60 13 | sec %= 60 14 | return when { 15 | day > 0 -> "%d:%02d:%02d:%02d".format(day, hour, minute, sec) 16 | hour > 0 -> "%d:%02d:%02d".format(hour, minute, sec) 17 | else -> "%d:%02d".format(minute, sec) 18 | } 19 | } 20 | 21 | fun joinByBullet(vararg str: String?) = 22 | str.filterNot { 23 | it.isNullOrEmpty() 24 | }.joinToString(separator = " • ") 25 | 26 | fun String.urlEncode(): String = URLEncoder.encode(this, "UTF-8") -------------------------------------------------------------------------------- /app/src/main/res/drawable/cached.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/library_add.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /innertube/src/main/java/com/babelsoftware/innertube/pages/BrowseResult.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.innertube.pages 2 | 3 | import com.babelsoftware.innertube.models.YTItem 4 | import com.babelsoftware.innertube.models.filterExplicit 5 | 6 | data class BrowseResult( 7 | val title: String?, 8 | val items: List, 9 | ) { 10 | data class Item( 11 | val title: String?, 12 | val items: List, 13 | ) 14 | 15 | fun filterExplicit(enabled: Boolean = true) = 16 | if (enabled) { 17 | copy( 18 | items = items.mapNotNull { 19 | it.copy( 20 | items = it.items 21 | .filterExplicit() 22 | .ifEmpty { return@mapNotNull null } 23 | ) 24 | } 25 | ) 26 | } else this 27 | } 28 | -------------------------------------------------------------------------------- /material-color-utilities/src/main/java/com/google/material/color/quantize/Quantizer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.material.color.quantize; 18 | 19 | interface Quantizer { 20 | public QuantizerResult quantize(int[] pixels, int maxColors); 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/graphic_eq.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/slow_motion_video.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/babelsoftware/loudly/constants/StatPeriod.kt: -------------------------------------------------------------------------------- 1 | package com.babelsoftware.loudly.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/res/drawable/history.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/radio_button_unchecked.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | --------------------------------------------------------------------------------