1.8.1 fr this time

This commit is contained in:
deniscerri 2024-11-26 22:24:14 +01:00
parent 266c148585
commit 0f6d8d6494
No known key found for this signature in database
GPG key ID: 95C43D517D830350
24 changed files with 162 additions and 113 deletions

View file

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

View file

@ -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())

View file

@ -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)
}

View file

@ -535,7 +535,7 @@ class ObserveSourcesBottomSheetDialog : BottomSheetDialogFragment() {
)
withContext(Dispatchers.IO){
observeSourcesViewModel.insert(observeItem)
observeSourcesViewModel.insertUpdate(observeItem)
}
dismiss()
}

View file

@ -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)
}

View file

@ -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)
}
}
}

View file

@ -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()
}

View file

@ -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")
}

View 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>

View file

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

View file

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

View file

@ -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 فقط، وتجنب \"&amp;\" والمسافات في أسماء الملفات</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>

View file

@ -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 \"&amp;"\ 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>

View file

@ -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 \"&amp;\" 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>

View file

@ -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 \„&amp;\” 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>

View file

@ -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 \"&amp;\" 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>

View file

@ -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 и избегайте \"&amp;\" пробелы в именах файлов</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 &amp; Тип загрузки</string>
<string name="prevent_duplicate_config">Полная конфигурация</string>
<string name="copy_url">Копировать URL</string>
<string name="move_top">Перейти вверх</string>

View file

@ -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 \"&amp;\" 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 &amp; 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>

View file

@ -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 знакове и избегавајте \"&amp;\" и размаке у називима фајлова</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>

View file

@ -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 எழுத்துகளுக்கு மட்டும் கட்டுப்படுத்தவும், மேலும் கோப்புப்பெயர்களில் \"&amp;\" மற்றும் இடைவெளிகளைத் தவிர்க்கவும்</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">முகவரி &amp; பதிவிறக்கம் வகை</string>
<string name="prevent_duplicate_config">முழு உள்ளமைவு</string>
<string name="copy_url">முகவரியை நகலெடு</string>
<string name="move_top">மேலே செல்</string>

View file

@ -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 та уникайте \"&amp;\" прогалини в іменах файлів</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 &amp; Тип завантаження</string>
<string name="prevent_duplicate_config">Повна конфігурація</string>
<string name="copy_url">Копіювати URL</string>
<string name="move_top">Перейти вгору</string>

View file

@ -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 字符,并避免在文件名中使用\"&amp;\"和空格</string>
<string name="kill_app">结束应用</string>
<string name="confirm_terminate">停止所有下载并强制关闭应用</string>
<string name="new_cut">新剪辑</string>

View file

@ -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 字元,避免在檔名中使用 \"&amp;\" 和空格</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>

View file

@ -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 \"&amp;\" 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 &amp; 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>