diff --git a/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/CookieViewModel.kt b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/CookieViewModel.kt index a26164b7..87970ed7 100644 --- a/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/CookieViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/CookieViewModel.kt @@ -19,9 +19,13 @@ import com.deniscerri.ytdl.database.models.CookieItem import com.deniscerri.ytdl.database.repository.CookieRepository import com.deniscerri.ytdl.ui.more.WebViewActivity import com.deniscerri.ytdl.util.FileUtil +import com.google.gson.GsonBuilder import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext import java.io.File +import java.util.Calendar import java.util.Date @@ -188,15 +192,25 @@ class CookieViewModel(private val application: Application) : AndroidViewModel(a } } - fun exportToFile(exported: (File?) -> Unit) { + fun exportToFile(exported: (File?) -> Unit) = viewModelScope.launch(Dispatchers.IO) { try{ FileUtil.getCookieFile(application, true){ c -> val cookieFile = File(c) if (!cookieFile.exists()) updateCookiesFile() - val downloads = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath + File.separator + "YTDLnis_Cookies.txt") - val file = cookieFile.copyTo(downloads, true) - exported(file) + val dir = File("${FileUtil.getCachePath(application)}/Cookie Backups") + dir.mkdirs() + val saveFile = File("${dir.absolutePath}/YTDLnis_Cookies.txt") + + saveFile.delete() + saveFile.createNewFile() + cookieFile.copyTo(saveFile, true) + + val res = runBlocking { + FileUtil.moveFile(saveFile.parentFile!!, application, FileUtil.getDefaultApplicationPath(), false) {} + } + + exported(File(res[0])) } }catch (e: Exception){ e.printStackTrace() diff --git a/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/LogViewModel.kt b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/LogViewModel.kt index e1d7b6aa..fd14cf26 100644 --- a/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/LogViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/LogViewModel.kt @@ -1,6 +1,7 @@ package com.deniscerri.ytdl.database.viewmodel import android.app.Application +import android.os.Environment import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.asLiveData @@ -9,8 +10,11 @@ import com.deniscerri.ytdl.database.DBManager import com.deniscerri.ytdl.database.models.LogItem import com.deniscerri.ytdl.database.repository.DownloadRepository import com.deniscerri.ytdl.database.repository.LogRepository +import com.deniscerri.ytdl.util.FileUtil import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.File class LogViewModel(private val application: Application) : AndroidViewModel(application) { private val repository: LogRepository @@ -55,4 +59,24 @@ class LogViewModel(private val application: Application) : AndroidViewModel(appl } + fun exportToFile(id: Long, exported: (File?) -> Unit) = viewModelScope.launch(Dispatchers.IO) { + try{ + val log = repository.getLogByID(id) + val dir = File("${FileUtil.getCachePath(application)}/Logs/") + dir.mkdirs() + val tmp = File("${dir.absolutePath}/[YTDLnis Log] ${log!!.title}.txt") + tmp.delete() + tmp.createNewFile() + tmp.writeText(log.content) + val res = withContext(Dispatchers.IO) { + FileUtil.moveFile(tmp.parentFile!!, application, FileUtil.getDefaultApplicationPath() + "/Exported Logs", false) {} + } + + exported(File(res[0])) + }catch (e: Exception){ + e.printStackTrace() + exported(null) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdl/ui/adapter/TemplatesAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/TemplatesAdapter.kt index a1aac6c4..420c9fbc 100644 --- a/app/src/main/java/com/deniscerri/ytdl/ui/adapter/TemplatesAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/TemplatesAdapter.kt @@ -79,6 +79,12 @@ class TemplatesAdapter(onItemClickListener: OnItemClickListener, activity: Activ isVisible = item.preferredCommandTemplate } + card.findViewById(R.id.urlRegex).apply { + isVisible = item.urlRegex.isNotEmpty() + val txt = "URL Regex: ${item.urlRegex.joinToString(", ")}" + text = txt + } + if (checkedItems.contains(item.id)) { card.isChecked = true card.strokeWidth = 5 diff --git a/app/src/main/java/com/deniscerri/ytdl/ui/more/downloadLogs/DownloadLogFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/downloadLogs/DownloadLogFragment.kt index c19699ab..b9c4f157 100644 --- a/app/src/main/java/com/deniscerri/ytdl/ui/more/downloadLogs/DownloadLogFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/downloadLogs/DownloadLogFragment.kt @@ -29,6 +29,7 @@ import com.deniscerri.ytdl.database.viewmodel.LogViewModel import com.deniscerri.ytdl.util.Extensions.enableFastScroll import com.deniscerri.ytdl.util.Extensions.enableTextHighlight import com.deniscerri.ytdl.util.Extensions.setCustomTextSize +import com.deniscerri.ytdl.util.FileUtil import com.deniscerri.ytdl.work.DownloadWorker import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.bottomappbar.BottomAppBar @@ -176,6 +177,23 @@ class DownloadLogFragment : Fragment() { R.id.text_size -> { slider!!.isVisible = !slider.isVisible } + + R.id.export_file -> { + logViewModel.exportToFile(logID!!) {f -> + if (f == null){ + Snackbar.make(bottomAppBar, getString(R.string.couldnt_parse_file), Snackbar.LENGTH_LONG) + .setAnchorView(bottomAppBar) + .show() + }else{ + val snack = Snackbar.make(bottomAppBar, getString(R.string.backup_created_successfully), Snackbar.LENGTH_LONG) + snack.setAnchorView(bottomAppBar) + snack.setAction(R.string.share) { + FileUtil.shareFileIntent(requireContext(), listOf(f.absolutePath)) + } + snack.show() + } + } + } } true } @@ -248,8 +266,9 @@ class DownloadLogFragment : Fragment() { fun onDownloadProgressEvent(event: DownloadWorker.WorkerProgress) { val progressBar = requireView().findViewById(R.id.progress) if (event.logItemID == logID) { - progressBar.isVisible = true + progressBar.isVisible = event.progress < 100 progressBar.setProgress(event.progress, true) + progressBar.isIndeterminate = event.progress == 0 } } diff --git a/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/MainSettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/MainSettingsFragment.kt index a856e711..314c29a8 100644 --- a/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/MainSettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/MainSettingsFragment.kt @@ -217,17 +217,24 @@ class MainSettingsFragment : PreferenceFragmentCompat() { } val currentTime = Calendar.getInstance() - val saveFile = File( - Environment.getExternalStoragePublicDirectory( - Environment.DIRECTORY_DOWNLOADS), "YTDLnis_${BuildConfig.VERSION_NAME}_${currentTime.get( - Calendar.YEAR)}-${currentTime.get(Calendar.MONTH) + 1}-${currentTime.get( - Calendar.DAY_OF_MONTH)} [${currentTime.get(Calendar.MILLISECOND)}.json") + val dir = File("${FileUtil.getCachePath(requireContext())}/Backups") + dir.mkdirs() + + val saveFile = File("${dir.absolutePath}/YTDLnis_Backup_${BuildConfig.VERSION_NAME}_${currentTime.get( + Calendar.YEAR)}-${currentTime.get(Calendar.MONTH) + 1}-${currentTime.get( + Calendar.DAY_OF_MONTH)}_${currentTime.get(Calendar.HOUR_OF_DAY)}-${currentTime.get(Calendar.MINUTE)}-${currentTime.get(Calendar.SECOND)}.json") + saveFile.delete() saveFile.createNewFile() saveFile.writeText(GsonBuilder().setPrettyPrinting().create().toJson(json)) + + val res = withContext(Dispatchers.IO) { + FileUtil.moveFile(saveFile.parentFile!!, requireContext(), FileUtil.getDefaultApplicationPath() + "/Backups", false) {} + } + val s = Snackbar.make(requireView(), getString(R.string.backup_created_successfully), Snackbar.LENGTH_LONG) s.setAction(R.string.Open_File){ - FileUtil.openFileIntent(requireActivity(), saveFile.absolutePath) + FileUtil.openFileIntent(requireActivity(), res[0]) } s.show() } diff --git a/app/src/main/java/com/deniscerri/ytdl/util/FileUtil.kt b/app/src/main/java/com/deniscerri/ytdl/util/FileUtil.kt index 61a2e1e8..b0e056f1 100644 --- a/app/src/main/java/com/deniscerri/ytdl/util/FileUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/FileUtil.kt @@ -324,6 +324,10 @@ object FileUtil { return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)?.absolutePath + File.separator + "YTDLnis/Command" } + fun getDefaultApplicationPath() : String { + return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)?.absolutePath + File.separator + "YTDLnis" + } + fun getDownloadArchivePath(context: Context) : String { var folder = PreferenceManager.getDefaultSharedPreferences(context).getString("download_archive_path", "")!! if (folder == "") { diff --git a/app/src/main/java/com/deniscerri/ytdl/util/extractors/YTDLPUtil.kt b/app/src/main/java/com/deniscerri/ytdl/util/extractors/YTDLPUtil.kt index c696a3ac..eac59b79 100644 --- a/app/src/main/java/com/deniscerri/ytdl/util/extractors/YTDLPUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/extractors/YTDLPUtil.kt @@ -475,7 +475,7 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co formatProper.format_note = format.getString("format_note") }else{ if (!formatProper.format_note.endsWith("audio", true)){ - formatProper.format_note = format.getString("format_note").uppercase().removeSuffix("AUDIO") + " AUDIO" + formatProper.format_note = format.getString("format_note").uppercase().removeSuffix("AUDIO").trim() + " AUDIO" } } @@ -902,7 +902,7 @@ class YTDLPUtil(private val context: Context, private val commandTemplateDao: Co } if (usePlaylistMetadata) { - metadataCommands.addOption("--parse-metadata", "%(album,playlist_title,playlist|)s:%(album)s") + metadataCommands.addOption("--parse-metadata", "%(album,playlist_title,playlist|)s:%(meta_album)s") } diff --git a/app/src/main/res/layout/command_template_item.xml b/app/src/main/res/layout/command_template_item.xml index 72c8fec0..c3b3d069 100644 --- a/app/src/main/res/layout/command_template_item.xml +++ b/app/src/main/res/layout/command_template_item.xml @@ -1,6 +1,7 @@ @@ -91,7 +94,7 @@ + + + + diff --git a/app/src/main/res/layout/format_item.xml b/app/src/main/res/layout/format_item.xml index 78541700..d8b053f5 100644 --- a/app/src/main/res/layout/format_item.xml +++ b/app/src/main/res/layout/format_item.xml @@ -40,6 +40,7 @@ android:visibility="gone" android:layout_width="0dp" android:indeterminate="true" + app:trackCornerRadius="20dp" app:trackColor="#000" android:layout_gravity="bottom" android:alpha="0.3" @@ -136,7 +137,7 @@ android:clickable="false" android:ellipsize="end" android:gravity="center" - android:maxLength="17" + android:maxLength="7" android:minWidth="30dp" android:paddingHorizontal="5dp" android:textStyle="bold" diff --git a/app/src/main/res/menu/log_detail_menu.xml b/app/src/main/res/menu/log_detail_menu.xml index 4b9a0045..e77ea10e 100644 --- a/app/src/main/res/menu/log_detail_menu.xml +++ b/app/src/main/res/menu/log_detail_menu.xml @@ -21,5 +21,11 @@ android:icon="@drawable/ic_textformat" app:showAsAction="always" /> + +