diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index 8a59cc1..1c03945 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -71,6 +71,9 @@ "options_video_shuffle_scope_hint": { "message": "If the selected category has no videos in the current source, all videos will play instead." }, + "options_video_repeat_current": { + "message": "Repeat current video" + }, "shuffle_scope_all": { "message": "All" }, diff --git a/src/_locales/ja/messages.json b/src/_locales/ja/messages.json index 7375a73..a95f0e4 100644 --- a/src/_locales/ja/messages.json +++ b/src/_locales/ja/messages.json @@ -71,6 +71,9 @@ "options_video_shuffle_scope_hint": { "message": "現在のソースに選択したカテゴリの動画がない場合、すべての動画が再生されます。" }, + "options_video_repeat_current": { + "message": "現在の動画を繰り返す" + }, "shuffle_scope_all": { "message": "すべて" }, diff --git a/src/_locales/zh_CN/messages.json b/src/_locales/zh_CN/messages.json index cd1d7df..08f2d4b 100644 --- a/src/_locales/zh_CN/messages.json +++ b/src/_locales/zh_CN/messages.json @@ -71,6 +71,9 @@ "options_video_shuffle_scope_hint": { "message": "如果当前视频源中没有所选类别的视频,将改为播放所有视频。" }, + "options_video_repeat_current": { + "message": "重复播放当前视频" + }, "shuffle_scope_all": { "message": "所有视频" }, diff --git a/src/_locales/zh_TW/messages.json b/src/_locales/zh_TW/messages.json index 710c776..0e5aaea 100644 --- a/src/_locales/zh_TW/messages.json +++ b/src/_locales/zh_TW/messages.json @@ -71,6 +71,9 @@ "options_video_shuffle_scope_hint": { "message": "如果目前影片來源中沒有所選類別的影片,將改為播放所有影片。" }, + "options_video_repeat_current": { + "message": "重複播放目前影片" + }, "shuffle_scope_all": { "message": "所有影片" }, diff --git a/src/components/VideoBackground.svelte b/src/components/VideoBackground.svelte index f1f0186..037ecab 100644 --- a/src/components/VideoBackground.svelte +++ b/src/components/VideoBackground.svelte @@ -110,6 +110,10 @@ scheduleVideoChange(scopes); } + function handleVideoEnded() { + if (!settings.repeatCurrentVideo) nextVideo(); + } + function onCanPlay() { opacity = 1; consecutiveErrors = 0; @@ -154,9 +158,10 @@ src={currentUrl} autoplay muted + loop={settings.repeatCurrentVideo} style:opacity={opacity} oncanplay={onCanPlay} - onended={nextVideo} + onended={handleVideoEnded} onerror={onError} > {/key} diff --git a/src/lib/defaults.js b/src/lib/defaults.js index e067b32..cd4676a 100644 --- a/src/lib/defaults.js +++ b/src/lib/defaults.js @@ -18,6 +18,7 @@ export const DEFAULTS = Object.freeze({ videoSrc: 'apple', reverseProxy: true, shuffleScopes: ['all'], + repeatCurrentVideo: false, showVideoMetadata: true, translateMotto: false, zenMusic: true, diff --git a/src/options/sections/VideoSection.svelte b/src/options/sections/VideoSection.svelte index 78c47d2..6f585ca 100644 --- a/src/options/sections/VideoSection.svelte +++ b/src/options/sections/VideoSection.svelte @@ -60,6 +60,18 @@ {t('options_video_shuffle_scope_hint')}

+ + {#if settings.videoSrc === 'apple'}