From 5b969030e3f2b36f674e21906ec9967435a89003 Mon Sep 17 00:00:00 2001 From: junkfood <69683722+junkfood02@users.noreply.github.com> Date: Thu, 8 Sep 2022 13:29:51 +0800 Subject: [PATCH 1/5] Pre-release v1.3.0-beta.1 --- .github/workflows/android.yml | 2 -- app/build.gradle.kts | 15 ++++++++------- .../java/com/junkfood/seal/BaseApplication.kt | 1 + .../main/java/com/junkfood/seal/MainActivity.kt | 15 ++++++++------- .../seal/ui/page/settings/about/AboutPage.kt | 9 ++++++++- .../java/com/junkfood/seal/util/DownloadUtil.kt | 12 ++++++++---- 6 files changed, 33 insertions(+), 21 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index bd57fde67..06b61da85 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -1,8 +1,6 @@ name: Android CI on: - pull_request: - branches: [ "main" ] workflow_dispatch: jobs: diff --git a/app/build.gradle.kts b/app/build.gradle.kts index be590c9d5..9d94ee209 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,10 +11,10 @@ plugins { apply(plugin = "dagger.hilt.android.plugin") val versionMajor = 1 -val versionMinor = 2 -val versionPatch = 1 -val versionBuild = 0 -val isStable = true +val versionMinor = 3 +val versionPatch = 0 +val versionBuild = 1 +val isStable = false val composeVersion = "1.2.1" val lifecycleVersion = "2.6.0-alpha01" @@ -25,7 +25,7 @@ val kotlinVersion = "1.6.21" val hiltVersion = "2.43.2" val composeMd3Version = "1.0.0-beta01" val coilVersion = "2.2.0" -val youtubedlAndroidVersion = "add_aria2-SNAPSHOT" +val youtubedlAndroidVersion = "51ddfa741e" val okhttpVersion = "5.0.0-alpha.10" val keystorePropertiesFile = rootProject.file("keystore.properties") @@ -179,8 +179,9 @@ dependencies { implementation("com.github.yausername.youtubedl-android:ffmpeg:$youtubedlAndroidVersion") implementation("com.github.yausername.youtubedl-android:aria2c:$youtubedlAndroidVersion") -// implementation ("com.github.xibr.youtubedl-android:library:set-ffmpeg-location-SNAPSHOT") -// implementation ("com.github.xibr.youtubedl-android:ffmpeg:set-ffmpeg-location-SNAPSHOT") +// implementation ("com.github.xibr.youtubedl-android:library:$youtubedlAndroidVersion") +// implementation ("com.github.xibr.youtubedl-android:ffmpeg:$youtubedlAndroidVersion") +// implementation ("com.github.xibr.youtubedl-android:aria2c:fc01d681a8") // implementation("com.github.JunkFood02.youtubedl-android:ffmpeg:-SNAPSHOT") // implementation("com.github.JunkFood02.youtubedl-android:library:-SNAPSHOT") diff --git a/app/src/main/java/com/junkfood/seal/BaseApplication.kt b/app/src/main/java/com/junkfood/seal/BaseApplication.kt index d74dfbd40..f1a7fed3b 100644 --- a/app/src/main/java/com/junkfood/seal/BaseApplication.kt +++ b/app/src/main/java/com/junkfood/seal/BaseApplication.kt @@ -51,6 +51,7 @@ class BaseApplication : Application() { try { YoutubeDL.getInstance().init(this@BaseApplication) FFmpeg.getInstance().init(this@BaseApplication) +// Aria2c.getInstance().init(this@BaseApplication) } catch (e: YoutubeDLException) { e.printStackTrace() Toast.makeText(this@BaseApplication, e.message, Toast.LENGTH_LONG).show() diff --git a/app/src/main/java/com/junkfood/seal/MainActivity.kt b/app/src/main/java/com/junkfood/seal/MainActivity.kt index 2aa9620ad..eb029767e 100644 --- a/app/src/main/java/com/junkfood/seal/MainActivity.kt +++ b/app/src/main/java/com/junkfood/seal/MainActivity.kt @@ -65,8 +65,8 @@ class MainActivity : AppCompatActivity() { handleShareIntent(intent) } - override fun onNewIntent(intent: Intent?) { - intent?.let { handleShareIntent(it) } + override fun onNewIntent(intent: Intent) { + handleShareIntent(intent) super.onNewIntent(intent) } @@ -74,11 +74,12 @@ class MainActivity : AppCompatActivity() { Log.d(TAG, "handleShareIntent: $intent") if (Intent.ACTION_SEND == intent.action) intent.getStringExtra(Intent.EXTRA_TEXT) - ?.let { it -> - TextUtil.matchUrlFromSharedText(it) - ?.let { it1 -> - if (sharedUrl != it1) { - sharedUrl = it1 + ?.let { sharedContent -> + intent.removeExtra(Intent.EXTRA_TEXT) + TextUtil.matchUrlFromSharedText(sharedContent) + ?.let { matchedUrl -> + if (sharedUrl != matchedUrl) { + sharedUrl = matchedUrl downloadViewModel.updateUrl(sharedUrl) } } diff --git a/app/src/main/java/com/junkfood/seal/ui/page/settings/about/AboutPage.kt b/app/src/main/java/com/junkfood/seal/ui/page/settings/about/AboutPage.kt index c298f2d66..20afb9fc5 100644 --- a/app/src/main/java/com/junkfood/seal/ui/page/settings/about/AboutPage.kt +++ b/app/src/main/java/com/junkfood/seal/ui/page/settings/about/AboutPage.kt @@ -8,9 +8,12 @@ import android.os.Build import android.provider.Settings import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.* import androidx.compose.material3.* @@ -243,7 +246,11 @@ fun UpdateDialog( ) { AlertDialog( onDismissRequest = {}, - title = { Text(title) }, + title = { + Column(Modifier.verticalScroll(rememberScrollState())) { + Text(title) + } + }, icon = { Icon(Icons.Outlined.NewReleases, null) }, confirmButton = { TextButton(onClick = { if (downloadStatus !is UpdateUtil.DownloadStatus.Progress) onConfirmUpdate() }) { when (downloadStatus) { diff --git a/app/src/main/java/com/junkfood/seal/util/DownloadUtil.kt b/app/src/main/java/com/junkfood/seal/util/DownloadUtil.kt index bbd3c53f5..ac2e40b84 100644 --- a/app/src/main/java/com/junkfood/seal/util/DownloadUtil.kt +++ b/app/src/main/java/com/junkfood/seal/util/DownloadUtil.kt @@ -7,6 +7,7 @@ import com.junkfood.seal.BaseApplication.Companion.context import com.junkfood.seal.BaseApplication.Companion.videoDownloadDir import com.junkfood.seal.R import com.junkfood.seal.database.DownloadedVideoInfo +import com.junkfood.seal.util.FileUtil.getConfigFile import com.junkfood.seal.util.FileUtil.getCookiesFile import com.junkfood.seal.util.PreferenceUtil.ARIA2C import com.junkfood.seal.util.PreferenceUtil.COOKIES @@ -131,7 +132,10 @@ object DownloadUtil { if (extractAudio) { pathBuilder.append(audioDownloadDir) - + if (aria2c) { + addOption("--downloader", "libaria2c.so"); + addOption("--external-downloader-args", "aria2c:\"--summary-interval=1\""); + } addOption("-x") when (PreferenceUtil.getAudioFormat()) { 1 -> { @@ -145,9 +149,9 @@ object DownloadUtil { } addOption("--embed-metadata") addOption("--embed-thumbnail") -// FileUtil.writeContentToFile("""--ppa "ffmpeg: -c:v png -vf crop=\"'if(gt(ih,iw),iw,ih)':'if(gt(iw,ih),ih,iw)'\""""", -// context.getConfigFile()) -// addOption("--config", context.getConfigFile().absolutePath) + FileUtil.writeContentToFile("""--ppa "ffmpeg: -c:v png -vf crop=\"'if(gt(ih,iw),iw,ih)':'if(gt(iw,ih),ih,iw)'\""""", + context.getConfigFile()) + addOption("--config", context.getConfigFile().absolutePath) if (playlistInfo.url.isNotEmpty()) { addOption("--parse-metadata", "%(album,playlist,title)s:%(meta_album)s") addOption("--parse-metadata", "%(track_number,playlist_index)d:%(meta_track)s") From 675004651e532e7ad3c5d1fb5aad5da03dc2d2c4 Mon Sep 17 00:00:00 2001 From: junkfood <69683722+JunkFood02@users.noreply.github.com> Date: Fri, 9 Sep 2022 09:38:28 +0800 Subject: [PATCH 2/5] Bug Fix & Update dependencies --- app/build.gradle.kts | 14 ++--- .../java/com/junkfood/seal/BaseApplication.kt | 3 +- .../ui/page/download/DownloadViewModel.kt | 54 +++++++++---------- .../seal/ui/page/videolist/VideoListPage.kt | 3 +- 4 files changed, 35 insertions(+), 39 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9d94ee209..203ae0f22 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -25,7 +25,7 @@ val kotlinVersion = "1.6.21" val hiltVersion = "2.43.2" val composeMd3Version = "1.0.0-beta01" val coilVersion = "2.2.0" -val youtubedlAndroidVersion = "51ddfa741e" +val youtubedlAndroidVersion = "aa680fbdd0" val okhttpVersion = "5.0.0-alpha.10" val keystorePropertiesFile = rootProject.file("keystore.properties") @@ -175,13 +175,13 @@ dependencies { // okhttp implementation("com.squareup.okhttp3:okhttp:$okhttpVersion") - implementation("com.github.yausername.youtubedl-android:library:$youtubedlAndroidVersion") - implementation("com.github.yausername.youtubedl-android:ffmpeg:$youtubedlAndroidVersion") - implementation("com.github.yausername.youtubedl-android:aria2c:$youtubedlAndroidVersion") +// implementation("com.github.yausername.youtubedl-android:library:$youtubedlAndroidVersion") +// implementation("com.github.yausername.youtubedl-android:ffmpeg:$youtubedlAndroidVersion") +// implementation("com.github.yausername.youtubedl-android:aria2c:$youtubedlAndroidVersion") -// implementation ("com.github.xibr.youtubedl-android:library:$youtubedlAndroidVersion") -// implementation ("com.github.xibr.youtubedl-android:ffmpeg:$youtubedlAndroidVersion") -// implementation ("com.github.xibr.youtubedl-android:aria2c:fc01d681a8") + implementation ("com.github.xibr.youtubedl-android:library:$youtubedlAndroidVersion") + implementation ("com.github.xibr.youtubedl-android:ffmpeg:$youtubedlAndroidVersion") + implementation ("com.github.xibr.youtubedl-android:aria2c:$youtubedlAndroidVersion") // implementation("com.github.JunkFood02.youtubedl-android:ffmpeg:-SNAPSHOT") // implementation("com.github.JunkFood02.youtubedl-android:library:-SNAPSHOT") diff --git a/app/src/main/java/com/junkfood/seal/BaseApplication.kt b/app/src/main/java/com/junkfood/seal/BaseApplication.kt index f1a7fed3b..4688ba109 100644 --- a/app/src/main/java/com/junkfood/seal/BaseApplication.kt +++ b/app/src/main/java/com/junkfood/seal/BaseApplication.kt @@ -16,6 +16,7 @@ import com.junkfood.seal.util.PreferenceUtil.AUDIO_DIRECTORY import com.junkfood.seal.util.PreferenceUtil.TEMPLATE_INDEX import com.junkfood.seal.util.PreferenceUtil.VIDEO_DIRECTORY import com.tencent.mmkv.MMKV +import com.yausername.aria2c.Aria2c import com.yausername.ffmpeg.FFmpeg import com.yausername.youtubedl_android.YoutubeDL import com.yausername.youtubedl_android.YoutubeDLException @@ -51,7 +52,7 @@ class BaseApplication : Application() { try { YoutubeDL.getInstance().init(this@BaseApplication) FFmpeg.getInstance().init(this@BaseApplication) -// Aria2c.getInstance().init(this@BaseApplication) + Aria2c.getInstance().init(this@BaseApplication) } catch (e: YoutubeDLException) { e.printStackTrace() Toast.makeText(this@BaseApplication, e.message, Toast.LENGTH_LONG).show() diff --git a/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadViewModel.kt b/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadViewModel.kt index 4f5db851d..864795de0 100644 --- a/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadViewModel.kt +++ b/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadViewModel.kt @@ -103,10 +103,6 @@ class DownloadViewModel @Inject constructor() : ViewModel() { notificationId: Int? = null ) { if (stateFlow.value.isCancelled) return - if (e.message.isNullOrEmpty()) { - finishProcessing() - return - } viewModelScope.launch { e.printStackTrace() if (PreferenceUtil.getValue(PreferenceUtil.DEBUG) || stateFlow.value.isInCustomCommandMode) @@ -315,23 +311,20 @@ class DownloadViewModel @Inject constructor() : ViewModel() { downloadResultTemp = DownloadUtil.Result.failure() viewModelScope.launch(Dispatchers.IO) { - if (urlList.size > 1) return@launch - try { - if (stateFlow.value.url.isNotEmpty()) - with(DownloadUtil.fetchVideoInfo(stateFlow.value.url)) { - if (!title.isNullOrEmpty() and !thumbnail.isNullOrEmpty()) - mutableStateFlow.update { - it.copy( - videoTitle = title, - videoThumbnailUrl = TextUtil.urlHttpToHttps(thumbnail), - videoAuthor = uploader ?: "null", - showVideoCard = true - ) - } + if (urlList.size != 1) return@launch + kotlin.runCatching { + with(DownloadUtil.fetchVideoInfo(urlList[0])) { + mutableStateFlow.update { + it.copy( + videoTitle = title.toString(), + videoThumbnailUrl = TextUtil.urlHttpToHttps(thumbnail), + videoAuthor = uploader.toString(), + showVideoCard = true + ) } - } catch (e: Exception) { - e.printStackTrace() + } } + } val notificationId = stateFlow.value.url.hashCode() @@ -370,21 +363,24 @@ class DownloadViewModel @Inject constructor() : ViewModel() { ) } finishProcessing() - NotificationUtil.finishNotification( - notificationId, - title = context.getString(R.string.download_success_msg), - text = null, - intent = null - ) } } catch (e: Exception) { - manageDownloadError(e, false, notificationId) - return@launch + if (!e.message.isNullOrEmpty()) { + manageDownloadError(e, false, notificationId) + return@launch + } + finishProcessing() } + NotificationUtil.finishNotification( + notificationId, + title = context.getString(R.string.download_success_msg), + text = null, + intent = null + ) } } - private suspend fun checkStateBeforeDownload(): Boolean { + private fun checkStateBeforeDownload(): Boolean { with(mutableStateFlow) { if (value.isProcessRunning || value.isFetchingInfo) { TextUtil.makeToastSuspend(context.getString(R.string.task_running)) @@ -432,7 +428,7 @@ class DownloadViewModel @Inject constructor() : ViewModel() { } } - private suspend fun showErrorMessage(s: String) { + private fun showErrorMessage(s: String) { TextUtil.makeToastSuspend(s) mutableStateFlow.update { it.copy( diff --git a/app/src/main/java/com/junkfood/seal/ui/page/videolist/VideoListPage.kt b/app/src/main/java/com/junkfood/seal/ui/page/videolist/VideoListPage.kt index 0a04bcf7c..7c1788014 100644 --- a/app/src/main/java/com/junkfood/seal/ui/page/videolist/VideoListPage.kt +++ b/app/src/main/java/com/junkfood/seal/ui/page/videolist/VideoListPage.kt @@ -102,8 +102,7 @@ fun VideoListPage( Scaffold( modifier = Modifier - .nestedScroll(scrollBehavior.nestedScrollConnection) - .navigationBarsPadding(), + .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { LargeTopAppBar( title = { From 96621a5305766392e5d6475fa0166572e6221745 Mon Sep 17 00:00:00 2001 From: junkfood <69683722+junkfood02@users.noreply.github.com> Date: Sat, 10 Sep 2022 01:11:02 +0800 Subject: [PATCH 3/5] Pre-release v1.3.0-beta.2 --- app/build.gradle.kts | 2 +- .../java/com/junkfood/seal/MainActivity.kt | 2 +- .../seal/ui/component/BottomDrawer.kt | 2 +- .../seal/ui/page/download/DownloadPage.kt | 2 +- .../page/download/DownloadSettingsDialog.kt | 38 +++++++++++++++---- .../appearance/AppearancePreferences.kt | 1 - .../java/com/junkfood/seal/util/TextUtil.kt | 24 +++++++----- 7 files changed, 50 insertions(+), 21 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 203ae0f22..4168727c0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,7 +13,7 @@ apply(plugin = "dagger.hilt.android.plugin") val versionMajor = 1 val versionMinor = 3 val versionPatch = 0 -val versionBuild = 1 +val versionBuild = 2 val isStable = false val composeVersion = "1.2.1" diff --git a/app/src/main/java/com/junkfood/seal/MainActivity.kt b/app/src/main/java/com/junkfood/seal/MainActivity.kt index eb029767e..03e2f61b4 100644 --- a/app/src/main/java/com/junkfood/seal/MainActivity.kt +++ b/app/src/main/java/com/junkfood/seal/MainActivity.kt @@ -77,7 +77,7 @@ class MainActivity : AppCompatActivity() { ?.let { sharedContent -> intent.removeExtra(Intent.EXTRA_TEXT) TextUtil.matchUrlFromSharedText(sharedContent) - ?.let { matchedUrl -> + .let { matchedUrl -> if (sharedUrl != matchedUrl) { sharedUrl = matchedUrl downloadViewModel.updateUrl(sharedUrl) diff --git a/app/src/main/java/com/junkfood/seal/ui/component/BottomDrawer.kt b/app/src/main/java/com/junkfood/seal/ui/component/BottomDrawer.kt index f346cc94a..43b664429 100644 --- a/app/src/main/java/com/junkfood/seal/ui/component/BottomDrawer.kt +++ b/app/src/main/java/com/junkfood/seal/ui/component/BottomDrawer.kt @@ -92,7 +92,7 @@ fun DrawerSheetSubtitle( text = text, modifier = modifier .fillMaxWidth() - .padding(start = 6.dp, top = 16.dp, bottom = 8.dp), + .padding(start = 4.dp, top = 16.dp, bottom = 8.dp), color = color, style = MaterialTheme.typography.labelLarge ) diff --git a/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadPage.kt b/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadPage.kt index 12dc55b9b..6fd7ae1e4 100644 --- a/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadPage.kt +++ b/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadPage.kt @@ -128,7 +128,7 @@ fun DownloadPage( keyboardController?.hide() }, pasteCallback = { TextUtil.matchUrlFromClipboard(clipboardManager.getText().toString()) - ?.let { downloadViewModel.updateUrl(it) } + .let { downloadViewModel.updateUrl(it) } } ) }) { diff --git a/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadSettingsDialog.kt b/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadSettingsDialog.kt index 3397b045a..635a8fd56 100644 --- a/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadSettingsDialog.kt +++ b/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadSettingsDialog.kt @@ -59,17 +59,23 @@ fun DownloadSettingDialog( val templateList = DatabaseUtil.getTemplateFlow().collectAsState(ArrayList()).value - val downloadButtonCallback = { + val updatePreferences = { PreferenceUtil.updateValue(EXTRACT_AUDIO, audio) PreferenceUtil.updateValue(THUMBNAIL, thumbnail) PreferenceUtil.updateValue(CUSTOM_COMMAND, customCommand) PreferenceUtil.updateValue(PLAYLIST, playlist) PreferenceUtil.updateValue(SUBTITLE, subtitle) PreferenceUtil.updateInt(TEMPLATE_INDEX, selectedTemplateIndex) + } + + val downloadButtonCallback = { + updatePreferences() hide() confirm() } + + val sheetContent: @Composable () -> Unit = { Column { Text( @@ -83,25 +89,37 @@ fun DownloadSettingDialog( FilterChip( selected = audio, enabled = !customCommand, - onClick = { audio = !audio }, + onClick = { + audio = !audio + updatePreferences() + }, label = stringResource(R.string.extract_audio) ) FilterChip( selected = playlist, enabled = !customCommand, - onClick = { playlist = !playlist }, + onClick = { + playlist = !playlist + updatePreferences() + }, label = stringResource(R.string.download_playlist) ) FilterChip( selected = subtitle, enabled = !customCommand && !audio, - onClick = { subtitle = !subtitle }, + onClick = { + subtitle = !subtitle + updatePreferences() + }, label = stringResource(id = R.string.embed_subtitles) ) FilterChip( selected = thumbnail, enabled = !customCommand, - onClick = { thumbnail = !thumbnail }, + onClick = { + thumbnail = !thumbnail + updatePreferences() + }, label = stringResource(R.string.create_thumbnail) ) } @@ -109,7 +127,10 @@ fun DownloadSettingDialog( Row(modifier = Modifier.horizontalScroll(rememberScrollState())) { FilterChip( selected = customCommand, - onClick = { customCommand = !customCommand }, + onClick = { + customCommand = !customCommand + updatePreferences() + }, label = stringResource(R.string.custom_command) ) ButtonChip( @@ -157,7 +178,10 @@ fun DownloadSettingDialog( itemsIndexed(templateList) { index, item -> FilterChipWithIcons( selected = index == selectedTemplateIndex, - onClick = { selectedTemplateIndex = index }, + onClick = { + selectedTemplateIndex = index + updatePreferences() + }, label = item.name ) } diff --git a/app/src/main/java/com/junkfood/seal/ui/page/settings/appearance/AppearancePreferences.kt b/app/src/main/java/com/junkfood/seal/ui/page/settings/appearance/AppearancePreferences.kt index 6af7ce893..e2a61bb3b 100644 --- a/app/src/main/java/com/junkfood/seal/ui/page/settings/appearance/AppearancePreferences.kt +++ b/app/src/main/java/com/junkfood/seal/ui/page/settings/appearance/AppearancePreferences.kt @@ -87,7 +87,6 @@ fun AppearancePreferences( ) { if (DynamicColors.isDynamicColorAvailable()) { ColorButton(color = dynamicDarkColorScheme(LocalContext.current).primary) - ColorButton(color = dynamicDarkColorScheme(LocalContext.current).tertiary) } ColorButton(color = Color(ColorScheme.DEFAULT_SEED_COLOR)) ColorButton(color = Color.Yellow) diff --git a/app/src/main/java/com/junkfood/seal/util/TextUtil.kt b/app/src/main/java/com/junkfood/seal/util/TextUtil.kt index b587f24ed..9ba598e69 100644 --- a/app/src/main/java/com/junkfood/seal/util/TextUtil.kt +++ b/app/src/main/java/com/junkfood/seal/util/TextUtil.kt @@ -15,9 +15,9 @@ object TextUtil { return this.isNotEmpty() && this.isDigitsOnly() && this.length < 5 && this.toInt() >= start && this.toInt() <= end } - fun matchUrlFromClipboard(s: String): String? { + fun matchUrlFromClipboard(s: String): String { matchUrlFromString(s).run { - if (isNullOrEmpty()) + if (isEmpty()) makeToast(R.string.paste_fail_msg) else makeToast(R.string.paste_msg) @@ -25,9 +25,9 @@ object TextUtil { } } - fun matchUrlFromSharedText(s: String): String? { + fun matchUrlFromSharedText(s: String): String { matchUrlFromString(s).run { - if (isNullOrEmpty()) + if (isEmpty()) makeToast(R.string.share_fail_msg) else makeToast(R.string.share_success_msg) @@ -35,15 +35,21 @@ object TextUtil { } } - private fun matchUrlFromString(s: String): String? { + private fun matchUrlFromString(s: String): String { + val builder = StringBuilder() val pattern = Pattern.compile("(http|https)://[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-.,@?^=%&:/~+#]*[\\w\\-@?^=%&/~+#])?") with(pattern.matcher(s)) { - if (find()) { - return group() - } + if (PreferenceUtil.getValue(PreferenceUtil.CUSTOM_COMMAND)) + while (find()) { + if (builder.isNotEmpty()) + builder.append("\n") + builder.append(group()) + } + else if (find()) + builder.append(group()) } - return null + return builder.toString() } fun urlHttpToHttps(url: String?): String { From 3e0177a47b68c8f9f14cca81a8401410916c8f74 Mon Sep 17 00:00:00 2001 From: junkfood <69683722+junkfood02@users.noreply.github.com> Date: Mon, 12 Sep 2022 01:16:37 +0800 Subject: [PATCH 4/5] Temporary file directory --- app/src/main/java/com/junkfood/seal/MainActivity.kt | 3 ++- .../junkfood/seal/ui/page/download/DownloadViewModel.kt | 4 +++- .../settings/download/DownloadDirectoryPreferences.kt | 5 ++--- app/src/main/java/com/junkfood/seal/util/DownloadUtil.kt | 9 +++++++-- app/src/main/java/com/junkfood/seal/util/FileUtil.kt | 8 +++++--- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/junkfood/seal/MainActivity.kt b/app/src/main/java/com/junkfood/seal/MainActivity.kt index 03e2f61b4..e4dc4671c 100644 --- a/app/src/main/java/com/junkfood/seal/MainActivity.kt +++ b/app/src/main/java/com/junkfood/seal/MainActivity.kt @@ -102,7 +102,8 @@ class MainActivity : AppCompatActivity() { fun startService() { if (isServiceRunning) return - Intent(context, DownloadService::class.java).also { intent -> + isServiceRunning = true + Intent(context.applicationContext, DownloadService::class.java).also { intent -> context.applicationContext.bindService(intent, connection, Context.BIND_AUTO_CREATE) } } diff --git a/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadViewModel.kt b/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadViewModel.kt index 864795de0..cccbec8eb 100644 --- a/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadViewModel.kt +++ b/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadViewModel.kt @@ -16,6 +16,7 @@ import com.junkfood.seal.R import com.junkfood.seal.util.* import com.junkfood.seal.util.FileUtil.getConfigFile import com.junkfood.seal.util.FileUtil.getCookiesFile +import com.junkfood.seal.util.FileUtil.getTempDir import com.junkfood.seal.util.FileUtil.openFile import com.junkfood.seal.util.PreferenceUtil.COOKIES import com.yausername.youtubedl_android.YoutubeDL @@ -337,7 +338,8 @@ class DownloadViewModel @Inject constructor() : ViewModel() { try { with(mutableStateFlow) { val request = YoutubeDLRequest(urlList) - request.addOption("-P", "${BaseApplication.videoDownloadDir}/") + request.addOption("-P", BaseApplication.videoDownloadDir) + request.addOption("-P", "temp:" + context.getTempDir()) FileUtil.writeContentToFile( PreferenceUtil.getTemplate(), context.getConfigFile() diff --git a/app/src/main/java/com/junkfood/seal/ui/page/settings/download/DownloadDirectoryPreferences.kt b/app/src/main/java/com/junkfood/seal/ui/page/settings/download/DownloadDirectoryPreferences.kt index 20f3a985c..ea0b02d93 100644 --- a/app/src/main/java/com/junkfood/seal/ui/page/settings/download/DownloadDirectoryPreferences.kt +++ b/app/src/main/java/com/junkfood/seal/ui/page/settings/download/DownloadDirectoryPreferences.kt @@ -31,6 +31,7 @@ import com.junkfood.seal.R import com.junkfood.seal.ui.component.* import com.junkfood.seal.ui.component.LargeTopAppBar import com.junkfood.seal.util.FileUtil +import com.junkfood.seal.util.FileUtil.getTempDir import com.junkfood.seal.util.PreferenceUtil import com.junkfood.seal.util.PreferenceUtil.CUSTOM_PATH import com.junkfood.seal.util.PreferenceUtil.OUTPUT_PATH_TEMPLATE @@ -206,9 +207,7 @@ fun DownloadDirectoryPreferences(onBackPressed: () -> Unit) { showClearTempDialog = false scope.launch(Dispatchers.IO) { val count = - FileUtil.clearTempFiles(audioDirectoryText) + FileUtil.clearTempFiles( - videoDirectoryText - ) + FileUtil.clearTempFiles(context.getTempDir()) withContext(Dispatchers.Main) { snackbarHostState.showSnackbar( context.getString(R.string.clear_temp_files_count).format(count) diff --git a/app/src/main/java/com/junkfood/seal/util/DownloadUtil.kt b/app/src/main/java/com/junkfood/seal/util/DownloadUtil.kt index ac2e40b84..22ce31ae8 100644 --- a/app/src/main/java/com/junkfood/seal/util/DownloadUtil.kt +++ b/app/src/main/java/com/junkfood/seal/util/DownloadUtil.kt @@ -9,6 +9,7 @@ import com.junkfood.seal.R import com.junkfood.seal.database.DownloadedVideoInfo import com.junkfood.seal.util.FileUtil.getConfigFile import com.junkfood.seal.util.FileUtil.getCookiesFile +import com.junkfood.seal.util.FileUtil.getTempDir import com.junkfood.seal.util.PreferenceUtil.ARIA2C import com.junkfood.seal.util.PreferenceUtil.COOKIES import com.junkfood.seal.util.PreferenceUtil.CUSTOM_PATH @@ -149,8 +150,11 @@ object DownloadUtil { } addOption("--embed-metadata") addOption("--embed-thumbnail") - FileUtil.writeContentToFile("""--ppa "ffmpeg: -c:v png -vf crop=\"'if(gt(ih,iw),iw,ih)':'if(gt(iw,ih),ih,iw)'\""""", - context.getConfigFile()) + addOption("--convert-thumbnails", "png") + FileUtil.writeContentToFile( + """--ppa "ffmpeg: -c:v png -vf crop=\"'if(gt(ih,iw),iw,ih)':'if(gt(iw,ih),ih,iw)'\""""", + context.getConfigFile() + ) addOption("--config", context.getConfigFile().absolutePath) if (playlistInfo.url.isNotEmpty()) { addOption("--parse-metadata", "%(album,playlist,title)s:%(meta_album)s") @@ -209,6 +213,7 @@ object DownloadUtil { } addOption("-P", pathBuilder.toString()) + addOption("-P", "temp:" + context.getTempDir()) if (customPath) addOption( "-o", diff --git a/app/src/main/java/com/junkfood/seal/util/FileUtil.kt b/app/src/main/java/com/junkfood/seal/util/FileUtil.kt index 49c54b5e3..228aa9900 100644 --- a/app/src/main/java/com/junkfood/seal/util/FileUtil.kt +++ b/app/src/main/java/com/junkfood/seal/util/FileUtil.kt @@ -77,10 +77,10 @@ object FileUtil { return paths } - fun clearTempFiles(downloadDir: String): Int { + fun clearTempFiles(downloadDir: File): Int { var count = 0 - File(downloadDir).walkTopDown().forEach { - if (it.isFile && Regex(".*\\.part\$").matches(it.absolutePath)) { + downloadDir.walkTopDown().forEach { + if (it.isFile) { if (it.delete()) count++ } @@ -92,6 +92,8 @@ object FileUtil { fun Context.getCookiesFile() = File(cacheDir, "cookies.txt") + fun Context.getTempDir() = File(filesDir, "tmp") + fun writeContentToFile(content: String, file: File): File { file.writeText(content) return file From 314adc9f087b23cc3531effc17a49aaac5f61b23 Mon Sep 17 00:00:00 2001 From: junkfood <69683722+junkfood02@users.noreply.github.com> Date: Tue, 13 Sep 2022 00:52:47 +0800 Subject: [PATCH 5/5] Cancel all notifications when toggled off --- app/build.gradle.kts | 14 +++++++------- .../page/settings/download/DownloadPreferences.kt | 3 +++ .../com/junkfood/seal/util/NotificationUtil.kt | 7 ++++++- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4168727c0..8cb966ad3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -25,7 +25,7 @@ val kotlinVersion = "1.6.21" val hiltVersion = "2.43.2" val composeMd3Version = "1.0.0-beta01" val coilVersion = "2.2.0" -val youtubedlAndroidVersion = "aa680fbdd0" +val youtubedlAndroidVersion = "68e633ff07" val okhttpVersion = "5.0.0-alpha.10" val keystorePropertiesFile = rootProject.file("keystore.properties") @@ -175,13 +175,13 @@ dependencies { // okhttp implementation("com.squareup.okhttp3:okhttp:$okhttpVersion") -// implementation("com.github.yausername.youtubedl-android:library:$youtubedlAndroidVersion") -// implementation("com.github.yausername.youtubedl-android:ffmpeg:$youtubedlAndroidVersion") -// implementation("com.github.yausername.youtubedl-android:aria2c:$youtubedlAndroidVersion") + implementation("com.github.yausername.youtubedl-android:library:$youtubedlAndroidVersion") + implementation("com.github.yausername.youtubedl-android:ffmpeg:$youtubedlAndroidVersion") + implementation("com.github.yausername.youtubedl-android:aria2c:$youtubedlAndroidVersion") - implementation ("com.github.xibr.youtubedl-android:library:$youtubedlAndroidVersion") - implementation ("com.github.xibr.youtubedl-android:ffmpeg:$youtubedlAndroidVersion") - implementation ("com.github.xibr.youtubedl-android:aria2c:$youtubedlAndroidVersion") +// implementation ("com.github.xibr.youtubedl-android:library:$youtubedlAndroidVersion") +// implementation ("com.github.xibr.youtubedl-android:ffmpeg:$youtubedlAndroidVersion") +// implementation ("com.github.xibr.youtubedl-android:aria2c:$youtubedlAndroidVersion") // implementation("com.github.JunkFood02.youtubedl-android:ffmpeg:-SNAPSHOT") // implementation("com.github.JunkFood02.youtubedl-android:library:-SNAPSHOT") diff --git a/app/src/main/java/com/junkfood/seal/ui/page/settings/download/DownloadPreferences.kt b/app/src/main/java/com/junkfood/seal/ui/page/settings/download/DownloadPreferences.kt index f34bf098a..fca33d4d0 100644 --- a/app/src/main/java/com/junkfood/seal/ui/page/settings/download/DownloadPreferences.kt +++ b/app/src/main/java/com/junkfood/seal/ui/page/settings/download/DownloadPreferences.kt @@ -21,6 +21,7 @@ import com.junkfood.seal.BaseApplication import com.junkfood.seal.R import com.junkfood.seal.ui.component.* import com.junkfood.seal.util.DownloadUtil +import com.junkfood.seal.util.NotificationUtil import com.junkfood.seal.util.PreferenceUtil import com.junkfood.seal.util.PreferenceUtil.ARIA2C import com.junkfood.seal.util.PreferenceUtil.COOKIES @@ -148,6 +149,8 @@ fun DownloadPreferences( onClick = { notificationPermission?.launchPermissionRequest() if (checkNotificationPermission()) { + if (downloadNotification) + NotificationUtil.cancelAllNotifications() downloadNotification = !downloadNotification PreferenceUtil.updateValue( NOTIFICATION, downloadNotification diff --git a/app/src/main/java/com/junkfood/seal/util/NotificationUtil.kt b/app/src/main/java/com/junkfood/seal/util/NotificationUtil.kt index 326f72afa..67af59e46 100644 --- a/app/src/main/java/com/junkfood/seal/util/NotificationUtil.kt +++ b/app/src/main/java/com/junkfood/seal/util/NotificationUtil.kt @@ -13,7 +13,8 @@ import com.junkfood.seal.util.PreferenceUtil.NOTIFICATION @SuppressLint("StaticFieldLeak") object NotificationUtil { - private val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + private val notificationManager = + context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager private const val PROGRESS_MAX = 100 private const val PROGRESS_INITIAL = 0 private const val CHANNEL_ID = "download_notification" @@ -120,4 +121,8 @@ object NotificationUtil { notificationManager.notify(notificationId, builder.build())*/ notificationManager.cancel(notificationId) } + + fun cancelAllNotifications() { + notificationManager.cancelAll() + } } \ No newline at end of file