prevented card from duplicating when switching formats

This commit is contained in:
Denis Çerri 2023-03-03 21:54:50 +01:00
parent e78f83ac73
commit 4d859ee8d4
No known key found for this signature in database
GPG key ID: 95C43D517D830350
22 changed files with 89 additions and 72 deletions

View file

@ -55,7 +55,7 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".ui.downloadLogs.DownloadLogListActivity" android:name=".ui.more.downloadLogs.DownloadLogListActivity"
android:configChanges="layoutDirection|locale" android:configChanges="layoutDirection|locale"
android:parentActivityName=".MainActivity" android:parentActivityName=".MainActivity"
android:exported="true"> android:exported="true">
@ -75,9 +75,9 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".ui.downloadLogs.DownloadLogActivity" android:name=".ui.more.downloadLogs.DownloadLogActivity"
android:configChanges="layoutDirection|locale" android:configChanges="layoutDirection|locale"
android:parentActivityName=".ui.downloadLogs.DownloadLogListActivity" android:parentActivityName=".ui.more.downloadLogs.DownloadLogListActivity"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="ytdlnis.downloadLogs.DownloadLogActivity" /> <action android:name="ytdlnis.downloadLogs.DownloadLogActivity" />
@ -85,7 +85,7 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".ui.settings.SettingsActivity" android:name=".ui.more.settings.SettingsActivity"
android:configChanges="layoutDirection|locale" android:configChanges="layoutDirection|locale"
android:parentActivityName=".MainActivity" android:parentActivityName=".MainActivity"
android:exported="true"> android:exported="true">
@ -95,7 +95,7 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".ui.CustomCommandActivity" android:name=".ui.more.CustomCommandActivity"
android:configChanges="layoutDirection|locale" android:configChanges="layoutDirection|locale"
android:theme="@style/AppDefaultTheme" android:theme="@style/AppDefaultTheme"
android:parentActivityName=".MainActivity" android:parentActivityName=".MainActivity"

View file

