From 9685091c4bc404384d06c86d6147857d37e9b7ea Mon Sep 17 00:00:00 2001 From: Shabinder Singh Date: Wed, 13 Oct 2021 01:20:41 +0530 Subject: [PATCH] YT Manual Extraction Fixes --- .../FetchPlatformQueryResult.kt | 34 ++++++------------ .../youtube_music/YoutubeMusic.kt | 35 ++++++++++++------- .../providers/TestSpotifyTrackMatching.kt | 4 +-- 3 files changed, 33 insertions(+), 40 deletions(-) diff --git a/common/providers/src/commonMain/kotlin/com.shabinder.common.providers/FetchPlatformQueryResult.kt b/common/providers/src/commonMain/kotlin/com.shabinder.common.providers/FetchPlatformQueryResult.kt index 5cbc1de8..fcf097a3 100644 --- a/common/providers/src/commonMain/kotlin/com.shabinder.common.providers/FetchPlatformQueryResult.kt +++ b/common/providers/src/commonMain/kotlin/com.shabinder.common.providers/FetchPlatformQueryResult.kt @@ -175,37 +175,23 @@ class FetchPlatformQueryResult( if (downloadLink.isNullOrBlank()) { // Try Fetching Track from Available Sources - val queryResult = saavnProvider.findBestSongDownloadURL( + saavnProvider.findBestSongDownloadURL( trackName = track.title, trackArtists = track.artists, preferredQuality = preferredQuality - ).onSuccess { audioFormat = AudioFormat.MP4 }.flatMapError { saavnError -> + ).onSuccess { (URL, quality) -> + audioFormat = AudioFormat.MP4 + downloadLink = URL + audioQuality = quality + }.flatMapError { saavnError -> appendPadded("Fetching From Saavn Failed:", saavnError.stackTraceToString()) // Saavn Failed, Lets Try Fetching Now From Youtube Music - youtubeMusic.findMp3SongDownloadURLYT(track, preferredQuality).onSuccess { - audioFormat = AudioFormat.MP3 - }.flatMapError { - // Append Error To StackTrace - appendPadded( - "Fetching From Yt1s Failed:", - it.stackTraceToString() - ) - appendPadded("Extracting Manually...") - - SuspendableEvent { - youtubeProvider.fetchVideoM4aLink(track.videoID.requireNotNull()) - }.onFailure { throwable -> - appendPadded("YT Manual Extraction Failed!", throwable.stackTraceToString()) - }.onSuccess { - audioFormat = AudioFormat.MP4 - } + youtubeMusic.findSongDownloadURLYT(track, preferredQuality, this).onSuccess { (URL, quality, format) -> + downloadLink = URL + audioQuality = quality + audioFormat = format } } - - queryResult.component1()?.let { - downloadLink = it.first - audioQuality = it.second - } } } return if (downloadLink.isNullOrBlank()) SuspendableEvent.error( diff --git a/common/providers/src/commonMain/kotlin/com.shabinder.common.providers/youtube_music/YoutubeMusic.kt b/common/providers/src/commonMain/kotlin/com.shabinder.common.providers/youtube_music/YoutubeMusic.kt index a2c10e54..44247c97 100644 --- a/common/providers/src/commonMain/kotlin/com.shabinder.common.providers/youtube_music/YoutubeMusic.kt +++ b/common/providers/src/commonMain/kotlin/com.shabinder.common.providers/youtube_music/YoutubeMusic.kt @@ -26,9 +26,12 @@ import com.shabinder.common.models.YoutubeTrack import com.shabinder.common.models.corsApi import com.shabinder.common.models.event.coroutines.SuspendableEvent import com.shabinder.common.models.event.coroutines.flatMap +import com.shabinder.common.models.event.coroutines.flatMapError import com.shabinder.common.models.event.coroutines.map +import com.shabinder.common.models.event.coroutines.onFailure import com.shabinder.common.providers.youtube.YoutubeProvider import com.shabinder.common.providers.youtube_to_mp3.requests.YoutubeMp3 +import com.shabinder.common.utils.appendPadded import io.github.shabinder.fuzzywuzzy.diffutils.FuzzySearch import io.ktor.client.HttpClient import io.ktor.client.request.headers @@ -61,10 +64,11 @@ class YoutubeMusic constructor( } // Get Downloadable Link - suspend fun findMp3SongDownloadURLYT( + suspend fun findSongDownloadURLYT( trackDetails: TrackDetails, - preferredQuality: AudioQuality = fileManager.preferenceManager.audioQuality - ): SuspendableEvent, Throwable> { + preferredQuality: AudioQuality = fileManager.preferenceManager.audioQuality, + errorReportBuilder: StringBuilder? = null + ): SuspendableEvent, Throwable> { return getYTIDBestMatch(trackDetails).flatMap { videoID -> // As YT compress Audio hence there is no benefit of quality for more than 192 val optimalQuality = @@ -72,18 +76,21 @@ class YoutubeMusic constructor( ?: 0) > 192 ) AudioQuality.KBPS192 else preferredQuality // 1 Try getting Link from Yt1s - youtubeMp3.getMp3DownloadLink(videoID, optimalQuality)/*.flatMapError { + youtubeMp3.getMp3DownloadLink(videoID, optimalQuality).map { + Triple(it, optimalQuality, AudioFormat.MP3) + }.flatMapError { + errorReportBuilder?.appendPadded( + "Yt1sMp3 Failed for $videoID:", it.stackTraceToString() + ) // 2 if Yt1s failed , Extract Manually + errorReportBuilder?.appendPadded("Extracting Manually...") SuspendableEvent { - youtubeProvider.ytDownloader.getVideo(videoID).get()?.url - ?: throw SpotiFlyerException.YoutubeLinkNotFound( - videoID, - message = "Caught Following Errors While Finding Downloadable Link for $videoID : \n${it.stackTraceToString()}" - ) + youtubeProvider.fetchVideoM4aLink(videoID) + }.onFailure { throwable -> + errorReportBuilder?.appendPadded("YT Manual Extraction Failed!", throwable.stackTraceToString()) + }.map { (URL, quality) -> + Triple(URL, quality, AudioFormat.MP4) } - }*/.map { - trackDetails.audioFormat = AudioFormat.MP3 - Pair(it, optimalQuality) } } } @@ -203,7 +210,9 @@ class YoutubeMusic constructor( */ for (detailArray in result.subList(0, result.size - 1)) { for (detail in detailArray.jsonArray) { - if ((detail.jsonObject["musicResponsiveListItemFlexColumnRenderer"]?.jsonObject?.size ?: 0) < 2) continue + if ((detail.jsonObject["musicResponsiveListItemFlexColumnRenderer"]?.jsonObject?.size + ?: 0) < 2 + ) continue // if not a dummy, collect All Variables val details = diff --git a/common/providers/src/commonTest/kotlin/com/shabinder/common/providers/TestSpotifyTrackMatching.kt b/common/providers/src/commonTest/kotlin/com/shabinder/common/providers/TestSpotifyTrackMatching.kt index a06d8471..fa4d7432 100644 --- a/common/providers/src/commonTest/kotlin/com/shabinder/common/providers/TestSpotifyTrackMatching.kt +++ b/common/providers/src/commonTest/kotlin/com/shabinder/common/providers/TestSpotifyTrackMatching.kt @@ -7,8 +7,6 @@ import com.shabinder.common.providers.utils.CommonUtils import com.shabinder.common.providers.utils.SpotifyUtils import com.shabinder.common.providers.utils.SpotifyUtils.toTrackDetailsList import io.github.shabinder.runBlocking -import io.ktor.client.request.get -import io.ktor.client.statement.HttpResponse import kotlinx.serialization.InternalSerializationApi import kotlin.test.Test @@ -41,7 +39,7 @@ class TestSpotifyTrackMatching { // val matched = CommonUtils.youtubeMusic.getYTTracks(CommonUtils.getYTQueryString(trackDetails)) // println("YT-MATCHES: \n ${matched.component1()?.joinToString("\n")} \n") - val ytMatch = CommonUtils.youtubeMusic.findMp3SongDownloadURLYT(trackDetails) + val ytMatch = CommonUtils.youtubeMusic.findSongDownloadURLYT(trackDetails) println("YT MATCH: $ytMatch") } } \ No newline at end of file