diff --git a/app/build.gradle b/app/build.gradle index e69f6d4a..7ac6dc06 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,4 +1,3 @@ - plugins { id 'com.android.application' id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' version '2.0.1' @@ -8,6 +7,10 @@ plugins { } def properties = new Properties() +def versionMajor = 1 +def versionMinor = 6 +def versionPatch = 3 +def versionBuild = 0 // bump for dogfood builds, public betas, etc. android { namespace 'com.deniscerri.ytdlnis' @@ -33,13 +36,10 @@ android { applicationId "com.deniscerri.ytdl" minSdk 23 targetSdk 33 - versionCode project.versionCode - versionName project.versionName + versionCode versionMajor * 1000000 + versionMinor * 10000 + versionPatch * 100 + versionBuild + versionName "${versionMajor}.${versionMinor}.${versionPatch}" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" archivesBaseName = "YTDLnis-$versionName" - ndk { - abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' - } vectorDrawables { useSupportLibrary true } @@ -66,7 +66,6 @@ android { beta { minifyEnabled true - versionNameSuffix "$project.betaVersionNameSuffix" proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' debuggable false signingConfig signingConfigs.debug @@ -92,6 +91,17 @@ android { disable 'MissingTranslation' } + android.applicationVariants.all { variant -> + variant.outputs.each { output -> + def baseAbiVersionCode = project.abiCodes.get(output.getFilter(com.android.build.OutputFile.ABI)) + if (baseAbiVersionCode != null) { + output.versionCodeOverride = (100 * project.android.defaultConfig.versionCode) + baseAbiVersionCode + } else { + output.versionCodeOverride = 100 * project.android.defaultConfig.versionCode + } + } + } + buildFeatures { viewBinding true compose true diff --git a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt index fca4fbaa..179eddb2 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt @@ -46,6 +46,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.elevation.SurfaceColors import com.google.android.material.navigation.NavigationBarView import com.google.android.material.navigation.NavigationView +import com.google.android.material.navigationrail.NavigationRailView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.io.BufferedReader @@ -221,7 +222,7 @@ class MainActivity : BaseActivity() { navigationView.animate()?.translationY(navigationView.height.toFloat())?.setDuration(300)?.withEndAction { navigationView.visibility = View.GONE }?.start() - }else{ + }else if (navigationView is NavigationRailView){ findViewById(R.id.frame_layout).updateLayoutParams { this.width = LayoutParams.MATCH_PARENT } @@ -240,7 +241,7 @@ class MainActivity : BaseActivity() { navigationView.animate()?.translationY(0F)?.setDuration(300)?.withEndAction { navigationView.visibility = View.VISIBLE }?.start() - }else{ + }else if (navigationView is NavigationRailView){ findViewById(R.id.frame_layout).updateLayoutParams { this.width = 0 } 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 a4360095..5b1ad274 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 @@ -238,9 +238,22 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application } fun switchDownloadType(list: List, type: Type) : List{ + val updatedDownloadPath : String = when(type){ + Type.audio -> sharedPreferences.getString("music_path", FileUtil.getDefaultAudioPath())!! + Type.video -> sharedPreferences.getString("video_path", FileUtil.getDefaultVideoPath())!! + Type.command -> sharedPreferences.getString("command_path", FileUtil.getDefaultCommandPath())!! + } + list.forEach { val format = getFormat(it.allFormats, type) it.format = format + val currentDownloadPath = when(it.type){ + Type.audio -> sharedPreferences.getString("music_path", FileUtil.getDefaultAudioPath()) + Type.video -> sharedPreferences.getString("video_path", FileUtil.getDefaultVideoPath()) + Type.command -> sharedPreferences.getString("command_path", FileUtil.getDefaultCommandPath()) + } + if (it.downloadPath == currentDownloadPath) it.downloadPath = updatedDownloadPath + it.type = type } return list diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt index 31eb33f9..fd62c566 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt @@ -33,14 +33,12 @@ import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel import com.deniscerri.ytdlnis.ui.BaseActivity import com.deniscerri.ytdlnis.ui.downloadcard.DownloadBottomSheetDialog import com.deniscerri.ytdlnis.ui.downloadcard.SelectPlaylistItemsBottomSheetDialog -import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.ThemeUtil import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import java.io.File import kotlin.properties.Delegates import kotlin.system.exitProcess @@ -117,31 +115,35 @@ class ShareActivity : BaseActivity() { this.finish() } - val inputQuery = intent.getStringExtra(Intent.EXTRA_TEXT) - try { - val result = resultViewModel.getItemByURL(inputQuery!!) - loadingBottomSheet.dismiss() - showDownloadSheet(result) - }catch (e: Exception){ - resultViewModel.deleteAll() - if (quickDownload && inputQuery!!.matches("(https?://(?:www\\.|(?!www))[a-zA-Z\\d][a-zA-Z\\d-]+[a-zA-Z\\d]\\.\\S{2,}|www\\.[a-zA-Z\\d][a-zA-Z\\d-]+[a-zA-Z\\d]\\.\\S{2,}|https?://(?:www\\.|(?!www))[a-zA-Z\\d]+\\.\\S{2,}|www\\.[a-zA-Z\\d]+\\.\\S{2,})".toRegex())){ - val result = downloadViewModel.createEmptyResultItem(inputQuery) + val inputQuery = intent.getStringExtra(Intent.EXTRA_TEXT)!! + lifecycleScope.launch { + try { + val result = withContext(Dispatchers.IO){ + resultViewModel.getItemByURL(inputQuery) + } loadingBottomSheet.dismiss() showDownloadSheet(result) - }else{ - lifecycleScope.launch { - val res = withContext(Dispatchers.IO){ - resultViewModel.parseQuery(inputQuery!!, true) - } - if (res.isEmpty()) { - Toast.makeText(this@ShareActivity, "No Results Found!", Toast.LENGTH_SHORT).show() - exit() - }else{ - loadingBottomSheet.dismiss() - if (res.size == 1){ - showDownloadSheet(res[0]!!) + }catch (e: Exception){ + resultViewModel.deleteAll() + if (quickDownload && inputQuery.matches("(https?://(?:www\\.|(?!www))[a-zA-Z\\d][a-zA-Z\\d-]+[a-zA-Z\\d]\\.\\S{2,}|www\\.[a-zA-Z\\d][a-zA-Z\\d-]+[a-zA-Z\\d]\\.\\S{2,}|https?://(?:www\\.|(?!www))[a-zA-Z\\d]+\\.\\S{2,}|www\\.[a-zA-Z\\d]+\\.\\S{2,})".toRegex())){ + val result = downloadViewModel.createEmptyResultItem(inputQuery) + loadingBottomSheet.dismiss() + showDownloadSheet(result) + }else{ + lifecycleScope.launch { + val res = withContext(Dispatchers.IO){ + resultViewModel.parseQuery(inputQuery, true) + } + if (res.isEmpty()) { + Toast.makeText(this@ShareActivity, "No Results Found!", Toast.LENGTH_SHORT).show() + exit() }else{ - showSelectPlaylistItems(res.toList()) + loadingBottomSheet.dismiss() + if (res.size == 1){ + showDownloadSheet(res[0]!!) + }else{ + showSelectPlaylistItems(res.toList()) + } } } } 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 8ebf2480..bfe2c32a 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt @@ -89,7 +89,6 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene private var selectedObjects: ArrayList? = null private var quickLaunchSheet = false private var sharedPreferences: SharedPreferences? = null - private var _binding : FragmentHomeBinding? = null private var actionMode: ActionMode? = null private var appBarLayout: AppBarLayout? = null private var materialToolbar: MaterialToolbar? = null @@ -98,7 +97,6 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - _binding = FragmentHomeBinding.inflate(inflater, container, false) fragmentView = inflater.inflate(R.layout.fragment_home, container, false) activity = getActivity() mainActivity = activity as MainActivity? 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 ae46103c..0b3c737e 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 @@ -9,7 +9,6 @@ import android.content.SharedPreferences import android.graphics.Canvas import android.graphics.Color import android.os.Bundle -import android.provider.MediaStore.Video import android.text.format.DateFormat import android.util.DisplayMetrics import android.view.Gravity diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt b/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt index 69d0b81a..76cbe052 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt @@ -15,13 +15,10 @@ import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.yausername.youtubedl_android.YoutubeDL import com.yausername.youtubedl_android.YoutubeDLRequest -import okhttp3.ResponseBody import org.json.JSONArray import org.json.JSONException import org.json.JSONObject -import retrofit2.Call import retrofit2.Retrofit -import retrofit2.http.GET import java.io.BufferedReader import java.io.File import java.io.InputStreamReader @@ -346,7 +343,7 @@ class InfoUtil(private val context: Context) { "youtube", "", formats, - if (obj.has("hls")) obj.getString("hls") else "", + if (obj.has("hls") && obj.getString("hls") != "null") obj.getString("hls") else "", chapters ) } catch (e: Exception) { @@ -478,7 +475,7 @@ class InfoUtil(private val context: Context) { } private fun getTrendingFromPiped(): ArrayList { - val url = pipedURL + "/trending?region=" + countryCODE + val url = "$pipedURL/trending?region=$countryCODE" val res = genericArrayRequest(url) try { for (i in 0 until res.length()) { @@ -653,7 +650,7 @@ class InfoUtil(private val context: Context) { }else{ urls.forEach { val id = getIDFromYoutubeURL(it) - val res = genericRequest(pipedURL + "/streams/" + id) + val res = genericRequest("$pipedURL/streams/$id") val vid = createVideoFromPipedJSON(res, id) progress(vid!!.formats) } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/UpdateUtil.kt b/app/src/main/java/com/deniscerri/ytdlnis/util/UpdateUtil.kt index 7a89a505..8d088f4b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/UpdateUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/util/UpdateUtil.kt @@ -28,7 +28,6 @@ import java.net.URL class UpdateUtil(var context: Context) { private val tag = "UpdateUtil" private val downloadManager: DownloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager - private val ytdlpNightly = "https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest" fun updateApp(result: (result: String) -> Unit) { try { diff --git a/app/src/main/res/layout-sw600dp/activity_main.xml b/app/src/main/res/layout-sw600dp/activity_main.xml index 7e5aabb6..e7b550fc 100644 --- a/app/src/main/res/layout-sw600dp/activity_main.xml +++ b/app/src/main/res/layout-sw600dp/activity_main.xml @@ -49,6 +49,7 @@ android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" + app:labelVisibilityMode="selected" app:layout_constraintTop_toTopOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/values-sq-rAL/strings.xml b/app/src/main/res/values-sq-rAL/strings.xml index 9330a1db..fa2fb8c1 100644 --- a/app/src/main/res/values-sq-rAL/strings.xml +++ b/app/src/main/res/values-sq-rAL/strings.xml @@ -60,7 +60,7 @@ Krijo një skedar shënimesh për çdo shkarkim Shtoni titrat në video Vendos Imazh - Përdorni miniaturën si kopertinë + Përdorni thumbnailin si kopertinë Kapituj në Video Shënoni segmentet e YouTube / SponsorBlock si kapituj për videon Ruaj Thumbnail @@ -88,7 +88,7 @@ Hiq në shkarkim Fshije skedarin nga paisja Shkarko pa histori shkarkimi - Konfiguro shkarkimin + Konfiguro Shkarkimin Titulli Autori Shkarko @@ -98,7 +98,7 @@ Shfaq Opsionet e Shkarkimit Konfiguro përpara se sa ta shkarkosh Hap Skedarin - Fshirja e shumë artikujve + Fshi disa artikuj Fshi skedarët nga paisja Ky aplikacion ka nevojë për lejen e Skedarëve për të ruajtur shkarkimet në paisje Dil @@ -112,7 +112,7 @@ Pjesë Shtesë Përkujtuesit e Abonimit Zgjidh Filtrimin e SponsorBlock - Ruani në drejtori + Ruaj në direktorinë Model i ri Cakto Modelet Redakto të zgjedhurin @@ -254,21 +254,21 @@ Historia e Kërkimit Pamja Ruaj Dhe Rikthe - Përdorni përfaqësuesin e specifikuar HTTP/HTTPS/SOCKS - URL e përfaqësuesit Socks5 + Përdorni proksin e specifikuar HTTP/HTTPS/SOCKS + URL e Proksit Socks5 Merr sugjerime kërkimi nga Google Sugjerimet e kërkimit Zgjidhni formatin me këtë ID në kartën e shkarkimit - Të ndryshme + Të Tjera Ky artikull përmban vetëm formate audio Lokal Gjeneral Gjestet e rrëshqitjes Rrëshqitni artikujt për veprime të caktuara - Miniatura e Prirjes - Pritini miniaturën në një katror për shkarkime audio + Preje Thumbnailin + Preje thumbnailin në formë katrore për shkarkimet audio Zhvendos skedarët e përkohshëm - Transferoni skedarët e memorizuar në dosjen e shkarkimeve + Transfero skedarët e përkohshëm në dosjen e shkarkimeve Të gjithë artikujt duhet të jenë audio ose video për të përdorur këtë opsion Përdor cilësinë e personalizuar të audios Instanca e PIPED diff --git a/app/src/main/res/xml/updating_preferences.xml b/app/src/main/res/xml/updating_preferences.xml index 60c475ff..d436f7e6 100644 --- a/app/src/main/res/xml/updating_preferences.xml +++ b/app/src/main/res/xml/updating_preferences.xml @@ -46,7 +46,7 @@