pull/1129/head
deniscerri 7 months ago
parent a68b5f20ae
commit e0a33b5722
No known key found for this signature in database
GPG Key ID: 95C43D517D830350

@ -156,6 +156,7 @@ dependencies {
implementation "io.github.junkfood02.youtubedl-android:aria2c:0.18.1" implementation "io.github.junkfood02.youtubedl-android:aria2c:0.18.1"
// implementation "io.github.junkfood02.youtubedl-android:library:0.17.4" // implementation "io.github.junkfood02.youtubedl-android:library:0.17.4"
//noinspection NewerVersionAvailable
implementation "io.github.junkfood02.youtubedl-android:ffmpeg:0.17.2" implementation "io.github.junkfood02.youtubedl-android:ffmpeg:0.17.2"
// implementation "io.github.junkfood02.youtubedl-android:aria2c:0.17.2" // implementation "io.github.junkfood02.youtubedl-android:aria2c:0.17.2"
@ -231,5 +232,4 @@ dependencies {
implementation("commons-io:commons-io:2.5") implementation("commons-io:commons-io:2.5")
implementation("org.apache.commons:commons-compress:1.12") implementation("org.apache.commons:commons-compress:1.12")
implementation("androidx.core:core-splashscreen:1.2.0") implementation("androidx.core:core-splashscreen:1.2.0")
implementation 'com.github.woheller69:FreeDroidWarn:V1.6'
} }

