웹 브라우저: 동영상을 못 찾은 페이지의 다운로드 버튼은 테두리만 (137)
- 덜 눈에 띄게 하려던 tonal 버튼이 이 테마에서 채움 버튼과 거의 같아 보였다 → OutlinedButton · IconButton.outlined. - YouTube 첫 화면 · 구독 목록은 미리보기 <video> 가 있어 동영상 있음으로 보였다 → 동영상 주소가 정해진 사이트 (YouTube · Vimeo · TikTok · 치지직 등) 는 주소로만, 그 밖은 페이지 안의 <video> 로 (downloadLooksUseful). - browser_test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>묶음4
parent
b1f2b1aef4
commit
afdbcfb2d7
|
|
@ -24,3 +24,15 @@ bool looksLikeVideoPage(String url) {
|
|||
caseSensitive: false,
|
||||
).hasMatch(url);
|
||||
}
|
||||
|
||||
/// 137: 동영상 페이지 주소가 정해져 있는 사이트 (YouTube 등). 이런 사이트는 주소만으로 판단한다 -
|
||||
/// 첫 화면 · 구독 목록에도 미리보기 <video> 가 있어 "동영상 있음" 으로 보였다.
|
||||
bool isKnownVideoSite(String url) => RegExp(
|
||||
r'^https?://([\w-]+\.)*(youtube\.com|youtu\.be|vimeo\.com|dailymotion\.com|twitch\.tv|tiktok\.com|instagram\.com|'
|
||||
r'tv\.naver\.com|chzzk\.naver\.com|bilibili\.com|nicovideo\.jp)(/|$)',
|
||||
caseSensitive: false,
|
||||
).hasMatch(url);
|
||||
|
||||
/// 137: 다운로드 버튼을 눈에 띄게 (채움) 할지 - 주소가 동영상 페이지이거나, 주소로 판단하지 않는 사이트에서 <video> 를 찾았을 때
|
||||
bool downloadLooksUseful(String url, {required bool pageHasVideo}) =>
|
||||
looksLikeVideoPage(url) || (pageHasVideo && !isKnownVideoSite(url));
|
||||
|
|
|
|||
|
|
@ -399,8 +399,8 @@ class _BrowserPageState extends State<BrowserPage> with RouteAware {
|
|||
/// 27: 어느 사이트에서나 받아 볼 수 있다 (yt-dlp 가 지원하면 받고, 아니면 다운로드 목록에 이유가 보인다)
|
||||
bool get _canDownload => widget.downloads != null && _url.startsWith('http');
|
||||
|
||||
/// 동영상이 있어 보이는 페이지 (버튼을 눈에 띄게)
|
||||
bool get _likelyVideo => looksLikeVideoPage(_url) || _hasVideo;
|
||||
/// 동영상이 있어 보이는 페이지 (버튼을 눈에 띄게). 137: 못 찾은 페이지는 테두리만 있는 버튼
|
||||
bool get _likelyVideo => downloadLooksUseful(_url, pageHasVideo: _hasVideo);
|
||||
|
||||
String get _downloadTip =>
|
||||
_likelyVideo ? tr('다운로드') : tr('다운로드 (이 페이지에서 동영상을 찾지 못했지만 받아 볼 수 있습니다)');
|
||||
|
|
@ -650,7 +650,7 @@ class _BrowserPageState extends State<BrowserPage> with RouteAware {
|
|||
onPressed: _canDownload ? _download : null,
|
||||
icon: const Icon(Icons.download, size: 18),
|
||||
)
|
||||
: IconButton.filledTonal(
|
||||
: IconButton.outlined(
|
||||
tooltip: _downloadTip,
|
||||
visualDensity: VisualDensity.compact,
|
||||
onPressed: _canDownload ? _download : null,
|
||||
|
|
@ -665,7 +665,7 @@ class _BrowserPageState extends State<BrowserPage> with RouteAware {
|
|||
icon: const Icon(Icons.download, size: 18),
|
||||
label: Text(tr('다운로드')),
|
||||
)
|
||||
: FilledButton.tonalIcon(
|
||||
: OutlinedButton.icon(
|
||||
onPressed: _canDownload ? _download : null,
|
||||
icon: const Icon(Icons.download, size: 18),
|
||||
label: Text(tr('다운로드')),
|
||||
|
|
|
|||
|
|
@ -146,6 +146,14 @@ void main() {
|
|||
expect(looksLikeVideoPage('https://tv.naver.com/v/123'), isTrue);
|
||||
expect(looksLikeVideoPage('https://www.google.com/'), isFalse);
|
||||
});
|
||||
test('137: 다운로드 버튼을 눈에 띄게 할지 - YouTube 첫 화면 · 구독 목록은 미리보기 <video> 가 있어도 아님', () {
|
||||
expect(downloadLooksUseful('https://www.youtube.com/', pageHasVideo: true), isFalse);
|
||||
expect(downloadLooksUseful('https://m.youtube.com/feed/subscriptions', pageHasVideo: true), isFalse);
|
||||
expect(downloadLooksUseful('https://www.youtube.com/watch?v=abc', pageHasVideo: false), isTrue);
|
||||
// 주소로 판단하지 않는 사이트는 페이지 안의 <video> 로
|
||||
expect(downloadLooksUseful('https://example.com/post/1', pageHasVideo: true), isTrue);
|
||||
expect(downloadLooksUseful('https://example.com/post/1', pageHasVideo: false), isFalse);
|
||||
});
|
||||
test('앱 안 브라우저 쿠키 → yt-dlp', () {
|
||||
// 내보낸 cookies.txt 가 없으면 쿠키 없이 (프로필 폴더를 직접 읽지 않는다)
|
||||
expect(ytDlpCookieArgs(browser: internalBrowserCookies, internalProfile: r'C:\w\EBWebView\Default'), isEmpty);
|
||||
|
|
@ -382,9 +390,11 @@ void main() {
|
|||
expect(find.text('수정 · 이동'), findsOneWidget);
|
||||
await tester.tapAt(const Offset(5, 880));
|
||||
await tester.pumpAndSettle();
|
||||
FilledButton dl() => tester.widget<FilledButton>(find.ancestor(of: find.text('다운로드'), matching: find.byWidgetPredicate((w) => w is FilledButton)));
|
||||
// 27: 동영상 페이지가 아니어도 받아 볼 수 있다 (덜 눈에 띄는 버튼 · 안내)
|
||||
ButtonStyleButton dl() =>
|
||||
tester.widget<ButtonStyleButton>(find.ancestor(of: find.text('다운로드'), matching: find.byWidgetPredicate((w) => w is ButtonStyleButton)));
|
||||
// 27: 동영상 페이지가 아니어도 받아 볼 수 있다 (덜 눈에 띄는 버튼 · 안내). 137: 테두리만 있는 버튼
|
||||
expect(dl().onPressed, isNotNull);
|
||||
expect(dl(), isA<OutlinedButton>());
|
||||
expect(find.byTooltip('다운로드 (이 페이지에서 동영상을 찾지 못했지만 받아 볼 수 있습니다)'), findsOneWidget);
|
||||
|
||||
// 주소창 입력 → 이동
|
||||
|
|
@ -395,6 +405,7 @@ void main() {
|
|||
host.onTitle('재미있는 영상');
|
||||
await tester.pump();
|
||||
expect(dl().onPressed, isNotNull);
|
||||
expect(dl(), isA<FilledButton>(), reason: '137: 동영상 페이지는 진한 버튼');
|
||||
await tester.tap(find.text('다운로드'));
|
||||
await tester.pump();
|
||||
expect(video.started, ['https://www.youtube.com/watch?v=abc']);
|
||||
|
|
|
|||
Loading…
Reference in New Issue