gitextract_3r9508kv/ ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug-report.md │ │ └── feature_request.md │ ├── dependabot.yml │ └── workflows/ │ ├── Release.yml │ ├── build-and-publish-kjs.yml │ ├── build-release-binaries.yml │ ├── maintenance.yml │ └── tf-refresh.yml ├── .gitignore ├── .gitmodules ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── android/ │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── shabinder/ │ │ └── spotiflyer/ │ │ ├── App.kt │ │ ├── MainActivity.kt │ │ ├── di/ │ │ │ └── AppModule.kt │ │ ├── service/ │ │ │ ├── ForegroundService.kt │ │ │ ├── Message.kt │ │ │ ├── TrackStatusFlowMap.kt │ │ │ └── Utils.kt │ │ ├── ui/ │ │ │ ├── AnalyticsDialog.kt │ │ │ ├── NetworkDialog.kt │ │ │ ├── PermissionDialog.kt │ │ │ └── SplashScreenActivity.kt │ │ └── utils/ │ │ ├── SignatureVerification.kt │ │ ├── UtilFunctions.kt │ │ └── autoclear/ │ │ ├── AutoClear.kt │ │ ├── AutoClearFragment.kt │ │ ├── LifecycleAutoInitializer.kt │ │ └── lifecycleobservers/ │ │ ├── LifecycleCreateAndDestroyObserver.kt │ │ ├── LifecycleResumeAndPauseObserver.kt │ │ └── LifecycleStartAndStopObserver.kt │ └── res/ │ ├── drawable/ │ │ └── ic_splash.xml │ ├── mipmap-anydpi-v26/ │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ └── values/ │ ├── colors.xml │ ├── ic_launcher_background.xml │ └── themes.xml ├── build.gradle.kts ├── buildSrc/ │ ├── build.gradle.kts │ ├── buildSrc/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ └── kotlin/ │ │ └── Versions.kt │ ├── deps.versions.toml │ ├── settings.gradle.kts │ └── src/ │ └── main/ │ └── kotlin/ │ ├── android-setup.gradle.kts │ ├── compiler-args.gradle.kts │ ├── ktlint-setup.gradle.kts │ ├── multiplatform-compose-setup.gradle.kts │ ├── multiplatform-setup-test.gradle.kts │ └── multiplatform-setup.gradle.kts ├── common/ │ ├── compose/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ ├── AndroidManifest.xml │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── shabinder/ │ │ │ └── common/ │ │ │ └── uikit/ │ │ │ ├── AndroidDialog.kt │ │ │ ├── AndroidImageLoad.kt │ │ │ ├── AndroidImages.kt │ │ │ ├── AndroidScrollBars.kt │ │ │ └── configurations/ │ │ │ └── AndroidTypography.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── shabinder/ │ │ │ └── common/ │ │ │ └── uikit/ │ │ │ ├── ExpectDialog.kt │ │ │ ├── ExpectImageLoad.kt │ │ │ ├── ExpectImages.kt │ │ │ ├── ScrollBars.kt │ │ │ ├── Toast.kt │ │ │ ├── configurations/ │ │ │ │ ├── Color.kt │ │ │ │ ├── Shape.kt │ │ │ │ ├── Theme.kt │ │ │ │ └── Type.kt │ │ │ ├── dialogs/ │ │ │ │ ├── Donation.kt │ │ │ │ └── ErrorInfoDialog.kt │ │ │ ├── screens/ │ │ │ │ ├── SpotiFlyerListUi.kt │ │ │ │ ├── SpotiFlyerMainUi.kt │ │ │ │ ├── SpotiFlyerPreferenceUi.kt │ │ │ │ ├── SpotiFlyerRootUi.kt │ │ │ │ └── splash/ │ │ │ │ └── Splash.kt │ │ │ └── utils/ │ │ │ ├── Colors.kt │ │ │ └── GradientScrim.kt │ │ └── desktopMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── shabinder/ │ │ └── common/ │ │ └── uikit/ │ │ ├── DesktopDialog.kt │ │ ├── DesktopImageLoad.kt │ │ ├── DesktopImages.kt │ │ ├── DesktopScrollBar.kt │ │ ├── DesktopToast.kt │ │ └── configurations/ │ │ └── DesktopTypography.kt │ ├── core-components/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ ├── AndroidManifest.xml │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── shabinder/ │ │ │ └── common/ │ │ │ └── core_components/ │ │ │ ├── AndroidNetworkObserver.kt │ │ │ ├── LiveDataExt.kt │ │ │ ├── analytics/ │ │ │ │ └── AndroidAnalyticsManager.kt │ │ │ ├── file_manager/ │ │ │ │ └── AndroidFileManager.kt │ │ │ ├── media_converter/ │ │ │ │ ├── AndroidMediaConverter.kt │ │ │ │ └── AudioTagging.kt │ │ │ ├── picture/ │ │ │ │ ├── AndroidPicture.kt │ │ │ │ └── Picture.kt │ │ │ └── utils/ │ │ │ └── AndroidHttpClient.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com.shabinder.common.core_components/ │ │ │ ├── CoreComponentsModule.kt │ │ │ ├── analytics/ │ │ │ │ ├── AnalyticsManager.kt │ │ │ │ ├── Events.kt │ │ │ │ └── Views.kt │ │ │ ├── file_manager/ │ │ │ │ └── FileManager.kt │ │ │ ├── media_converter/ │ │ │ │ └── MediaConverter.kt │ │ │ ├── parallel_executor/ │ │ │ │ └── ParallelExecutor.kt │ │ │ ├── picture/ │ │ │ │ └── Picture.kt │ │ │ ├── preference_manager/ │ │ │ │ └── PreferenceManager.kt │ │ │ └── utils/ │ │ │ ├── NetworkingExt.kt │ │ │ └── StoreExt.kt │ │ ├── desktopMain/ │ │ │ └── kotlin/ │ │ │ ├── com/ │ │ │ │ └── shabinder/ │ │ │ │ └── common/ │ │ │ │ └── core_components/ │ │ │ │ └── utils/ │ │ │ │ └── DesktopHttpClient.kt │ │ │ └── com.shabinder.common.core_components/ │ │ │ ├── analytics/ │ │ │ │ └── DesktopAnalyticsManager.kt │ │ │ ├── file_manager/ │ │ │ │ └── DesktopFileManager.kt │ │ │ ├── media_converter/ │ │ │ │ ├── DesktopMediaConverter.kt │ │ │ │ └── ID3Tagging.kt │ │ │ └── picture/ │ │ │ └── Picture.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── com.shabinder.common.core_components/ │ │ │ ├── IOSDeps.kt │ │ │ ├── IOSDir.kt │ │ │ ├── IOSTagging.kt │ │ │ ├── IOSUtils.kt │ │ │ └── picture/ │ │ │ └── IOSPicture.kt │ │ └── jsMain/ │ │ └── kotlin/ │ │ └── com.shabinder.common.core_components/ │ │ ├── FileSave.kt │ │ ├── ID3Writer.kt │ │ ├── analytics/ │ │ │ └── WebAnalyticsManager.kt │ │ ├── file_manager/ │ │ │ └── WebFileManager.kt │ │ ├── media_converter/ │ │ │ └── WebMediaConverter.kt │ │ ├── picture/ │ │ │ └── Picture.kt │ │ └── utils/ │ │ └── WebHttpClient.kt │ ├── data-models/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin/ │ │ │ │ └── com.shabinder.common.models/ │ │ │ │ ├── AndroidAtomicReference.kt │ │ │ │ ├── AndroidDispatcher.kt │ │ │ │ └── AndroidPlatformActions.kt │ │ │ └── res/ │ │ │ └── drawable/ │ │ │ └── jio_saavn.xml │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── shabinder/ │ │ │ └── common/ │ │ │ ├── caching/ │ │ │ │ ├── Cache.kt │ │ │ │ ├── FakeTimeSource.kt │ │ │ │ ├── RealCache.kt │ │ │ │ └── ReorderingIsoMutableSet.kt │ │ │ ├── models/ │ │ │ │ ├── Actions.kt │ │ │ │ ├── AudioFormat.kt │ │ │ │ ├── AudioQuality.kt │ │ │ │ ├── Consumer.kt │ │ │ │ ├── CorsProxy.kt │ │ │ │ ├── Dispatcher.kt │ │ │ │ ├── DownloadObject.kt │ │ │ │ ├── DownloadRecord.kt │ │ │ │ ├── DownloadResult.kt │ │ │ │ ├── NativeAtomicReference.kt │ │ │ │ ├── PlatformActions.kt │ │ │ │ ├── PlatformQueryResult.kt │ │ │ │ ├── SpotiFlyerException.kt │ │ │ │ ├── Status.kt │ │ │ │ ├── YoutubeTrack.kt │ │ │ │ ├── event/ │ │ │ │ │ ├── Event.kt │ │ │ │ │ ├── Factory.kt │ │ │ │ │ ├── Validation.kt │ │ │ │ │ └── coroutines/ │ │ │ │ │ ├── SuspendableEvent.kt │ │ │ │ │ └── SuspendedValidation.kt │ │ │ │ ├── gaana/ │ │ │ │ │ ├── Artist.kt │ │ │ │ │ ├── CustomArtworks.kt │ │ │ │ │ ├── GaanaAlbum.kt │ │ │ │ │ ├── GaanaArtistDetails.kt │ │ │ │ │ ├── GaanaArtistTracks.kt │ │ │ │ │ ├── GaanaPlaylist.kt │ │ │ │ │ ├── GaanaSong.kt │ │ │ │ │ ├── GaanaTrack.kt │ │ │ │ │ ├── Genre.kt │ │ │ │ │ └── Tags.kt │ │ │ │ ├── saavn/ │ │ │ │ │ ├── MoreInfo.kt │ │ │ │ │ ├── SaavnAlbum.kt │ │ │ │ │ ├── SaavnPlaylist.kt │ │ │ │ │ ├── SaavnSearchResult.kt │ │ │ │ │ └── SaavnSong.kt │ │ │ │ ├── soundcloud/ │ │ │ │ │ ├── Badges.kt │ │ │ │ │ ├── CreatorSubscription.kt │ │ │ │ │ ├── Format.kt │ │ │ │ │ ├── Media.kt │ │ │ │ │ ├── Product.kt │ │ │ │ │ ├── PublisherMetadata.kt │ │ │ │ │ ├── Transcoding.kt │ │ │ │ │ ├── User.kt │ │ │ │ │ ├── Visual.kt │ │ │ │ │ ├── Visuals.kt │ │ │ │ │ └── resolvemodel/ │ │ │ │ │ └── SoundCloudResolveResponseBase.kt │ │ │ │ ├── spotify/ │ │ │ │ │ ├── Album.kt │ │ │ │ │ ├── Artist.kt │ │ │ │ │ ├── Copyright.kt │ │ │ │ │ ├── Episodes.kt │ │ │ │ │ ├── Followers.kt │ │ │ │ │ ├── Image.kt │ │ │ │ │ ├── LinkedTrack.kt │ │ │ │ │ ├── PagingObjectPlaylistTrack.kt │ │ │ │ │ ├── PagingObjectTrack.kt │ │ │ │ │ ├── Playlist.kt │ │ │ │ │ ├── PlaylistTrack.kt │ │ │ │ │ ├── Source.kt │ │ │ │ │ ├── SpotifyCredentials.kt │ │ │ │ │ ├── TokenData.kt │ │ │ │ │ ├── Track.kt │ │ │ │ │ ├── UserPrivate.kt │ │ │ │ │ └── UserPublic.kt │ │ │ │ └── wynk/ │ │ │ │ ├── AlbumRefWynk.kt │ │ │ │ ├── HtDataWynk.kt │ │ │ │ ├── ItemWynk.kt │ │ │ │ ├── ShortURLWynk.kt │ │ │ │ └── SingerWynk.kt │ │ │ └── utils/ │ │ │ ├── Ext.kt │ │ │ ├── JsonUtils.kt │ │ │ └── Utils.kt │ │ ├── desktopMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── shabinder/ │ │ │ └── common/ │ │ │ └── models/ │ │ │ ├── DesktopAtomicReference.kt │ │ │ ├── DesktopDispacthers.kt │ │ │ └── DesktopPlatformActions.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── com.shabinder.common.models/ │ │ │ └── IOSPlatformActions.kt │ │ ├── jsMain/ │ │ │ └── kotlin/ │ │ │ └── com.shabinder.common.models/ │ │ │ ├── JSPlatformActions.kt │ │ │ ├── WebActual.kt │ │ │ └── WebAtomicReference.kt │ │ └── main/ │ │ └── res/ │ │ └── drawable/ │ │ ├── ic_arrow.xml │ │ ├── ic_download_arrow.xml │ │ ├── ic_error.xml │ │ ├── ic_gaana.xml │ │ ├── ic_github.xml │ │ ├── ic_heart.xml │ │ ├── ic_indian_rupee.xml │ │ ├── ic_instagram.xml │ │ ├── ic_jio_saavn_logo.xml │ │ ├── ic_linkedin.xml │ │ ├── ic_mug.xml │ │ ├── ic_musicplaceholder.xml │ │ ├── ic_opencollective_icon.xml │ │ ├── ic_paypal_logo.xml │ │ ├── ic_refreshgradient.xml │ │ ├── ic_round_cancel_24.xml │ │ ├── ic_share_open.xml │ │ ├── ic_song_placeholder.xml │ │ ├── ic_soundcloud.xml │ │ ├── ic_spotiflyer_logo.xml │ │ ├── ic_spotify_logo.xml │ │ ├── ic_tick.xml │ │ ├── ic_youtube.xml │ │ ├── ic_youtube_music_logo.xml │ │ ├── music.xml │ │ └── soundbound_app_logo.xml │ ├── database/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ ├── AndroidManifest.xml │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── shabinder/ │ │ │ └── common/ │ │ │ └── database/ │ │ │ └── ActualAndroid.kt │ │ ├── commonMain/ │ │ │ ├── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── shabinder/ │ │ │ │ └── common/ │ │ │ │ └── database/ │ │ │ │ ├── Expect.kt │ │ │ │ └── SpotiFlyerDatabase.kt │ │ │ └── sqldelight/ │ │ │ └── com/ │ │ │ └── shabinder/ │ │ │ └── common/ │ │ │ └── database/ │ │ │ ├── DownloadRecordDatabase.sq │ │ │ └── TokenDB.sq │ │ ├── desktopMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── shabinder/ │ │ │ └── common/ │ │ │ └── database/ │ │ │ └── ActualDesktop.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── com.shabinder.common.database/ │ │ │ └── ActualIos.kt │ │ └── jsMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── shabinder/ │ │ └── common/ │ │ └── database/ │ │ └── ActualJs.kt │ ├── dependency-injection/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── AndroidManifest.xml │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── shabinder/ │ │ └── common/ │ │ └── di/ │ │ ├── ApplicationInit.kt │ │ └── DI.kt │ ├── list/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── AndroidManifest.xml │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── shabinder/ │ │ └── common/ │ │ └── list/ │ │ ├── SpotiFlyerList.kt │ │ ├── integration/ │ │ │ └── SpotiFlyerListImpl.kt │ │ └── store/ │ │ ├── InstanceKeeperExt.kt │ │ ├── SpotiFlyerListStore.kt │ │ └── SpotiFlyerListStoreProvider.kt │ ├── main/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── AndroidManifest.xml │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── shabinder/ │ │ └── common/ │ │ └── main/ │ │ ├── SpotiFlyerMain.kt │ │ ├── integration/ │ │ │ └── SpotiFlyerMainImpl.kt │ │ └── store/ │ │ ├── InstanceKeeperExt.kt │ │ ├── SpotiFlyerMainStore.kt │ │ └── SpotiFlyerMainStoreProvider.kt │ ├── preference/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ └── AndroidManifest.xml │ │ └── commonMain/ │ │ └── kotlin/ │ │ └── com/ │ │ └── shabinder/ │ │ └── common/ │ │ └── preference/ │ │ ├── SpotiFlyerPreference.kt │ │ ├── integration/ │ │ │ └── SpotiFlyerPreferenceImpl.kt │ │ └── store/ │ │ ├── InstanceKeeperExt.kt │ │ ├── SpotiFlyerPreferenceStore.kt │ │ └── SpotiFlyerPreferenceStoreProvider.kt │ ├── providers/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── androidMain/ │ │ │ ├── AndroidManifest.xml │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── shabinder/ │ │ │ └── common/ │ │ │ └── providers/ │ │ │ ├── AndroidActual.kt │ │ │ └── saavn/ │ │ │ └── requests/ │ │ │ └── decryptURL.kt │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ └── com.shabinder.common.providers/ │ │ │ ├── Expect.kt │ │ │ ├── FetchPlatformQueryResult.kt │ │ │ ├── ProvidersModule.kt │ │ │ ├── gaana/ │ │ │ │ ├── GaanaProvider.kt │ │ │ │ └── requests/ │ │ │ │ └── GaanaRequests.kt │ │ │ ├── saavn/ │ │ │ │ ├── SaavnProvider.kt │ │ │ │ └── requests/ │ │ │ │ ├── JioSaavnRequests.kt │ │ │ │ └── JioSaavnUtils.kt │ │ │ ├── sound_cloud/ │ │ │ │ ├── SoundCloudProvider.kt │ │ │ │ └── requests/ │ │ │ │ └── SoundCloudRequests.kt │ │ │ ├── spotify/ │ │ │ │ ├── SpotifyProvider.kt │ │ │ │ ├── requests/ │ │ │ │ │ ├── SpotifyAuth.kt │ │ │ │ │ └── SpotifyRequests.kt │ │ │ │ └── token_store/ │ │ │ │ └── TokenStore.kt │ │ │ ├── youtube/ │ │ │ │ └── YoutubeProvider.kt │ │ │ ├── youtube_music/ │ │ │ │ └── YoutubeMusic.kt │ │ │ └── youtube_to_mp3/ │ │ │ └── requests/ │ │ │ ├── YoutubeMp3.kt │ │ │ └── Yt1sMp3.kt │ │ ├── commonTest/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── shabinder/ │ │ │ └── common/ │ │ │ └── providers/ │ │ │ ├── TestSpotifyTrackMatching.kt │ │ │ ├── placeholders/ │ │ │ │ ├── FileManager.kt │ │ │ │ ├── MediaConverter.kt │ │ │ │ └── PreferenceManager.kt │ │ │ └── utils/ │ │ │ ├── CommonUtils.kt │ │ │ └── SpotifyUtils.kt │ │ ├── desktopMain/ │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── shabinder/ │ │ │ └── common/ │ │ │ └── providers/ │ │ │ ├── DesktopActual.kt │ │ │ └── saavn/ │ │ │ └── requests/ │ │ │ └── decryptURL.kt │ │ ├── iosMain/ │ │ │ └── kotlin/ │ │ │ └── com.shabinder.common.providers/ │ │ │ ├── IOSActual.kt │ │ │ └── saavn.requests/ │ │ │ └── decryptURL.kt │ │ └── jsMain/ │ │ └── kotlin/ │ │ └── com.shabinder.common.providers/ │ │ ├── WebActual.kt │ │ └── saavn/ │ │ └── requests/ │ │ └── decryptURL.kt │ └── root/ │ ├── build.gradle.kts │ └── src/ │ ├── androidMain/ │ │ └── AndroidManifest.xml │ └── commonMain/ │ └── kotlin/ │ └── com/ │ └── shabinder/ │ └── common/ │ └── root/ │ ├── SpotiFlyerRoot.kt │ ├── callbacks/ │ │ └── SpotiFlyerRootCallBacks.kt │ └── integration/ │ └── SpotiFlyerRootImpl.kt ├── console-app/ │ ├── build.gradle.kts │ └── src/ │ └── main/ │ └── java/ │ ├── common/ │ │ ├── Common.kt │ │ └── Parameters.kt │ ├── main.kt │ └── utils/ │ ├── Exceptions.kt │ ├── Ext.kt │ └── TestClass.kt ├── desktop/ │ ├── build.gradle.kts │ └── src/ │ └── jvmMain/ │ ├── kotlin/ │ │ └── Main.kt │ └── resources/ │ └── drawable/ │ └── spotiflyer.icns ├── fastlane/ │ ├── Appfile │ ├── Fastfile │ └── metadata/ │ └── android/ │ └── en-US/ │ ├── changelogs/ │ │ ├── 20.txt │ │ ├── 21.txt │ │ ├── 22.txt │ │ ├── 24.txt │ │ ├── 25.txt │ │ ├── 26.txt │ │ ├── 27.txt │ │ ├── 28.txt │ │ ├── 29.txt │ │ ├── 30.txt │ │ ├── 31.txt │ │ └── 32.txt │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt ├── ffmpeg/ │ ├── android-ffmpeg/ │ │ ├── .gitignore │ │ ├── build.gradle.bak │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── proguard-rules.pro │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── nl/ │ │ └── bravobit/ │ │ └── ffmpeg/ │ │ ├── CommandResult.java │ │ ├── CpuArch.java │ │ ├── CpuArchHelper.java │ │ ├── ExecuteBinaryResponseHandler.java │ │ ├── FFbinaryContextProvider.java │ │ ├── FFbinaryInterface.java │ │ ├── FFbinaryObserver.java │ │ ├── FFcommandExecuteAsyncTask.java │ │ ├── FFcommandExecuteResponseHandler.java │ │ ├── FFmpeg.kt │ │ ├── FFprobe.java │ │ ├── FFtask.kt │ │ ├── FileUtils.kt │ │ ├── Log.kt │ │ ├── ResponseHandler.kt │ │ ├── ShellCommand.kt │ │ └── Util.kt │ └── copy-ffmpeg-executables.sh ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── infra/ │ ├── .terraform.lock.hcl │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── maintenance-tasks/ │ ├── build.gradle.kts │ └── src/ │ └── main/ │ └── java/ │ ├── common/ │ │ ├── Common.kt │ │ ├── ContentUpdation.kt │ │ ├── Date.kt │ │ ├── GithubService.kt │ │ ├── HCTIService.kt │ │ └── Secrets.kt │ ├── main.kt │ ├── models/ │ │ ├── github/ │ │ │ ├── Asset.kt │ │ │ ├── Author.kt │ │ │ ├── GithubFileContent.kt │ │ │ ├── GithubReleaseInfoItem.kt │ │ │ ├── GithubReleasesInfo.kt │ │ │ ├── Reactions.kt │ │ │ └── Uploader.kt │ │ └── matomo/ │ │ ├── MatomoDownloads.kt │ │ └── MatomoDownloadsItem.kt │ ├── scripts/ │ │ ├── UpdateAnalyticsImage.kt │ │ └── UpdateDownloadCards.kt │ └── utils/ │ ├── Exceptions.kt │ ├── Ext.kt │ └── TestClass.kt ├── scripts/ │ └── build-ffmpeg.sh ├── settings.gradle.kts ├── translations/ │ ├── Strings_cn.properties.xml │ ├── Strings_cro.properties │ ├── Strings_cs.properties │ ├── Strings_de.properties │ ├── Strings_en.properties │ ├── Strings_es.properties │ ├── Strings_fa.properties │ ├── Strings_fr.properties │ ├── Strings_hi.properties │ ├── Strings_id.properties │ ├── Strings_it.properties │ ├── Strings_ja.properties.xml │ ├── Strings_jp.properties │ ├── Strings_ml.properties │ ├── Strings_ne.properties │ ├── Strings_nl.properties │ ├── Strings_pl.properties │ ├── Strings_pt.properties │ ├── Strings_pt_BR.properties │ ├── Strings_ro.properties │ ├── Strings_ru.properties │ ├── Strings_tl.properties │ ├── Strings_tr.properties │ ├── Strings_tw.properties │ ├── Strings_uk.properties │ └── Strings_ur.properties.xml └── web-app/ ├── build.gradle.kts └── src/ └── main/ ├── kotlin/ │ ├── App.kt │ ├── Styles.kt │ ├── client.kt │ ├── extras/ │ │ ├── RenderableComponent.kt │ │ ├── UniqueId.kt │ │ └── Utils.kt │ ├── home/ │ │ ├── HomeScreen.kt │ │ ├── IconList.kt │ │ ├── Message.kt │ │ └── Searchbar.kt │ ├── list/ │ │ ├── CircularProgressBar.kt │ │ ├── CoverImage.kt │ │ ├── DownloadAllButton.kt │ │ ├── DownloadButton.kt │ │ ├── ListScreen.kt │ │ ├── LoadingAnim.kt │ │ ├── LoadingSpinner.kt │ │ └── TrackItem.kt │ ├── navbar/ │ │ ├── NavBar.kt │ │ └── NavBarStyles.kt │ └── root/ │ └── RootR.kt └── resources/ ├── css-circular-prog-bar.css ├── index.html └── styles.css