@ -52,11 +52,6 @@ class App : Application() {
.getInt("concurrent_downloads", 1))) .getInt("concurrent_downloads", 1)))
.build()) .build())
val locale = getSharedPreferences("root_preferences", MODE_PRIVATE)
.getString("app_language", Locale.getDefault().language)!!
AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(locale))
} }
@Throws(YoutubeDLException::class) @Throws(YoutubeDLException::class)
private fun initLibraries() { private fun initLibraries() {

View file

@ -1,7 +1,6 @@
package com.deniscerri.ytdlnis package com.deniscerri.ytdlnis
import android.Manifest import android.Manifest
import android.content.ClipboardManager
import android.content.Context import android.content.Context
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
@ -17,7 +16,6 @@ import android.view.MenuItem
import android.view.View import android.view.View
import android.view.WindowInsets import android.view.WindowInsets
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
@ -29,11 +27,10 @@ import com.deniscerri.ytdlnis.service.IDownloaderService
import com.deniscerri.ytdlnis.ui.DownloadQueueActivity import com.deniscerri.ytdlnis.ui.DownloadQueueActivity
import com.deniscerri.ytdlnis.ui.HistoryFragment import com.deniscerri.ytdlnis.ui.HistoryFragment
import com.deniscerri.ytdlnis.ui.HomeFragment import com.deniscerri.ytdlnis.ui.HomeFragment
import com.deniscerri.ytdlnis.ui.MoreFragment import com.deniscerri.ytdlnis.ui.more.MoreFragment
import com.deniscerri.ytdlnis.ui.settings.SettingsActivity import com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity
import com.deniscerri.ytdlnis.util.UpdateUtil import com.deniscerri.ytdlnis.util.UpdateUtil
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import java.io.BufferedReader import java.io.BufferedReader
import java.io.File import java.io.File
import java.io.InputStreamReader import java.io.InputStreamReader

View file

@ -49,22 +49,10 @@ class ResultRepository(private val resultDao: ResultDao, private val commandTemp
} }
suspend fun getOne(inputQuery: String, resetResults: Boolean) : ArrayList<ResultItem?>{ suspend fun getOne(inputQuery: String, resetResults: Boolean) : ArrayList<ResultItem?>{
var el: Array<String?> =
inputQuery.split("/".toRegex()).dropLastWhile { it.isEmpty() }
.toTypedArray()
var query = el[el.size - 1]
if (query!!.contains("watch?v=")) {
query = query.substring(8)
}
el = query.split("&".toRegex()).dropLastWhile { it.isEmpty() }
.toTypedArray()
query = el[0]
el = query!!.split("\\?".toRegex()).dropLastWhile { it.isEmpty() }
.toTypedArray()
query = el[0]
val infoUtil = InfoUtil(context) val infoUtil = InfoUtil(context)
val query = infoUtil.getIDFromYoutubeURL(inputQuery)
try { try {
val v = infoUtil.getVideo(query!!) val v = infoUtil.getVideo(query)
if (resetResults) deleteAll() if (resetResults) deleteAll()
itemCount.postValue(1) itemCount.postValue(1)
resultDao.insert(v!!) resultDao.insert(v!!)

View file

@ -108,7 +108,7 @@ class ShareActivity : AppCompatActivity() {
} }
resultViewModel.items.observe(this) { resultViewModel.items.observe(this) {
if (it.isNotEmpty()){ if (it.isNotEmpty() && supportFragmentManager.findFragmentByTag("downloadSingleSheet") == null){
if(resultViewModel.itemCount.value!! == it.size){ if(resultViewModel.itemCount.value!! == it.size){
loadingBottomSheet.cancel() loadingBottomSheet.cancel()
showDownloadSheet(it[0]) showDownloadSheet(it[0])
@ -211,6 +211,5 @@ class ShareActivity : AppCompatActivity() {
companion object { companion object {
private const val TAG = "ShareActivity" private const val TAG = "ShareActivity"
} }
} }

View file

@ -162,10 +162,10 @@ class DownloadAudioFragment(private var resultItem: ResultItem) : Fragment() {
if (containers.contains(formats[formats.lastIndex].container)){ if (containers.contains(formats[formats.lastIndex].container)){
formats[formats.lastIndex].container formats[formats.lastIndex].container
}else{ }else{
containers[0] sharedPreferences.getString("audio_format", "mp3")!!
} }
}catch (e: Exception){ }catch (e: Exception){
containers[0] sharedPreferences.getString("audio_format", "mp3")!!
} }
downloadItem.format.container = selectedContainer downloadItem.format.container = selectedContainer

View file

@ -135,7 +135,7 @@ class DownloadBottomSheetDialog(private val resultItem: ResultItem, private val
val timepicker = MaterialTimePicker.Builder() val timepicker = MaterialTimePicker.Builder()
.setTimeFormat(TimeFormat.CLOCK_12H) .setTimeFormat(TimeFormat.CLOCK_24H)
.setHour(currentDate.get(Calendar.HOUR_OF_DAY)) .setHour(currentDate.get(Calendar.HOUR_OF_DAY))
.setMinute(currentDate.get(Calendar.MINUTE)) .setMinute(currentDate.get(Calendar.MINUTE))
.build() .build()

View file

@ -58,7 +58,7 @@ class DownloadVideoFragment(private val resultItem: ResultItem) : Fragment() {
fragmentView = inflater.inflate(R.layout.fragment_download_video, container, false) fragmentView = inflater.inflate(R.layout.fragment_download_video, container, false)
activity = getActivity() activity = getActivity()
downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java] downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java]
resultViewModel = ViewModelProvider(this)[ResultViewModel::class.java] resultViewModel = ViewModelProvider(this@DownloadVideoFragment)[ResultViewModel::class.java]
downloadItem = downloadViewModel.createDownloadItemFromResult(resultItem, Type.video) downloadItem = downloadViewModel.createDownloadItemFromResult(resultItem, Type.video)
fileUtil = FileUtil() fileUtil = FileUtil()
uiUtil = UiUtil(fileUtil) uiUtil = UiUtil(fileUtil)
@ -151,7 +151,12 @@ class DownloadVideoFragment(private val resultItem: ResultItem) : Fragment() {
}else{ }else{
containerAutoCompleteTextView.setText(containers[0], false) containerAutoCompleteTextView.setText(containers[0], false)
} }
lifecycleScope.launch {
withContext(Dispatchers.IO){
resultItem.formats = ArrayList(allFormats)
resultViewModel.update(resultItem)
}
}
formats = allFormats.toMutableList() formats = allFormats.toMutableList()
uiUtil.populateFormatCard(formatCard, item) uiUtil.populateFormatCard(formatCard, item)
} }

View file

@ -17,6 +17,7 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.view.get import androidx.core.view.get
import androidx.core.view.size import androidx.core.view.size
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.R
import com.deniscerri.ytdlnis.database.models.DownloadItem import com.deniscerri.ytdlnis.database.models.DownloadItem
@ -37,6 +38,9 @@ import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import com.google.android.material.timepicker.MaterialTimePicker import com.google.android.material.timepicker.MaterialTimePicker
import com.google.android.material.timepicker.TimeFormat import com.google.android.material.timepicker.TimeFormat
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.util.* import java.util.*
@ -73,20 +77,24 @@ class FormatSelectionBottomSheetDialog(private val item: DownloadItem, private v
val refreshBtn = view.findViewById<Button>(R.id.format_refresh) val refreshBtn = view.findViewById<Button>(R.id.format_refresh)
if (formats.none { it.filesize == 0L }) refreshBtn.visibility = View.GONE if (formats.none { it.filesize == 0L }) refreshBtn.visibility = View.GONE
refreshBtn.setOnClickListener { refreshBtn.setOnClickListener {
try { lifecycleScope.launch {
refreshBtn.isEnabled = false try {
val res = infoUtil.getFromYTDL(item.url) refreshBtn.isEnabled = false
formats = res[0]!!.formats.filter { it.filesize != 0L } val res = withContext(Dispatchers.IO){
formats = when(item.type){ infoUtil.getFormats(item.url)
Type.audio -> formats.filter { it.format_note.contains("audio", ignoreCase = true) } }
else -> formats.filter { !it.format_note.contains("audio", ignoreCase = true) } formats = res.formats.filter { it.filesize != 0L }
formats = when(item.type){
Type.audio -> formats.filter { it.format_note.contains("audio", ignoreCase = true) }
else -> formats.filter { !it.format_note.contains("audio", ignoreCase = true) }
}
addFormatsToView(linearLayout)
refreshBtn.visibility = View.GONE
}catch (e: Exception){
refreshBtn.isEnabled = true
e.printStackTrace()
Toast.makeText(context, getString(R.string.error_updating_formats), Toast.LENGTH_SHORT).show()
} }
addFormatsToView(linearLayout)
refreshBtn.visibility = View.GONE
}catch (e: Exception){
refreshBtn.isEnabled = true
e.printStackTrace()
Toast.makeText(context, getString(R.string.error_updating_formats), Toast.LENGTH_SHORT).show()
} }
} }
} }

View file

@ -1,4 +1,4 @@
package com.deniscerri.ytdlnis.ui package com.deniscerri.ytdlnis.ui.more
import android.Manifest import android.Manifest
import android.app.Notification import android.app.Notification

View file

@ -1,4 +1,4 @@
package com.deniscerri.ytdlnis.ui package com.deniscerri.ytdlnis.ui.more
import android.app.Activity import android.app.Activity
import android.app.Application import android.app.Application

View file

@ -1,17 +1,14 @@
package com.deniscerri.ytdlnis.ui.downloadLogs package com.deniscerri.ytdlnis.ui.more.downloadLogs
import android.content.Context import android.content.Context
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.FileObserver import android.os.FileObserver
import android.util.Log
import android.view.View
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.widget.NestedScrollView import androidx.core.widget.NestedScrollView
import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.R
import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.appbar.MaterialToolbar
import kotlinx.coroutines.runBlocking
import java.io.File import java.io.File

View file

@ -1,27 +1,19 @@
package com.deniscerri.ytdlnis.ui.downloadLogs package com.deniscerri.ytdlnis.ui.more.downloadLogs
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.* import android.os.*
import android.text.InputType
import android.util.Log
import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.widget.RelativeLayout import android.widget.RelativeLayout
import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.SearchView
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.R
import com.deniscerri.ytdlnis.adapter.DownloadLogsAdapter import com.deniscerri.ytdlnis.adapter.DownloadLogsAdapter
import com.deniscerri.ytdlnis.util.InfoUtil
import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.appbar.MaterialToolbar
import com.google.android.material.button.MaterialButton
import java.io.File import java.io.File
import java.util.ArrayList
class DownloadLogListActivity : AppCompatActivity(), DownloadLogsAdapter.OnItemClickListener { class DownloadLogListActivity : AppCompatActivity(), DownloadLogsAdapter.OnItemClickListener {

View file

@ -1,4 +1,4 @@
package com.deniscerri.ytdlnis.ui.settings package com.deniscerri.ytdlnis.ui.more.settings
import android.content.Context import android.content.Context
import android.content.res.Configuration import android.content.res.Configuration

View file

@ -1,4 +1,4 @@
package com.deniscerri.ytdlnis.ui.settings package com.deniscerri.ytdlnis.ui.more.settings
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent

View file

@ -20,6 +20,7 @@ import java.io.InputStreamReader
import java.net.HttpURLConnection import java.net.HttpURLConnection
import java.net.URL import java.net.URL
import java.util.* import java.util.*
import java.util.regex.Pattern
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
class InfoUtil(context: Context) { class InfoUtil(context: Context) {
@ -449,6 +450,41 @@ class InfoUtil(context: Context) {
return items return items
} }
fun getIDFromYoutubeURL(inputQuery: String) : String {
var el: Array<String?> =
inputQuery.split("/".toRegex()).dropLastWhile { it.isEmpty() }
.toTypedArray()
var query = el[el.size - 1]
if (query!!.contains("watch?v=")) {
query = query.substring(8)
}
el = query.split("&".toRegex()).dropLastWhile { it.isEmpty() }
.toTypedArray()
query = el[0]
el = query!!.split("\\?".toRegex()).dropLastWhile { it.isEmpty() }
.toTypedArray()
query = el[0]
return query!!
}
fun getFormats(url: String) : ResultItem {
init()
val p = Pattern.compile("^(https?)://(www.)?youtu(.be)?")
val m = p.matcher(url)
return if(m.find() && useInvidous){
val id = getIDFromYoutubeURL(url)
Log.e("Aa", id)
val res = genericRequest(invidousURL + "videos/" + id)
Log.e("aa", res.toString())
if (res.length() == 0) getFromYTDL(url)[0]!!
else createVideofromInvidiousJSON(
res
)!!
}else{
getFromYTDL(url)[0]!!
}
}
fun getFromYTDL(query: String): ArrayList<ResultItem?> { fun getFromYTDL(query: String): ArrayList<ResultItem?> {
init() init()
items = ArrayList() items = ArrayList()

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.deniscerri.ytdlnis.ui.CustomCommandActivity"> tools:context="com.deniscerri.ytdlnis.ui.more.CustomCommandActivity">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.deniscerri.ytdlnis.ui.CustomCommandActivity"> tools:context="com.deniscerri.ytdlnis.ui.more.CustomCommandActivity">
<FrameLayout <FrameLayout
android:id="@+id/custom_command_frame_layout" android:id="@+id/custom_command_frame_layout"

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.deniscerri.ytdlnis.ui.CustomCommandActivity"> tools:context="com.deniscerri.ytdlnis.ui.more.CustomCommandActivity">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.deniscerri.ytdlnis.ui.CustomCommandActivity"> tools:context="com.deniscerri.ytdlnis.ui.more.CustomCommandActivity">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.deniscerri.ytdlnis.ui.CustomCommandActivity"> tools:context="com.deniscerri.ytdlnis.ui.more.CustomCommandActivity">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context="com.deniscerri.ytdlnis.ui.settings.SettingsActivity"> tools:context="com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity">
<FrameLayout <FrameLayout
android:id="@+id/settings_frame_layout" android:id="@+id/settings_frame_layout"