1.8.0
This commit is contained in:
parent
80672a2556
commit
d1d9a341bd
13 changed files with 76 additions and 30 deletions
23
CHANGELOG.md
23
CHANGELOG.md
|
|
@ -1,5 +1,28 @@
|
||||||
# YTDLnis Changelog
|
# YTDLnis Changelog
|
||||||
|
|
||||||
|
> # 1.8.0 (2024-10)
|
||||||
|
|
||||||
|
# Notice
|
||||||
|
|
||||||
|
This version has the updated python version 3.11. Due to yt-dlp's deprecation of python 3.8, this update had to be made, but at the same time support for Android 6 will be dropped. Android 6 users can still keep using the previous version until yt-dlp stops working in the future.
|
||||||
|
|
||||||
|
# What's Changed
|
||||||
|
|
||||||
|
- Re-added individual pause button for downloads
|
||||||
|
- Added ability to set preferred command template
|
||||||
|
- Added PO Token setting for youtube extractor arguments
|
||||||
|
- Added customizable client for youtube extractor arguments
|
||||||
|
- Added preference to add extra youtube extractor arguments
|
||||||
|
- Added a header on cancelled/errored/scheduled/saved tabs to show the count and a dropdown menu to delete and copy urls instead of using the main queue screen menu
|
||||||
|
- Fixed app not starting scheduled downloads with the resume button if there were no paused downloads, weird ik
|
||||||
|
- Added Socket Timeout in Download Settings
|
||||||
|
- Fixed app not adding extra commands in the very end of the command list
|
||||||
|
- Fixed #580
|
||||||
|
- Small fixes on the home screen channel tab filters
|
||||||
|
- Fixed app crashing when pressing the thumbnail icon in the result card details. The icon is hidden if there is no thumbnail
|
||||||
|
- Watch Videos playlist type link is supported for data fetching and downloading.
|
||||||
|
- Added ability to parse the "artists" tag when fetching data for ytm
|
||||||
|
|
||||||
> # 1.7.9.2 (2024-09)
|
> # 1.7.9.2 (2024-09)
|
||||||
|
|
||||||
# What's Changed
|
# What's Changed
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3 align="center">
|
<h3 align="center">
|
||||||
YTDLnis Android 6.0 və yuxarı üçün yt-dlp istifadə edən pulsuz və açıq mənbəli video/səs yükləyicidir.
|
YTDLnis Android 7.0 və yuxarı üçün yt-dlp istifadə edən pulsuz və açıq mənbəli video/səs yükləyicidir.
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
|
||||||
|
|
@ -10,10 +10,10 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3 align="center">
|
<h3 align="center">
|
||||||
YTDLnis es un descargador de audio/video gratuito y de código abierto que utiliza yt-dlp para Android 6.0 y superior.
|
YTDLnis es un descargador de audio/video gratuito y de código abierto que utiliza yt-dlp para Android 7.0 y superior.
|
||||||
</h3>
|
</h3>
|
||||||
<h4 align="center">
|
<h4 align="center">
|
||||||
[Creado por Denis Çerri. Actualmente mantenido por zaednasr]
|
Creado por Denis Çerri
|
||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3 align="center">
|
<h3 align="center">
|
||||||
YTDLnis adalah pengunduh video/audio sumber terbuka dan gratis yang menggunakan yt-dlp bagi Android 6.0 ke atas.
|
YTDLnis adalah pengunduh video/audio sumber terbuka dan gratis yang menggunakan yt-dlp bagi Android 7.0 ke atas.
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
|
||||||
|
|
@ -20,10 +20,10 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3 align="center">
|
<h3 align="center">
|
||||||
YTDLnisは、Android 6.0以降に対応した、yt-dlpを使用した無料かつオープンソースのビデオ/オーディオダウンローダーです。
|
YTDLnisは、Android 7.0以降に対応した、yt-dlpを使用した無料かつオープンソースのビデオ/オーディオダウンローダーです。
|
||||||
</h3>
|
</h3>
|
||||||
<h4 align="center">
|
<h4 align="center">
|
||||||
[Denis Çerriによって作成されました。現在はzaednasrによってメンテナンスされています]
|
Denis Çerriによって作成されました
|
||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3 align="center">
|
<h3 align="center">
|
||||||
YTDLnis é um aplicativo gratuito e de código aberto para baixar vídeos/áudios usando yt-dlp disponível para o Android 6.0 e superior.
|
YTDLnis é um aplicativo gratuito e de código aberto para baixar vídeos/áudios usando yt-dlp disponível para o Android 7.0 e superior.
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3 align="center">
|
<h3 align="center">
|
||||||
YTDLnis është një shkarkues video/audio falas dhe me burim të hapur duke përdorur yt-dlp për Android 6.0 dhe më lart.
|
YTDLnis është një shkarkues video/audio falas dhe me burim të hapur duke përdorur yt-dlp për Android 7.0 dhe më lart.
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
|
||||||
|
|
@ -20,10 +20,10 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3 align="center">
|
<h3 align="center">
|
||||||
YTDLnis is a free and open source video/audio downloader using yt-dlp for Android 6.0 and above.
|
YTDLnis is a free and open source video/audio downloader using yt-dlp for Android 7.0 and above.
|
||||||
</h3>
|
</h3>
|
||||||
<h4 align="center">
|
<h4 align="center">
|
||||||
[Created by Denis Çerri. Currently being maintained by zaednasr]
|
Created by Denis Çerri
|
||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@ plugins {
|
||||||
|
|
||||||
def properties = new Properties()
|
def properties = new Properties()
|
||||||
def versionMajor = 1
|
def versionMajor = 1
|
||||||
def versionMinor = 7
|
def versionMinor = 8
|
||||||
def versionPatch = 9
|
def versionPatch = 0
|
||||||
def versionBuild = 2 // bump for dogfood builds, public betas, etc.
|
def versionBuild = 0 // bump for dogfood builds, public betas, etc.
|
||||||
def isBeta = false
|
def isBeta = false
|
||||||
|
|
||||||
def versionExt = ""
|
def versionExt = ""
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,7 @@ interface DownloadDao {
|
||||||
@Query("SELECT * FROM downloads WHERE status='Scheduled' ORDER BY downloadStartTime, id")
|
@Query("SELECT * FROM downloads WHERE status='Scheduled' ORDER BY downloadStartTime, id")
|
||||||
fun getScheduledDownloadsList() : List<DownloadItem>
|
fun getScheduledDownloadsList() : List<DownloadItem>
|
||||||
|
|
||||||
@Query("SELECT id FROM downloads WHERE status='Queued' ORDER BY id")
|
@Query("SELECT id FROM downloads WHERE status='Queued' ORDER BY downloadStartTime, id")
|
||||||
fun getQueuedDownloadsListIDs() : List<Long>
|
fun getQueuedDownloadsListIDs() : List<Long>
|
||||||
|
|
||||||
@RewriteQueriesToDropUnusedColumns
|
@RewriteQueriesToDropUnusedColumns
|
||||||
|
|
@ -289,8 +289,11 @@ interface DownloadDao {
|
||||||
|
|
||||||
resetScheduleTimeForItems(existingIDs)
|
resetScheduleTimeForItems(existingIDs)
|
||||||
existingIDs.forEach { updateDownloadID(it, -it) }
|
existingIDs.forEach { updateDownloadID(it, -it) }
|
||||||
downloads.filter { !existingIDs.contains(it) }.reversed().forEach {
|
downloads.filter { !existingIDs.contains(it) }.toMutableList().apply {
|
||||||
updateDownloadID(it, it + existingIDs.size)
|
this.reverse()
|
||||||
|
this.forEach {
|
||||||
|
updateDownloadID(it, it + existingIDs.size)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
existingIDs.forEachIndexed { idx, it ->
|
existingIDs.forEachIndexed { idx, it ->
|
||||||
|
|
@ -305,8 +308,11 @@ interface DownloadDao {
|
||||||
|
|
||||||
resetScheduleTimeForItems(existingIDs)
|
resetScheduleTimeForItems(existingIDs)
|
||||||
existingIDs.forEach { updateDownloadID(it, -it) }
|
existingIDs.forEach { updateDownloadID(it, -it) }
|
||||||
downloads.filter { !existingIDs.contains(it) }.reversed().forEach {
|
downloads.filter { !existingIDs.contains(it) }.toMutableList().apply {
|
||||||
updateDownloadID(it, it + existingIDs.size)
|
this.reverse()
|
||||||
|
this.forEach {
|
||||||
|
updateDownloadID(it, it + existingIDs.size)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
existingIDs.forEachIndexed { idx, it ->
|
existingIDs.forEachIndexed { idx, it ->
|
||||||
|
|
|
||||||
|
|
@ -176,7 +176,7 @@ class DownloadViewModel(private val application: Application) : AndroidViewModel
|
||||||
return@combine PausedAllDownloadsState.HIDDEN
|
return@combine PausedAllDownloadsState.HIDDEN
|
||||||
}else if (paused > 1 || (active == 0 && queued > 0) || (paused > 0 && active > 0)) {
|
}else if (paused > 1 || (active == 0 && queued > 0) || (paused > 0 && active > 0)) {
|
||||||
return@combine PausedAllDownloadsState.RESUME
|
return@combine PausedAllDownloadsState.RESUME
|
||||||
}else if (active > 1) {
|
}else if (active > 1 || (active > 0 && queued > 0)) {
|
||||||
return@combine PausedAllDownloadsState.PAUSE
|
return@combine PausedAllDownloadsState.PAUSE
|
||||||
}else{
|
}else{
|
||||||
return@combine PausedAllDownloadsState.HIDDEN
|
return@combine PausedAllDownloadsState.HIDDEN
|
||||||
|
|
@ -767,12 +767,14 @@ class DownloadViewModel(private val application: Application) : AndroidViewModel
|
||||||
|
|
||||||
//other ids that need to move around
|
//other ids that need to move around
|
||||||
val takenPositions = mutableListOf<Long>()
|
val takenPositions = mutableListOf<Long>()
|
||||||
for (dID in downloads.filter { !ids.contains(it) && it < lastID }.reversed()){
|
downloads.filter { !ids.contains(it) && it < lastID }.toMutableList().apply {
|
||||||
val newID = downloads.last { !newIDs.contains(it) && !takenPositions.contains(it) && it <= lastID }
|
this.reverse()
|
||||||
takenPositions.add(newID)
|
this.forEach { dID ->
|
||||||
dao.updateDownloadID(dID, newID)
|
val newID = downloads.last { !newIDs.contains(it) && !takenPositions.contains(it) && it <= lastID }
|
||||||
|
takenPositions.add(newID)
|
||||||
|
dao.updateDownloadID(dID, newID)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ids.forEachIndexed { idx, it ->
|
ids.forEachIndexed { idx, it ->
|
||||||
dao.updateDownloadID(-it, newIDs[idx])
|
dao.updateDownloadID(-it, newIDs[idx])
|
||||||
}
|
}
|
||||||
|
|
@ -782,7 +784,7 @@ class DownloadViewModel(private val application: Application) : AndroidViewModel
|
||||||
suspend fun putAtBottomOfQueue(ids: List<Long>) = CoroutineScope(Dispatchers.IO).launch{
|
suspend fun putAtBottomOfQueue(ids: List<Long>) = CoroutineScope(Dispatchers.IO).launch{
|
||||||
val downloads = dao.getQueuedDownloadsListIDs()
|
val downloads = dao.getQueuedDownloadsListIDs()
|
||||||
ids.forEach { dao.updateDownloadID(it, -it)}
|
ids.forEach { dao.updateDownloadID(it, -it)}
|
||||||
val newIDs = downloads.sortedByDescending { it }.take(ids.size)
|
val newIDs = downloads.takeLast(ids.size)
|
||||||
|
|
||||||
//other ids that need to move around
|
//other ids that need to move around
|
||||||
val takenPositions = mutableListOf<Long>()
|
val takenPositions = mutableListOf<Long>()
|
||||||
|
|
@ -792,8 +794,11 @@ class DownloadViewModel(private val application: Application) : AndroidViewModel
|
||||||
dao.updateDownloadID(dID, newID)
|
dao.updateDownloadID(dID, newID)
|
||||||
}
|
}
|
||||||
|
|
||||||
ids.reversed().forEachIndexed { idx, it ->
|
ids.toMutableList().apply {
|
||||||
dao.updateDownloadID(-it, newIDs[idx])
|
this.reverse()
|
||||||
|
this.forEachIndexed { idx, it ->
|
||||||
|
dao.updateDownloadID(-it, newIDs[idx])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -803,9 +808,12 @@ class DownloadViewModel(private val application: Application) : AndroidViewModel
|
||||||
dao.updateDownloadID(current, -current)
|
dao.updateDownloadID(current, -current)
|
||||||
|
|
||||||
if (current > id){
|
if (current > id){
|
||||||
for (dID in downloads.filter { it in id until current }.reversed()){
|
downloads.filter { it in id until current }.toMutableList().apply {
|
||||||
val index = downloads.indexOf(dID)
|
this.reverse()
|
||||||
dao.updateDownloadID(dID, downloads[index + 1])
|
this.forEach { dID ->
|
||||||
|
val index = downloads.indexOf(dID)
|
||||||
|
dao.updateDownloadID(dID, downloads[index + 1])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
for (dID in downloads.filter { it in (current + 1)..id }){
|
for (dID in downloads.filter { it in (current + 1)..id }){
|
||||||
|
|
|
||||||
|
|
@ -151,6 +151,7 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{
|
||||||
|
|
||||||
historyViewModel = ViewModelProvider(this)[HistoryViewModel::class.java]
|
historyViewModel = ViewModelProvider(this)[HistoryViewModel::class.java]
|
||||||
historyViewModel.allItems.observe(viewLifecycleOwner) {
|
historyViewModel.allItems.observe(viewLifecycleOwner) {
|
||||||
|
allhistoryList = it
|
||||||
if(it.isEmpty()){
|
if(it.isEmpty()){
|
||||||
noResults!!.visibility = VISIBLE
|
noResults!!.visibility = VISIBLE
|
||||||
selectionChips!!.visibility = GONE
|
selectionChips!!.visibility = GONE
|
||||||
|
|
|
||||||
8
fastlane/metadata/android/en-US/changelogs/108000000.txt
Normal file
8
fastlane/metadata/android/en-US/changelogs/108000000.txt
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
# What's Changed
|
||||||
|
|
||||||
|
- Update to Python 3.11, FFMpeg 7.0.1, Cryptodome-3.20.0, mutagen-1.47.0
|
||||||
|
- Re-added individual pause button for downloads
|
||||||
|
- Added ability to set preferred command template
|
||||||
|
- Added youtube extractor argument preferences
|
||||||
|
- Download Queue general fixes
|
||||||
|
- Read the Github changelog for more info
|
||||||
Loading…
Reference in a new issue