@ -1,7 +1,6 @@
package com.deniscerri.ytdl package com.deniscerri.ytdl
import android.app.ActionBar.LayoutParams import android.app.ActionBar.LayoutParams
import android.app.AlertDialog
import android.content.Context import android.content.Context
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
@ -13,14 +12,12 @@ import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.util.Log import android.util.Log
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.WindowInsets import android.view.WindowInsets
import android.widget.CheckBox import android.widget.CheckBox
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.forEach import androidx.core.view.forEach
import androidx.core.view.isVisible import androidx.core.view.isVisible
@ -70,7 +67,6 @@ import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.woheller69.freeDroidWarn.FreeDroidWarn
import java.io.BufferedReader import java.io.BufferedReader
import java.io.InputStreamReader import java.io.InputStreamReader
import java.io.Reader import java.io.Reader
@ -272,7 +268,6 @@ class MainActivity : BaseActivity() {
cookieViewModel.updateCookiesFile() cookieViewModel.updateCookiesFile()
val intent = intent val intent = intent
FreeDroidWarn.showWarningOnUpgrade(this, BuildConfig.VERSION_CODE);
handleIntents(intent) handleIntents(intent)
if (preferences.getBoolean("auto_update_ytdlp", false)){ if (preferences.getBoolean("auto_update_ytdlp", false)){

@ -627,6 +627,10 @@ object Extensions {
return Pattern.compile("((^(https?)://)?(www.)?(m.)?youtu(.be)?(be.com))/watch_videos\\?video_ids=.*").matcher(this).find() return Pattern.compile("((^(https?)://)?(www.)?(m.)?youtu(.be)?(be.com))/watch_videos\\?video_ids=.*").matcher(this).find()
} }
fun String.isSoundCloudURL() : Boolean {
return Pattern.compile("""^(https?://)?(www\.|m\.)?soundcloud\.com/[\w\-.]+(/[\w\-.]+)*/?$""").matcher(this).find()
}
fun String.extractURL() : String { fun String.extractURL() : String {
val res = val res =
Pattern.compile("(http|ftp|https)://([\\w_-]+(?:\\.[\\w_-]+)+)([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])") Pattern.compile("(http|ftp|https)://([\\w_-]+(?:\\.[\\w_-]+)+)([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])")

@ -329,6 +329,10 @@ object FileUtil {
return "${getCachePath(context)}dl" return "${getCachePath(context)}dl"
} }
fun getCacheYTDLPPath(context: Context) : String {
return "${getCachePath(context)}yt-dlp"
}
fun getInfoJsonPath(context: Context) : String { fun getInfoJsonPath(context: Context) : String {
return "${getCachePath(context)}infojsons" return "${getCachePath(context)}infojsons"
} }

@ -26,6 +26,7 @@ import com.deniscerri.ytdl.database.viewmodel.ResultViewModel
import com.deniscerri.ytdl.util.Extensions.getIDFromYoutubeURL import com.deniscerri.ytdl.util.Extensions.getIDFromYoutubeURL
import com.deniscerri.ytdl.util.Extensions.getIntByAny import com.deniscerri.ytdl.util.Extensions.getIntByAny
import com.deniscerri.ytdl.util.Extensions.getStringByAny import com.deniscerri.ytdl.util.Extensions.getStringByAny
import com.deniscerri.ytdl.util.Extensions.isSoundCloudURL
import com.deniscerri.ytdl.util.Extensions.isURL import com.deniscerri.ytdl.util.Extensions.isURL
import com.deniscerri.ytdl.util.Extensions.isYoutubeURL import com.deniscerri.ytdl.util.Extensions.isYoutubeURL
import com.deniscerri.ytdl.util.Extensions.isYoutubeWatchVideosURL import com.deniscerri.ytdl.util.Extensions.isYoutubeWatchVideosURL
@ -104,6 +105,15 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co
} }
} }
private fun canApplyFlatPlaylist(url: String) : Boolean {
var noFlatPlaylist = sharedPreferences.getBoolean("no_flat_playlist", false)
if (url.isSoundCloudURL()) {
noFlatPlaylist = true
}
return !noFlatPlaylist
}
@SuppressLint("RestrictedApi") @SuppressLint("RestrictedApi")
fun getFromYTDL(query: String, singleItem: Boolean = false, resultsGenerated: (results: List<ResultItem>) -> Unit): List<ResultItem> { fun getFromYTDL(query: String, singleItem: Boolean = false, resultsGenerated: (results: List<ResultItem>) -> Unit): List<ResultItem> {
val searchEngine = sharedPreferences.getString("search_engine", "ytsearch") val searchEngine = sharedPreferences.getString("search_engine", "ytsearch")
@ -136,7 +146,7 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co
request.setYoutubeExtractorArgs(query) request.setYoutubeExtractorArgs(query)
} }
if (!sharedPreferences.getBoolean("no_flat_playlist", false)) { if (canApplyFlatPlaylist(query)) {
request.addOption("--flat-playlist") request.addOption("--flat-playlist")
} }
@ -181,7 +191,7 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co
for (result in results) { for (result in results) {
if (result.isNullOrBlank()) continue if (result.isNullOrBlank()) continue
val jsonObject = JSONObject(result) val jsonObject = JSONObject(result)
val title = jsonObject.getStringByAny("alt_title", "title", "webpage_url_basename") var title = jsonObject.getStringByAny("alt_title", "title", "webpage_url_basename")
if (title == "[Private video]" || title == "[Deleted video]") continue if (title == "[Private video]" || title == "[Deleted video]") continue
@ -266,10 +276,14 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co
val type = jsonObject.getStringByAny("_type") val type = jsonObject.getStringByAny("_type")
if (type == "playlist" && playlistTitle.isEmpty()) { if (type == "playlist") {
playlistTitle = title if (playlistTitle.isEmpty()) {
playlistTitle = title
}
title = ""
} }
val availableSubtitles = mutableListOf<String>() val availableSubtitles = mutableListOf<String>()
if (jsonObject.has("subtitles")) { if (jsonObject.has("subtitles")) {
runCatching { runCatching {
@ -618,6 +632,8 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
private fun YTDLRequest.addWriteInfoJson(url: String) { private fun YTDLRequest.addWriteInfoJson(url: String) {
if (url.isYoutubeURL() && url.contains("playlist?list=")) return
val cachePath = FileUtil.getInfoJsonPath(context) val cachePath = FileUtil.getInfoJsonPath(context)
File(cachePath).mkdirs() File(cachePath).mkdirs()
@ -1240,11 +1256,6 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co
var cont = "" var cont = ""
val outputContainer = downloadItem.container val outputContainer = downloadItem.container
if (downloadItem.videoPreferences.compatibilityMode) {
request.addOption("--recode-video", "mp4")
request.addOption("--merge-output-format", "mp4/mkv")
request.addOption("--ppa", "VideoConvertor+ffmpeg_o:-c:v libx264 -c:a aac -profile:v baseline")
}
if(outputContainer.isNotEmpty() && outputContainer != "Default" && outputContainer != context.getString( if(outputContainer.isNotEmpty() && outputContainer != "Default" && outputContainer != context.getString(
R.string.defaultValue) && supportedContainers.contains(outputContainer)){ R.string.defaultValue) && supportedContainers.contains(outputContainer)){
@ -1301,7 +1312,13 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co
val preferredCodec = sharedPreferences.getString("video_codec", "") val preferredCodec = sharedPreferences.getString("video_codec", "")
val vCodecPrefIndex = context.getStringArray(R.array.video_codec_values).indexOf(preferredCodec) val vCodecPrefIndex = context.getStringArray(R.array.video_codec_values).indexOf(preferredCodec)
val vCodecPref = context.getStringArray(R.array.video_codec_values_ytdlp)[vCodecPrefIndex] var vCodecPref = context.getStringArray(R.array.video_codec_values_ytdlp)[vCodecPrefIndex]
if (downloadItem.videoPreferences.compatibilityMode) {
request.addOption("--recode-video", "mp4")
request.addOption("--merge-output-format", "mp4/mkv")
request.addOption("--ppa", "VideoConvertor+ffmpeg_o:-c:v libx264 -c:a aac -profile:v baseline")
}
val defaultFormats = context.resources.getStringArray(R.array.video_formats_values) val defaultFormats = context.resources.getStringArray(R.array.video_formats_values)
val usingGenericFormat = defaultFormats.contains(videoF) || downloadItem.allFormats.isEmpty() || downloadItem.allFormats == formatUtil.getGenericVideoFormats(context.resources) val usingGenericFormat = defaultFormats.contains(videoF) || downloadItem.allFormats.isEmpty() || downloadItem.allFormats == formatUtil.getGenericVideoFormats(context.resources)
@ -1552,7 +1569,8 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co
tmp.addOption("--config-locations", conf.absolutePath) tmp.addOption("--config-locations", conf.absolutePath)
ytDlRequest.addCommands(tmp) ytDlRequest.addCommands(tmp)
ytDlRequest.addOption("--cache-dir", cache.absolutePath) val ytdlpCache = File(FileUtil.getCacheYTDLPPath(context))
ytDlRequest.addOption("--cache-dir", ytdlpCache.absolutePath)
return ytDlRequest return ytDlRequest
} }
} }
Loading…
Cancel
Save