Compare commits

..

No commits in common. "d29639a9c58a845a7931a0081ecc07fd81d2cc71" and "6fd0c6e7f6640e95c7444bbb5a5ab095c7321404" have entirely different histories.

3 changed files with 9 additions and 29 deletions

View File

@ -47,8 +47,8 @@ guide to switching back to the official build once the upstream fix lands.
./build-ytdlp.sh
docker buildx build --platform linux/amd64 \
--build-arg VERSION=1.26 \
-t 192.168.2.212:3000/tigeren/metube:1.26 \
--build-arg VERSION=1.25 \
-t 192.168.2.212:3000/tigeren/metube:1.25 \
--push .
```

View File

@ -867,12 +867,7 @@ class DownloadQueue:
key = entry.get('webpage_url') or entry['url']
if not self.queue.exists(key):
dl = DownloadInfo(video_id, entry.get('title') or video_id, key, quality, format, folder, custom_name_prefix, error, entry, playlist_item_limit)
result = await self.__add_download(dl, auto_start)
if result:
# __add_download reports a skipped duplicate or an error
# (e.g. {'status': 'ok', 'msg': 'Download already exists'});
# surface that instead of an unconditional success.
return result
await self.__add_download(dl, auto_start)
return {'status': 'ok'}
return {'status': 'error', 'msg': f'Unsupported resource "{etype}"'}

View File

@ -1,4 +1,4 @@
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Component, HostListener, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, distinctUntilChanged, map } from 'rxjs';
@ -17,7 +17,7 @@ export type DownloadTab = 'downloading' | 'queued' | 'completed';
styleUrls: ['./app.component.sass'],
standalone: false
})
export class AppComponent implements OnInit, OnDestroy {
export class AppComponent implements OnInit {
formats: Format[] = Formats;
qualities: Quality[];
themes: Theme[] = Themes;
@ -128,15 +128,6 @@ export class AppComponent implements OnInit, OnDestroy {
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
if (this.activeTheme.id === 'auto') this.setTheme(this.activeTheme);
});
// Listen in the capture phase so Escape closes the player even when the
// native video controls (shadow DOM) hold focus after seeking and would
// otherwise swallow the keydown before it bubbles to the document.
document.addEventListener('keydown', this.onPlayerKeydown, true);
}
ngOnDestroy(): void {
document.removeEventListener('keydown', this.onPlayerKeydown, true);
}
// ---------- Navigation ----------
@ -178,11 +169,10 @@ export class AppComponent implements OnInit, OnDestroy {
this.playerTitle = '';
}
private onPlayerKeydown = (event: KeyboardEvent): void => {
if (event.key === 'Escape' && this.playerUrl) {
this.closePlayer();
}
};
@HostListener('document:keydown.escape')
onEscape(): void {
if (this.playerUrl) this.closePlayer();
}
// ---------- Library (媒体库) ----------
@ -456,11 +446,6 @@ export class AppComponent implements OnInit, OnDestroy {
this.addInProgress = false;
if (status.status === 'error') {
this.toastService.show(`添加失败: ${status.msg}`, { error: true });
} else if (status.msg) {
// Backend skipped the URL (e.g. "Download already exists") — surface
// that instead of a misleading "added to queue".
this.toastService.show(status.msg, { error: true });
this.loadEvents();
} else {
this.addUrl = '';
this.toastService.show('已加入队列');