fixes
newpipe extractor fix add approx filesize remember text wrap state in logs/terminal if quick download enabled, added ability to show the download card while sharing the txt file on any download type hide download size when enabling cutting because the size is unknown
This commit is contained in:
parent
3df58df7bd
commit
70ed5008ac
17 changed files with 150 additions and 78 deletions
|
|
@ -134,7 +134,7 @@ android {
|
|||
|
||||
dependencies {
|
||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.0.4"
|
||||
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs_nio:2.1.0"
|
||||
implementation "com.github.yausername.youtubedl-android:library:$youtubedlAndroidVer"
|
||||
implementation "com.github.yausername.youtubedl-android:ffmpeg:$youtubedlAndroidVer"
|
||||
implementation "com.github.yausername.youtubedl-android:aria2c:$youtubedlAndroidVer"
|
||||
|
|
@ -161,7 +161,7 @@ dependencies {
|
|||
androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVer"
|
||||
|
||||
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
|
||||
implementation "com.devbrackets.android:exomedia:4.3.0"
|
||||
implementation 'com.devbrackets.android:exomedia:5.1.0'
|
||||
|
||||
implementation("androidx.cardview:cardview:1.0.0")
|
||||
implementation("com.squareup.picasso:picasso:2.71828")
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ import androidx.core.view.WindowInsetsCompat
|
|||
import androidx.core.view.forEach
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.view.updateLayoutParams
|
||||
import androidx.documentfile.provider.DocumentFile
|
||||
import androidx.fragment.app.FragmentContainerView
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
|
|
@ -38,6 +39,7 @@ import androidx.navigation.fragment.NavHostFragment
|
|||
import androidx.navigation.fragment.findNavController
|
||||
import androidx.navigation.ui.setupWithNavController
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.anggrayudi.storage.file.getAbsolutePath
|
||||
import com.deniscerri.ytdl.database.DBManager
|
||||
import com.deniscerri.ytdl.database.repository.DownloadRepository
|
||||
import com.deniscerri.ytdl.database.viewmodel.CookieViewModel
|
||||
|
|
@ -405,39 +407,45 @@ class MainActivity : BaseActivity() {
|
|||
intent.getParcelableExtra(Intent.EXTRA_STREAM)
|
||||
}
|
||||
|
||||
if (preferences.getString("preferred_download_type", "video") == "command"){
|
||||
val f = File(FileUtil.formatPath(uri?.path ?: ""))
|
||||
if (!f.exists()){
|
||||
Toast.makeText(context, "Couldn't read file", Toast.LENGTH_LONG).show()
|
||||
var downloadType = DownloadViewModel.Type.valueOf(preferences.getString("preferred_download_type", "video")!!)
|
||||
if (preferences.getBoolean("quick_download", false) || downloadType == DownloadViewModel.Type.command) {
|
||||
val docFile = DocumentFile.fromSingleUri(this, uri!!)
|
||||
if (docFile?.exists() == true){
|
||||
val bundle = Bundle()
|
||||
val path = docFile.getAbsolutePath(this)
|
||||
if (downloadType == DownloadViewModel.Type.auto) {
|
||||
downloadType = downloadViewModel.getDownloadType(null, path)
|
||||
}
|
||||
|
||||
bundle.putParcelable("result", downloadViewModel.createEmptyResultItem(path))
|
||||
bundle.putSerializable("type", downloadType)
|
||||
navController.navigate(R.id.downloadBottomSheetDialog, bundle)
|
||||
return
|
||||
}
|
||||
val bundle = Bundle()
|
||||
bundle.putParcelable("result", downloadViewModel.createEmptyResultItem(f.absolutePath))
|
||||
bundle.putSerializable("type", DownloadViewModel.Type.command)
|
||||
navController.navigate(R.id.downloadBottomSheetDialog, bundle)
|
||||
}else{
|
||||
val `is` = contentResolver.openInputStream(uri!!)
|
||||
val textBuilder = StringBuilder()
|
||||
val reader: Reader = BufferedReader(
|
||||
InputStreamReader(
|
||||
`is`, Charset.forName(
|
||||
StandardCharsets.UTF_8.name()
|
||||
)
|
||||
}
|
||||
|
||||
val `is` = contentResolver.openInputStream(uri!!)
|
||||
val textBuilder = StringBuilder()
|
||||
val reader: Reader = BufferedReader(
|
||||
InputStreamReader(
|
||||
`is`, Charset.forName(
|
||||
StandardCharsets.UTF_8.name()
|
||||
)
|
||||
)
|
||||
var c: Int
|
||||
while (reader.read().also { c = it } != -1) {
|
||||
textBuilder.append(c.toChar())
|
||||
}
|
||||
val bundle = Bundle()
|
||||
bundle.putString("url", textBuilder.toString())
|
||||
navController.popBackStack(R.id.homeFragment, true)
|
||||
navController.navigate(
|
||||
R.id.homeFragment,
|
||||
bundle
|
||||
)
|
||||
)
|
||||
var c: Int
|
||||
while (reader.read().also { c = it } != -1) {
|
||||
textBuilder.append(c.toChar())
|
||||
}
|
||||
val bundle = Bundle()
|
||||
bundle.putString("url", textBuilder.toString())
|
||||
navController.popBackStack(R.id.homeFragment, true)
|
||||
navController.navigate(
|
||||
R.id.homeFragment,
|
||||
bundle
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
Toast.makeText(context, "Couldn't read file", Toast.LENGTH_LONG).show()
|
||||
e.printStackTrace()
|
||||
}
|
||||
}else if (action == Intent.ACTION_VIEW){
|
||||
|
|
|
|||
|
|
@ -219,12 +219,12 @@ class DownloadAudioFragment(private var resultItem: ResultItem? = null, private
|
|||
|
||||
val formatCard = view.findViewById<MaterialCardView>(R.id.format_card_constraintLayout)
|
||||
val chosenFormat = downloadItem.format
|
||||
UiUtil.populateFormatCard(requireContext(), formatCard, chosenFormat, null)
|
||||
UiUtil.populateFormatCard(requireContext(), formatCard, chosenFormat, null, showSize = downloadItem.downloadSections.isEmpty())
|
||||
val listener = object : OnFormatClickListener {
|
||||
override fun onFormatClick(formatTuple: FormatTuple) {
|
||||
formatTuple.format?.apply {
|
||||
downloadItem.format = this
|
||||
UiUtil.populateFormatCard(requireContext(), formatCard, this, null)
|
||||
UiUtil.populateFormatCard(requireContext(), formatCard, this, null, showSize = downloadItem.downloadSections.isEmpty())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -245,12 +245,12 @@ class DownloadAudioFragment(private var resultItem: ResultItem? = null, private
|
|||
val preferredFormat = downloadViewModel.getFormat(formats, Type.audio)
|
||||
downloadItem.format = preferredFormat
|
||||
downloadItem.allFormats = formats
|
||||
UiUtil.populateFormatCard(requireContext(), formatCard, preferredFormat, null)
|
||||
UiUtil.populateFormatCard(requireContext(), formatCard, preferredFormat, null, showSize = downloadItem.downloadSections.isEmpty())
|
||||
}
|
||||
}
|
||||
formatCard.setOnClickListener{
|
||||
if (parentFragmentManager.findFragmentByTag("formatSheet") == null){
|
||||
val bottomSheet = FormatSelectionBottomSheetDialog(listOf(downloadItem), listener)
|
||||
val bottomSheet = FormatSelectionBottomSheetDialog(listOf(downloadItem), listener, canUpdate = !nonSpecific)
|
||||
bottomSheet.show(parentFragmentManager, "formatSheet")
|
||||
}
|
||||
}
|
||||
|
|
@ -319,7 +319,7 @@ class DownloadAudioFragment(private var resultItem: ResultItem? = null, private
|
|||
if(isUpdatingData){
|
||||
val snack = Snackbar.make(view, context.getString(R.string.please_wait), Snackbar.LENGTH_SHORT)
|
||||
snack.show()
|
||||
}else{
|
||||
}else if (!nonSpecific){
|
||||
val snack = Snackbar.make(view, context.getString(R.string.cut_unavailable), Snackbar.LENGTH_SHORT)
|
||||
snack.setAction(R.string.update){
|
||||
CoroutineScope(SupervisorJob()).launch(Dispatchers.IO) {
|
||||
|
|
@ -332,6 +332,10 @@ class DownloadAudioFragment(private var resultItem: ResultItem? = null, private
|
|||
snack.show()
|
||||
}
|
||||
},
|
||||
cutValueChanged = {
|
||||
downloadItem.downloadSections = it
|
||||
UiUtil.populateFormatCard(requireContext(), formatCard, downloadItem.format, showSize = downloadItem.downloadSections.isEmpty())
|
||||
},
|
||||
extraCommandsClicked = {
|
||||
val callback = object : ExtraCommandsListener {
|
||||
override fun onChangeExtraCommand(c: String) {
|
||||
|
|
@ -358,7 +362,7 @@ class DownloadAudioFragment(private var resultItem: ResultItem? = null, private
|
|||
formats.find { it.format_id == formatID }?.apply {
|
||||
downloadItem.format = this
|
||||
val formatCard = requireView().findViewById<MaterialCardView>(R.id.format_card_constraintLayout)
|
||||
UiUtil.populateFormatCard(requireContext(), formatCard, downloadItem.format, listOf())
|
||||
UiUtil.populateFormatCard(requireContext(), formatCard, downloadItem.format, listOf(), showSize = downloadItem.downloadSections.isEmpty())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -187,13 +187,13 @@ class DownloadBottomSheetDialog : BottomSheetDialogFragment() {
|
|||
|
||||
//remove outdated player url of 1hr so it can refetch it in the cut player
|
||||
if (result.creationTime > System.currentTimeMillis() - 3600000) result.urls = ""
|
||||
|
||||
val fragmentManager = parentFragmentManager
|
||||
fragmentAdapter = DownloadFragmentAdapter(
|
||||
fragmentManager,
|
||||
lifecycle,
|
||||
result,
|
||||
currentDownloadItem,
|
||||
nonSpecific = result.url.endsWith(".txt"),
|
||||
isIncognito = incognito
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -579,6 +579,7 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
|
|||
},
|
||||
cutClicked = {},
|
||||
cutDisabledClicked = {},
|
||||
cutValueChanged = {},
|
||||
extraCommandsClicked = {
|
||||
val callback = object : ExtraCommandsListener {
|
||||
override fun onChangeExtraCommand(c: String) {
|
||||
|
|
@ -649,6 +650,7 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
|
|||
},
|
||||
cutClicked = {},
|
||||
cutDisabledClicked = {},
|
||||
cutValueChanged = {},
|
||||
filenameTemplateSet = { checked ->
|
||||
items.forEach { it.customFileNameTemplate = checked }
|
||||
CoroutineScope(Dispatchers.IO).launch { items.forEach { downloadViewModel.updateDownload(it) } }
|
||||
|
|
@ -846,8 +848,8 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
|
|||
|
||||
audio!!.setOnClickListener {
|
||||
lifecycleScope.launch {
|
||||
item = downloadViewModel.switchDownloadType(listOf(item), DownloadViewModel.Type.audio).first()
|
||||
withContext(Dispatchers.IO){
|
||||
item = downloadViewModel.switchDownloadType(listOf(item), DownloadViewModel.Type.audio).first()
|
||||
downloadViewModel.updateDownload(item)
|
||||
}
|
||||
bottomSheet.cancel()
|
||||
|
|
@ -856,8 +858,8 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
|
|||
|
||||
video!!.setOnClickListener {
|
||||
lifecycleScope.launch {
|
||||
item = downloadViewModel.switchDownloadType(listOf(item), DownloadViewModel.Type.video).first()
|
||||
withContext(Dispatchers.IO){
|
||||
item = downloadViewModel.switchDownloadType(listOf(item), DownloadViewModel.Type.video).first()
|
||||
downloadViewModel.updateDownload(item)
|
||||
}
|
||||
bottomSheet.cancel()
|
||||
|
|
@ -866,8 +868,8 @@ class DownloadMultipleBottomSheetDialog : BottomSheetDialogFragment(), Configure
|
|||
|
||||
command!!.setOnClickListener {
|
||||
lifecycleScope.launch {
|
||||
item = downloadViewModel.switchDownloadType(listOf(item), DownloadViewModel.Type.command).first()
|
||||
withContext(Dispatchers.IO){
|
||||
item = downloadViewModel.switchDownloadType(listOf(item), DownloadViewModel.Type.command).first()
|
||||
downloadViewModel.updateDownload(item)
|
||||
}
|
||||
bottomSheet.cancel()
|
||||
|
|
|
|||
|
|
@ -237,7 +237,15 @@ class DownloadVideoFragment(private var resultItem: ResultItem? = null, private
|
|||
val formatCard = view.findViewById<MaterialCardView>(R.id.format_card_constraintLayout)
|
||||
|
||||
val chosenFormat = downloadItem.format
|
||||
UiUtil.populateFormatCard(requireContext(), formatCard, chosenFormat, downloadItem.allFormats.filter { downloadItem.videoPreferences.audioFormatIDs.contains(it.format_id) })
|
||||
|
||||
UiUtil.populateFormatCard(
|
||||
requireContext(),
|
||||
formatCard,
|
||||
chosenFormat,
|
||||
downloadItem.allFormats.filter { downloadItem.videoPreferences.audioFormatIDs.contains(it.format_id) },
|
||||
showSize = downloadItem.downloadSections.isEmpty()
|
||||
)
|
||||
|
||||
val listener = object : OnFormatClickListener {
|
||||
override fun onFormatClick(formatTuple: FormatTuple) {
|
||||
formatTuple.format?.apply {
|
||||
|
|
@ -248,7 +256,8 @@ class DownloadVideoFragment(private var resultItem: ResultItem? = null, private
|
|||
downloadItem.videoPreferences.audioFormatIDs.addAll(it)
|
||||
}
|
||||
UiUtil.populateFormatCard(requireContext(), formatCard, downloadItem.format,
|
||||
if(downloadItem.videoPreferences.removeAudio) listOf() else formatTuple.audioFormats
|
||||
if(downloadItem.videoPreferences.removeAudio) listOf() else formatTuple.audioFormats,
|
||||
showSize = downloadItem.downloadSections.isEmpty()
|
||||
)
|
||||
}
|
||||
|
||||
|
|
@ -272,14 +281,15 @@ class DownloadVideoFragment(private var resultItem: ResultItem? = null, private
|
|||
downloadItem.format = preferredFormat
|
||||
downloadItem.allFormats = formats
|
||||
UiUtil.populateFormatCard(requireContext(), formatCard, preferredFormat,
|
||||
if(downloadItem.videoPreferences.removeAudio) listOf() else formats.filter { preferredAudioFormats.contains(it.format_id) }
|
||||
if(downloadItem.videoPreferences.removeAudio) listOf() else formats.filter { preferredAudioFormats.contains(it.format_id) },
|
||||
showSize = downloadItem.downloadSections.isEmpty()
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
formatCard.setOnClickListener{
|
||||
if (parentFragmentManager.findFragmentByTag("formatSheet") == null){
|
||||
val bottomSheet = FormatSelectionBottomSheetDialog(listOf(downloadItem), listener)
|
||||
val bottomSheet = FormatSelectionBottomSheetDialog(listOf(downloadItem), listener, canUpdate = !nonSpecific)
|
||||
bottomSheet.show(parentFragmentManager, "formatSheet")
|
||||
}
|
||||
}
|
||||
|
|
@ -349,7 +359,7 @@ class DownloadVideoFragment(private var resultItem: ResultItem? = null, private
|
|||
if(isUpdatingData){
|
||||
val snack = Snackbar.make(view, context.getString(R.string.please_wait), Snackbar.LENGTH_SHORT)
|
||||
snack.show()
|
||||
}else{
|
||||
}else if (!nonSpecific){
|
||||
val snack = Snackbar.make(view, context.getString(R.string.cut_unavailable), Snackbar.LENGTH_SHORT)
|
||||
snack.setAction(R.string.update){
|
||||
CoroutineScope(SupervisorJob()).launch(Dispatchers.IO) {
|
||||
|
|
@ -362,6 +372,17 @@ class DownloadVideoFragment(private var resultItem: ResultItem? = null, private
|
|||
snack.show()
|
||||
}
|
||||
},
|
||||
cutValueChanged = {
|
||||
downloadItem.downloadSections = it
|
||||
UiUtil.populateFormatCard(
|
||||
requireContext(),
|
||||
formatCard,
|
||||
downloadItem.format,
|
||||
if(downloadItem.videoPreferences.removeAudio) listOf()
|
||||
else downloadItem.allFormats.filter { f -> downloadItem.videoPreferences.audioFormatIDs.contains(f.format_id) },
|
||||
showSize = downloadItem.downloadSections.isEmpty()
|
||||
)
|
||||
},
|
||||
filenameTemplateSet = {
|
||||
downloadItem.customFileNameTemplate = it
|
||||
},
|
||||
|
|
@ -376,7 +397,13 @@ class DownloadVideoFragment(private var resultItem: ResultItem? = null, private
|
|||
},
|
||||
removeAudioClicked = {
|
||||
downloadItem.videoPreferences.removeAudio = it
|
||||
UiUtil.populateFormatCard(requireContext(), formatCard, downloadItem.format, if (it) listOf() else downloadItem.allFormats.filter { downloadItem.videoPreferences.audioFormatIDs.contains(it.format_id) })
|
||||
UiUtil.populateFormatCard(
|
||||
requireContext(),
|
||||
formatCard,
|
||||
downloadItem.format,
|
||||
if (it) listOf() else downloadItem.allFormats.filter { downloadItem.videoPreferences.audioFormatIDs.contains(it.format_id) },
|
||||
showSize = downloadItem.downloadSections.isEmpty()
|
||||
)
|
||||
},
|
||||
recodeVideoClicked = {
|
||||
downloadItem.videoPreferences.recodeVideo = it
|
||||
|
|
@ -429,7 +456,8 @@ class DownloadVideoFragment(private var resultItem: ResultItem? = null, private
|
|||
downloadItem.videoPreferences.audioFormatIDs.addAll(arrayListOf(format.format_id))
|
||||
val formatCard = requireView().findViewById<MaterialCardView>(R.id.format_card_constraintLayout)
|
||||
UiUtil.populateFormatCard(requireContext(), formatCard, downloadItem.format,
|
||||
if(downloadItem.videoPreferences.removeAudio) listOf() else listOf(format)
|
||||
if(downloadItem.videoPreferences.removeAudio) listOf() else listOf(format),
|
||||
showSize = downloadItem.downloadSections.isEmpty()
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ import kotlinx.coroutines.withContext
|
|||
class FormatSelectionBottomSheetDialog(
|
||||
private val _items: List<DownloadItem?>? = null,
|
||||
private val _listener: OnFormatClickListener? = null,
|
||||
private val canUpdate: Boolean = true,
|
||||
private val _multipleFormatsListener: OnMultipleFormatClickListener? = null
|
||||
) : BottomSheetDialogFragment() {
|
||||
|
||||
|
|
@ -180,7 +181,7 @@ class FormatSelectionBottomSheetDialog(
|
|||
|
||||
refreshBtn = view.findViewById(R.id.format_refresh)
|
||||
filterBtn.isVisible = chosenFormats.isNotEmpty() || items.all { it!!.url.isYoutubeURL() }
|
||||
if (!isMissingFormats || items.isEmpty() || items.first()?.url?.isEmpty() == true) {
|
||||
if (!isMissingFormats || items.isEmpty() || items.first()?.url?.isEmpty() == true || !canUpdate) {
|
||||
refreshBtn.visibility = View.GONE
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -131,6 +131,7 @@ class DownloadLogFragment : Fragment() {
|
|||
// contentScrollView.setPadding(0,0,0,
|
||||
// (requireContext().resources.displayMetrics.density * 150).toInt()
|
||||
// )
|
||||
sharedPreferences.edit().putBoolean("wrap_text_log", true).apply()
|
||||
updateAutoScrollState()
|
||||
}else{
|
||||
val parent = content.parent as ViewGroup
|
||||
|
|
@ -148,6 +149,7 @@ class DownloadLogFragment : Fragment() {
|
|||
scrollView.id = R.id.horizontalscroll_output
|
||||
parent.addView(scrollView, 0)
|
||||
updateAutoScrollState()
|
||||
sharedPreferences.edit().putBoolean("wrap_text_log", false).apply()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -186,6 +188,11 @@ class DownloadLogFragment : Fragment() {
|
|||
false
|
||||
}
|
||||
|
||||
sharedPreferences.getBoolean("wrap_text_log", false).apply {
|
||||
if (this){
|
||||
bottomAppBar.menu.performIdentifierAction(R.id.wrap, 0)
|
||||
}
|
||||
}
|
||||
|
||||
logViewModel.getLogFlowByID(id!!).observe(viewLifecycleOwner){logItem ->
|
||||
kotlin.runCatching {
|
||||
|
|
|
|||
|
|
@ -256,6 +256,7 @@ class TerminalFragment : Fragment() {
|
|||
scrollView.removeAllViews()
|
||||
parent.removeView(scrollView)
|
||||
parent.addView(output, 0)
|
||||
sharedPreferences.edit().putBoolean("wrap_text_terminal", true).apply()
|
||||
}else{
|
||||
val parent = output?.parent as ViewGroup
|
||||
parent.removeView(output)
|
||||
|
|
@ -267,6 +268,7 @@ class TerminalFragment : Fragment() {
|
|||
scrollView.addView(output)
|
||||
scrollView.id = R.id.horizontalscroll_output
|
||||
parent.addView(scrollView, 0)
|
||||
sharedPreferences.edit().putBoolean("wrap_text_terminal", false).apply()
|
||||
}
|
||||
}
|
||||
R.id.export_clipboard -> {
|
||||
|
|
@ -297,6 +299,12 @@ class TerminalFragment : Fragment() {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
sharedPreferences.getBoolean("wrap_text_terminal", false).apply {
|
||||
if (this){
|
||||
bottomAppBar.menu.performIdentifierAction(R.id.wrap, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
private fun hideCancelFab() {
|
||||
kotlin.runCatching {
|
||||
|
|
|
|||
|
|
@ -267,16 +267,21 @@ object Extensions {
|
|||
val finishingProgressLinesRegex = Pattern.compile("\\[download]\\h+(100%|[a-zA-Z])")
|
||||
|
||||
if (line.isNotBlank()) {
|
||||
var newLine = ""
|
||||
val newLines = line.lines()
|
||||
if (!lines.takeLast(3).any { newLines.contains(it) }) {
|
||||
lines.addAll(newLines.dropLast(1))
|
||||
newLine = "\n${newLines.last()}"
|
||||
var newline = ""
|
||||
val newLines = line.lines().filter { !lines.contains(it) }
|
||||
lines.addAll(newLines)
|
||||
if (newLines.isNotEmpty()) {
|
||||
newLines.last().apply {
|
||||
if (this.contains("[download")) {
|
||||
newline = "\n${this}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return lines.dropLastWhile {
|
||||
|
||||
return lines.distinct().filterNot {
|
||||
it.contains("[download") && !finishingProgressLinesRegex.matcher(it).find()
|
||||
}.joinToString("\n") + newLine
|
||||
}.joinToString("\n") + newline
|
||||
}
|
||||
|
||||
return lines.filterNot {
|
||||
|
|
|
|||
|
|
@ -119,6 +119,7 @@ class NotificationUtil(var context: Context) {
|
|||
)
|
||||
.setPriority(NotificationCompat.PRIORITY_LOW)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
.setGroup(DOWNLOAD_RUNNING_NOTIFICATION_ID.toString())
|
||||
.setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE)
|
||||
.clearActions()
|
||||
.build()
|
||||
|
|
@ -148,6 +149,7 @@ class NotificationUtil(var context: Context) {
|
|||
fun createDownloadServiceNotification(
|
||||
pendingIntent: PendingIntent?,
|
||||
title: String?,
|
||||
group : Int = DOWNLOAD_RUNNING_NOTIFICATION_ID
|
||||
): Notification {
|
||||
val notificationBuilder = getBuilder(DOWNLOAD_SERVICE_CHANNEL_ID)
|
||||
|
||||
|
|
@ -167,6 +169,7 @@ class NotificationUtil(var context: Context) {
|
|||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
.setProgress(PROGRESS_MAX, PROGRESS_CURR, true)
|
||||
.setContentIntent(pendingIntent)
|
||||
.setGroup(group.toString())
|
||||
.setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE)
|
||||
.clearActions()
|
||||
.build()
|
||||
|
|
@ -371,6 +374,7 @@ class NotificationUtil(var context: Context) {
|
|||
R.drawable.ic_launcher_foreground_large
|
||||
)
|
||||
)
|
||||
.setGroup(DOWNLOAD_ERRORED_NOTIFICATION_ID.toString())
|
||||
.setContentIntent(errorTabPendingIntent)
|
||||
.setPriority(NotificationCompat.PRIORITY_MAX)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
|
|
@ -427,6 +431,7 @@ class NotificationUtil(var context: Context) {
|
|||
notificationBuilder.setProgress(100, progress, (progress == 0 || progress == 100))
|
||||
.setContentTitle(title)
|
||||
.setStyle(NotificationCompat.BigTextStyle().bigText(contentText))
|
||||
.setGroup(DOWNLOAD_RUNNING_NOTIFICATION_ID.toString())
|
||||
.clearActions()
|
||||
//.addAction(0, resources.getString(R.string.pause), pauseNotificationPendingIntent)
|
||||
.addAction(0, resources.getString(R.string.cancel), cancelNotificationPendingIntent)
|
||||
|
|
@ -462,6 +467,7 @@ class NotificationUtil(var context: Context) {
|
|||
notificationBuilder.setProgress(100, progress, progress == 0)
|
||||
.setContentTitle(title)
|
||||
.setStyle(NotificationCompat.BigTextStyle().bigText(contentText))
|
||||
.setGroup(DOWNLOAD_TERMINAL_RUNNING_NOTIFICATION_ID.toString())
|
||||
.clearActions()
|
||||
.addAction(0, resources.getString(R.string.cancel), cancelNotificationPendingIntent)
|
||||
notificationManager.notify(id, notificationBuilder.build())
|
||||
|
|
@ -686,6 +692,8 @@ class NotificationUtil(var context: Context) {
|
|||
const val DOWNLOAD_ERRORED_NOTIFICATION_ID = 60000
|
||||
const val FORMAT_UPDATING_FINISHED_NOTIFICATION_ID = 70000
|
||||
const val QUERY_PROCESS_FINISHED_NOTIFICATION_ID = 80000
|
||||
const val DOWNLOAD_RUNNING_NOTIFICATION_ID = 90000
|
||||
const val DOWNLOAD_TERMINAL_RUNNING_NOTIFICATION_ID = 99000
|
||||
|
||||
private const val PROGRESS_MAX = 100
|
||||
private const val PROGRESS_CURR = 0
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ import java.util.function.Predicate
|
|||
|
||||
object UiUtil {
|
||||
@SuppressLint("SetTextI18n")
|
||||
fun populateFormatCard(context: Context, formatCard : MaterialCardView, chosenFormat: Format, audioFormats: List<Format>?){
|
||||
fun populateFormatCard(context: Context, formatCard : MaterialCardView, chosenFormat: Format, audioFormats: List<Format>? = null, showSize: Boolean = true){
|
||||
var formatNote = chosenFormat.format_note
|
||||
if (formatNote.isEmpty()) formatNote = context.getString(R.string.defaultValue)
|
||||
else if (formatNote == "best") formatNote = context.getString(R.string.best_quality)
|
||||
|
|
@ -168,7 +168,11 @@ object UiUtil {
|
|||
var filesize = chosenFormat.filesize
|
||||
if (!audioFormats.isNullOrEmpty() && filesize > 10L) filesize += audioFormats.sumOf { it.filesize }
|
||||
formatCard.findViewById<TextView>(R.id.file_size).apply {
|
||||
text = FileUtil.convertFileSize(filesize)
|
||||
if (showSize) {
|
||||
text = FileUtil.convertFileSize(filesize)
|
||||
}else{
|
||||
text = "?"
|
||||
}
|
||||
setOnClickListener {
|
||||
formatCard.callOnClick()
|
||||
}
|
||||
|
|
@ -1015,16 +1019,14 @@ object UiUtil {
|
|||
|
||||
tmp.setOnClickListener {
|
||||
val c = it as Chip
|
||||
val currentLanguages = editText.text.toString().split(",").filter { f -> f.isNotBlank() }.toMutableList()
|
||||
if(!c.isChecked){
|
||||
editText.setText(editText.text.toString().replace(c.tag.toString(), "").removeSuffix(","))
|
||||
editText.setText(currentLanguages.filter { l -> l != c.tag }.joinToString(","))
|
||||
editText.setSelection(editText.text.length)
|
||||
}else{
|
||||
if (editText.text.isBlank()){
|
||||
editText.setText(c.tag.toString())
|
||||
editText.setSelection(editText.text.length)
|
||||
}else{
|
||||
editText.append(",${c.tag}")
|
||||
}
|
||||
currentLanguages.add(c.tag.toString())
|
||||
editText.setText(currentLanguages.joinToString(","))
|
||||
editText.setSelection(editText.text.length)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1143,6 +1145,7 @@ object UiUtil {
|
|||
saveThumbnailClicked: (Boolean) -> Unit,
|
||||
sponsorBlockItemsSet: (values: Array<String>, checkedItems: List<Boolean>) -> Unit,
|
||||
cutClicked: (VideoCutListener) -> Unit,
|
||||
cutValueChanged: (String) -> Unit,
|
||||
cutDisabledClicked: () -> Unit,
|
||||
filenameTemplateSet: (String) -> Unit,
|
||||
saveSubtitlesClicked: (Boolean) -> Unit,
|
||||
|
|
@ -1346,7 +1349,7 @@ object UiUtil {
|
|||
|
||||
override fun onChangeCut(list: List<String>) {
|
||||
if (list.isEmpty()){
|
||||
downloadItem.downloadSections = ""
|
||||
cutValueChanged("")
|
||||
cut.text = context.getString(R.string.cut)
|
||||
|
||||
splitByChapters.isEnabled = true
|
||||
|
|
@ -1362,7 +1365,7 @@ object UiUtil {
|
|||
list.forEach {
|
||||
value += "$it;"
|
||||
}
|
||||
downloadItem.downloadSections = value
|
||||
cutValueChanged(value)
|
||||
cut.text = value.dropLast(1)
|
||||
|
||||
splitByChapters.isEnabled = false
|
||||
|
|
@ -1419,6 +1422,7 @@ object UiUtil {
|
|||
sponsorBlockItemsSet: (Array<String>, List<Boolean>) -> Unit,
|
||||
cutClicked: (VideoCutListener) -> Unit,
|
||||
cutDisabledClicked: () -> Unit,
|
||||
cutValueChanged: (String) -> Unit,
|
||||
extraCommandsClicked: () -> Unit
|
||||
){
|
||||
val embedThumb = view.findViewById<Chip>(R.id.embed_thumb)
|
||||
|
|
@ -1508,7 +1512,7 @@ object UiUtil {
|
|||
val cutVideoListener = object : VideoCutListener {
|
||||
override fun onChangeCut(list: List<String>) {
|
||||
if (list.isEmpty()){
|
||||
downloadItem.downloadSections = ""
|
||||
cutValueChanged("")
|
||||
cut.text = context.getString(R.string.cut)
|
||||
|
||||
splitByChapters.isEnabled = true
|
||||
|
|
@ -1518,7 +1522,7 @@ object UiUtil {
|
|||
list.forEach {
|
||||
value += "$it;"
|
||||
}
|
||||
downloadItem.downloadSections = value
|
||||
cutValueChanged(value)
|
||||
cut.text = value.dropLast(1)
|
||||
|
||||
splitByChapters.isEnabled = false
|
||||
|
|
|
|||
|
|
@ -387,12 +387,6 @@ class YTDLPUtil(private val context: Context) {
|
|||
}
|
||||
}
|
||||
|
||||
kotlin.runCatching {
|
||||
if (!format.has("filesize")) {
|
||||
format.put("filesize", 0)
|
||||
}
|
||||
}
|
||||
|
||||
kotlin.runCatching {
|
||||
if(format.get("format_note").toString() == "null"){
|
||||
format.remove("format_note")
|
||||
|
|
@ -528,7 +522,11 @@ class YTDLPUtil(private val context: Context) {
|
|||
fun buildYoutubeDLRequest(downloadItem: DownloadItem) : YoutubeDLRequest {
|
||||
val useItemURL = sharedPreferences.getBoolean("use_itemurl_instead_playlisturl", false)
|
||||
|
||||
val request = if (downloadItem.playlistURL.isNullOrBlank() || downloadItem.playlistTitle.isBlank() || useItemURL){
|
||||
val request = if (downloadItem.url.endsWith(".txt")) {
|
||||
YoutubeDLRequest(listOf()).apply {
|
||||
addOption("-a", downloadItem.url)
|
||||
}
|
||||
}else if (downloadItem.playlistURL.isNullOrBlank() || downloadItem.playlistTitle.isBlank() || useItemURL){
|
||||
YoutubeDLRequest(downloadItem.url)
|
||||
}else{
|
||||
YoutubeDLRequest(downloadItem.playlistURL!!).apply {
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ class TerminalDownloadWorker(
|
|||
|
||||
val intent = Intent(context, TerminalActivity::class.java)
|
||||
val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
|
||||
val notification = notificationUtil.createDownloadServiceNotification(pendingIntent, command.take(65))
|
||||
val notification = notificationUtil.createDownloadServiceNotification(pendingIntent, command.take(65), NotificationUtil.DOWNLOAD_TERMINAL_RUNNING_NOTIFICATION_ID)
|
||||
val foregroundInfo = ForegroundInfo(itemId, notification)
|
||||
setForegroundAsync(foregroundInfo)
|
||||
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@
|
|||
android:layout_height="match_parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:resize_mode="fixed_height"
|
||||
app:useDefaultControls="true"
|
||||
app:use_controller="false" />
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
|
|
|
|||
|
|
@ -28,7 +28,6 @@
|
|||
android:keepScreenOn="true"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:resize_mode="fixed_height"
|
||||
app:useDefaultControls="true"
|
||||
app:use_controller="true" />
|
||||
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
|
|
|
|||
|
|
@ -4,7 +4,8 @@
|
|||
<item name="android:windowBackground">@android:color/transparent</item>
|
||||
<item name="android:windowIsTranslucent">true</item>
|
||||
<item name="android:colorBackgroundCacheHint">@null</item>
|
||||
<item name="android:windowContentOverlay">@null</item>
|
||||
<item name="android:windowAnimationStyle">@null</item>
|
||||
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||
<item name="preferenceTheme">@style/PreferenceTheme</item>
|
||||
</style>
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue