From 7191dc00f23fb228b63e4a699e49719450346f1b Mon Sep 17 00:00:00 2001 From: deniscerri <64997243+deniscerri@users.noreply.github.com> Date: Sun, 30 Jul 2023 18:40:15 +0200 Subject: [PATCH] implemented updating formats in the background worker --- .../database/viewmodel/DownloadViewModel.kt | 6 +- .../CancelDownloadNotificationReceiver.kt | 10 ++- .../com/deniscerri/ytdlnis/ui/HomeFragment.kt | 20 ++++- .../DownloadMultipleBottomSheetDialog.kt | 37 +++++++- .../FormatSelectionBottomSheetDialog.kt | 18 +++- .../SelectPlaylistItemsBottomSheetDialog.kt | 2 +- .../ui/downloads/ActiveDownloadsFragment.kt | 2 +- .../ytdlnis/util/NotificationUtil.kt | 88 ++++++++++++++++++- .../work/UpdatePlaylistFormatsWorker.kt | 61 ++++++++++--- .../ytdlnis/work/UpdateYTDLWorker.kt | 28 +----- app/src/main/res/values/strings.xml | 2 + 11 files changed, 220 insertions(+), 54 deletions(-) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt index 18694455..2145255e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt @@ -60,7 +60,7 @@ import kotlin.random.nextInt class DownloadViewModel(application: Application) : AndroidViewModel(application) { private val dbManager: DBManager - private val repository : DownloadRepository + val repository : DownloadRepository private val sharedPreferences: SharedPreferences private val commandTemplateDao: CommandTemplateDao private val infoUtil : InfoUtil @@ -339,7 +339,7 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application } - private fun getFormat(formats: List, type: Type) : Format { + fun getFormat(formats: List, type: Type) : Format { when(type) { Type.audio -> { return cloneFormat ( @@ -539,7 +539,7 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application .build() workManager.enqueueUniqueWork( - Random.nextInt(1000000000).toString(), + it.id.toString(), ExistingWorkPolicy.REPLACE, workRequest ) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelDownloadNotificationReceiver.kt b/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelDownloadNotificationReceiver.kt index 5802d04d..5dbe0619 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelDownloadNotificationReceiver.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelDownloadNotificationReceiver.kt @@ -3,6 +3,7 @@ package com.deniscerri.ytdlnis.receiver import android.content.BroadcastReceiver import android.content.Context import android.content.Intent +import androidx.work.WorkManager import com.deniscerri.ytdlnis.database.DBManager import com.deniscerri.ytdlnis.database.repository.DownloadRepository import com.deniscerri.ytdlnis.util.NotificationUtil @@ -19,14 +20,17 @@ class CancelDownloadNotificationReceiver : BroadcastReceiver() { if (message != null) { runCatching { val notificationUtil = NotificationUtil(c) + WorkManager.getInstance(c).cancelUniqueWork(id.toString()) notificationUtil.cancelDownloadNotification(id) YoutubeDL.getInstance().destroyProcessById(id.toString()) val dbManager = DBManager.getInstance(c) CoroutineScope(Dispatchers.IO).launch{ - val item = dbManager.downloadDao.getDownloadById(id.toLong()) - item.status = DownloadRepository.Status.Cancelled.toString() - dbManager.downloadDao.update(item) + runCatching { + val item = dbManager.downloadDao.getDownloadById(id.toLong()) + item.status = DownloadRepository.Status.Cancelled.toString() + dbManager.downloadDao.update(item) + } } } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt index d407f6ad..512b4c38 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt @@ -31,6 +31,7 @@ import androidx.recyclerview.widget.RecyclerView import com.deniscerri.ytdlnis.MainActivity import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.adapter.HomeAdapter +import com.deniscerri.ytdlnis.database.models.DownloadItem import com.deniscerri.ytdlnis.database.models.ResultItem import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel @@ -50,6 +51,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.search.SearchBar import com.google.android.material.search.SearchView +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -232,6 +234,18 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene } } + if (arguments?.getBoolean("showDownloadsWithUpdatedFormats") == true){ + CoroutineScope(Dispatchers.IO).launch { + val ids = arguments?.getLongArray("downloadIds") + val items = mutableListOf() + ids?.forEach { + items.add(downloadViewModel.getItemByID(it)) + } + val bottomSheet = DownloadMultipleBottomSheetDialog(items.toMutableList()) + bottomSheet.show(parentFragmentManager, "downloadMultipleSheet") + } + } + } override fun onResume() { @@ -239,7 +253,9 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene if(arguments?.getString("url") == null){ resultViewModel.checkTrending() }else{ + arguments arguments?.remove("url") + arguments?.remove("showDownloadsWithUpdatedFormats") } if (searchView?.currentTransitionState == SearchView.TransitionState.SHOWN){ lifecycleScope.launch { @@ -612,7 +628,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene downloadViewModel.turnResultItemsToDownloadItems(resultsList!!) } if (sharedPreferences!!.getBoolean("download_card", true)) { - val bottomSheet = DownloadMultipleBottomSheetDialog(resultsList!!, downloadList.toMutableList()) + val bottomSheet = DownloadMultipleBottomSheetDialog(downloadList.toMutableList()) bottomSheet.show(parentFragmentManager, "downloadMultipleSheet") } else { downloadViewModel.queueDownloads(downloadList) @@ -673,7 +689,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene if (selectedObjects!!.size == 1){ showSingleDownloadSheet(selectedObjects!![0], DownloadViewModel.Type.valueOf(sharedPreferences!!.getString("preferred_download_type", "video")!!), false) }else{ - val bottomSheet = DownloadMultipleBottomSheetDialog(selectedObjects!!, downloadList.toMutableList()) + val bottomSheet = DownloadMultipleBottomSheetDialog(downloadList.toMutableList()) bottomSheet.show(parentFragmentManager, "downloadMultipleSheet") } } else { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt index c554314d..77d36674 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt @@ -33,11 +33,14 @@ import androidx.preference.PreferenceManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import androidx.work.Data +import androidx.work.ExistingWorkPolicy +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkManager import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.adapter.ConfigureMultipleDownloadsAdapter import com.deniscerri.ytdlnis.database.models.DownloadItem import com.deniscerri.ytdlnis.database.models.Format -import com.deniscerri.ytdlnis.database.models.ResultItem import com.deniscerri.ytdlnis.database.repository.DownloadRepository import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel @@ -45,6 +48,7 @@ import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel import com.deniscerri.ytdlnis.receiver.ShareActivity import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdlnis.work.UpdatePlaylistFormatsWorker import com.google.android.material.bottomappbar.BottomAppBar import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog @@ -62,7 +66,7 @@ import kotlinx.coroutines.withContext import java.text.SimpleDateFormat import java.util.Locale -class DownloadMultipleBottomSheetDialog(private var results: List, private var items: MutableList) : BottomSheetDialogFragment(), ConfigureMultipleDownloadsAdapter.OnItemClickListener, View.OnClickListener, +class DownloadMultipleBottomSheetDialog(private var items: MutableList) : BottomSheetDialogFragment(), ConfigureMultipleDownloadsAdapter.OnItemClickListener, View.OnClickListener, ConfigureDownloadBottomSheetDialog.OnDownloadItemUpdateListener { private lateinit var downloadViewModel: DownloadViewModel private lateinit var commandTemplateViewModel: CommandTemplateViewModel @@ -193,6 +197,35 @@ class DownloadMultipleBottomSheetDialog(private var results: List, listAdapter.submitList(items.toList()) listAdapter.notifyDataSetChanged() } + + + override fun onContinueOnBackground(items: List) { + requireActivity().lifecycleScope.launch { + val ids = mutableListOf() + runBlocking { + items.map { it!!.status = DownloadRepository.Status.Saved.toString() } + items.forEach { + ids.add(downloadViewModel.repository.insert(it!!)) + } + } + val id = System.currentTimeMillis().toInt() + val workRequest = OneTimeWorkRequestBuilder() + .setInputData( + Data.Builder() + .putLongArray("ids", ids.toLongArray()) + .putInt("id", id) + .build()) + .addTag("updateFormats") + .build() + + WorkManager.getInstance(requireContext()).enqueueUniqueWork( + id.toString(), + ExistingWorkPolicy.REPLACE, + workRequest + ) + } + + } } bottomAppBar.setOnMenuItemClickListener { m: MenuItem -> diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/FormatSelectionBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/FormatSelectionBottomSheetDialog.kt index d5ea6383..0ac464f6 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/FormatSelectionBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/FormatSelectionBottomSheetDialog.kt @@ -22,6 +22,7 @@ import com.facebook.shimmer.ShimmerFrameLayout import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.card.MaterialCardView +import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -45,6 +46,10 @@ class FormatSelectionBottomSheetDialog(private val items: List, p private lateinit var audioTitle : TextView private lateinit var sortBy : FormatSorting + + private lateinit var continueInBackgroundSnackBar : Snackbar + private lateinit var view: View + enum class FormatSorting { filesize, container, id } @@ -62,7 +67,7 @@ class FormatSelectionBottomSheetDialog(private val items: List, p @SuppressLint("RestrictedApi") override fun setupDialog(dialog: Dialog, style: Int) { super.setupDialog(dialog, style) - val view = LayoutInflater.from(context).inflate(R.layout.format_select_bottom_sheet, null) + view = LayoutInflater.from(context).inflate(R.layout.format_select_bottom_sheet, null) dialog.setContentView(view) sortBy = FormatSorting.valueOf(sharedPreferences.getString("format_order", "filesize")!!) @@ -121,6 +126,16 @@ class FormatSelectionBottomSheetDialog(private val items: List, p refreshBtn.setOnClickListener { lifecycleScope.launch { + if (items.size > 10){ + continueInBackgroundSnackBar = Snackbar.make(view, R.string.update_formats_background, Snackbar.LENGTH_INDEFINITE) + continueInBackgroundSnackBar.setAction(R.string.ok) { + listener.onContinueOnBackground(items) + this@FormatSelectionBottomSheetDialog.dismiss() + } + continueInBackgroundSnackBar.show() + } + + chosenFormats = emptyList() try { refreshBtn.isEnabled = false @@ -333,6 +348,7 @@ class FormatSelectionBottomSheetDialog(private val items: List, p interface OnFormatClickListener{ fun onFormatClick(allFormats: List>, item: List) + fun onContinueOnBackground(items : List) {} } class FormatTuple internal constructor( diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt index 5a57603e..ef50a401 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt @@ -157,7 +157,7 @@ class SelectPlaylistItemsBottomSheetDialog(private val items: List, downloadItems.add(i) } - val bottomSheet = DownloadMultipleBottomSheetDialog(items, downloadItems) + val bottomSheet = DownloadMultipleBottomSheetDialog(downloadItems) bottomSheet.show(parentFragmentManager, "downloadMultipleSheet") } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ActiveDownloadsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ActiveDownloadsFragment.kt index b1ee2041..5b279775 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ActiveDownloadsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ActiveDownloadsFragment.kt @@ -138,7 +138,7 @@ class ActiveDownloadsFragment : Fragment(), ActiveDownloadAdapter.OnItemClickLis it.forEach{item -> WorkManager.getInstance(requireContext()) - .getWorkInfosByTagLiveData(item.id.toString()) + .getWorkInfosForUniqueWorkLiveData(item.id.toString()) .observe(viewLifecycleOwner){ list -> list.forEach {work -> if (work == null) return@observe diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/NotificationUtil.kt b/app/src/main/java/com/deniscerri/ytdlnis/util/NotificationUtil.kt index d43a15bc..ec1986b0 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/NotificationUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/util/NotificationUtil.kt @@ -19,7 +19,6 @@ import com.deniscerri.ytdlnis.receiver.PauseDownloadNotificationReceiver import com.deniscerri.ytdlnis.receiver.ResumeActivity import com.deniscerri.ytdlnis.receiver.ShareFileActivity import java.io.File -import kotlin.math.log class NotificationUtil(var context: Context) { @@ -342,12 +341,95 @@ class NotificationUtil(var context: Context) { } } - fun showYTDLUpdateNotification() : Notification{ + fun createYTDLUpdateNotification() : Notification{ val notificationBuilder = getBuilder(DOWNLOAD_MISC_CHANNEL_ID) notificationBuilder.setContentTitle("Updating YT-DLP...") return notificationBuilder.build() } + fun createFormatsUpdateNotification(workID: Int): Notification { + val notificationBuilder = getBuilder(DOWNLOAD_MISC_CHANNEL_ID) + + val cancelIntent = Intent(context, CancelDownloadNotificationReceiver::class.java) + cancelIntent.putExtra("cancel", "") + cancelIntent.putExtra("workID", workID) + val cancelNotificationPendingIntent = PendingIntent.getBroadcast( + context, + workID, + cancelIntent, + PendingIntent.FLAG_IMMUTABLE + ) + + return notificationBuilder + .setContentTitle(context.getString(R.string.update_formats_background)) + .setOngoing(true) + .setCategory(Notification.CATEGORY_PROGRESS) + .setSmallIcon(android.R.drawable.stat_sys_download) + .setLargeIcon( + BitmapFactory.decodeResource( + context.resources, + android.R.drawable.stat_sys_download + ) + ) + .setContentText("") + .setPriority(NotificationCompat.PRIORITY_DEFAULT) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .setProgress(PROGRESS_MAX, PROGRESS_CURR, false) + .setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE) + .clearActions() + .addAction(0, context.getString(R.string.cancel), cancelNotificationPendingIntent) + .build() + } + + fun updateFormatUpdateNotification( + id: Int, + progress: Int, + queue: Int, + ) { + + val notificationBuilder = getBuilder(DOWNLOAD_MISC_CHANNEL_ID) + val contentText = """${queue - progress} ${context.getString(R.string.items_left)}""" + try { + notificationBuilder.setProgress(queue, progress, false) + .setContentTitle(context.getString(R.string.update_formats_background)) + .setStyle(NotificationCompat.BigTextStyle().bigText(contentText)) + notificationManager.notify(id, notificationBuilder.build()) + } catch (e: Exception) { + e.printStackTrace() + } + } + + + fun showFormatsUpdatedNotification(downloadIds: List) { + val notificationBuilder = getBuilder(DOWNLOAD_FINISHED_CHANNEL_ID) + + val bundle = Bundle() + bundle.putBoolean("showDownloadsWithUpdatedFormats", true) + bundle.putLongArray("downloadIds", downloadIds.toLongArray()) + + val openMultipleDownloads = NavDeepLinkBuilder(context) + .setGraph(R.navigation.nav_graph) + .setDestination(R.id.homeFragment) + .setArguments(bundle) + .createPendingIntent() + + notificationBuilder + .setContentTitle(context.getString(R.string.finished_download_notification_channel_name)) + .setSmallIcon(R.drawable.ic_launcher_foreground_large) + .setLargeIcon( + BitmapFactory.decodeResource( + context.resources, + R.drawable.ic_launcher_foreground_large + ) + ) + .setContentIntent(openMultipleDownloads) + .setPriority(NotificationCompat.PRIORITY_MAX) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .clearActions() + + notificationManager.notify(FORMAT_UPDATING_FINISHED_NOTIFICATION_ID, notificationBuilder.build()) + } + companion object { const val DOWNLOAD_SERVICE_CHANNEL_ID = "1" const val COMMAND_DOWNLOAD_SERVICE_CHANNEL_ID = "2" @@ -355,6 +437,8 @@ class NotificationUtil(var context: Context) { const val DOWNLOAD_FINISHED_NOTIFICATION_ID = 3 const val DOWNLOAD_RESUME_NOTIFICATION_ID = 4 const val DOWNLOAD_UPDATING_NOTIFICATION_ID = 5 + const val FORMAT_UPDATING_NOTIFICATION_ID = 6 + const val FORMAT_UPDATING_FINISHED_NOTIFICATION_ID = 7 const val DOWNLOAD_MISC_CHANNEL_ID = "4" const val DOWNLOAD_MISC_NOTIFICATION_ID = 4 private const val PROGRESS_MAX = 100 diff --git a/app/src/main/java/com/deniscerri/ytdlnis/work/UpdatePlaylistFormatsWorker.kt b/app/src/main/java/com/deniscerri/ytdlnis/work/UpdatePlaylistFormatsWorker.kt index 101923e2..f3c0c1a6 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/work/UpdatePlaylistFormatsWorker.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/work/UpdatePlaylistFormatsWorker.kt @@ -5,6 +5,7 @@ import android.os.Handler import android.os.Looper import android.util.Log import android.widget.Toast +import androidx.lifecycle.ViewModelProvider import androidx.navigation.NavDeepLinkBuilder import androidx.preference.PreferenceManager import androidx.work.CoroutineWorker @@ -13,6 +14,7 @@ import androidx.work.ForegroundInfo import androidx.work.Worker import androidx.work.WorkerParameters import androidx.work.workDataOf +import com.deniscerri.ytdlnis.App import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.Converters import com.deniscerri.ytdlnis.database.DBManager @@ -23,13 +25,16 @@ import com.deniscerri.ytdlnis.database.models.HistoryItem import com.deniscerri.ytdlnis.database.models.LogItem import com.deniscerri.ytdlnis.database.repository.DownloadRepository import com.deniscerri.ytdlnis.database.repository.LogRepository +import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.InfoUtil import com.deniscerri.ytdlnis.util.NotificationUtil +import com.deniscerri.ytdlnis.util.NotificationUtil.Companion.FORMAT_UPDATING_NOTIFICATION_ID import com.deniscerri.ytdlnis.util.UpdateUtil import com.yausername.youtubedl_android.YoutubeDL import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import java.io.File @@ -41,24 +46,56 @@ class UpdatePlaylistFormatsWorker( ) : CoroutineWorker(context, workerParams) { override suspend fun doWork(): Result { val dbManager = DBManager.getInstance(context) - val resultDao = dbManager.resultDao + val dao = dbManager.downloadDao + val resDao = dbManager.resultDao val infoUtil = InfoUtil(context) - val converters = Converters() - val urls = inputData.getStringArray("urls")!!.toMutableList() + val vm = DownloadViewModel(App.instance) + val notificationUtil = NotificationUtil(context) + val ids = inputData.getLongArray("ids")!!.toMutableList() + val workID = inputData.getInt("id", 0) + if (workID == 0) return Result.failure() - infoUtil.getFormatsMultiple(urls){ - val formatStrings = mutableListOf() - it.forEach { i -> formatStrings.add(converters.formatToString(i)) } - setProgressAsync(workDataOf("formats" to formatStrings.toTypedArray())) + val notification = notificationUtil.createFormatsUpdateNotification(workID) + val foregroundInfo = ForegroundInfo(FORMAT_UPDATING_NOTIFICATION_ID, notification) + setForeground(foregroundInfo) - CoroutineScope(Dispatchers.IO).launch { - val result = resultDao.getResultByURL(urls.removeFirst()) - val formats = infoUtil.getFormats(result.url) - result.formats = ArrayList(formats) - resultDao.update(result) + var count = 0 + ids.forEach { + if (!isStopped){ + val d = dao.getDownloadById(it) + val r = resDao.getResultByURL(d.url) + + if (d.allFormats.isNotEmpty()){ + count++ + return@forEach + } + + runCatching { + d.allFormats.clear() + d.allFormats.addAll(infoUtil.getFormats(d.url)) + d.format = vm.getFormat(d.allFormats,d.type) + + r.formats.clear() + r.formats.addAll(d.allFormats) + + dao.update(d) + resDao.update(r) + } + + + count++ + notificationUtil.updateFormatUpdateNotification(FORMAT_UPDATING_NOTIFICATION_ID, count, ids.size) + }else{ + notificationUtil.cancelDownloadNotification(FORMAT_UPDATING_NOTIFICATION_ID) } } + + + runBlocking { + notificationUtil.showFormatsUpdatedNotification(ids) + } + return Result.success() } } \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/work/UpdateYTDLWorker.kt b/app/src/main/java/com/deniscerri/ytdlnis/work/UpdateYTDLWorker.kt index 0fa9e6ed..5f99b578 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/work/UpdateYTDLWorker.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/work/UpdateYTDLWorker.kt @@ -1,37 +1,11 @@ package com.deniscerri.ytdlnis.work import android.content.Context -import android.os.Handler -import android.os.Looper -import android.util.Log -import android.widget.Toast -import androidx.navigation.NavDeepLinkBuilder -import androidx.preference.PreferenceManager import androidx.work.CoroutineWorker -import androidx.work.Data import androidx.work.ForegroundInfo -import androidx.work.Worker import androidx.work.WorkerParameters -import androidx.work.workDataOf -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.dao.DownloadDao -import com.deniscerri.ytdlnis.database.dao.ResultDao -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.HistoryItem -import com.deniscerri.ytdlnis.database.models.LogItem -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.database.repository.LogRepository -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.InfoUtil import com.deniscerri.ytdlnis.util.NotificationUtil import com.deniscerri.ytdlnis.util.UpdateUtil -import com.yausername.youtubedl_android.YoutubeDL -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking -import java.io.File class UpdateYTDLWorker( @@ -39,7 +13,7 @@ class UpdateYTDLWorker( workerParams: WorkerParameters ) : CoroutineWorker(context, workerParams) { override suspend fun doWork(): Result { - val notification = NotificationUtil(context).showYTDLUpdateNotification() + val notification = NotificationUtil(context).createYTDLUpdateNotification() val foregroundInfo = ForegroundInfo(System.currentTimeMillis().toInt(), notification) setForeground(foregroundInfo) UpdateUtil(context).updateYoutubeDL() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 47919508..b115f00c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -300,4 +300,6 @@ Use Cookies Embed Metadata Embed metadata to the video file. Also embeds chapters/infojson if present + Formats have been updated + Update Formats in Background \ No newline at end of file