This commit is contained in:
deniscerri 2023-06-15 18:40:39 +02:00
parent b02605f64f
commit 259b3b27dd
No known key found for this signature in database
GPG key ID: 95C43D517D830350
13 changed files with 82 additions and 63 deletions

View file

@ -1,4 +1,3 @@
plugins { plugins {
id 'com.android.application' id 'com.android.application'
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' version '2.0.1' id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' version '2.0.1'
@ -8,6 +7,10 @@ plugins {
} }
def properties = new Properties() def properties = new Properties()
def versionMajor = 1
def versionMinor = 6
def versionPatch = 3
def versionBuild = 0 // bump for dogfood builds, public betas, etc.
android { android {
namespace 'com.deniscerri.ytdlnis' namespace 'com.deniscerri.ytdlnis'
@ -33,13 +36,10 @@ android {
applicationId "com.deniscerri.ytdl" applicationId "com.deniscerri.ytdl"
minSdk 23 minSdk 23
targetSdk 33 targetSdk 33
versionCode project.versionCode versionCode versionMajor * 1000000 + versionMinor * 10000 + versionPatch * 100 + versionBuild
versionName project.versionName versionName "${versionMajor}.${versionMinor}.${versionPatch}"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
archivesBaseName = "YTDLnis-$versionName" archivesBaseName = "YTDLnis-$versionName"
ndk {
abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
}
vectorDrawables { vectorDrawables {
useSupportLibrary true useSupportLibrary true
} }
@ -66,7 +66,6 @@ android {
beta { beta {
minifyEnabled true minifyEnabled true
versionNameSuffix "$project.betaVersionNameSuffix"
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
debuggable false debuggable false
signingConfig signingConfigs.debug signingConfig signingConfigs.debug
@ -92,6 +91,17 @@ android {
disable 'MissingTranslation' 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 { buildFeatures {
viewBinding true viewBinding true
compose true compose true

View file

@ -46,6 +46,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.elevation.SurfaceColors import com.google.android.material.elevation.SurfaceColors
import com.google.android.material.navigation.NavigationBarView import com.google.android.material.navigation.NavigationBarView
import com.google.android.material.navigation.NavigationView import com.google.android.material.navigation.NavigationView
import com.google.android.material.navigationrail.NavigationRailView
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.BufferedReader import java.io.BufferedReader
@ -221,7 +222,7 @@ class MainActivity : BaseActivity() {
navigationView.animate()?.translationY(navigationView.height.toFloat())?.setDuration(300)?.withEndAction { navigationView.animate()?.translationY(navigationView.height.toFloat())?.setDuration(300)?.withEndAction {
navigationView.visibility = View.GONE navigationView.visibility = View.GONE
}?.start() }?.start()
}else{ }else if (navigationView is NavigationRailView){
findViewById<FragmentContainerView>(R.id.frame_layout).updateLayoutParams { findViewById<FragmentContainerView>(R.id.frame_layout).updateLayoutParams {
this.width = LayoutParams.MATCH_PARENT this.width = LayoutParams.MATCH_PARENT
} }
@ -240,7 +241,7 @@ class MainActivity : BaseActivity() {
navigationView.animate()?.translationY(0F)?.setDuration(300)?.withEndAction { navigationView.animate()?.translationY(0F)?.setDuration(300)?.withEndAction {
navigationView.visibility = View.VISIBLE navigationView.visibility = View.VISIBLE
}?.start() }?.start()
}else{ }else if (navigationView is NavigationRailView){
findViewById<FragmentContainerView>(R.id.frame_layout).updateLayoutParams { findViewById<FragmentContainerView>(R.id.frame_layout).updateLayoutParams {
this.width = 0 this.width = 0
} }

View file

@ -238,9 +238,22 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application
} }
fun switchDownloadType(list: List<DownloadItem>, type: Type) : List<DownloadItem>{ fun switchDownloadType(list: List<DownloadItem>, type: Type) : List<DownloadItem>{
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 { list.forEach {
val format = getFormat(it.allFormats, type) val format = getFormat(it.allFormats, type)
it.format = format 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 it.type = type
} }
return list return list

View file

@ -33,14 +33,12 @@ import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel
import com.deniscerri.ytdlnis.ui.BaseActivity import com.deniscerri.ytdlnis.ui.BaseActivity
import com.deniscerri.ytdlnis.ui.downloadcard.DownloadBottomSheetDialog import com.deniscerri.ytdlnis.ui.downloadcard.DownloadBottomSheetDialog
import com.deniscerri.ytdlnis.ui.downloadcard.SelectPlaylistItemsBottomSheetDialog import com.deniscerri.ytdlnis.ui.downloadcard.SelectPlaylistItemsBottomSheetDialog
import com.deniscerri.ytdlnis.util.FileUtil
import com.deniscerri.ytdlnis.util.ThemeUtil import com.deniscerri.ytdlnis.util.ThemeUtil
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.io.File
import kotlin.properties.Delegates import kotlin.properties.Delegates
import kotlin.system.exitProcess import kotlin.system.exitProcess
@ -117,31 +115,35 @@ class ShareActivity : BaseActivity() {
this.finish() this.finish()
} }
val inputQuery = intent.getStringExtra(Intent.EXTRA_TEXT) val inputQuery = intent.getStringExtra(Intent.EXTRA_TEXT)!!
try { lifecycleScope.launch {
val result = resultViewModel.getItemByURL(inputQuery!!) try {
loadingBottomSheet.dismiss() val result = withContext(Dispatchers.IO){
showDownloadSheet(result) resultViewModel.getItemByURL(inputQuery)
}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() loadingBottomSheet.dismiss()
showDownloadSheet(result) showDownloadSheet(result)
}else{ }catch (e: Exception){
lifecycleScope.launch { resultViewModel.deleteAll()
val res = withContext(Dispatchers.IO){ 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())){
resultViewModel.parseQuery(inputQuery!!, true) val result = downloadViewModel.createEmptyResultItem(inputQuery)
} loadingBottomSheet.dismiss()
if (res.isEmpty()) { showDownloadSheet(result)
Toast.makeText(this@ShareActivity, "No Results Found!", Toast.LENGTH_SHORT).show() }else{
exit() lifecycleScope.launch {
}else{ val res = withContext(Dispatchers.IO){
loadingBottomSheet.dismiss() resultViewModel.parseQuery(inputQuery, true)
if (res.size == 1){ }
showDownloadSheet(res[0]!!) if (res.isEmpty()) {
Toast.makeText(this@ShareActivity, "No Results Found!", Toast.LENGTH_SHORT).show()
exit()
}else{ }else{
showSelectPlaylistItems(res.toList()) loadingBottomSheet.dismiss()
if (res.size == 1){
showDownloadSheet(res[0]!!)
}else{
showSelectPlaylistItems(res.toList())
}
} }
} }
} }

View file

@ -89,7 +89,6 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene
private var selectedObjects: ArrayList<ResultItem>? = null private var selectedObjects: ArrayList<ResultItem>? = null
private var quickLaunchSheet = false private var quickLaunchSheet = false
private var sharedPreferences: SharedPreferences? = null private var sharedPreferences: SharedPreferences? = null
private var _binding : FragmentHomeBinding? = null
private var actionMode: ActionMode? = null private var actionMode: ActionMode? = null
private var appBarLayout: AppBarLayout? = null private var appBarLayout: AppBarLayout? = null
private var materialToolbar: MaterialToolbar? = null private var materialToolbar: MaterialToolbar? = null
@ -98,7 +97,6 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
_binding = FragmentHomeBinding.inflate(inflater, container, false)
fragmentView = inflater.inflate(R.layout.fragment_home, container, false) fragmentView = inflater.inflate(R.layout.fragment_home, container, false)
activity = getActivity() activity = getActivity()
mainActivity = activity as MainActivity? mainActivity = activity as MainActivity?

View file

@ -9,7 +9,6 @@ import android.content.SharedPreferences
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.provider.MediaStore.Video
import android.text.format.DateFormat import android.text.format.DateFormat
import android.util.DisplayMetrics import android.util.DisplayMetrics
import android.view.Gravity import android.view.Gravity

View file

@ -15,13 +15,10 @@ import com.google.gson.Gson
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import com.yausername.youtubedl_android.YoutubeDL import com.yausername.youtubedl_android.YoutubeDL
import com.yausername.youtubedl_android.YoutubeDLRequest import com.yausername.youtubedl_android.YoutubeDLRequest
import okhttp3.ResponseBody
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONException import org.json.JSONException
import org.json.JSONObject import org.json.JSONObject
import retrofit2.Call
import retrofit2.Retrofit import retrofit2.Retrofit
import retrofit2.http.GET
import java.io.BufferedReader import java.io.BufferedReader
import java.io.File import java.io.File
import java.io.InputStreamReader import java.io.InputStreamReader
@ -346,7 +343,7 @@ class InfoUtil(private val context: Context) {
"youtube", "youtube",
"", "",
formats, formats,
if (obj.has("hls")) obj.getString("hls") else "", if (obj.has("hls") && obj.getString("hls") != "null") obj.getString("hls") else "",
chapters chapters
) )
} catch (e: Exception) { } catch (e: Exception) {
@ -478,7 +475,7 @@ class InfoUtil(private val context: Context) {
} }
private fun getTrendingFromPiped(): ArrayList<ResultItem?> { private fun getTrendingFromPiped(): ArrayList<ResultItem?> {
val url = pipedURL + "/trending?region=" + countryCODE val url = "$pipedURL/trending?region=$countryCODE"
val res = genericArrayRequest(url) val res = genericArrayRequest(url)
try { try {
for (i in 0 until res.length()) { for (i in 0 until res.length()) {
@ -653,7 +650,7 @@ class InfoUtil(private val context: Context) {
}else{ }else{
urls.forEach { urls.forEach {
val id = getIDFromYoutubeURL(it) val id = getIDFromYoutubeURL(it)
val res = genericRequest(pipedURL + "/streams/" + id) val res = genericRequest("$pipedURL/streams/$id")
val vid = createVideoFromPipedJSON(res, id) val vid = createVideoFromPipedJSON(res, id)
progress(vid!!.formats) progress(vid!!.formats)
} }

View file

@ -28,7 +28,6 @@ import java.net.URL
class UpdateUtil(var context: Context) { class UpdateUtil(var context: Context) {
private val tag = "UpdateUtil" private val tag = "UpdateUtil"
private val downloadManager: DownloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager 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) { fun updateApp(result: (result: String) -> Unit) {
try { try {

View file

@ -49,6 +49,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:labelVisibilityMode="selected"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"

View file

@ -60,7 +60,7 @@
<string name="log_downloads_summary">Krijo një skedar shënimesh për çdo shkarkim</string> <string name="log_downloads_summary">Krijo një skedar shënimesh për çdo shkarkim</string>
<string name="embed_subs_summary">Shtoni titrat në video</string> <string name="embed_subs_summary">Shtoni titrat në video</string>
<string name="embed_thumb">Vendos Imazh</string> <string name="embed_thumb">Vendos Imazh</string>
<string name="embed_thumb_summary">Përdorni miniaturën si kopertinë</string> <string name="embed_thumb_summary">Përdorni thumbnailin si kopertinë</string>
<string name="add_chapters">Kapituj në Video</string> <string name="add_chapters">Kapituj në Video</string>
<string name="add_chapters_summary">Shënoni segmentet e YouTube / SponsorBlock si kapituj për videon</string> <string name="add_chapters_summary">Shënoni segmentet e YouTube / SponsorBlock si kapituj për videon</string>
<string name="save_thumb">Ruaj Thumbnail</string> <string name="save_thumb">Ruaj Thumbnail</string>
@ -88,7 +88,7 @@
<string name="remove_downloading">Hiq në shkarkim</string> <string name="remove_downloading">Hiq në shkarkim</string>
<string name="delete_file_too">Fshije skedarin nga paisja</string> <string name="delete_file_too">Fshije skedarin nga paisja</string>
<string name="incognito_summary">Shkarko pa histori shkarkimi</string> <string name="incognito_summary">Shkarko pa histori shkarkimi</string>
<string name="configure_download">Konfiguro shkarkimin</string> <string name="configure_download">Konfiguro Shkarkimin</string>
<string name="title">Titulli</string> <string name="title">Titulli</string>
<string name="author">Autori</string> <string name="author">Autori</string>
<string name="download">Shkarko</string> <string name="download">Shkarko</string>
@ -98,7 +98,7 @@
<string name="show_download_card">Shfaq Opsionet e Shkarkimit</string> <string name="show_download_card">Shfaq Opsionet e Shkarkimit</string>
<string name="download_card_summary">Konfiguro përpara se sa ta shkarkosh</string> <string name="download_card_summary">Konfiguro përpara se sa ta shkarkosh</string>
<string name="Open_File">Hap Skedarin</string> <string name="Open_File">Hap Skedarin</string>
<string name="you_are_going_to_delete_multiple_items">Fshirja e shumë artikujve</string> <string name="you_are_going_to_delete_multiple_items">Fshi disa artikuj</string>
<string name="delete_files_too">Fshi skedarët nga paisja</string> <string name="delete_files_too">Fshi skedarët nga paisja</string>
<string name="request_permission_desc">Ky aplikacion ka nevojë për lejen e Skedarëve për të ruajtur shkarkimet në paisje</string> <string name="request_permission_desc">Ky aplikacion ka nevojë për lejen e Skedarëve për të ruajtur shkarkimet në paisje</string>
<string name="exit_app">Dil</string> <string name="exit_app">Dil</string>
@ -112,7 +112,7 @@
<string name="sponsorblock_fillers">Pjesë Shtesë</string> <string name="sponsorblock_fillers">Pjesë Shtesë</string>
<string name="sponsorblock_reminders">Përkujtuesit e Abonimit</string> <string name="sponsorblock_reminders">Përkujtuesit e Abonimit</string>
<string name="select_sponsorblock_filtering">Zgjidh Filtrimin e SponsorBlock</string> <string name="select_sponsorblock_filtering">Zgjidh Filtrimin e SponsorBlock</string>
<string name="save_dir">Ruani në drejtori</string> <string name="save_dir">Ruaj në direktorinë</string>
<string name="new_template">Model i ri</string> <string name="new_template">Model i ri</string>
<string name="adjust_templates">Cakto Modelet</string> <string name="adjust_templates">Cakto Modelet</string>
<string name="edit_selected">Redakto të zgjedhurin</string> <string name="edit_selected">Redakto të zgjedhurin</string>
@ -254,21 +254,21 @@
<string name="search_history">Historia e Kërkimit</string> <string name="search_history">Historia e Kërkimit</string>
<string name="appearance">Pamja</string> <string name="appearance">Pamja</string>
<string name="backup_restore">Ruaj Dhe Rikthe</string> <string name="backup_restore">Ruaj Dhe Rikthe</string>
<string name="socks5_proxy_summary">Përdorni përfaqësuesin e specifikuar HTTP/HTTPS/SOCKS</string> <string name="socks5_proxy_summary">Përdorni proksin e specifikuar HTTP/HTTPS/SOCKS</string>
<string name="socks5_proxy">URL e përfaqësuesit Socks5</string> <string name="socks5_proxy">URL e Proksit Socks5</string>
<string name="search_suggestions_summary">Merr sugjerime kërkimi nga Google</string> <string name="search_suggestions_summary">Merr sugjerime kërkimi nga Google</string>
<string name="search_suggestions">Sugjerimet e kërkimit</string> <string name="search_suggestions">Sugjerimet e kërkimit</string>
<string name="preferred_format_id_summary">Zgjidhni formatin me këtë ID në kartën e shkarkimit</string> <string name="preferred_format_id_summary">Zgjidhni formatin me këtë ID në kartën e shkarkimit</string>
<string name="misc">ndryshme</string> <string name="misc">Tjera</string>
<string name="audio_only_item">Ky artikull përmban vetëm formate audio</string> <string name="audio_only_item">Ky artikull përmban vetëm formate audio</string>
<string name="locale">Lokal</string> <string name="locale">Lokal</string>
<string name="general">Gjeneral</string> <string name="general">Gjeneral</string>
<string name="swipe_gestures">Gjestet e rrëshqitjes</string> <string name="swipe_gestures">Gjestet e rrëshqitjes</string>
<string name="swipe_gestures_summary">Rrëshqitni artikujt për veprime të caktuara</string> <string name="swipe_gestures_summary">Rrëshqitni artikujt për veprime të caktuara</string>
<string name="crop_thumb">Miniatura e Prirjes</string> <string name="crop_thumb">Preje Thumbnailin</string>
<string name="crop_thumb_summary">Pritini miniaturën në një katror për shkarkime audio</string> <string name="crop_thumb_summary">Preje thumbnailin në formë katrore për shkarkimet audio</string>
<string name="move_temporary_files">Zhvendos skedarët e përkohshëm</string> <string name="move_temporary_files">Zhvendos skedarët e përkohshëm</string>
<string name="move_temporary_files_summary">Transferoni skedarët e memorizuar në dosjen e shkarkimeve</string> <string name="move_temporary_files_summary">Transfero skedarët e përkohshëm në dosjen e shkarkimeve</string>
<string name="format_filtering_hint_2">Të gjithë artikujt duhet të jenë audio ose video për të përdorur këtë opsion</string> <string name="format_filtering_hint_2">Të gjithë artikujt duhet të jenë audio ose video për të përdorur këtë opsion</string>
<string name="custom_audio_quality">Përdor cilësinë e personalizuar të audios</string> <string name="custom_audio_quality">Përdor cilësinë e personalizuar të audios</string>
<string name="piped_instance">Instanca e PIPED</string> <string name="piped_instance">Instanca e PIPED</string>

View file

@ -46,7 +46,7 @@
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:widgetLayout="@layout/preferece_material_switch" android:widgetLayout="@layout/preferece_material_switch"
app:defaultValue="true" app:defaultValue="false"
android:icon="@drawable/ic_update_app" android:icon="@drawable/ic_update_app"
android:key="update_app" android:key="update_app"
app:summary="@string/update_app_summary" app:summary="@string/update_app_summary"

View file

@ -2,16 +2,8 @@
buildscript { buildscript {
def versionMajor = 1
def versionMinor = 6
def versionPatch = 2
def versionBuild = 1 // bump for dogfood builds, public betas, etc.
ext { ext {
versionCode = versionMajor * 100000 + versionMinor * 1000 + versionPatch * 100 + versionBuild abiCodes = ['armeabi-v7a': 1, 'x86': 2, 'x86_64': 3, 'arm64-v8a': 4]
versionName = "${versionMajor}.${versionMinor}.${versionPatch}"
betaVersionNameSuffix = ".${versionBuild}-beta"
// dependency versions // dependency versions
appCompatVer = '1.6.1' appCompatVer = '1.6.1'
junitVer = '4.13.2' junitVer = '4.13.2'

View file

@ -0,0 +1,7 @@
Fixed txt file import not working
added ability to select multiple audio streams for a single video
make swipe gestures a preference
crop thumb preference
added support for multiple folders in a single download through filename templates
added code syntax highlighter
moved from invidious to piped for youtube queries