feat: subscription for youtube platfrom

This commit is contained in:
Peifan Li
2025-12-02 00:04:34 -05:00
parent 7caa924264
commit 6a42b658b3
17 changed files with 701 additions and 8 deletions

View File

@@ -1,6 +1,6 @@
# MyTube
一个 YouTube/Bilibili/MissAV 视频下载和播放应用,允许您将视频及其缩略图本地保存。将您的视频整理到收藏夹中,以便轻松访问和管理。现已支持[yt-dlp所有网址](https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md##)包括微博小红书x.com等。
一个 YouTube/Bilibili/MissAV 视频下载和播放应用,允许您将视频及其缩略图本地保存并提供订阅下载功能。将您的视频整理到收藏夹中,以便轻松访问和管理。现已支持[yt-dlp所有网址](https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md##)包括微博小红书x.com等。
[English](README.md)
@@ -23,6 +23,7 @@
- **视频播放器**:自定义播放器,支持播放/暂停、循环、快进/快退、全屏和调光控制。
- **搜索功能**:支持在本地库中搜索视频,或在线搜索 YouTube 视频。
- **收藏夹**:创建自定义收藏夹以整理您的视频。
- **订阅功能**:订阅您喜爱的频道,并在新视频发布时收到通知。
- **现代化 UI**:响应式深色主题界面,包含“返回主页”功能和玻璃拟态效果。
- **主题支持**:支持在明亮和深色模式之间切换,支持平滑过渡。
- **登录保护**:通过密码登录页面保护您的应用。
@@ -154,6 +155,11 @@ npm run lint:fix # 修复前端代码检查错误
- `PUT /api/collections/:id` - 更新收藏夹 (添加/移除视频)
- `DELETE /api/collections/:id` - 删除收藏夹
### 订阅
- `GET /api/subscriptions` - 获取所有订阅
- `POST /api/subscriptions` - 创建新订阅
- `DELETE /api/subscriptions/:id` - 删除订阅
### 设置与系统
- `GET /api/settings` - 获取应用设置
- `POST /api/settings` - 更新应用设置
@@ -228,6 +234,16 @@ MAX_FILE_SIZE=500000000
[![Star History Chart](https://api.star-history.com/svg?repos=franklioxygen/MyTube&type=date&legend=bottom-right)](https://www.star-history.com/#franklioxygen/MyTube&type=date&legend=bottom-right)
## 免责声明
- 使用目的与限制 本软件(及相关代码、文档)仅供个人学习、研究及技术交流使用。严禁将本软件用于任何形式的商业用途,或利用本软件进行违反国家法律法规的犯罪活动。
- 责任界定 开发者对用户使用本软件的具体行为概不知情,亦无法控制。因用户非法或不当使用本软件(包括但不限于侵犯第三方版权、下载违规内容等)而产生的任何法律责任、纠纷或损失,均由用户自行承担,开发者不承担任何直接、间接或连带责任。
- 二次开发与分发 本项目代码开源,任何个人或组织基于本项目代码进行修改、二次开发时,应遵守开源协议。 特别声明: 若第三方人为修改代码以规避、去除本软件原有的用户认证机制/安全限制,并进行公开分发或传播,由此引发的一切责任事件及法律后果,需由该代码修改发布者承担全部责任。我们强烈不建议用户规避或篡改任何安全验证机制。
- 非盈利声明 本项目为完全免费的开源项目。开发者从未在任何平台发布捐赠信息,本软件本身不收取任何费用,亦不提供任何形式的付费增值服务。任何声称代表本项目收取费用、销售软件或寻求捐赠的信息均为虚假信息,请用户仔细甄别,谨防上当受骗。
## 许可证
MIT

View File

@@ -28,6 +28,7 @@ A YouTube/Bilibili/MissAV video downloader and player application that allows yo
- **Login Protection**: Secure your application with a password login page.
- **Internationalization**: Support for multiple languages including English, Chinese, Spanish, French, German, Japanese, Korean, Arabic, and Portuguese.
- **Pagination**: Efficiently browse large libraries with pagination support.
- **Subscriptions**: Manage subscriptions to channels or creators to automatically download new content.
- **Video Rating**: Rate your videos with a 5-star system.
- **Mobile Optimizations**: Mobile-friendly tags menu and optimized layout for smaller screens.
- **Temp Files Cleanup**: Manage storage by cleaning up temporary download files directly from settings.
@@ -154,6 +155,11 @@ npm run lint:fix # Fix linting errors for frontend
- `PUT /api/collections/:id` - Update a collection (add/remove videos)
- `DELETE /api/collections/:id` - Delete a collection
### Subscriptions
- `GET /api/subscriptions` - Get all subscriptions
- `POST /api/subscriptions` - Create a new subscription
- `DELETE /api/subscriptions/:id` - Delete a subscription
### Settings & System
- `GET /api/settings` - Get application settings
- `POST /api/settings` - Update application settings
@@ -228,6 +234,16 @@ For detailed instructions on how to deploy MyTube using Docker or on QNAP Contai
[![Star History Chart](https://api.star-history.com/svg?repos=franklioxygen/MyTube&type=date&legend=bottom-right)](https://www.star-history.com/#franklioxygen/MyTube&type=date&legend=bottom-right)
## Disclaimer
- Purpose and Restrictions This software (including code and documentation) is intended solely for personal learning, research, and technical exchange. It is strictly prohibited to use this software for any commercial purposes or for any illegal activities that violate local laws and regulations.
- Liability The developer is unaware of and has no control over how users utilize this software. Any legal liabilities, disputes, or damages arising from the illegal or improper use of this software (including but not limited to copyright infringement) shall be borne solely by the user. The developer assumes no direct, indirect, or joint liability.
- Modifications and Distribution This project is open-source. Any individual or organization modifying or forking this code must comply with the open-source license. Important: If a third party modifies the code to bypass or remove the original user authentication/security mechanisms and distributes such versions, the modifier/distributor bears full responsibility for any consequences. We strongly discourage bypassing or tampering with any security verification mechanisms.
- Non-Profit Statement This is a completely free open-source project. The developer does not accept donations and has never published any donation pages. The software itself allows no charges and offers no paid services. Please be vigilant and beware of any scams or misleading information claiming to collect fees on behalf of this project.
## License
MIT

View File

@@ -15,6 +15,7 @@ import AuthorVideos from './pages/AuthorVideos';
import CollectionPage from './pages/CollectionPage';
import DownloadPage from './pages/DownloadPage';
import Home from './pages/Home';
import InstructionPage from './pages/InstructionPage';
import LoginPage from './pages/LoginPage';
import ManagePage from './pages/ManagePage';
import SettingsPage from './pages/SettingsPage';
@@ -113,6 +114,7 @@ function AppContent() {
<Route path="/author/:name" element={<AuthorVideos />} />
<Route path="/video/:id" element={<VideoPlayer />} />
<Route path="/subscriptions" element={<SubscriptionsPage />} />
<Route path="/instruction" element={<InstructionPage />} />
</Routes>
</Box>

View File

@@ -0,0 +1,30 @@
import { Box, Paper, Typography } from '@mui/material';
import React from 'react';
import { en } from '../utils/locales/en';
const Disclaimer: React.FC = () => {
return (
<Box sx={{ mt: 4, mb: 2 }}>
<Paper
elevation={0}
sx={{
p: 3,
bgcolor: (theme) => theme.palette.mode === 'dark' ? 'rgba(30, 30, 30, 0.6)' : 'background.paper',
border: '1px solid',
borderColor: (theme) => theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)',
borderRadius: 4,
backdropFilter: 'blur(10px)'
}}
>
<Typography variant="subtitle1" sx={{ fontWeight: 'bold', mb: 1, color: 'primary.main' }}>
{en.disclaimerTitle}
</Typography>
<Typography variant="body2" color="text.secondary" sx={{ whiteSpace: 'pre-line' }}>
{en.disclaimerText}
</Typography>
</Paper>
</Box>
);
};
export default Disclaimer;

View File

@@ -3,6 +3,7 @@ import {
Brightness7,
Clear,
Download,
Help,
Menu as MenuIcon,
Search,
Settings,
@@ -337,6 +338,9 @@ const Header: React.FC<HeaderProps> = ({
<MenuItem onClick={() => { handleManageClose(); navigate('/settings'); }}>
<Settings sx={{ mr: 2 }} /> {t('settings')}
</MenuItem>
<MenuItem onClick={() => { handleManageClose(); navigate('/instruction'); }}>
<Help sx={{ mr: 2 }} /> {t('instruction')}
</MenuItem>
</Menu>
</Box>
);

View File

@@ -0,0 +1,180 @@
import { Box, Container, Divider, List, ListItem, ListItemText, Paper, Typography } from '@mui/material';
import React from 'react';
import Disclaimer from '../components/Disclaimer';
import { useLanguage } from '../contexts/LanguageContext';
const InstructionPage: React.FC = () => {
const { t } = useLanguage();
const renderInstructions = () => (
<Paper elevation={0} sx={{ p: 3, bgcolor: 'transparent' }}>
{/* Section 1 */}
<Box sx={{ mb: 4 }}>
<Typography variant="h5" gutterBottom sx={{ fontWeight: 'bold', color: 'primary.main' }}>
{t('instructionSection1Title')}
</Typography>
<Typography variant="body1" paragraph color="text.secondary">
{t('instructionSection1Desc')}
</Typography>
<Box sx={{ ml: 2 }}>
<Typography variant="subtitle1" sx={{ fontWeight: 'bold', mt: 2 }}>
{t('instructionSection1Sub1')}
</Typography>
<List dense>
<ListItem>
<ListItemText
primary={<><b>{t('instructionSection1Item1Label')}</b> {t('instructionSection1Item1Text')}</>}
/>
</ListItem>
<ListItem>
<ListItemText
primary={<><b>{t('instructionSection1Item2Label')}</b> {t('instructionSection1Item2Text')}</>}
/>
</ListItem>
</List>
<Typography variant="subtitle1" sx={{ fontWeight: 'bold', mt: 2 }}>
{t('instructionSection1Sub2')}
</Typography>
<List dense>
<ListItem>
<ListItemText
primary={<><b>{t('instructionSection1Item3Label')}</b> {t('instructionSection1Item3Text')}</>}
/>
</ListItem>
<ListItem>
<ListItemText
primary={<><b>{t('instructionSection1Item4Label')}</b> {t('instructionSection1Item4Text')}</>}
/>
</ListItem>
</List>
<Typography variant="subtitle1" sx={{ fontWeight: 'bold', mt: 2 }}>
{t('instructionSection1Sub3')}
</Typography>
<List dense>
<ListItem>
<ListItemText
primary={<><b>{t('instructionSection1Item5Label')}</b> {t('instructionSection1Item5Text')}</>}
/>
</ListItem>
<ListItem>
<ListItemText
primary={<><b>{t('instructionSection1Item6Label')}</b> {t('instructionSection1Item6Text')}</>}
/>
</ListItem>
<ListItem>
<ListItemText
primary={<><b>{t('instructionSection1Item7Label')}</b> {t('instructionSection1Item7Text')}</>}
/>
</ListItem>
</List>
</Box>
</Box>
<Divider sx={{ my: 3 }} />
{/* Section 2 */}
<Box sx={{ mb: 4 }}>
<Typography variant="h5" gutterBottom sx={{ fontWeight: 'bold', color: 'primary.main' }}>
{t('instructionSection2Title')}
</Typography>
<Typography variant="body1" paragraph color="text.secondary">
{t('instructionSection2Desc')}
</Typography>
<Box sx={{ ml: 2 }}>
<Typography variant="subtitle1" sx={{ fontWeight: 'bold', mt: 2 }}>
{t('instructionSection2Sub1')}
</Typography>
<Typography variant="body2" sx={{ mb: 1, ml: 2 }}>
{t('instructionSection2Text1')}
</Typography>
<Typography variant="subtitle1" sx={{ fontWeight: 'bold', mt: 2 }}>
{t('instructionSection2Sub2')}
</Typography>
<Typography variant="body2" sx={{ mb: 1, ml: 2 }}>
{t('instructionSection2Text2')}
</Typography>
</Box>
</Box>
<Divider sx={{ my: 3 }} />
{/* Section 3 */}
<Box sx={{ mb: 4 }}>
<Typography variant="h5" gutterBottom sx={{ fontWeight: 'bold', color: 'primary.main' }}>
{t('instructionSection3Title')}
</Typography>
<Typography variant="body1" paragraph color="text.secondary">
{t('instructionSection3Desc')}
</Typography>
<Box sx={{ ml: 2 }}>
<Typography variant="subtitle1" sx={{ fontWeight: 'bold', mt: 2 }}>
{t('instructionSection3Sub1')}
</Typography>
<Typography variant="body2" sx={{ mb: 1, ml: 2 }}>
{t('instructionSection3Text1')}
</Typography>
<Typography variant="subtitle1" sx={{ fontWeight: 'bold', mt: 2 }}>
{t('instructionSection3Sub2')}
</Typography>
<Typography variant="body2" sx={{ mb: 1, ml: 2 }}>
{t('instructionSection3Text2')}
</Typography>
<Typography variant="subtitle1" sx={{ fontWeight: 'bold', mt: 2 }}>
{t('instructionSection3Sub3')}
</Typography>
<List dense>
<ListItem>
<ListItemText
primary={<><b>{t('instructionSection3Item1Label')}</b> {t('instructionSection3Item1Text')}</>}
/>
</ListItem>
<ListItem>
<ListItemText
primary={<><b>{t('instructionSection3Item2Label')}</b> {t('instructionSection3Item2Text')}</>}
/>
</ListItem>
</List>
<Typography variant="subtitle1" sx={{ fontWeight: 'bold', mt: 2 }}>
{t('instructionSection3Sub4')}
</Typography>
<List dense>
<ListItem>
<ListItemText
primary={<><b>{t('instructionSection3Item3Label')}</b> {t('instructionSection3Item3Text')}</>}
/>
</ListItem>
</List>
</Box>
</Box>
<Divider sx={{ my: 3 }} />
<Disclaimer />
</Paper>
);
return (
<Container maxWidth="lg" sx={{ py: 4 }}>
<Box sx={{ mb: 4 }}>
<Typography variant="h4" component="h1" gutterBottom sx={{ fontWeight: 'bold' }}>
{t('instruction')}
</Typography>
</Box>
<Box>
{renderInstructions()}
</Box>
</Container>
);
};
export default InstructionPage;

View File

@@ -14,6 +14,7 @@ import {
} from '@mui/material';
import axios from 'axios';
import React, { useEffect, useState } from 'react';
import ConfirmationModal from '../components/ConfirmationModal';
import { useLanguage } from '../contexts/LanguageContext';
import { useSnackbar } from '../contexts/SnackbarContext';
@@ -35,6 +36,8 @@ const SubscriptionsPage: React.FC = () => {
const { t } = useLanguage();
const { showSnackbar } = useSnackbar();
const [subscriptions, setSubscriptions] = useState<Subscription[]>([]);
const [isUnsubscribeModalOpen, setIsUnsubscribeModalOpen] = useState(false);
const [selectedSubscription, setSelectedSubscription] = useState<{ id: string; author: string } | null>(null);
useEffect(() => {
fetchSubscriptions();
@@ -50,18 +53,24 @@ const SubscriptionsPage: React.FC = () => {
}
};
const handleUnsubscribe = async (id: string, author: string) => {
if (!window.confirm(t('confirmUnsubscribe', { author }))) {
return;
}
const handleUnsubscribeClick = (id: string, author: string) => {
setSelectedSubscription({ id, author });
setIsUnsubscribeModalOpen(true);
};
const handleConfirmUnsubscribe = async () => {
if (!selectedSubscription) return;
try {
await axios.delete(`${API_URL}/subscriptions/${id}`);
await axios.delete(`${API_URL}/subscriptions/${selectedSubscription.id}`);
showSnackbar(t('unsubscribedSuccessfully'));
fetchSubscriptions();
} catch (error) {
console.error('Error unsubscribing:', error);
showSnackbar(t('error'));
} finally {
setIsUnsubscribeModalOpen(false);
setSelectedSubscription(null);
}
};
@@ -117,7 +126,7 @@ const SubscriptionsPage: React.FC = () => {
<TableCell align="right">
<IconButton
color="error"
onClick={() => handleUnsubscribe(sub.id, sub.author)}
onClick={() => handleUnsubscribeClick(sub.id, sub.author)}
title={t('unsubscribe')}
>
<Delete />
@@ -129,6 +138,16 @@ const SubscriptionsPage: React.FC = () => {
</TableBody>
</Table>
</TableContainer>
<ConfirmationModal
isOpen={isUnsubscribeModalOpen}
onClose={() => setIsUnsubscribeModalOpen(false)}
onConfirm={handleConfirmUnsubscribe}
title={t('unsubscribe')}
message={t('confirmUnsubscribe', { author: selectedSubscription?.author || '' })}
confirmText={t('unsubscribe')}
isDanger
/>
</Container >
);
};

View File

@@ -294,4 +294,46 @@ export const ar = {
subscriptionAlreadyExists: "أنت مشترك بالفعل في هذا المؤلف.",
minutes: "دقائق",
never: "أبداً",
// Instruction Page
instructionSection1Title: "1. التنزيل وإدارة المهام",
instructionSection1Desc: "تتضمن هذه الوحدة وظائف الحصول على الفيديو والمهام المجمعة واستيراد الملفات.",
instructionSection1Sub1: "تنزيل الرابط:",
instructionSection1Item1Label: "تنزيل أساسي:",
instructionSection1Item1Text: "الصق روابط من مواقع فيديو مختلفة في مربع الإدخال للتنزيل مباشرة.",
instructionSection1Item2Label: "الأذونات:",
instructionSection1Item2Text: "بالنسبة للمواقع التي تتطلب عضوية أو تسجيل دخول، يرجى تسجيل الدخول إلى الحساب المقابل في علامة تبويب متصفح جديدة أولاً للحصول على أذونات التنزيل.",
instructionSection1Sub2: "التعرف الذكي:",
instructionSection1Item3Label: "اشتراك مؤلف YouTube:",
instructionSection1Item3Text: "عندما يكون الرابط الذي تم لصقه هو قناة مؤلف، سيسأل النظام عما إذا كنت تريد الاشتراك. بعد الاشتراك، يمكن للنظام مسح وتنزيل تحديثات المؤلف تلقائيًا على فترات زمنية محددة.",
instructionSection1Item4Label: "تنزيل مجموعة Bilibili:",
instructionSection1Item4Text: "عندما يكون الرابط الذي تم لصقه مفضلة/مجموعة Bilibili، سيسأل النظام عما إذا كنت تريد تنزيل محتوى المجموعة بالكامل.",
instructionSection1Sub3: "أدوات متقدمة (صفحة إدارة التنزيل):",
instructionSection1Item5Label: "إضافة مهام مجمعة:",
instructionSection1Item5Text: "يدعم لصق روابط تنزيل متعددة في وقت واحد (واحد في كل سطر) للإضافة المجمعة.",
instructionSection1Item6Label: "مسح الملفات:",
instructionSection1Item6Text: "يبحث تلقائيًا عن جميع الملفات في الدليل الجذر لتخزين الفيديو والمجلدات من المستوى الأول. هذه الوظيفة مناسبة لمزامنة الملفات مع النظام بعد أن يقوم المسؤولون بإيداعها يدويًا في الواجهة الخلفية للخادم.",
instructionSection1Item7Label: "تحميل فيديو:",
instructionSection1Item7Text: "يدعم تحميل ملفات الفيديو المحلية مباشرة من العميل إلى الخادم.",
instructionSection2Title: "2. إدارة مكتبة الفيديو",
instructionSection2Desc: "صيانة وتحرير موارد الفيديو التي تم تنزيلها أو استيرادها.",
instructionSection2Sub1: "حذف المجموعة/الفيديو:",
instructionSection2Text1: "عند حذف مجموعة في صفحة الإدارة، يقدم النظام خيارين: حذف عنصر قائمة المجموعة فقط (الاحتفاظ بالملفات)، أو حذف الملفات المادية داخل المجموعة تمامًا.",
instructionSection2Sub2: "إصلاح الصورة المصغرة:",
instructionSection2Text2: "إذا لم يكن للفيديو غلاف بعد التنزيل، فانقر فوق زر التحديث على الصورة المصغرة للفيديو، وسيقوم النظام بإعادة التقاط الإطار الأول للفيديو كصورة مصغرة جديدة.",
instructionSection3Title: "3. إعدادات النظام",
instructionSection3Desc: "تكوين معلمات النظام وصيانة البيانات وتوسيع الوظائف.",
instructionSection3Sub1: "إعدادات الأمان:",
instructionSection3Text1: "قم بتعيين كلمة مرور تسجيل الدخول للنظام (كلمة المرور الأولية الافتراضية هي 123، يوصى بتغييرها بعد تسجيل الدخول الأول).",
instructionSection3Sub2: "إدارة العلامات:",
instructionSection3Text2: "يدعم إضافة أو حذف علامات تصنيف الفيديو. ملاحظة: يجب النقر فوق الزر \"حفظ\" في أسفل الصفحة لتصبح التغييرات سارية المفعول.",
instructionSection3Sub3: "صيانة النظام:",
instructionSection3Item1Label: "تنظيف الملفات المؤقتة:",
instructionSection3Item1Text: "يستخدم لمسح ملفات التنزيل المؤقتة المتبقية الناتجة عن فشل الواجهة الخلفية العرضي لتحرير المساحة.",
instructionSection3Item2Label: "ترحيل قاعدة البيانات:",
instructionSection3Item2Text: "مصمم لمستخدمي الإصدارات المبكرة. استخدم هذه الوظيفة لترحيل البيانات من JSON إلى قاعدة بيانات SQLite الجديدة. بعد الترحيل الناجح، انقر فوق زر الحذف لتنظيف بيانات السجل القديمة.",
instructionSection3Sub4: "الخدمات الموسعة:",
instructionSection3Item3Label: "OpenList Cloud Drive:",
instructionSection3Item3Text: "(قيد التطوير) يدعم الاتصال بخدمات OpenList التي ينشرها المستخدم. أضف التكوين هنا لتمكين تكامل محرك الأقراص السحابية.",
};

View File

@@ -165,4 +165,46 @@ export const de = {
subscriptionAlreadyExists: "Sie haben diesen Autor bereits abonniert.",
minutes: "Minuten",
never: "Nie",
// Instruction Page
instructionSection1Title: "1. Download & Aufgabenverwaltung",
instructionSection1Desc: "Dieses Modul umfasst Videoerfassung, Batch-Aufgaben und Dateiimportfunktionen.",
instructionSection1Sub1: "Link-Download:",
instructionSection1Item1Label: "Basis-Download:",
instructionSection1Item1Text: "Fügen Sie Links von verschiedenen Videoseiten in das Eingabefeld ein, um direkt herunterzuladen.",
instructionSection1Item2Label: "Berechtigungen:",
instructionSection1Item2Text: "Für Seiten, die eine Mitgliedschaft oder Anmeldung erfordern, melden Sie sich bitte zuerst in einem neuen Browser-Tab im entsprechenden Konto an, um Download-Berechtigungen zu erhalten.",
instructionSection1Sub2: "Intelligente Erkennung:",
instructionSection1Item3Label: "YouTube-Autoren-Abonnement:",
instructionSection1Item3Text: "Wenn der eingefügte Link der Kanal eines Autors ist, fragt das System, ob Sie abonnieren möchten. Nach dem Abonnieren kann das System automatisch nach Updates des Autors in festgelegten Intervallen suchen und diese herunterladen.",
instructionSection1Item4Label: "Bilibili-Sammlungs-Download:",
instructionSection1Item4Text: "Wenn der eingefügte Link ein Bilibili-Favorit/Sammlung ist, fragt das System, ob Sie den gesamten Inhalt der Sammlung herunterladen möchten.",
instructionSection1Sub3: "Erweiterte Tools (Download-Verwaltungsseite):",
instructionSection1Item5Label: "Batch-Aufgaben hinzufügen:",
instructionSection1Item5Text: "Unterstützt das Einfügen mehrerer Download-Links auf einmal (einer pro Zeile) für das Batch-Hinzufügen.",
instructionSection1Item6Label: "Dateien scannen:",
instructionSection1Item6Text: "Sucht automatisch nach allen Dateien im Videospeicher-Stammverzeichnis und Ordnern der ersten Ebene. Diese Funktion eignet sich zum Synchronisieren von Dateien mit dem System, nachdem Administratoren sie manuell im Server-Backend abgelegt haben.",
instructionSection1Item7Label: "Video hochladen:",
instructionSection1Item7Text: "Unterstützt das Hochladen lokaler Videodateien direkt vom Client auf den Server.",
instructionSection2Title: "2. Videobibliotheksverwaltung",
instructionSection2Desc: "Verwalten und bearbeiten Sie heruntergeladene oder importierte Videoressourcen.",
instructionSection2Sub1: "Sammlungs-/Video-Löschung:",
instructionSection2Text1: "Beim Löschen einer Sammlung auf der Verwaltungsseite bietet das System zwei Optionen: nur das Sammlungslistenelement löschen (Dateien behalten) oder die physischen Dateien innerhalb der Sammlung vollständig löschen.",
instructionSection2Sub2: "Thumbnail-Reparatur:",
instructionSection2Text2: "Wenn ein Video nach dem Herunterladen kein Cover hat, klicken Sie auf die Aktualisieren-Schaltfläche auf dem Video-Thumbnail, und das System erfasst den ersten Frame des Videos erneut als neues Thumbnail.",
instructionSection3Title: "3. Systemeinstellungen",
instructionSection3Desc: "Systemparameter konfigurieren, Daten verwalten und Funktionen erweitern.",
instructionSection3Sub1: "Sicherheitseinstellungen:",
instructionSection3Text1: "Legen Sie das System-Login-Passwort fest (das Standard-Initialpasswort ist 123, es wird empfohlen, es nach dem ersten Login zu ändern).",
instructionSection3Sub2: "Tag-Verwaltung:",
instructionSection3Text2: "Unterstützt das Hinzufügen oder Löschen von Videoklassifizierungs-Tags. Hinweis: Sie müssen auf die Schaltfläche \"Speichern\" unten auf der Seite klicken, damit Änderungen wirksam werden.",
instructionSection3Sub3: "Systemwartung:",
instructionSection3Item1Label: "Temporäre Dateien bereinigen:",
instructionSection3Item1Text: "Wird verwendet, um restliche temporäre Download-Dateien zu löschen, die durch gelegentliche Backend-Fehler verursacht wurden, um Speicherplatz freizugeben.",
instructionSection3Item2Label: "Datenbankmigration:",
instructionSection3Item2Text: "Entwickelt für Benutzer früherer Versionen. Verwenden Sie diese Funktion, um Daten von JSON in die neue SQLite-Datenbank zu migrieren. Klicken Sie nach erfolgreicher Migration auf die Löschen-Schaltfläche, um alte Verlaufsdaten zu bereinigen.",
instructionSection3Sub4: "Erweiterte Dienste:",
instructionSection3Item3Label: "OpenList Cloud Drive:",
instructionSection3Item3Text: "(In Entwicklung) Unterstützt die Verbindung zu benutzerbereitgestellten OpenList-Diensten. Fügen Sie hier eine Konfiguration hinzu, um die Cloud-Laufwerksintegration zu aktivieren.",
};

View File

@@ -9,6 +9,7 @@ export const en = {
uploadVideo: "Upload Video",
enterUrlOrSearchTerm: "Enter YouTube/Bilibili URL or search term",
manageVideos: "Manage Videos",
instruction: "Instruction",
// Home
pasteUrl: "Paste video or collection URL",
@@ -295,4 +296,50 @@ export const en = {
subscriptionAlreadyExists: "You are already subscribed to this author.",
minutes: "minutes",
never: "Never",
// Instruction Page
instructionSection1Title: "1. Download & Task Management",
instructionSection1Desc: "This module includes video acquisition, batch tasks, and file import functions.",
instructionSection1Sub1: "Link Download:",
instructionSection1Item1Label: "Basic Download:",
instructionSection1Item1Text: "Paste links from various video sites into the input box to download directly.",
instructionSection1Item2Label: "Permissions:",
instructionSection1Item2Text: "For sites requiring membership or login, please log in to the corresponding account in a new browser tab first to acquire download permissions.",
instructionSection1Sub2: "Smart Recognition:",
instructionSection1Item3Label: "YouTube Author Subscription:",
instructionSection1Item3Text: "When the pasted link is an author's channel, the system will ask if you want to subscribe. After subscribing, the system can automatically scan and download the author's updates at set intervals.",
instructionSection1Item4Label: "Bilibili Collection Download:",
instructionSection1Item4Text: "When the pasted link is a Bilibili favorite/collection, the system will ask if you want to download the entire collection content.",
instructionSection1Sub3: "Advanced Tools (Download Management Page):",
instructionSection1Item5Label: "Batch Add Tasks:",
instructionSection1Item5Text: "Supports pasting multiple download links at once (one per line) for batch addition.",
instructionSection1Item6Label: "Scan Files:",
instructionSection1Item6Text: "Automatically searches for all files in the video storage root directory and first-level folders. This function is suitable for syncing files to the system after administrators manually deposit them in the server backend.",
instructionSection1Item7Label: "Upload Video:",
instructionSection1Item7Text: "Supports uploading local video files directly from the client to the server.",
instructionSection2Title: "2. Video Library Management",
instructionSection2Desc: "Maintain and edit downloaded or imported video resources.",
instructionSection2Sub1: "Collection/Video Deletion:",
instructionSection2Text1: "When deleting a collection on the management page, the system offers two options: delete only the collection list item (keep files), or completely delete the physical files within the collection.",
instructionSection2Sub2: "Thumbnail Repair:",
instructionSection2Text2: "If a video has no cover after downloading, click the refresh button on the video thumbnail, and the system will re-capture the first frame of the video as the new thumbnail.",
instructionSection3Title: "3. System Settings",
instructionSection3Desc: "Configure system parameters, maintain data, and extend functions.",
instructionSection3Sub1: "Security Settings:",
instructionSection3Text1: "Set the system login password (default initial password is 123, recommended to change after first login).",
instructionSection3Sub2: "Tag Management:",
instructionSection3Text2: "Supports adding or deleting video classification tags. Note: You must click the \"Save\" button at the bottom of the page for changes to take effect.",
instructionSection3Sub3: "System Maintenance:",
instructionSection3Item1Label: "Clean Up Temp Files:",
instructionSection3Item1Text: "Used to clear residual temporary download files caused by occasional backend failures to free up space.",
instructionSection3Item2Label: "Database Migration:",
instructionSection3Item2Text: "Designed for early version users. Use this function to migrate data from JSON to the new SQLite database. After successful migration, click the delete button to clean up old history data.",
instructionSection3Sub4: "Extended Services:",
instructionSection3Item3Label: "OpenList Cloud Drive:",
instructionSection3Item3Text: "(In Development) Supports connecting to user-deployed OpenList services. Add configuration here to enable cloud drive integration.",
// Disclaimer
disclaimerTitle: "Disclaimer",
disclaimerText: "1. Purpose and Restrictions\nThis software (including code and documentation) is intended solely for personal learning, research, and technical exchange. It is strictly prohibited to use this software for any commercial purposes or for any illegal activities that violate local laws and regulations.\n\n2. Liability\nThe developer is unaware of and has no control over how users utilize this software. Any legal liabilities, disputes, or damages arising from the illegal or improper use of this software (including but not limited to copyright infringement) shall be borne solely by the user. The developer assumes no direct, indirect, or joint liability.\n\n3. Modifications and Distribution\nThis project is open-source. Any individual or organization modifying or forking this code must comply with the open-source license. Important: If a third party modifies the code to bypass or remove the original user authentication/security mechanisms and distributes such versions, the modifier/distributor bears full responsibility for any consequences. We strongly discourage bypassing or tampering with any security verification mechanisms.\n\n4. Non-Profit Statement\nThis is a completely free open-source project. The developer does not accept donations and has never published any donation pages. The software itself allows no charges and offers no paid services. Please be vigilant and beware of any scams or misleading information claiming to collect fees on behalf of this project.",
};

View File

@@ -162,4 +162,46 @@ export const es = {
subscriptionAlreadyExists: "Ya estás suscrito a este autor.",
minutes: "minutos",
never: "Nunca",
// Instruction Page
instructionSection1Title: "1. Descarga y Gestión de Tareas",
instructionSection1Desc: "Este módulo incluye adquisición de video, tareas por lotes y funciones de importación de archivos.",
instructionSection1Sub1: "Descarga de Enlace:",
instructionSection1Item1Label: "Descarga Básica:",
instructionSection1Item1Text: "Pegue enlaces de varios sitios de video en el cuadro de entrada para descargar directamente.",
instructionSection1Item2Label: "Permisos:",
instructionSection1Item2Text: "Para sitios que requieren membresía o inicio de sesión, inicie sesión en la cuenta correspondiente en una nueva pestaña del navegador primero para adquirir permisos de descarga.",
instructionSection1Sub2: "Reconocimiento Inteligente:",
instructionSection1Item3Label: "Suscripción de Autor de YouTube:",
instructionSection1Item3Text: "Cuando el enlace pegado es el canal de un autor, el sistema preguntará si desea suscribirse. Después de suscribirse, el sistema puede escanear y descargar automáticamente las actualizaciones del autor en intervalos establecidos.",
instructionSection1Item4Label: "Descarga de Colección de Bilibili:",
instructionSection1Item4Text: "Cuando el enlace pegado es un favorito/colección de Bilibili, el sistema preguntará si desea descargar todo el contenido de la colección.",
instructionSection1Sub3: "Herramientas Avanzadas (Página de Gestión de Descargas):",
instructionSection1Item5Label: "Añadir Tareas por Lotes:",
instructionSection1Item5Text: "Admite pegar múltiples enlaces de descarga a la vez (uno por línea) para la adición por lotes.",
instructionSection1Item6Label: "Escanear Archivos:",
instructionSection1Item6Text: "Busca automáticamente todos los archivos en el directorio raíz de almacenamiento de video y carpetas de primer nivel. Esta función es adecuada para sincronizar archivos con el sistema después de que los administradores los depositen manualmente en el backend del servidor.",
instructionSection1Item7Label: "Subir Video:",
instructionSection1Item7Text: "Admite subir archivos de video locales directamente desde el cliente al servidor.",
instructionSection2Title: "2. Gestión de Biblioteca de Video",
instructionSection2Desc: "Mantener y editar recursos de video descargados o importados.",
instructionSection2Sub1: "Eliminación de Colección/Video:",
instructionSection2Text1: "Al eliminar una colección en la página de gestión, el sistema ofrece dos opciones: eliminar solo el elemento de la lista de colección (mantener archivos), o eliminar completamente los archivos físicos dentro de la colección.",
instructionSection2Sub2: "Reparación de Miniatura:",
instructionSection2Text2: "Si un video no tiene portada después de la descarga, haga clic en el botón de actualización en la miniatura del video, y el sistema volverá a capturar el primer fotograma del video como la nueva miniatura.",
instructionSection3Title: "3. Configuración del Sistema",
instructionSection3Desc: "Configurar parámetros del sistema, mantener datos y extender funciones.",
instructionSection3Sub1: "Configuración de Seguridad:",
instructionSection3Text1: "Establezca la contraseña de inicio de sesión del sistema (la contraseña inicial predeterminada es 123, se recomienda cambiar después del primer inicio de sesión).",
instructionSection3Sub2: "Gestión de Etiquetas:",
instructionSection3Text2: "Admite agregar o eliminar etiquetas de clasificación de video. Nota: Debe hacer clic en el botón \"Guardar\" en la parte inferior de la página para que los cambios surtan efecto.",
instructionSection3Sub3: "Mantenimiento del Sistema:",
instructionSection3Item1Label: "Limpiar Archivos Temporales:",
instructionSection3Item1Text: "Se utiliza para borrar archivos de descarga temporales residuales causados por fallas ocasionales del backend para liberar espacio.",
instructionSection3Item2Label: "Migración de Base de Datos:",
instructionSection3Item2Text: "Diseñado para usuarios de versiones anteriores. Use esta función para migrar datos de JSON a la nueva base de datos SQLite. Después de una migración exitosa, haga clic en el botón de eliminar para limpiar los datos históricos antiguos.",
instructionSection3Sub4: "Servicios Extendidos:",
instructionSection3Item3Label: "Nube OpenList:",
instructionSection3Item3Text: "(En Desarrollo) Admite conectar servicios OpenList implementados por el usuario. Agregue configuración aquí para habilitar la integración de la unidad en la nube.",
};

View File

@@ -292,4 +292,46 @@ export const fr = {
subscriptionAlreadyExists: "Vous êtes déjà abonné à cet auteur.",
minutes: "minutes",
never: "Jamais",
// Instruction Page
instructionSection1Title: "1. Téléchargement et Gestion des Tâches",
instructionSection1Desc: "Ce module comprend l'acquisition de vidéos, les tâches par lots et les fonctions d'importation de fichiers.",
instructionSection1Sub1: "Téléchargement de Lien :",
instructionSection1Item1Label: "Téléchargement de Base :",
instructionSection1Item1Text: "Collez des liens de divers sites vidéo dans la zone de saisie pour télécharger directement.",
instructionSection1Item2Label: "Permissions :",
instructionSection1Item2Text: "Pour les sites nécessitant une adhésion ou une connexion, veuillez d'abord vous connecter au compte correspondant dans un nouvel onglet du navigateur pour acquérir les permissions de téléchargement.",
instructionSection1Sub2: "Reconnaissance Intelligente :",
instructionSection1Item3Label: "Abonnement Auteur YouTube :",
instructionSection1Item3Text: "Lorsque le lien collé est la chaîne d'un auteur, le système demandera si vous souhaitez vous abonner. Après l'abonnement, le système peut scanner et télécharger automatiquement les mises à jour de l'auteur à des intervalles définis.",
instructionSection1Item4Label: "Téléchargement de Collection Bilibili :",
instructionSection1Item4Text: "Lorsque le lien collé est un favori/collection Bilibili, le système demandera si vous souhaitez télécharger tout le contenu de la collection.",
instructionSection1Sub3: "Outils Avancés (Page de Gestion des Téléchargements) :",
instructionSection1Item5Label: "Ajouter des Tâches par Lots :",
instructionSection1Item5Text: "Prend en charge le collage de plusieurs liens de téléchargement à la fois (un par ligne) pour l'ajout par lots.",
instructionSection1Item6Label: "Scanner les Fichiers :",
instructionSection1Item6Text: "Recherche automatiquement tous les fichiers dans le répertoire racine de stockage vidéo et les dossiers de premier niveau. Cette fonction convient pour synchroniser les fichiers avec le système après que les administrateurs les ont déposés manuellement dans le backend du serveur.",
instructionSection1Item7Label: "Télécharger une Vidéo :",
instructionSection1Item7Text: "Prend en charge le téléchargement de fichiers vidéo locaux directement du client vers le serveur.",
instructionSection2Title: "2. Gestion de la Bibliothèque Vidéo",
instructionSection2Desc: "Maintenir et éditer les ressources vidéo téléchargées ou importées.",
instructionSection2Sub1: "Suppression de Collection/Vidéo :",
instructionSection2Text1: "Lors de la suppression d'une collection sur la page de gestion, le système offre deux options : supprimer uniquement l'élément de la liste de collection (conserver les fichiers), ou supprimer complètement les fichiers physiques dans la collection.",
instructionSection2Sub2: "Réparation de Miniature :",
instructionSection2Text2: "Si une vidéo n'a pas de couverture après le téléchargement, cliquez sur le bouton d'actualisation sur la miniature de la vidéo, et le système recapturera la première image de la vidéo comme nouvelle miniature.",
instructionSection3Title: "3. Paramètres du Système",
instructionSection3Desc: "Configurer les paramètres du système, maintenir les données et étendre les fonctions.",
instructionSection3Sub1: "Paramètres de Sécurité :",
instructionSection3Text1: "Définissez le mot de passe de connexion au système (le mot de passe initial par défaut est 123, il est recommandé de le changer après la première connexion).",
instructionSection3Sub2: "Gestion des Étiquettes :",
instructionSection3Text2: "Prend en charge l'ajout ou la suppression d'étiquettes de classification vidéo. Remarque : Vous devez cliquer sur le bouton \"Enregistrer\" en bas de la page pour que les modifications prennent effet.",
instructionSection3Sub3: "Maintenance du Système :",
instructionSection3Item1Label: "Nettoyer les Fichiers Temporaires :",
instructionSection3Item1Text: "Utilisé pour effacer les fichiers de téléchargement temporaires résiduels causés par des pannes occasionnelles du backend pour libérer de l'espace.",
instructionSection3Item2Label: "Migration de Base de Données :",
instructionSection3Item2Text: "Conçu pour les utilisateurs des premières versions. Utilisez cette fonction pour migrer les données de JSON vers la nouvelle base de données SQLite. Après une migration réussie, cliquez sur le bouton de suppression pour nettoyer les anciennes données historiques.",
instructionSection3Sub4: "Services Étendus :",
instructionSection3Item3Label: "OpenList Cloud Drive :",
instructionSection3Item3Text: "(En Développement) Prend en charge la connexion aux services OpenList déployés par l'utilisateur. Ajoutez la configuration ici pour activer l'intégration du lecteur cloud.",
};

View File

@@ -294,4 +294,46 @@ export const ja = {
subscriptionAlreadyExists: "この著者はすでに購読しています。",
minutes: "分",
never: "なし",
// Instruction Page
instructionSection1Title: "1. ダウンロードとタスク管理",
instructionSection1Desc: "このモジュールには、ビデオ取得、バッチタスク、およびファイルインポート機能が含まれています。",
instructionSection1Sub1: "リンクダウンロード:",
instructionSection1Item1Label: "基本ダウンロード:",
instructionSection1Item1Text: "さまざまなビデオサイトのリンクを入力ボックスに貼り付けて直接ダウンロードします。",
instructionSection1Item2Label: "権限:",
instructionSection1Item2Text: "メンバーシップまたはログインが必要なサイトの場合、ダウンロード権限を取得するために、まず新しいブラウザタブで対応するアカウントにログインしてください。",
instructionSection1Sub2: "スマート認識:",
instructionSection1Item3Label: "YouTube 著者登録:",
instructionSection1Item3Text: "貼り付けられたリンクが著者のチャンネルである場合、システムは登録するかどうかを尋ねます。登録後、システムは設定された間隔で著者の更新を自動的にスキャンしてダウンロードできます。",
instructionSection1Item4Label: "Bilibili コレクションダウンロード:",
instructionSection1Item4Text: "貼り付けられたリンクが Bilibili のお気に入り/コレクションである場合、システムはコレクションの内容全体をダウンロードするかどうかを尋ねます。",
instructionSection1Sub3: "高度なツール(ダウンロード管理ページ):",
instructionSection1Item5Label: "バッチタスクの追加:",
instructionSection1Item5Text: "バッチ追加のために、複数のダウンロードリンクを一度に1行に1つ貼り付けることをサポートします。",
instructionSection1Item6Label: "ファイルのスキャン:",
instructionSection1Item6Text: "ビデオストレージのルートディレクトリと第1レベルのフォルダ内のすべてのファイルを自動的に検索します。この機能は、管理者がサーバーバックエンドに手動でファイルを配置した後、システムにファイルを同期するのに適しています。",
instructionSection1Item7Label: "ビデオのアップロード:",
instructionSection1Item7Text: "クライアントからサーバーにローカルビデオファイルを直接アップロードすることをサポートします。",
instructionSection2Title: "2. ビデオライブラリ管理",
instructionSection2Desc: "ダウンロードまたはインポートされたビデオリソースを維持および編集します。",
instructionSection2Sub1: "コレクション/ビデオの削除:",
instructionSection2Text1: "管理ページでコレクションを削除する場合、システムには2つのオプションがあります。コレクションリスト項目のみを削除するファイルを保持するか、コレクション内の物理ファイルを完全に削除するかです。",
instructionSection2Sub2: "サムネイルの修復:",
instructionSection2Text2: "ダウンロード後にビデオにカバーがない場合は、ビデオサムネイルの更新ボタンをクリックすると、システムはビデオの最初のフレームを新しいサムネイルとして再キャプチャします。",
instructionSection3Title: "3. システム設定",
instructionSection3Desc: "システムパラメータの構成、データの維持、および機能の拡張。",
instructionSection3Sub1: "セキュリティ設定:",
instructionSection3Text1: "システムログインパスワードを設定しますデフォルトの初期パスワードは123です。初回ログイン後に変更することをお勧めします。",
instructionSection3Sub2: "タグ管理:",
instructionSection3Text2: "ビデオ分類タグの追加または削除をサポートします。注:変更を有効にするには、ページ下部の「保存」ボタンをクリックする必要があります。",
instructionSection3Sub3: "システムメンテナンス:",
instructionSection3Item1Label: "一時ファイルのクリーンアップ:",
instructionSection3Item1Text: "スペースを解放するために、時折発生するバックエンドの障害によって引き起こされる残留一時ダウンロードファイルをクリアするために使用されます。",
instructionSection3Item2Label: "データベース移行:",
instructionSection3Item2Text: "初期バージョンのユーザー向けに設計されています。この機能を使用して、JSON から新しい SQLite データベースにデータを移行します。移行が成功したら、削除ボタンをクリックして古い履歴データをクリーンアップします。",
instructionSection3Sub4: "拡張サービス:",
instructionSection3Item3Label: "OpenList クラウドドライブ:",
instructionSection3Item3Text: "(開発中)ユーザーがデプロイした OpenList サービスへの接続をサポートします。ここで構成を追加して、クラウドドライブ統合を有効にします。",
};

View File

@@ -294,4 +294,46 @@ export const ko = {
subscriptionAlreadyExists: "이미 구독 중인 작가입니다.",
minutes: "분",
never: "없음",
// Instruction Page
instructionSection1Title: "1. 다운로드 및 작업 관리",
instructionSection1Desc: "이 모듈에는 비디오 획득, 일괄 작업 및 파일 가져오기 기능이 포함되어 있습니다.",
instructionSection1Sub1: "링크 다운로드:",
instructionSection1Item1Label: "기본 다운로드:",
instructionSection1Item1Text: "다양한 비디오 사이트의 링크를 입력 상자에 붙여넣어 직접 다운로드하십시오.",
instructionSection1Item2Label: "권한:",
instructionSection1Item2Text: "멤버십 또는 로그인이 필요한 사이트의 경우, 다운로드 권한을 얻으려면 먼저 새 브라우저 탭에서 해당 계정에 로그인하십시오.",
instructionSection1Sub2: "스마트 인식:",
instructionSection1Item3Label: "YouTube 작성자 구독:",
instructionSection1Item3Text: "붙여넣은 링크가 작성자의 채널인 경우 시스템에서 구독 여부를 묻습니다. 구독 후 시스템은 설정된 간격으로 작성자의 업데이트를 자동으로 스캔하고 다운로드할 수 있습니다.",
instructionSection1Item4Label: "Bilibili 컬렉션 다운로드:",
instructionSection1Item4Text: "붙여넣은 링크가 Bilibili 즐겨찾기/컬렉션인 경우 시스템에서 전체 컬렉션 콘텐츠를 다운로드할지 묻습니다.",
instructionSection1Sub3: "고급 도구 (다운로드 관리 페이지):",
instructionSection1Item5Label: "일괄 작업 추가:",
instructionSection1Item5Text: "일괄 추가를 위해 한 번에 여러 다운로드 링크(한 줄에 하나씩)를 붙여넣는 것을 지원합니다.",
instructionSection1Item6Label: "파일 스캔:",
instructionSection1Item6Text: "비디오 저장소 루트 디렉터리 및 1단계 폴더의 모든 파일을 자동으로 검색합니다. 이 기능은 관리자가 서버 백엔드에 수동으로 파일을 입금한 후 시스템에 파일을 동기화하는 데 적합합니다.",
instructionSection1Item7Label: "비디오 업로드:",
instructionSection1Item7Text: "클라이언트에서 서버로 로컬 비디오 파일을 직접 업로드하는 것을 지원합니다.",
instructionSection2Title: "2. 비디오 라이브러리 관리",
instructionSection2Desc: "다운로드하거나 가져온 비디오 리소스를 유지 관리하고 편집합니다.",
instructionSection2Sub1: "컬렉션/비디오 삭제:",
instructionSection2Text1: "관리 페이지에서 컬렉션을 삭제할 때 시스템은 두 가지 옵션을 제공합니다. 컬렉션 목록 항목만 삭제(파일 유지)하거나 컬렉션 내의 물리적 파일을 완전히 삭제하는 것입니다.",
instructionSection2Sub2: "썸네일 복구:",
instructionSection2Text2: "다운로드 후 비디오에 표지가 없는 경우 비디오 썸네일의 새로 고침 버튼을 클릭하면 시스템이 비디오의 첫 번째 프레임을 새 썸네일로 다시 캡처합니다.",
instructionSection3Title: "3. 시스템 설정",
instructionSection3Desc: "시스템 매개변수 구성, 데이터 유지 관리 및 기능 확장.",
instructionSection3Sub1: "보안 설정:",
instructionSection3Text1: "시스템 로그인 비밀번호를 설정하십시오(기본 초기 비밀번호는 123이며, 첫 로그인 후 변경하는 것이 좋습니다).",
instructionSection3Sub2: "태그 관리:",
instructionSection3Text2: "비디오 분류 태그 추가 또는 삭제를 지원합니다. 참고: 변경 사항을 적용하려면 페이지 하단의 \"저장\" 버튼을 클릭해야 합니다.",
instructionSection3Sub3: "시스템 유지 관리:",
instructionSection3Item1Label: "임시 파일 정리:",
instructionSection3Item1Text: "공간을 확보하기 위해 가끔 발생하는 백엔드 오류로 인한 잔여 임시 다운로드 파일을 지우는 데 사용됩니다.",
instructionSection3Item2Label: "데이터베이스 마이그레이션:",
instructionSection3Item2Text: "초기 버전 사용자를 위해 설계되었습니다. 이 기능을 사용하여 JSON에서 새 SQLite 데이터베이스로 데이터를 마이그레이션하십시오. 마이그레이션이 성공하면 삭제 버튼을 클릭하여 오래된 기록 데이터를 정리하십시오.",
instructionSection3Sub4: "확장 서비스:",
instructionSection3Item3Label: "OpenList 클라우드 드라이브:",
instructionSection3Item3Text: "(개발 중) 사용자 배포 OpenList 서비스 연결을 지원합니다. 클라우드 드라이브 통합을 활성화하려면 여기에 구성을 추가하십시오.",
};

View File

@@ -293,4 +293,46 @@ export const pt = {
subscriptionAlreadyExists: "Você já está inscrito neste autor.",
minutes: "minutos",
never: "Nunca",
// Instruction Page
instructionSection1Title: "1. Download e Gerenciamento de Tarefas",
instructionSection1Desc: "Este módulo inclui aquisição de vídeo, tarefas em lote e funções de importação de arquivos.",
instructionSection1Sub1: "Download de Link:",
instructionSection1Item1Label: "Download Básico:",
instructionSection1Item1Text: "Cole links de vários sites de vídeo na caixa de entrada para baixar diretamente.",
instructionSection1Item2Label: "Permissões:",
instructionSection1Item2Text: "Para sites que exigem associação ou login, faça login na conta correspondente em uma nova guia do navegador primeiro para adquirir permissões de download.",
instructionSection1Sub2: "Reconhecimento Inteligente:",
instructionSection1Item3Label: "Assinatura de Autor do YouTube:",
instructionSection1Item3Text: "Quando o link colado for o canal de um autor, o sistema perguntará se você deseja se inscrever. Após a inscrição, o sistema pode verificar e baixar automaticamente as atualizações do autor em intervalos definidos.",
instructionSection1Item4Label: "Download de Coleção Bilibili:",
instructionSection1Item4Text: "Quando o link colado for um favorito/coleção Bilibili, o sistema perguntará se você deseja baixar todo o conteúdo da coleção.",
instructionSection1Sub3: "Ferramentas Avançadas (Página de Gerenciamento de Download):",
instructionSection1Item5Label: "Adicionar Tarefas em Lote:",
instructionSection1Item5Text: "Suporta colar vários links de download de uma vez (um por linha) para adição em lote.",
instructionSection1Item6Label: "Verificar Arquivos:",
instructionSection1Item6Text: "Pesquisa automaticamente todos os arquivos no diretório raiz de armazenamento de vídeo e pastas de primeiro nível. Esta função é adequada para sincronizar arquivos com o sistema depois que os administradores os depositam manualmente no backend do servidor.",
instructionSection1Item7Label: "Enviar Vídeo:",
instructionSection1Item7Text: "Suporta o envio de arquivos de vídeo locais diretamente do cliente para o servidor.",
instructionSection2Title: "2. Gerenciamento da Biblioteca de Vídeo",
instructionSection2Desc: "Manter e editar recursos de vídeo baixados ou importados.",
instructionSection2Sub1: "Exclusão de Coleção/Vídeo:",
instructionSection2Text1: "Ao excluir uma coleção na página de gerenciamento, o sistema oferece duas opções: excluir apenas o item da lista de coleção (manter arquivos) ou excluir completamente os arquivos físicos dentro da coleção.",
instructionSection2Sub2: "Reparo de Miniatura:",
instructionSection2Text2: "Se um vídeo não tiver capa após o download, clique no botão de atualização na miniatura do vídeo e o sistema recapturará o primeiro quadro do vídeo como a nova miniatura.",
instructionSection3Title: "3. Configurações do Sistema",
instructionSection3Desc: "Configurar parâmetros do sistema, manter dados e estender funções.",
instructionSection3Sub1: "Configurações de Segurança:",
instructionSection3Text1: "Defina a senha de login do sistema (a senha inicial padrão é 123, recomenda-se alterar após o primeiro login).",
instructionSection3Sub2: "Gerenciamento de Tags:",
instructionSection3Text2: "Suporta adicionar ou excluir tags de classificação de vídeo. Nota: Você deve clicar no botão \"Salvar\" na parte inferior da página para que as alterações entrem em vigor.",
instructionSection3Sub3: "Manutenção do Sistema:",
instructionSection3Item1Label: "Limpar Arquivos Temporários:",
instructionSection3Item1Text: "Usado para limpar arquivos de download temporários residuais causados por falhas ocasionais de backend para liberar espaço.",
instructionSection3Item2Label: "Migração de Banco de Dados:",
instructionSection3Item2Text: "Projetado para usuários de versões anteriores. Use esta função para migrar dados de JSON para o novo banco de dados SQLite. Após a migração bem-sucedida, clique no botão excluir para limpar dados históricos antigos.",
instructionSection3Sub4: "Serviços Estendidos:",
instructionSection3Item3Label: "OpenList Cloud Drive:",
instructionSection3Item3Text: "(Em Desenvolvimento) Suporta conexão com serviços OpenList implantados pelo usuário. Adicione a configuração aqui para habilitar a integração da unidade de nuvem.",
};

View File

@@ -294,4 +294,46 @@ export const ru = {
subscriptionAlreadyExists: "Вы уже подписаны на этого автора.",
minutes: "минуты",
never: "Никогда",
// Instruction Page
instructionSection1Title: "1. Загрузка и управление задачами",
instructionSection1Desc: "Этот модуль включает функции получения видео, пакетных задач и импорта файлов.",
instructionSection1Sub1: "Загрузка по ссылке:",
instructionSection1Item1Label: "Базовая загрузка:",
instructionSection1Item1Text: "Вставьте ссылки с различных видеосайтов в поле ввода для прямой загрузки.",
instructionSection1Item2Label: "Разрешения:",
instructionSection1Item2Text: "Для сайтов, требующих членства или входа в систему, пожалуйста, сначала войдите в соответствующую учетную запись на новой вкладке браузера, чтобы получить разрешения на загрузку.",
instructionSection1Sub2: "Умное распознавание:",
instructionSection1Item3Label: "Подписка на автора YouTube:",
instructionSection1Item3Text: "Когда вставленная ссылка является каналом автора, система спросит, хотите ли вы подписаться. После подписки система может автоматически сканировать и загружать обновления автора через заданные интервалы.",
instructionSection1Item4Label: "Загрузка коллекции Bilibili:",
instructionSection1Item4Text: "Когда вставленная ссылка является избранным/коллекцией Bilibili, система спросит, хотите ли вы загрузить все содержимое коллекции.",
instructionSection1Sub3: "Расширенные инструменты (Страница управления загрузками):",
instructionSection1Item5Label: "Пакетное добавление задач:",
instructionSection1Item5Text: "Поддерживает вставку нескольких ссылок для загрузки одновременно (по одной в строке) для пакетного добавления.",
instructionSection1Item6Label: "Сканировать файлы:",
instructionSection1Item6Text: "Автоматически ищет все файлы в корневом каталоге хранения видео и папках первого уровня. Эта функция подходит для синхронизации файлов с системой после того, как администраторы вручную поместили их на сервер.",
instructionSection1Item7Label: "Загрузить видео:",
instructionSection1Item7Text: "Поддерживает загрузку локальных видеофайлов непосредственно с клиента на сервер.",
instructionSection2Title: "2. Управление видеотекой",
instructionSection2Desc: "Обслуживание и редактирование загруженных или импортированных видеоресурсов.",
instructionSection2Sub1: "Удаление коллекции/видео:",
instructionSection2Text1: "При удалении коллекции на странице управления система предлагает два варианта: удалить только элемент списка коллекции (сохранить файлы) или полностью удалить физические файлы внутри коллекции.",
instructionSection2Sub2: "Восстановление миниатюры:",
instructionSection2Text2: "Если у видео нет обложки после загрузки, нажмите кнопку обновления на миниатюре видео, и система повторно захватит первый кадр видео в качестве новой миниатюры.",
instructionSection3Title: "3. Настройки системы",
instructionSection3Desc: "Настройка параметров системы, обслуживание данных и расширение функций.",
instructionSection3Sub1: "Настройки безопасности:",
instructionSection3Text1: "Установите пароль для входа в систему (начальный пароль по умолчанию — 123, рекомендуется изменить после первого входа).",
instructionSection3Sub2: "Управление тегами:",
instructionSection3Text2: "Поддерживает добавление или удаление тегов классификации видео. Примечание: Вы должны нажать кнопку «Сохранить» внизу страницы, чтобы изменения вступили в силу.",
instructionSection3Sub3: "Обслуживание системы:",
instructionSection3Item1Label: "Очистить временные файлы:",
instructionSection3Item1Text: "Используется для очистки остаточных временных файлов загрузки, вызванных случайными сбоями бэкенда, для освобождения места.",
instructionSection3Item2Label: "Миграция базы данных:",
instructionSection3Item2Text: "Предназначено для пользователей ранних версий. Используйте эту функцию для миграции данных из JSON в новую базу данных SQLite. После успешной миграции нажмите кнопку удаления, чтобы очистить старые исторические данные.",
instructionSection3Sub4: "Расширенные сервисы:",
instructionSection3Item3Label: "Облачный диск OpenList:",
instructionSection3Item3Text: "(В разработке) Поддерживает подключение к развернутым пользователем сервисам OpenList. Добавьте конфигурацию здесь, чтобы включить интеграцию с облачным диском.",
};

View File

@@ -9,6 +9,7 @@ export const zh = {
uploadVideo: "上传视频",
enterUrlOrSearchTerm: "输入 YouTube/Bilibili 链接或搜索关键词",
manageVideos: "管理视频",
instruction: "使用说明",
// Home
pasteUrl: "粘贴视频或合集链接",
@@ -295,4 +296,46 @@ export const zh = {
subscriptionAlreadyExists: "您已订阅此作者。",
minutes: "分钟",
never: "从未",
// Instruction Page
instructionSection1Title: "1. 下载与任务管理",
instructionSection1Desc: "本模块包含视频获取、批量任务及文件导入等功能。",
instructionSection1Sub1: "链接下载:",
instructionSection1Item1Label: "基础下载:",
instructionSection1Item1Text: "在链接文本框中粘贴各类视频网站的链接即可直接下载。",
instructionSection1Item2Label: "权限说明:",
instructionSection1Item2Text: "部分需要会员或登录才能观看的网站,请先在浏览器内另开标签页登录对应账号,以获取下载权限。",
instructionSection1Sub2: "智能识别:",
instructionSection1Item3Label: "YouTube 作者订阅:",
instructionSection1Item3Text: "当粘贴链接为作者个人空间时,系统将询问是否订阅。订阅后,系统可设定时间间隔,自动扫描并下载该作者的更新。",
instructionSection1Item4Label: "Bilibili 合集下载:",
instructionSection1Item4Text: "当粘贴链接为 Bilibili 收藏夹/合集时,系统将询问是否下载整个合集内容。",
instructionSection1Sub3: "高级工具(下载管理页):",
instructionSection1Item5Label: "批量添加任务:",
instructionSection1Item5Text: "支持一次性粘贴多个下载链接(请按行区分),进行批量添加。",
instructionSection1Item6Label: "扫描文件:",
instructionSection1Item6Text: "自动搜索视频储存根目录及一级文件夹下的所有文件。此功能适用于管理员在服务器后台直接存入文件后,将其批量同步至系统。",
instructionSection1Item7Label: "上传视频:",
instructionSection1Item7Text: "支持直接从客户端单独上传本地视频文件到服务器。",
instructionSection2Title: "2. 视频库管理",
instructionSection2Desc: "对已下载或导入的视频资源进行维护和编辑。",
instructionSection2Sub1: "合集/视频删除:",
instructionSection2Text1: "在管理页面删除合集时,系统提供两种选择:仅删除合集列表项(保留文件),或连同合集内的物理文件一并彻底删除。",
instructionSection2Sub2: "缩略图修复:",
instructionSection2Text2: "若遇到下载后视频无封面的情况,可点击视频缩略图上的刷新按钮,系统将重新抓取视频首帧作为新的缩略图。",
instructionSection3Title: "3. 系统设置",
instructionSection3Desc: "配置系统参数、维护数据及扩展功能。",
instructionSection3Sub1: "安全设定:",
instructionSection3Text1: "设置系统登录密码(默认初始密码为 123建议首次登录后修改。",
instructionSection3Sub2: "标签管理:",
instructionSection3Text2: "支持添加或删除视频分类标签。注意: 所有操作完成后,必须点击页面底端的“保存”按钮方可生效。",
instructionSection3Sub3: "系统维护:",
instructionSection3Item1Label: "清理临时文件:",
instructionSection3Item1Text: "用于清除因后端偶发故障而残留的临时下载文件,释放空间。",
instructionSection3Item2Label: "数据库迁移:",
instructionSection3Item2Text: "专为早期版本用户设计。使用此功能可将数据从 JSON 迁移至新的 SQLite 数据库。迁移成功后,可点击删除按钮清理旧的历史数据。",
instructionSection3Sub4: "扩展服务:",
instructionSection3Item3Label: "OpenList 云盘:",
instructionSection3Item3Text: "(开发中)支持连接用户自行部署的 OpenList 服务,在此处添加配置后可实现云盘联动。",
};