From 1b418d53acbd83e111cc01792a04e722bad2e687 Mon Sep 17 00:00:00 2001 From: deniscerri <64997243+deniscerri@users.noreply.github.com> Date: Sun, 24 Nov 2024 22:45:36 +0100 Subject: [PATCH] small changes --- .../ytdl/util/extractors/YTDLPUtil.kt | 66 ++++++++++++------- app/src/main/res/drawable/divider_10dp.xml | 7 ++ .../main/res/layout/custom_ytdlp_source.xml | 2 +- .../res/layout/fragment_download_audio.xml | 5 +- .../res/layout/fragment_download_video.xml | 5 +- 5 files changed, 55 insertions(+), 30 deletions(-) create mode 100644 app/src/main/res/drawable/divider_10dp.xml diff --git a/app/src/main/java/com/deniscerri/ytdl/util/extractors/YTDLPUtil.kt b/app/src/main/java/com/deniscerri/ytdl/util/extractors/YTDLPUtil.kt index 4d32bb71..a70cfcf5 100644 --- a/app/src/main/java/com/deniscerri/ytdl/util/extractors/YTDLPUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/extractors/YTDLPUtil.kt @@ -37,6 +37,7 @@ import org.json.JSONObject import java.io.File import java.lang.reflect.Type import java.net.URLEncoder +import java.security.MessageDigest import java.util.ArrayList import java.util.Locale import java.util.UUID @@ -138,7 +139,33 @@ class YTDLPUtil(private val context: Context) { val title = jsonObject.getStringByAny("alt_title", "title", "webpage_url_basename") if (title == "[Private video]" || title == "[Deleted video]") continue - var author = jsonObject.getStringByAny("artists", "artist", "uploader", "channel", "playlist_uploader", "uploader_id") + + var playlistTitle = jsonObject.getStringByAny("playlist_title") + var playlistURL: String? = "" + var playlistIndex: Int? = null + + if(playlistTitle.removeSurrounding("\"") == query) playlistTitle = "" + + if (playlistTitle.isNotBlank()){ + playlistURL = jsonObject.getStringByAny("playlist_webpage_url").ifEmpty { query } + kotlin.runCatching { playlistIndex = jsonObject.getInt("playlist_index") } + } + val url = if (jsonObject.has("url") && results.size > 1){ + jsonObject.getString("url") + }else{ + if (Patterns.WEB_URL.matcher(query).matches() && playlistURL?.isEmpty() == true){ + query + }else{ + jsonObject.getStringByAny("webpage_url", "original_url", "url", ) + jsonObject.getString("webpage_url") + } + } + + val authorTags = mutableListOf("uploader", "channel", "playlist_uploader", "uploader_id") + if (url.isYoutubeURL()) { + authorTags.addAll(0, listOf("artists", "artist")) + } + var author = jsonObject.getStringByAny(*authorTags.map { it }.toTypedArray()) var duration = jsonObject.getIntByAny("duration").toString() if (duration != "-1"){ duration = jsonObject.getInt("duration").toStringDuration(Locale.US) @@ -167,16 +194,7 @@ class YTDLPUtil(private val context: Context) { var website = jsonObject.getStringByAny("extractor_key", "extractor","ie_key") if (website == "Generic" || website == "HTML5MediaEmbed") website = jsonObject.getStringByAny("webpage_url_domain") - var playlistTitle = jsonObject.getStringByAny("playlist_title") - var playlistURL: String? = "" - var playlistIndex: Int? = null - if(playlistTitle.removeSurrounding("\"") == query) playlistTitle = "" - - if (playlistTitle.isNotBlank()){ - playlistURL = jsonObject.getStringByAny("playlist_webpage_url").ifEmpty { query } - kotlin.runCatching { playlistIndex = jsonObject.getInt("playlist_index") } - } val formatsInJSON = if (jsonObject.has("formats") && jsonObject.get("formats") is JSONArray) jsonObject.getJSONArray("formats") else null val formats : ArrayList = parseYTDLFormats(formatsInJSON) @@ -201,16 +219,7 @@ class YTDLPUtil(private val context: Context) { urls = urlList.joinToString("\n") } - val url = if (jsonObject.has("url") && results.size > 1){ - jsonObject.getString("url") - }else{ - if (Patterns.WEB_URL.matcher(query).matches() && playlistURL?.isEmpty() == true){ - query - }else{ - jsonObject.getStringByAny("webpage_url", "original_url", "url", ) - jsonObject.getString("webpage_url") - } - } + val type = jsonObject.getStringByAny("_type") if (type == "playlist" && playlistTitle.isEmpty()) { @@ -536,6 +545,7 @@ class YTDLPUtil(private val context: Context) { this.add(it) } } + @OptIn(ExperimentalStdlibApi::class) @SuppressLint("RestrictedApi") fun buildYoutubeDLRequest(downloadItem: DownloadItem) : YoutubeDLRequest { val useItemURL = sharedPreferences.getBoolean("use_itemurl_instead_playlisturl", false) @@ -723,8 +733,8 @@ class YTDLPUtil(private val context: Context) { } if (!sharedPreferences.getBoolean("disable_write_info_json", false)) { - val cachePath = "${FileUtil.getCachePath(context)}/infojsons" - val infoJsonName = downloadItem.url.replace("/", "") + val cachePath = "${FileUtil.getCachePath(context)}infojsons" + val infoJsonName = MessageDigest.getInstance("MD5").digest(downloadItem.url.toByteArray()).toHexString() val infoJsonFile = File(cachePath).walkTopDown().firstOrNull { it.name == "${infoJsonName}.info.json" } //ignore info file if its older than 5 hours. puny measure to prevent expired formats in some cases @@ -807,7 +817,10 @@ class YTDLPUtil(private val context: Context) { request.addOption("-P", downDir.absolutePath) request.addOption("-S", formatSorting.toString()) - metadataCommands.addOption("--parse-metadata", """%(artists,artist,uploader,channel,creator|null)l:^(?P.*?)(?:(?= - Topic)|$)""") + val useArtistTags = if (downloadItem.url.isYoutubeURL()) "artists,artist," else "" + if (downloadItem.author.isBlank()) { + metadataCommands.addOption("--parse-metadata", """%(${useArtistTags}uploader,channel,creator|null)l:^(?P.*?)(?:(?= - Topic)|$)""") + } if (downloadItem.audioPreferences.splitByChapters && downloadItem.downloadSections.isBlank()){ request.addOption("--split-chapters") @@ -835,9 +848,9 @@ class YTDLPUtil(private val context: Context) { } + metadataCommands.addOption("--parse-metadata", "%(album_artist,first_artist|)s:%(album_artist)s") metadataCommands.addOption("--parse-metadata", "description:(?:Released on: )(?P\\d{4})") metadataCommands.addOption("--parse-metadata", "%(dscrptn_year,release_year,release_date>%Y,upload_date>%Y)s:(?P\\d+)") - metadataCommands.addOption("--parse-metadata", "%(album_artist,first_artist|)s:%(album_artist)s") if (isPlaylistItem) { metadataCommands.addOption("--parse-metadata", "%(track_number,playlist_index)d:(?P\\d+)") @@ -877,7 +890,10 @@ class YTDLPUtil(private val context: Context) { } DownloadViewModel.Type.video -> { - metadataCommands.addOption("--parse-metadata", """%(uploader,channel,creator,artist|null)s:^(?P.*?)(?:(?= - Topic)|$)""") + val useArtistTags = if (downloadItem.url.isYoutubeURL()) "artists,artist," else "" + if (downloadItem.author.isBlank()) { + metadataCommands.addOption("--parse-metadata", """%(${useArtistTags}uploader,channel,creator|null)l:^(?P.*?)(?:(?= - Topic)|$)""") + } val supportedContainers = context.resources.getStringArray(R.array.video_containers) diff --git a/app/src/main/res/drawable/divider_10dp.xml b/app/src/main/res/drawable/divider_10dp.xml new file mode 100644 index 00000000..213f691d --- /dev/null +++ b/app/src/main/res/drawable/divider_10dp.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/custom_ytdlp_source.xml b/app/src/main/res/layout/custom_ytdlp_source.xml index ae546bf2..e1955001 100644 --- a/app/src/main/res/layout/custom_ytdlp_source.xml +++ b/app/src/main/res/layout/custom_ytdlp_source.xml @@ -23,7 +23,7 @@ android:id="@+id/sampleRadioBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="10dp" + android:layout_marginStart="5dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/fragment_download_audio.xml b/app/src/main/res/layout/fragment_download_audio.xml index a426b631..c452ead1 100644 --- a/app/src/main/res/layout/fragment_download_audio.xml +++ b/app/src/main/res/layout/fragment_download_audio.xml @@ -35,13 +35,15 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingHorizontal="10dp" + android:divider="@drawable/divider_10dp" + android:showDividers="middle" android:orientation="horizontal"> @@ -59,7 +61,6 @@ style="@style/Widget.Material3.TextInputLayout.FilledBox.ExposedDropdownMenu" android:layout_width="0dp" android:layout_weight="45" - android:paddingStart="10dp" android:layout_height="wrap_content" android:hint="@string/container"> diff --git a/app/src/main/res/layout/fragment_download_video.xml b/app/src/main/res/layout/fragment_download_video.xml index 78395786..8a0207b7 100644 --- a/app/src/main/res/layout/fragment_download_video.xml +++ b/app/src/main/res/layout/fragment_download_video.xml @@ -34,6 +34,8 @@ android:layout_height="wrap_content" android:orientation="horizontal" android:paddingHorizontal="10dp" + android:divider="@drawable/divider_10dp" + android:showDividers="middle" android:baselineAligned="false">