diff --git a/web/src/pages/StrmGenerateSection.tsx b/web/src/pages/StrmGenerateSection.tsx index cfe944a..600c37d 100644 --- a/web/src/pages/StrmGenerateSection.tsx +++ b/web/src/pages/StrmGenerateSection.tsx @@ -1,11 +1,18 @@ import type { FormEvent } from 'react' -import { Loader2, Save, Wand2 } from 'lucide-react' import type { GenerateSTRMResult } from '../api/strm' import type { Library } from '../types' -import { currentOrigin, type CloudPlaybackMode } from './strmPageModel' +import type { CloudPlaybackMode } from './strmPageModel' +import { + PlaybackPreferencePanel, + PlaybackTogglePanel, + StrmGenerateForm, + StrmGenerateHeader, + StrmGenerateHint, + StrmGenerateResultPanel, +} from './StrmGenerateSectionParts' -type StrmGenerateSectionProps = { +export type StrmGenerateSectionProps = { libraries: Library[] generateLibraryID: string baseURL: string @@ -31,173 +38,19 @@ type StrmGenerateSectionProps = { setOverwrite: (value: boolean) => void } -export function StrmGenerateSection({ - libraries, - generateLibraryID, - baseURL, - outputDir, - cloudPlaybackMode, - strmPlaybackEnabled, - redirectProxyEnabled, - autoGenerate, - savingSettings, - overwrite, - generating, - generateResult, - playbackStatus, - onGenerate, - saveSTRMSettings, - setGenerateLibraryID, - setBaseURL, - setOutputDir, - setCloudPlaybackMode, - setStrmPlaybackEnabled, - setRedirectProxyEnabled, - setAutoGenerate, - setOverwrite, -}: StrmGenerateSectionProps) { +export function StrmGenerateSection(props: StrmGenerateSectionProps) { return (
-
-
-

自动生成 STRM 文件

-

- 只需要填写自己的访问域名,系统会按媒体库内每个媒体批量生成可播放的 .strm 文件。 -

-
- - {playbackStatus} - -
-
- - -
-
- - - -
-
- - setBaseURL(e.target.value)} - /> - - - setOutputDir(e.target.value)} - /> - -
-

- 生成内容为 域名 + /api/stream/媒体ID?token=...;第三方客户端播放优先方式由上方「STRMURL / 302反代」模式决定。域名会同步保存到系统设置中的「公开访问域名 / STRM 域名」。 -

- {generateResult && ( -
-
- 输出目录:{generateResult.output_dir} -
-
- 新增 {generateResult.generated} · 更新 {generateResult.updated} · 跳过 {generateResult.skipped} · 清理 {generateResult.cleaned || 0} -
- {generateResult.errors && generateResult.errors.length > 0 && ( -
- 失败 {generateResult.errors.length} 条:{generateResult.errors.slice(0, 3).join(';')} -
- )} -
- )} + + + + + +
) } diff --git a/web/src/pages/StrmGenerateSectionParts.tsx b/web/src/pages/StrmGenerateSectionParts.tsx new file mode 100644 index 0000000..ebe6470 --- /dev/null +++ b/web/src/pages/StrmGenerateSectionParts.tsx @@ -0,0 +1,259 @@ +import { Loader2, Save, Wand2 } from 'lucide-react' + +import type { GenerateSTRMResult } from '../api/strm' +import type { Library } from '../types' +import { currentOrigin, type CloudPlaybackMode } from './strmPageModel' +import type { StrmGenerateSectionProps } from './StrmGenerateSection' + +type PlaybackStatusProps = Pick< + StrmGenerateSectionProps, + 'playbackStatus' | 'strmPlaybackEnabled' | 'redirectProxyEnabled' +> + +export function StrmGenerateHeader({ playbackStatus, strmPlaybackEnabled, redirectProxyEnabled }: PlaybackStatusProps) { + const enabled = strmPlaybackEnabled || redirectProxyEnabled + return ( +
+
+

自动生成 STRM 文件

+

+ 只需要填写自己的访问域名,系统会按媒体库内每个媒体批量生成可播放的 .strm 文件。 +

+
+ + {playbackStatus} + +
+ ) +} + +type PlaybackToggleProps = Pick< + StrmGenerateSectionProps, + 'strmPlaybackEnabled' | 'redirectProxyEnabled' | 'setStrmPlaybackEnabled' | 'setRedirectProxyEnabled' +> + +export function PlaybackTogglePanel({ + strmPlaybackEnabled, + redirectProxyEnabled, + setStrmPlaybackEnabled, + setRedirectProxyEnabled, +}: PlaybackToggleProps) { + return ( +
+ + +
+ ) +} + +type PlaybackToggleItemProps = { + checked: boolean + title: string + description: string + onChange: (value: boolean) => void +} + +function PlaybackToggle({ checked, title, description, onChange }: PlaybackToggleItemProps) { + return ( + + ) +} + +type PlaybackPreferenceProps = Pick< + StrmGenerateSectionProps, + | 'cloudPlaybackMode' + | 'strmPlaybackEnabled' + | 'redirectProxyEnabled' + | 'autoGenerate' + | 'savingSettings' + | 'saveSTRMSettings' + | 'setCloudPlaybackMode' + | 'setAutoGenerate' +> + +export function PlaybackPreferencePanel({ + cloudPlaybackMode, + strmPlaybackEnabled, + redirectProxyEnabled, + autoGenerate, + savingSettings, + saveSTRMSettings, + setCloudPlaybackMode, + setAutoGenerate, +}: PlaybackPreferenceProps) { + return ( +
+ + + +
+ ) +} + +type StrmGenerateFormProps = Pick< + StrmGenerateSectionProps, + | 'libraries' + | 'generateLibraryID' + | 'baseURL' + | 'outputDir' + | 'overwrite' + | 'generating' + | 'onGenerate' + | 'setGenerateLibraryID' + | 'setBaseURL' + | 'setOutputDir' + | 'setOverwrite' +> + +export function StrmGenerateForm({ + libraries, + generateLibraryID, + baseURL, + outputDir, + overwrite, + generating, + onGenerate, + setGenerateLibraryID, + setBaseURL, + setOutputDir, + setOverwrite, +}: StrmGenerateFormProps) { + return ( +
+ + setBaseURL(e.target.value)} + /> + + + setOutputDir(e.target.value)} + /> + + + ) +} + +type LibrarySelectProps = { + libraries: Library[] + value: string + onChange: (value: string) => void +} + +function LibrarySelect({ libraries, value, onChange }: LibrarySelectProps) { + return ( + + ) +} + +export function StrmGenerateHint() { + return ( +

+ 生成内容为 域名 + /api/stream/媒体ID?token=...;第三方客户端播放优先方式由上方「STRMURL / 302反代」模式决定。域名会同步保存到系统设置中的「公开访问域名 / STRM 域名」。 +

+ ) +} + +export function StrmGenerateResultPanel({ result }: { result: GenerateSTRMResult | null }) { + if (!result) { + return null + } + return ( +
+
+ 输出目录:{result.output_dir} +
+
+ 新增 {result.generated} · 更新 {result.updated} · 跳过 {result.skipped} · 清理 {result.cleaned || 0} +
+ {result.errors && result.errors.length > 0 && ( +
+ 失败 {result.errors.length} 条:{result.errors.slice(0, 3).join(';')} +
+ )} +
+ ) +}