1.8.1 fr this time
This commit is contained in:
parent
266c148585
commit
0f6d8d6494
24 changed files with 162 additions and 113 deletions
|
|
@ -14,7 +14,8 @@
|
|||
- Made the app remember the last used scheduled time so it can suggest you that time for the next download
|
||||
- #618, made all preferences with a description show their values
|
||||
- Fixed bug that prevented app from loading all urls from text file
|
||||
- Added ability to write info json when downloading so when you resume an
|
||||
- Added ability to stop an observed source but not delete it
|
||||
-
|
||||
|
||||
## Custom yt-dlp source
|
||||
|
||||
|
|
|
|||
|
|
@ -12,8 +12,6 @@ import androidx.work.Data
|
|||
import androidx.work.ExistingWorkPolicy
|
||||
import androidx.work.NetworkType
|
||||
import androidx.work.OneTimeWorkRequestBuilder
|
||||
import androidx.work.PeriodicWorkRequest
|
||||
import androidx.work.PeriodicWorkRequestBuilder
|
||||
import androidx.work.WorkManager
|
||||
import com.deniscerri.ytdl.database.DBManager
|
||||
import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem
|
||||
|
|
@ -50,7 +48,7 @@ class ObserveSourcesViewModel(private val application: Application) : AndroidVie
|
|||
return repository.getByID(id)
|
||||
}
|
||||
|
||||
suspend fun insert(item: ObserveSourcesItem) : Long {
|
||||
suspend fun insertUpdate(item: ObserveSourcesItem) : Long {
|
||||
if (item.id > 0) {
|
||||
repository.update(item)
|
||||
observeTask(item)
|
||||
|
|
@ -63,6 +61,12 @@ class ObserveSourcesViewModel(private val application: Application) : AndroidVie
|
|||
return id
|
||||
}
|
||||
|
||||
suspend fun stopObserving(item: ObserveSourcesItem) {
|
||||
item.status = ObserveSourcesRepository.SourceStatus.STOPPED
|
||||
repository.update(item)
|
||||
cancelObservationTaskByID(item.id)
|
||||
}
|
||||
|
||||
fun delete(item: ObserveSourcesItem) = viewModelScope.launch(Dispatchers.IO) {
|
||||
runCatching { cancelObservationTaskByID(item.id) }
|
||||
repository.delete(item)
|
||||
|
|
@ -81,7 +85,7 @@ class ObserveSourcesViewModel(private val application: Application) : AndroidVie
|
|||
}
|
||||
|
||||
private fun cancelObservationTaskByID(id: Long){
|
||||
workManager.cancelAllWorkByTag(id.toString())
|
||||
workManager.cancelAllWorkByTag("observation_$id")
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -136,7 +140,7 @@ class ObserveSourcesViewModel(private val application: Application) : AndroidVie
|
|||
|
||||
val workRequest = OneTimeWorkRequestBuilder<ObserveSourceWorker>()
|
||||
.addTag("observeSources")
|
||||
.addTag(it.id.toString())
|
||||
.addTag("observation_${it.id}")
|
||||
.setConstraints(workConstraints.build())
|
||||
.setInitialDelay(timeInMillis - System.currentTimeMillis(), TimeUnit.MILLISECONDS)
|
||||
.setInputData(Data.Builder().putLong("id", it.id).build())
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem
|
|||
import com.deniscerri.ytdl.database.repository.ObserveSourcesRepository
|
||||
import com.deniscerri.ytdl.util.Extensions.calculateNextTimeForObserving
|
||||
import com.deniscerri.ytdl.util.Extensions.popup
|
||||
import com.google.android.material.button.MaterialButton
|
||||
import com.google.android.material.card.MaterialCardView
|
||||
import com.google.android.material.chip.Chip
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
|
|
@ -93,29 +94,35 @@ class ObserveSourcesAdapter(onItemClickListener: OnItemClickListener, activity:
|
|||
progressBar.isVisible = false
|
||||
|
||||
// BUTTON ----------------------------------
|
||||
val btn = card.findViewById<FloatingActionButton>(R.id.search)
|
||||
btn.isEnabled = true
|
||||
val searchBtn = card.findViewById<MaterialButton>(R.id.search)
|
||||
val pauseBtn = card.findViewById<MaterialButton>(R.id.pause_resume)
|
||||
searchBtn.isEnabled = true
|
||||
pauseBtn.isEnabled = true
|
||||
if (item.status == ObserveSourcesRepository.SourceStatus.STOPPED){
|
||||
info.isVisible = false
|
||||
checkMissing.isVisible = false
|
||||
searchBtn.isVisible = false
|
||||
|
||||
btn.setImageResource(R.drawable.exomedia_ic_play_arrow_white)
|
||||
btn.setOnClickListener {
|
||||
btn.isEnabled = false
|
||||
progressBar.isVisible = true
|
||||
progressBar.animate()
|
||||
pauseBtn.setIconResource(R.drawable.exomedia_ic_play_arrow_white)
|
||||
pauseBtn.setOnClickListener {
|
||||
pauseBtn.isEnabled = false
|
||||
onItemClickListener.onItemStart(item, position)
|
||||
}
|
||||
}else{
|
||||
info.isVisible = true
|
||||
searchBtn.isVisible = true
|
||||
|
||||
btn.setImageResource(R.drawable.ic_search)
|
||||
btn.setOnClickListener {
|
||||
btn.isEnabled = false
|
||||
searchBtn.setOnClickListener {
|
||||
searchBtn.isEnabled = false
|
||||
progressBar.isVisible = true
|
||||
progressBar.animate()
|
||||
onItemClickListener.onItemSearch(item)
|
||||
}
|
||||
|
||||
pauseBtn.setIconResource(R.drawable.exomedia_ic_pause_white)
|
||||
pauseBtn.setOnClickListener {
|
||||
pauseBtn.isEnabled = false
|
||||
onItemClickListener.onItemPaused(item, position)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -132,6 +139,7 @@ class ObserveSourcesAdapter(onItemClickListener: OnItemClickListener, activity:
|
|||
|
||||
fun onItemSearch(item: ObserveSourcesItem)
|
||||
fun onItemStart(item: ObserveSourcesItem, position: Int)
|
||||
fun onItemPaused(item: ObserveSourcesItem, position: Int)
|
||||
fun onItemClick(item: ObserveSourcesItem)
|
||||
fun onDelete(item: ObserveSourcesItem)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -535,7 +535,7 @@ class ObserveSourcesBottomSheetDialog : BottomSheetDialogFragment() {
|
|||
)
|
||||
|
||||
withContext(Dispatchers.IO){
|
||||
observeSourcesViewModel.insert(observeItem)
|
||||
observeSourcesViewModel.insertUpdate(observeItem)
|
||||
}
|
||||
dismiss()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package com.deniscerri.ytdl.ui.more
|
|||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.DialogInterface
|
||||
import android.content.Intent
|
||||
import android.content.SharedPreferences
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
|
|
@ -153,13 +152,22 @@ class ObserveSourcesFragment : Fragment(), ObserveSourcesAdapter.OnItemClickList
|
|||
withContext(Dispatchers.IO){
|
||||
item.status = ObserveSourcesRepository.SourceStatus.ACTIVE
|
||||
item.runCount = 0
|
||||
observeSourcesViewModel.insert(item)
|
||||
observeSourcesViewModel.insertUpdate(item)
|
||||
}
|
||||
listAdapter.notifyItemChanged(position)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
override fun onItemPaused(item: ObserveSourcesItem, position: Int) {
|
||||
lifecycleScope.launch {
|
||||
withContext(Dispatchers.IO){
|
||||
observeSourcesViewModel.stopObserving(item)
|
||||
}
|
||||
listAdapter.notifyItemChanged(position)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onItemClick(item: ObserveSourcesItem) {
|
||||
showDialog(item.url)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ import android.app.Activity
|
|||
import android.content.DialogInterface
|
||||
import android.content.Intent
|
||||
import android.content.SharedPreferences
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.os.Environment
|
||||
|
|
@ -13,12 +12,9 @@ import android.util.LayoutDirection
|
|||
import android.util.Log
|
||||
import android.view.Gravity
|
||||
import android.view.View
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import android.widget.EditText
|
||||
import android.widget.TextView
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import androidx.core.content.edit
|
||||
import androidx.core.os.LocaleListCompat
|
||||
|
|
@ -31,7 +27,6 @@ import androidx.preference.PreferenceFragmentCompat
|
|||
import androidx.preference.PreferenceManager
|
||||
import androidx.work.WorkInfo
|
||||
import androidx.work.WorkManager
|
||||
import com.afollestad.materialdialogs.utils.MDUtil.getStringArray
|
||||
import com.deniscerri.ytdl.BuildConfig
|
||||
import com.deniscerri.ytdl.MainActivity
|
||||
import com.deniscerri.ytdl.R
|
||||
|
|
@ -52,17 +47,13 @@ import com.deniscerri.ytdl.database.viewmodel.ResultViewModel
|
|||
import com.deniscerri.ytdl.util.FileUtil
|
||||
import com.deniscerri.ytdl.util.UiUtil
|
||||
import com.deniscerri.ytdl.util.UpdateUtil
|
||||
import com.google.android.material.chip.Chip
|
||||
import com.google.android.material.chip.ChipGroup
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import com.google.android.material.textfield.TextInputLayout
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.GsonBuilder
|
||||
import com.google.gson.JsonArray
|
||||
import com.google.gson.JsonObject
|
||||
import com.google.gson.JsonParser
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
|
|
@ -754,7 +745,7 @@ class MainSettingsFragment : PreferenceFragmentCompat() {
|
|||
withContext(Dispatchers.IO){
|
||||
if (resetData) observeSourcesViewModel.deleteAll()
|
||||
data.observeSources!!.forEach {
|
||||
observeSourcesViewModel.insert(it)
|
||||
observeSourcesViewModel.insertUpdate(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ class UpdateSettingsFragment : BaseSettingsFragment() {
|
|||
|
||||
private fun setYTDLPVersion() {
|
||||
lifecycleScope.launch {
|
||||
ytdlVersion!!.summary = ""
|
||||
ytdlVersion!!.summary = getString(R.string.loading)
|
||||
val version = withContext(Dispatchers.IO){
|
||||
ytdlpUtil.getVersion()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@ class YTDLPUtil(private val context: Context) {
|
|||
if (url.isYoutubeURL()) {
|
||||
authorTags.addAll(0, listOf("artists", "artist"))
|
||||
}
|
||||
var author = jsonObject.getStringByAny(*authorTags.map { it }.toTypedArray())
|
||||
var author = jsonObject.getStringByAny(*authorTags.map { it }.toTypedArray()).removeSuffix(" - Topic")
|
||||
var duration = jsonObject.getIntByAny("duration").toString()
|
||||
if (duration != "-1"){
|
||||
duration = jsonObject.getInt("duration").toStringDuration(Locale.US)
|
||||
|
|
@ -447,8 +447,9 @@ class YTDLPUtil(private val context: Context) {
|
|||
}
|
||||
|
||||
val formatProper = Gson().fromJson(format.toString(), Format::class.java)
|
||||
if (formatProper.format_note == null) continue
|
||||
if (formatProper.format_note == null) formatProper.format_note = ""
|
||||
|
||||
val resolution = format.getString("resolution")
|
||||
if (format.has("format_note")){
|
||||
if (!formatProper!!.format_note.contains("audio only", true)) {
|
||||
formatProper.format_note = format.getString("format_note")
|
||||
|
|
@ -457,12 +458,18 @@ class YTDLPUtil(private val context: Context) {
|
|||
formatProper.format_note = format.getString("format_note").uppercase().removeSuffix("AUDIO") + " AUDIO"
|
||||
}
|
||||
}
|
||||
|
||||
if (!resolution.isNullOrBlank() && resolution != "audio only") {
|
||||
formatProper.format_note = "${formatProper.format_note} (${resolution})"
|
||||
}
|
||||
}
|
||||
if (formatProper.format_note == "storyboard") continue
|
||||
|
||||
if (formatProper.format_note.contains("storyboard", ignoreCase = true)) continue
|
||||
|
||||
formatProper.container = format.getString("ext")
|
||||
if (formatProper.tbr == "None") formatProper.tbr = ""
|
||||
if (!formatProper.tbr.isNullOrBlank()){
|
||||
formatProper.tbr = formatProper.tbr + "k"
|
||||
formatProper.tbr += "k"
|
||||
}
|
||||
|
||||
if(formatProper.vcodec.isNullOrEmpty() || formatProper.vcodec == "null"){
|
||||
|
|
@ -1173,9 +1180,13 @@ class YTDLPUtil(private val context: Context) {
|
|||
}
|
||||
|
||||
val lang = Locale.getDefault().language
|
||||
val langTag = Locale.getDefault().toLanguageTag()
|
||||
if (context.getStringArray(R.array.subtitle_langs).contains(lang)) {
|
||||
extractorArgs.add("lang=$lang")
|
||||
}
|
||||
if (context.getStringArray(R.array.subtitle_langs).contains(langTag)) {
|
||||
extractorArgs.add("lang=$langTag")
|
||||
}
|
||||
if (poToken.isNotBlank()) {
|
||||
extractorArgs.add("po_token=web+$poToken")
|
||||
}
|
||||
|
|
|
|||
5
app/src/main/res/drawable/baseline_stop_24.xml
Normal file
5
app/src/main/res/drawable/baseline_stop_24.xml
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
|
||||
|
||||
<path android:fillColor="@android:color/white" android:pathData="M6,6h12v12H6z"/>
|
||||
|
||||
</vector>
|
||||
|
|
@ -10,7 +10,7 @@
|
|||
<RelativeLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
app:layout_constraintDimensionRatio="H,2:1"
|
||||
app:layout_constraintDimensionRatio="H,2.7:1"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
|
@ -43,48 +43,43 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<LinearLayout
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:dividerPadding="5dp"
|
||||
android:orientation="vertical"
|
||||
android:layout_marginEnd="10dp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/search"
|
||||
app:layout_constraintEnd_toStartOf="@id/check_missing"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="2"
|
||||
android:paddingStart="10dp"
|
||||
android:paddingTop="10dp"
|
||||
android:paddingEnd="10dp"
|
||||
android:scrollbars="none"
|
||||
android:shadowRadius="2"
|
||||
android:textColor="#FFF"
|
||||
android:textSize="17sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintEnd_toStartOf="@+id/check_missing"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="2"
|
||||
android:paddingStart="10dp"
|
||||
android:paddingTop="10dp"
|
||||
android:paddingEnd="10dp"
|
||||
android:scrollbars="none"
|
||||
android:shadowRadius="2"
|
||||
android:textColor="#FFF"
|
||||
android:textSize="17sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/url"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:gravity="bottom"
|
||||
android:maxLines="1"
|
||||
android:paddingStart="10dp"
|
||||
android:paddingEnd="10dp"
|
||||
android:scrollbars="none"
|
||||
android:shadowRadius="1.5"
|
||||
android:textColor="#FFF"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
<TextView
|
||||
android:id="@+id/url"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:gravity="bottom"
|
||||
android:maxLines="1"
|
||||
android:paddingStart="10dp"
|
||||
android:paddingEnd="10dp"
|
||||
android:scrollbars="none"
|
||||
android:shadowRadius="1.5"
|
||||
android:textColor="#FFF"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintVertical_bias="0.0"
|
||||
app:layout_constraintBottom_toTopOf="@+id/buttons"
|
||||
app:layout_constraintEnd_toStartOf="@+id/check_missing"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/title" />
|
||||
|
||||
|
||||
<Button
|
||||
|
|
@ -98,7 +93,7 @@
|
|||
android:padding="0dp"
|
||||
android:minHeight="0dp"
|
||||
app:icon="@drawable/ic_restore"
|
||||
app:layout_constraintBottom_toTopOf="@+id/search"
|
||||
app:layout_constraintBottom_toTopOf="@+id/buttons"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
|
|
@ -107,26 +102,52 @@
|
|||
style="@style/Widget.Material3.Chip.Assist.Elevated"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="0dp"
|
||||
android:layout_margin="10dp"
|
||||
app:chipMinTouchTargetSize="0dp"
|
||||
android:layout_margin="12dp"
|
||||
app:chipIcon="@drawable/baseline_loop_24"
|
||||
app:chipIconVisible="true"
|
||||
app:chipMinTouchTargetSize="0dp"
|
||||
app:layout_constraintHorizontal_bias="0.0"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/buttons"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/search"
|
||||
style="@style/Widget.Material3.ExtendedFloatingActionButton.Icon.Secondary"
|
||||
android:layout_width="55dp"
|
||||
android:layout_height="55dp"
|
||||
<LinearLayout
|
||||
android:id="@+id/buttons"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="10dp"
|
||||
app:elevation="0dp"
|
||||
android:elevation="0dp"
|
||||
app:borderWidth="0dp"
|
||||
android:src="@drawable/ic_search"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/pause_resume"
|
||||
style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:elevation="0dp"
|
||||
app:borderWidth="0dp"
|
||||
app:cornerRadius="10dp"
|
||||
app:elevation="0dp"
|
||||
app:icon="@drawable/exomedia_ic_pause_white"/>
|
||||
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/search"
|
||||
style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:elevation="0dp"
|
||||
android:src="@drawable/ic_search"
|
||||
app:borderWidth="0dp"
|
||||
app:cornerRadius="10dp"
|
||||
app:elevation="0dp"
|
||||
app:icon="@drawable/ic_search"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:autoLink="all"
|
||||
android:text="@string/add"
|
||||
app:icon="@drawable/ic_check"
|
||||
app:icon="@drawable/ic_plus"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
|
|
|||
|
|
@ -177,7 +177,7 @@
|
|||
<string name="ignore_battery_optimization">تجاهل تحسين البطارية</string>
|
||||
<string name="log_downloads_summary">إنشاء ملف سجل للتنزيل المكتمل</string>
|
||||
<string name="shortcuts_desc">طريقة وصول أسرع للأوامر كثيرة الاستخدام</string>
|
||||
<string name="restrict_filenames_summary"><![CDATA[تقييد أسماء الملفات لتشمل أحرف ASCII فقط، وتجنب \"&\" والمسافات في أسماء الملفات]]></string>
|
||||
<string name="restrict_filenames_summary">تقييد أسماء الملفات لتشمل أحرف ASCII فقط، وتجنب \"&\" والمسافات في أسماء الملفات</string>
|
||||
<string name="add_chapters_summary">تعليم أجزاء مقطع اليوتيوب و/أو حاجب شرائح الإعلانات كفصول للفيديو</string>
|
||||
<string name="container">الصيغة</string>
|
||||
<string name="cut">قص</string>
|
||||
|
|
@ -381,7 +381,7 @@
|
|||
<string name="disabled">معطّل</string>
|
||||
<string name="subtitles">الترجمات</string>
|
||||
<string name="prevent_duplicate_downloads">منع التنزيلات المكررة</string>
|
||||
<string name="prevent_duplicate_url_type"><![CDATA[عنوان URL ونوع التنزيل]]></string>
|
||||
<string name="prevent_duplicate_url_type">عنوان URL ونوع التنزيل</string>
|
||||
<string name="prevent_duplicate_config">التكوين كاملًا</string>
|
||||
<string name="copy_url">نسخ الرابط</string>
|
||||
<string name="move_bottom">نقل للأسفل</string>
|
||||
|
|
|
|||
|
|
@ -172,7 +172,7 @@
|
|||
<string name="best_quality">Ən Yaxşı Keyfiyyət</string>
|
||||
<string name="worst_quality">Ən Pis Keyfiyyət</string>
|
||||
<string name="restrict_filenames">Fayl adların məhdudlaşdır</string>
|
||||
<string name="restrict_filenames_summary"><![CDATA[Fayl adların ancaq ASCII simvollarıyla məhdudlaşdır və fayl adlarında \"&"\ və boşluqlar yaratma]]></string>
|
||||
<string name="restrict_filenames_summary">Fayl adların ancaq ASCII simvollarıyla məhdudlaşdır və fayl adlarında \"&"\ və boşluqlar yaratma</string>
|
||||
<string name="kill_app">Tətbiqi Dayandır</string>
|
||||
<string name="confirm_terminate">Bütün yükləmələri dayandırır və tətbiqi zorla bağlayır</string>
|
||||
<string name="dont_ask_again">Təkrar soruşma</string>
|
||||
|
|
@ -381,7 +381,7 @@
|
|||
<string name="disabled">Qeyri-aktiv</string>
|
||||
<string name="subtitles">Titrlər</string>
|
||||
<string name="prevent_duplicate_downloads">Eyni Yükləmələrin Qarşısını Al</string>
|
||||
<string name="prevent_duplicate_url_type"><![CDATA[URL və Yükləmə Növü]]></string>
|
||||
<string name="prevent_duplicate_url_type">URL və Yükləmə Növü</string>
|
||||
<string name="prevent_duplicate_config">Tam Konfiqurasiya</string>
|
||||
<string name="copy_url">URL-i Köçür</string>
|
||||
<string name="move_top">Yuxarıya keçin</string>
|
||||
|
|
|
|||
|
|
@ -172,7 +172,7 @@
|
|||
<string name="best_quality">Mejor Calidad</string>
|
||||
<string name="worst_quality">Peor Calidad</string>
|
||||
<string name="restrict_filenames">Restringir nombres de archivos</string>
|
||||
<string name="restrict_filenames_summary"><![CDATA[Restringe los nombres de archivo a sólo caracteres ASCII y evita \"&\" y espacios en los nombres de archivo]]></string>
|
||||
<string name="restrict_filenames_summary">Restringe los nombres de archivo a sólo caracteres ASCII y evita \"&\" y espacios en los nombres de archivo</string>
|
||||
<string name="kill_app">Terminar la aplicación</string>
|
||||
<string name="confirm_terminate">Detiene todas las descargas y fuerza el cierre de la aplicación</string>
|
||||
<string name="dont_ask_again">No vuelvas a preguntar</string>
|
||||
|
|
@ -381,7 +381,7 @@
|
|||
<string name="disabled">Desactivado</string>
|
||||
<string name="subtitles">Subtítulos</string>
|
||||
<string name="prevent_duplicate_downloads">Evitar descargas duplicadas</string>
|
||||
<string name="prevent_duplicate_url_type"><![CDATA[URL y Tipo de descarga]]></string>
|
||||
<string name="prevent_duplicate_url_type">URL y Tipo de descarga</string>
|
||||
<string name="prevent_duplicate_config">Configuración completa</string>
|
||||
<string name="copy_url">Copiar la URL</string>
|
||||
<string name="move_top">Mover de primero</string>
|
||||
|
|
|
|||
|
|
@ -265,7 +265,7 @@
|
|||
<string name="cancelled">Anulowane</string>
|
||||
<string name="access_all_directories_summary">Zezwól aplikacji na pobieranie do katalogów, które są domyślnie ograniczone</string>
|
||||
<string name="clear_temporary_files_summary">Usuń pliki pamięci podręcznej z pobrań zakończonych awarią, błędem bądź anulowaniem</string>
|
||||
<string name="restrict_filenames_summary"><![CDATA[Ogranicz nazwy plików tylko do znaków ASCII i unikaj \„&\” i spacji w nazwach plików]]></string>
|
||||
<string name="restrict_filenames_summary">Ogranicz nazwy plików tylko do znaków ASCII i unikaj \„&\” i spacji w nazwach plików</string>
|
||||
<string name="confirm_terminate">Zatrzymuje wszystkie pobierania i wymusza zamknięcie aplikacji</string>
|
||||
<string name="download_over_metered_networks_summary">Umożliwia pobieranie przez dowolną sieć. Jeśli opcja nie jest wybrana, aplikacja czeka na sieć bez planu taryfowego</string>
|
||||
<string name="format_filtering_hint">Aby można było użyć tej opcji, wszystkie elementy muszą być tego samego typu</string>
|
||||
|
|
@ -389,7 +389,7 @@
|
|||
<string name="disabled">Wyłączone</string>
|
||||
<string name="subtitles">Napisy</string>
|
||||
<string name="prevent_duplicate_downloads">Zapobieganie pobieraniu duplikatów</string>
|
||||
<string name="prevent_duplicate_url_type"><![CDATA[URL i typ pobierania]]></string>
|
||||
<string name="prevent_duplicate_url_type">URL i typ pobierania</string>
|
||||
<string name="prevent_duplicate_config">Pełna konfiguracja</string>
|
||||
<string name="copy_url">Kopiuj adres URL</string>
|
||||
<string name="scheduled">Zaplanowane</string>
|
||||
|
|
|
|||
|
|
@ -248,7 +248,7 @@
|
|||
<string name="kill_app">Encerrar Aplicativo</string>
|
||||
<string name="freespace">Espaço livre</string>
|
||||
<string name="dont_ask_again">Não perguntar novamente</string>
|
||||
<string name="restrict_filenames_summary"><![CDATA[Restringir nomes de arquivos apenas a caracteres ASCII e evite \"&\" e espaços em nomes de arquivos]]></string>
|
||||
<string name="restrict_filenames_summary">Restringir nomes de arquivos apenas a caracteres ASCII e evite \"&\" e espaços em nomes de arquivos</string>
|
||||
<string name="template">Modelo</string>
|
||||
<string name="sponsorblock_nonmusic">Partes sem música e sem relação com o tema</string>
|
||||
<string name="container">Contêiner</string>
|
||||
|
|
|
|||
|
|
@ -179,7 +179,7 @@
|
|||
<string name="share">Поделиться</string>
|
||||
<string name="confirm_delete_cookies_desc">Удалить все Cookies без возможности восстановления</string>
|
||||
<string name="restrict_filenames">Ограничение имён файлов</string>
|
||||
<string name="restrict_filenames_summary"><![CDATA[Ограничивайте имена файлов только символами ASCII и избегайте \"&\" пробелы в именах файлов]]></string>
|
||||
<string name="restrict_filenames_summary">Ограничивайте имена файлов только символами ASCII и избегайте \"&\" пробелы в именах файлов</string>
|
||||
<string name="download_over_metered_networks">Загружать через сети с тарифным планом</string>
|
||||
<string name="metered_network_download_start_info">Загрузка начнется при подключении к безлимитной сети</string>
|
||||
<string name="kill_app">Завершить работу</string>
|
||||
|
|
@ -381,7 +381,7 @@
|
|||
<string name="disabled">Отключено</string>
|
||||
<string name="subtitles">Субтитры</string>
|
||||
<string name="prevent_duplicate_downloads">Предотвращение дублирования загрузок</string>
|
||||
<string name="prevent_duplicate_url_type"><![CDATA[URL & Тип загрузки]]></string>
|
||||
<string name="prevent_duplicate_url_type">URL & Тип загрузки</string>
|
||||
<string name="prevent_duplicate_config">Полная конфигурация</string>
|
||||
<string name="copy_url">Копировать URL</string>
|
||||
<string name="move_top">Перейти вверх</string>
|
||||
|
|
|
|||
|
|
@ -172,7 +172,7 @@
|
|||
<string name="freespace">Hapësirë e lirë</string>
|
||||
<string name="link_you_copied">Linku i kopjuar</string>
|
||||
<string name="restrict_filenames">Limito Titujt</string>
|
||||
<string name="restrict_filenames_summary"><![CDATA[Kufizoni emrat e skedarëve vetëm në karaktere ASCII dhe shmangni \"&\" dhe hapësirat në emrat e skedarëve]]></string>
|
||||
<string name="restrict_filenames_summary">Kufizoni emrat e skedarëve vetëm në karaktere ASCII dhe shmangni \"&\" dhe hapësirat në emrat e skedarëve</string>
|
||||
<string name="kill_app">Ndalo Aplikacionin</string>
|
||||
<string name="confirm_terminate">Ndalon të gjithë shkarkimet dhe mbyll me forcë aplikacionin</string>
|
||||
<string name="end">Fundi</string>
|
||||
|
|
@ -381,7 +381,7 @@
|
|||
<string name="no_download_fragments_summary">Mos përdorni skedarë .part dhe shkruani direkt në skedarin dalës</string>
|
||||
<string name="subtitles">Titrat</string>
|
||||
<string name="prevent_duplicate_downloads">Parandalo Shkarkimet Duplikate</string>
|
||||
<string name="prevent_duplicate_url_type"><![CDATA[URL &Lloji i shkarkimit]]></string>
|
||||
<string name="prevent_duplicate_url_type">URL & Lloji i shkarkimit</string>
|
||||
<string name="prevent_duplicate_config">Konfigurimi i plotë</string>
|
||||
<string name="copy_url">Kopjo URL</string>
|
||||
<string name="move_top">Vendose në fillim</string>
|
||||
|
|
|
|||
|
|
@ -243,7 +243,7 @@
|
|||
<string name="search">Претрага</string>
|
||||
<string name="keep_cache">Задржи фрагменте</string>
|
||||
<string name="file_size">Величина фајла</string>
|
||||
<string name="restrict_filenames_summary"><![CDATA[Ограничите називе фајлова само на ASCII знакове и избегавајте \"&\" и размаке у називима фајлова]]></string>
|
||||
<string name="restrict_filenames_summary">Ограничите називе фајлова само на ASCII знакове и избегавајте \"&\" и размаке у називима фајлова</string>
|
||||
<string name="auto">Аутоматски</string>
|
||||
<string name="configure_download">Прилагођавање преузимања</string>
|
||||
<string name="shortcuts">Пречице</string>
|
||||
|
|
@ -379,7 +379,7 @@
|
|||
<string name="hour">Час</string>
|
||||
<string name="display_over_apps">Приказуј преко апликација</string>
|
||||
<string name="subtitles">Титлови</string>
|
||||
<string name="prevent_duplicate_url_type"><![CDATA[URL адреса и тип преузимања]]></string>
|
||||
<string name="prevent_duplicate_url_type">URL адреса и тип преузимања</string>
|
||||
<string name="prevent_duplicate_config">Потпуна конфигурација</string>
|
||||
<string name="copy_url">Копирај URL адресу</string>
|
||||
<string name="move_bottom">Помери на дно</string>
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@
|
|||
<string name="freespace">வெற்று இடம்</string>
|
||||
<string name="link_you_copied">நீங்கள் நகலெடுத்த இணைப்பு</string>
|
||||
<string name="restrict_filenames">கோப்பு பெயர்களைக் கட்டுப்படுத்து</string>
|
||||
<string name="restrict_filenames_summary"><![CDATA[கோப்புப் பெயர்களை ASCII எழுத்துகளுக்கு மட்டும் கட்டுப்படுத்தவும், மேலும் கோப்புப்பெயர்களில் \"&\" மற்றும் இடைவெளிகளைத் தவிர்க்கவும்]]></string>
|
||||
<string name="restrict_filenames_summary">கோப்புப் பெயர்களை ASCII எழுத்துகளுக்கு மட்டும் கட்டுப்படுத்தவும், மேலும் கோப்புப்பெயர்களில் \"&\" மற்றும் இடைவெளிகளைத் தவிர்க்கவும்</string>
|
||||
<string name="kill_app">பயன்பாட்டை நிறுத்து</string>
|
||||
<string name="confirm_terminate">எல்லா பதிவிறக்கங்களையும் நிறுத்தி, பயன்பாட்டை வலுக்கட்டாயமாக மூடுகிறது</string>
|
||||
<string name="dont_ask_again">மீண்டும் கேட்காதே</string>
|
||||
|
|
@ -253,7 +253,7 @@
|
|||
<string name="on_time">ஆன்</string>
|
||||
<string name="display_over_apps_summary">பதிவிறக்க அட்டையை எப்போதும் மேலே காண்பிக்கவும். பதிவிறக்க அட்டை காண்பிக்கப்படும் போது தற்போது இயங்கும் பயன்பாடு மூடப்பட்டால் இதை இயக்கவும்</string>
|
||||
<string name="hour">மணி</string>
|
||||
<string name="prevent_duplicate_url_type"><![CDATA[முகவரி & பதிவிறக்கம் வகை]]></string>
|
||||
<string name="prevent_duplicate_url_type">முகவரி & பதிவிறக்கம் வகை</string>
|
||||
<string name="prevent_duplicate_config">முழு உள்ளமைவு</string>
|
||||
<string name="copy_url">முகவரியை நகலெடு</string>
|
||||
<string name="move_top">மேலே செல்</string>
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@
|
|||
<string name="select">Вибрати</string>
|
||||
<string name="all_items_selected">Вибрано всі елементи</string>
|
||||
<string name="redownload">Повторне завантаження</string>
|
||||
<string name="restrict_filenames_summary"><![CDATA[Обмежуйте імена файлів лише символами ASCII та уникайте \"&\" прогалини в іменах файлів]]></string>
|
||||
<string name="restrict_filenames_summary">Обмежуйте імена файлів лише символами ASCII та уникайте \"&\" прогалини в іменах файлів</string>
|
||||
<string name="selected">Вибрано</string>
|
||||
<string name="access_all_directories_summary">Дозволити застосунку завантажувати в каталоги, обмежених за замовчуванням</string>
|
||||
<string name="download_rescheduled_to">Завантаження перенесено на:</string>
|
||||
|
|
@ -381,7 +381,7 @@
|
|||
<string name="disabled">Вимкнено</string>
|
||||
<string name="subtitles">Субтитри</string>
|
||||
<string name="prevent_duplicate_downloads">Запобігання повторним завантаженням</string>
|
||||
<string name="prevent_duplicate_url_type"><![CDATA[URL & Тип завантаження]]></string>
|
||||
<string name="prevent_duplicate_url_type">URL & Тип завантаження</string>
|
||||
<string name="prevent_duplicate_config">Повна конфігурація</string>
|
||||
<string name="copy_url">Копіювати URL</string>
|
||||
<string name="move_top">Перейти вгору</string>
|
||||
|
|
|
|||
|
|
@ -217,7 +217,7 @@
|
|||
<string name="cache_cleared">临时文件已清除</string>
|
||||
<string name="ytdl_version">yt-dlp 版本</string>
|
||||
<string name="link_you_copied">您复制的链接</string>
|
||||
<string name="restrict_filenames_summary"><![CDATA[将文件名限制为仅 ASCII 字符,并避免在文件名中使用\"&\"和空格]]></string>
|
||||
<string name="restrict_filenames_summary">将文件名限制为仅 ASCII 字符,并避免在文件名中使用\"&\"和空格</string>
|
||||
<string name="kill_app">结束应用</string>
|
||||
<string name="confirm_terminate">停止所有下载并强制关闭应用</string>
|
||||
<string name="new_cut">新剪辑</string>
|
||||
|
|
|
|||
|
|
@ -235,7 +235,7 @@
|
|||
<string name="clear_temporary_files_summary">從崩潰/錯誤/取消的下載中刪除快取檔案</string>
|
||||
<string name="download_rescheduled_to">下載已重新安排至:</string>
|
||||
<string name="freespace">可用空間</string>
|
||||
<string name="restrict_filenames_summary"><![CDATA[限制檔名只使用 ASCII 字元,避免在檔名中使用 \"&\" 和空格]]></string>
|
||||
<string name="restrict_filenames_summary">限制檔名只使用 ASCII 字元,避免在檔名中使用 \"&\" 和空格</string>
|
||||
<string name="cut">剪下</string>
|
||||
<string name="update_formats_summary">當下載卡片顯示時,立刻獲取可用的格式</string>
|
||||
<string name="download_over_metered_networks_summary">使用任何網路類型進行下載。否則等待非計量網路</string>
|
||||
|
|
@ -381,7 +381,7 @@
|
|||
<string name="disabled">關閉</string>
|
||||
<string name="subtitles">字幕</string>
|
||||
<string name="prevent_duplicate_downloads">防止重複下載</string>
|
||||
<string name="prevent_duplicate_url_type"><![CDATA[URL 和下載類型]]></string>
|
||||
<string name="prevent_duplicate_url_type">URL 和下載類型</string>
|
||||
<string name="prevent_duplicate_config">完整設定</string>
|
||||
<string name="copy_url">複製 URL</string>
|
||||
<string name="move_top">移至頂部</string>
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@
|
|||
<string name="freespace">Free space</string>
|
||||
<string name="link_you_copied">Link you copied</string>
|
||||
<string name="restrict_filenames">Restrict Filenames</string>
|
||||
<string name="restrict_filenames_summary"><![CDATA[Restrict filenames to only ASCII characters, and avoid \"&\" and spaces in filenames]]></string>
|
||||
<string name="restrict_filenames_summary">Restrict filenames to only ASCII characters, and avoid \"&\" and spaces in filenames</string>
|
||||
<string name="kill_app">Terminate App</string>
|
||||
<string name="confirm_terminate">Stops all downloads and force closes the app</string>
|
||||
<string name="dont_ask_again">Don\'t ask again</string>
|
||||
|
|
@ -384,7 +384,7 @@
|
|||
<string name="hour">Hour</string>
|
||||
<string name="subtitles">Subtitles</string>
|
||||
<string name="prevent_duplicate_downloads">Prevent Duplicate Downloads</string>
|
||||
<string name="prevent_duplicate_url_type"><![CDATA[URL & Download Type]]></string>
|
||||
<string name="prevent_duplicate_url_type">URL & Download Type</string>
|
||||
<string name="prevent_duplicate_config">Full Configuration</string>
|
||||
<string name="copy_url">Copy URL</string>
|
||||
<string name="move_top">Move to the Top</string>
|
||||
|
|
|
|||
Loading…
Reference in a new issue