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 {
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

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.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<FragmentContainerView>(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<FragmentContainerView>(R.id.frame_layout).updateLayoutParams {
this.width = 0
}

View file

@ -238,9 +238,22 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application
}
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 {
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

View file

@ -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())
}
}
}
}

View file

@ -89,7 +89,6 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene
private var selectedObjects: ArrayList<ResultItem>? = 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?

View file

@ -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

View file

@ -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<ResultItem?> {
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)
}

View file

@ -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 {

View file

@ -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"

View file

@ -60,7 +60,7 @@
<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_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_summary">Shënoni segmentet e YouTube / SponsorBlock si kapituj për videon</string>
<string name="save_thumb">Ruaj Thumbnail</string>
@ -88,7 +88,7 @@
<string name="remove_downloading">Hiq në shkarkim</string>
<string name="delete_file_too">Fshije skedarin nga paisja</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="author">Autori</string>
<string name="download">Shkarko</string>
@ -98,7 +98,7 @@
<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="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="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>
@ -112,7 +112,7 @@
<string name="sponsorblock_fillers">Pjesë Shtesë</string>
<string name="sponsorblock_reminders">Përkujtuesit e Abonimit</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="adjust_templates">Cakto Modelet</string>
<string name="edit_selected">Redakto të zgjedhurin</string>
@ -254,21 +254,21 @@
<string name="search_history">Historia e Kërkimit</string>
<string name="appearance">Pamja</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">URL e përfaqësuesit Socks5</string>
<string name="socks5_proxy_summary">Përdorni proksin e specifikuar HTTP/HTTPS/SOCKS</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">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="misc">ndryshme</string>
<string name="misc">Tjera</string>
<string name="audio_only_item">Ky artikull përmban vetëm formate audio</string>
<string name="locale">Lokal</string>
<string name="general">Gjeneral</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="crop_thumb">Miniatura e Prirjes</string>
<string name="crop_thumb_summary">Pritini miniaturën në një katror për shkarkime audio</string>
<string name="crop_thumb">Preje Thumbnailin</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_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="custom_audio_quality">Përdor cilësinë e personalizuar të audios</string>
<string name="piped_instance">Instanca e PIPED</string>

View file

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

View file

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