Add completion-time sort option for downloaded items
This commit is contained in:
parent
78554ea022
commit
a0f7ecec9a
|
|
@ -138,6 +138,7 @@ class DownloadInfo:
|
||||||
self.status = "pending"
|
self.status = "pending"
|
||||||
self.size = None
|
self.size = None
|
||||||
self.timestamp = time.time_ns()
|
self.timestamp = time.time_ns()
|
||||||
|
self.completion_timestamp = None
|
||||||
self.error = error
|
self.error = error
|
||||||
self.entry = entry
|
self.entry = entry
|
||||||
self.playlist_item_limit = playlist_item_limit
|
self.playlist_item_limit = playlist_item_limit
|
||||||
|
|
@ -417,6 +418,9 @@ class PersistentQueue:
|
||||||
v.thumbnail = None
|
v.thumbnail = None
|
||||||
if not hasattr(v, 'duration'):
|
if not hasattr(v, 'duration'):
|
||||||
v.duration = None
|
v.duration = None
|
||||||
|
# Ensure completion timestamp exists (added for completion-time sorting)
|
||||||
|
if not hasattr(v, 'completion_timestamp'):
|
||||||
|
v.completion_timestamp = None
|
||||||
self.dict[k] = Download(None, None, None, None, None, None, {}, v)
|
self.dict[k] = Download(None, None, None, None, None, None, {}, v)
|
||||||
|
|
||||||
def exists(self, key):
|
def exists(self, key):
|
||||||
|
|
@ -743,6 +747,7 @@ class DownloadQueue:
|
||||||
if download.canceled:
|
if download.canceled:
|
||||||
asyncio.create_task(self.notifier.canceled(download.info.url))
|
asyncio.create_task(self.notifier.canceled(download.info.url))
|
||||||
else:
|
else:
|
||||||
|
download.info.completion_timestamp = time.time_ns()
|
||||||
self.done.put(download)
|
self.done.put(download)
|
||||||
asyncio.create_task(self.notifier.completed(download.info))
|
asyncio.create_task(self.notifier.completed(download.info))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ export class AppComponent implements OnInit, OnDestroy {
|
||||||
status: DownloadTab = 'queued';
|
status: DownloadTab = 'queued';
|
||||||
selectedFolder = 'all';
|
selectedFolder = 'all';
|
||||||
filter = '';
|
filter = '';
|
||||||
sort: 'date' | 'title' | 'size' = 'date';
|
sort: 'date' | 'completion' | 'title' | 'size' = 'date';
|
||||||
sortAscending = false;
|
sortAscending = false;
|
||||||
view: 'list' | 'grid' = 'list';
|
view: 'list' | 'grid' = 'list';
|
||||||
isAdvancedOpen = false;
|
isAdvancedOpen = false;
|
||||||
|
|
@ -413,6 +413,8 @@ export class AppComponent implements OnInit, OnDestroy {
|
||||||
rows.sort((a, b) => a.value.title.localeCompare(b.value.title, 'zh') * dir);
|
rows.sort((a, b) => a.value.title.localeCompare(b.value.title, 'zh') * dir);
|
||||||
} else if (this.sort === 'size') {
|
} else if (this.sort === 'size') {
|
||||||
rows.sort((a, b) => ((a.value.size || 0) - (b.value.size || 0)) * dir);
|
rows.sort((a, b) => ((a.value.size || 0) - (b.value.size || 0)) * dir);
|
||||||
|
} else if (this.sort === 'completion') {
|
||||||
|
rows.sort((a, b) => ((a.value.completion_timestamp || a.value.timestamp || 0) - (b.value.completion_timestamp || b.value.timestamp || 0)) * dir);
|
||||||
} else {
|
} else {
|
||||||
rows.sort((a, b) => ((a.value.timestamp || 0) - (b.value.timestamp || 0)) * dir);
|
rows.sort((a, b) => ((a.value.timestamp || 0) - (b.value.timestamp || 0)) * dir);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@
|
||||||
</div>
|
</div>
|
||||||
<select class="tool-select" aria-label="排序方式" [ngModel]="sort" (ngModelChange)="sortChange.emit($event)">
|
<select class="tool-select" aria-label="排序方式" [ngModel]="sort" (ngModelChange)="sortChange.emit($event)">
|
||||||
<option value="date">按添加时间</option>
|
<option value="date">按添加时间</option>
|
||||||
|
<option value="completion">按完成时间</option>
|
||||||
<option value="title">按标题</option>
|
<option value="title">按标题</option>
|
||||||
<option value="size">按大小</option>
|
<option value="size">按大小</option>
|
||||||
</select>
|
</select>
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,7 @@ export interface Download {
|
||||||
duration?: number;
|
duration?: number;
|
||||||
thumbnail?: string;
|
thumbnail?: string;
|
||||||
timestamp?: number;
|
timestamp?: number;
|
||||||
|
completion_timestamp?: number;
|
||||||
website?: string;
|
website?: string;
|
||||||
file_exists?: boolean;
|
file_exists?: boolean;
|
||||||
checked?: boolean;
|
checked?: boolean;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue