even more fixes

pull/1087/head
deniscerri 6 months ago
parent 9a615777ad
commit 52fced08ea
No known key found for this signature in database
GPG Key ID: 95C43D517D830350

@ -24,6 +24,8 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.buffer
import kotlinx.coroutines.flow.cache
import kotlinx.coroutines.flow.combine
@ -32,6 +34,7 @@ import kotlinx.coroutines.flow.flattenMerge
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@ -45,6 +48,21 @@ class HistoryViewModel(application: Application) : AndroidViewModel(application)
private val queryFilter = MutableStateFlow("")
private val typeFilter = MutableStateFlow("")
var filterCount : StateFlow<Int> = combine(
websiteFilter,
statusFilter
) { website, status ->
val activeFilters = listOf(
website.isNotEmpty(),
status != HistoryStatus.ALL
)
activeFilters.count { it }
}.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = 0
)
enum class HistoryStatus {
UNSET, DELETED, NOT_DELETED, ALL
}

@ -324,9 +324,6 @@ class DownloadVideoFragment(private var resultItem: ResultItem? = null, private
if (currentDownloadItem == null || !containers.contains(downloadItem.container.ifEmpty { getString(R.string.defaultValue) })){
downloadItem.container = if (containerPreference == getString(R.string.defaultValue)) "" else containerPreference!!
}
if (downloadItem.videoPreferences.compatibilityMode) {
container.editText?.setText("mkv")
}
containerAutoCompleteTextView!!.setText(
downloadItem.container.ifEmpty { getString(R.string.defaultValue) },
false)
@ -347,7 +344,9 @@ class DownloadVideoFragment(private var resultItem: ResultItem? = null, private
downloadItem.videoPreferences.recodeVideo = false
}
}
if (downloadItem.videoPreferences.compatibilityMode) {
containerAutoCompleteTextView.setText("mkv",false)
}
view.findViewById<LinearLayout>(R.id.adjust).apply {
visibility = if (shownFields.contains("adjust_video")) View.VISIBLE else View.GONE
if (isVisible){

@ -34,6 +34,7 @@ import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import androidx.paging.PagingData
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper
@ -48,8 +49,10 @@ import com.deniscerri.ytdl.database.repository.HistoryRepository
import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel
import com.deniscerri.ytdl.database.viewmodel.HistoryViewModel
import com.deniscerri.ytdl.ui.adapter.HistoryPaginatedAdapter
import com.deniscerri.ytdl.util.Extensions.createBadge
import com.deniscerri.ytdl.util.Extensions.enableFastScroll
import com.deniscerri.ytdl.util.Extensions.toListString
import com.deniscerri.ytdl.util.Extensions.updateMenuItemBadge
import com.deniscerri.ytdl.util.FileUtil
import com.deniscerri.ytdl.util.NavbarUtil
import com.deniscerri.ytdl.util.UiUtil
@ -143,6 +146,12 @@ class HistoryFragment : Fragment(), HistoryPaginatedAdapter.OnItemClickListener{
}
}
lifecycleScope.launch {
historyViewModel.filterCount.collectLatest {
topAppBar.updateMenuItemBadge(R.id.filters, it)
}
}
lifecycleScope.launch {
historyViewModel.websites.collectLatest {
if(it.isEmpty()) {
@ -288,6 +297,7 @@ class HistoryFragment : Fragment(), HistoryPaginatedAdapter.OnItemClickListener{
deleteDialog.setMessage(getString(R.string.confirm_delete_history_desc))
deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() }
deleteDialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int ->
historyAdapter.submitData(lifecycle, PagingData.empty())
historyViewModel.clearDeleted()
}
deleteDialog.show()
@ -302,6 +312,7 @@ class HistoryFragment : Fragment(), HistoryPaginatedAdapter.OnItemClickListener{
deleteDialog.setMessage(getString(R.string.confirm_delete_history_desc))
deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() }
deleteDialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int ->
historyAdapter.submitData(lifecycle, PagingData.empty())
historyViewModel.deleteDuplicates()
}
deleteDialog.show()

@ -224,7 +224,7 @@ class GenerateYoutubePoTokensFragment : Fragment() {
val intent = Intent(requireContext(), PoTokenWebViewLoginActivity::class.java)
intent.putExtra("url", "https://www.youtube.com")
//intent.putExtra("redirect_url", "https://www.youtube.com/embed/${editText.text.toString().getIDFromYoutubeURL()}")
intent.putExtra("redirect_url", "https://www.youtube.com/embed/${editText.text.toString().getIDFromYoutubeURL()}")
intent.putExtra("no_auth", true)
webPoTokenResultLauncher.launch(intent)
}

@ -11,7 +11,6 @@ import android.view.MenuItem
import android.webkit.CookieManager
import android.webkit.WebChromeClient
import android.webkit.WebSettings
import android.webkit.WebStorage
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.Toast
@ -25,7 +24,6 @@ import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.view.children
import androidx.core.view.forEach
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceManager
@ -35,10 +33,6 @@ import com.deniscerri.ytdl.database.viewmodel.CookieViewModel
import com.deniscerri.ytdl.ui.BaseActivity
import com.deniscerri.ytdl.util.UiUtil
import com.deniscerri.ytdl.util.extractors.newpipe.potoken.NewPipePoTokenGenerator
import com.google.accompanist.web.AccompanistWebChromeClient
import com.google.accompanist.web.AccompanistWebViewClient
import com.google.accompanist.web.WebView
import com.google.accompanist.web.rememberWebViewState
import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.appbar.MaterialToolbar
import com.google.android.material.button.MaterialButton
@ -127,29 +121,32 @@ class PoTokenWebViewLoginActivity : BaseActivity() {
}
//update cookies
withContext(Dispatchers.IO) {
val cookieURL = "Po Token Generated Cookies"
cookiesViewModel.getCookiesFromDB(cookieURL).getOrNull()?.let {
kotlin.runCatching {
cookiesViewModel.insert(
CookieItem(
0,
cookieURL,
it,
"",
true
if (!noAuth) {
//update cookies
withContext(Dispatchers.IO) {
val cookieURL = "Po Token Generated Cookies"
cookiesViewModel.getCookiesFromDB(cookieURL).getOrNull()?.let {
kotlin.runCatching {
cookiesViewModel.insert(
CookieItem(
0,
cookieURL,
it,
"",
true
)
)
)
cookiesViewModel.updateCookiesFile()
preferences.edit().putBoolean("use_cookies", true).apply()
}.onFailure {
withContext(Dispatchers.Main) {
Toast.makeText(
this@PoTokenWebViewLoginActivity,
"Tokens were generated but cookies were not updated",
Toast.LENGTH_SHORT
).show()
cookiesViewModel.updateCookiesFile()
preferences.edit().putBoolean("use_cookies", true).apply()
}.onFailure {
withContext(Dispatchers.Main) {
Toast.makeText(
this@PoTokenWebViewLoginActivity,
"Tokens were generated but cookies were not updated",
Toast.LENGTH_SHORT
).show()
}
}
}
}
@ -169,7 +166,10 @@ class PoTokenWebViewLoginActivity : BaseActivity() {
if (value?.trim('"') == "complete") {
Handler(Looper.getMainLooper()).postDelayed({
redirectUrl?.apply {
webView.loadUrl(this)
val extraHeaders: MutableMap<String?, String?> =
HashMap()
extraHeaders["Referer"] = url
webView.loadUrl(this, extraHeaders)
}
redirectUrl = null
}, 2500)

@ -21,6 +21,7 @@ import android.text.Spanned
import android.text.TextWatcher
import android.util.DisplayMetrics
import android.util.TypedValue
import android.view.MenuItem
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
@ -33,6 +34,7 @@ import android.widget.ScrollView
import android.widget.TextView
import androidx.annotation.OptIn
import androidx.annotation.Px
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.text.HtmlCompat
@ -46,6 +48,7 @@ import com.deniscerri.ytdl.database.models.DownloadItem
import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem
import com.deniscerri.ytdl.database.repository.DownloadRepository
import com.deniscerri.ytdl.database.repository.ObserveSourcesRepository.EveryCategory
import com.google.android.material.appbar.MaterialToolbar
import com.google.android.material.badge.BadgeDrawable
import com.google.android.material.badge.BadgeUtils
import com.google.android.material.badge.ExperimentalBadgeUtils
@ -67,7 +70,9 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
import kotlinx.serialization.json.Json
import me.zhanghai.android.fastscroll.FastScrollerBuilder
import org.json.JSONArray
import org.json.JSONObject
import org.json.JSONTokener
import java.io.File
import java.net.HttpCookie
import java.util.Calendar
@ -257,9 +262,9 @@ object Extensions {
runCatching {
val tmp = this.getString(it)
if (tmp != "null") {
return if (tmp.startsWith("[") && tmp.endsWith("]")) {
return try {
Json.decodeFromString<List<String>>(tmp).joinToString(", ")
}else{
} catch (e: Exception) {
tmp
}
}
@ -324,6 +329,25 @@ object Extensions {
}
}
@OptIn(ExperimentalBadgeUtils::class)
fun MaterialToolbar.updateMenuItemBadge(menuItemId: Int, nr: Int) {
this.findViewById<View>(menuItemId).overlay.clear()
val badge = BadgeDrawable.create(context).apply {
number = nr
backgroundColor = ContextCompat.getColor(context, R.color.white)
badgeTextColor = ContextCompat.getColor(context, R.color.black)
verticalOffset = dpToPx(resources, 4f)
horizontalOffset = dpToPx(resources, 4f)
}
if (nr > 0) {
BadgeUtils.attachBadgeDrawable(badge, this, menuItemId)
} else {
BadgeUtils.detachBadgeDrawable(badge, this, menuItemId)
}
}
fun TabLayout.Tab.createBadge(nr: Int){
removeBadge()
if (nr > 0) {

@ -509,5 +509,5 @@
<string name="app_icon">App Icon</string>
<string name="show_quick_download_share_menu">Show option to download immediately in the share menu</string>
<string name="quick_download_title">Don\'t fetch data</string>
<string name="sponsorblock_hook">Hook</string>
<string name="sponsorblock_hook">Hook/Greetings</string>
</resources>

Loading…
Cancel
Save