small changes

This commit is contained in:
deniscerri 2024-11-24 22:45:36 +01:00
parent a032775f1b
commit 1b418d53ac
No known key found for this signature in database
GPG key ID: 95C43D517D830350
5 changed files with 55 additions and 30 deletions

View file

@ -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<Format> = 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<uploader>.*?)(?:(?= - 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<uploader>.*?)(?:(?= - 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<dscrptn_year>\\d{4})")
metadataCommands.addOption("--parse-metadata", "%(dscrptn_year,release_year,release_date>%Y,upload_date>%Y)s:(?P<meta_date>\\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<track_number>\\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<uploader>.*?)(?:(?= - 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<uploader>.*?)(?:(?= - Topic)|$)""")
}
val supportedContainers = context.resources.getStringArray(R.array.video_containers)

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<size
android:height="10dp"
android:width="10dp"/>
</shape>

View file

@ -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" />

View file

@ -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">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/author_textinput"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="40"
android:layout_weight="45"
android:hint="@string/author"
style="@style/Widget.Material3.TextInputLayout.FilledBox">
@ -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">

View file

@ -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">
<com.google.android.material.textfield.TextInputLayout
@ -41,7 +43,7 @@
style="@style/Widget.Material3.TextInputLayout.FilledBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="40"
android:layout_weight="45"
android:hint="@string/author">
<com.google.android.material.textfield.TextInputEditText
@ -60,7 +62,6 @@
android:layout_weight="45"
android:labelFor="@id/container_textview"
android:hint="@string/container"
android:paddingStart="10dp"
android:paddingEnd="0dp">
<AutoCompleteTextView