diff --git a/client/components/app/ConfigSideNav.vue b/client/components/app/ConfigSideNav.vue index 0868bafb..50e440d7 100644 --- a/client/components/app/ConfigSideNav.vue +++ b/client/components/app/ConfigSideNav.vue @@ -99,6 +99,11 @@ export default { id: 'config-item-metadata-utils', title: this.$strings.HeaderItemMetadataUtils, path: '/config/item-metadata-utils' + }, + { + id: 'config-rss-feeds', + title: this.$strings.HeaderRSSFeeds, + path: '/config/rss-feeds' } ] diff --git a/client/components/modals/rssfeed/ViewFeedModal.vue b/client/components/modals/rssfeed/ViewFeedModal.vue new file mode 100644 index 00000000..9e34b17f --- /dev/null +++ b/client/components/modals/rssfeed/ViewFeedModal.vue @@ -0,0 +1,124 @@ + + + + + + diff --git a/client/pages/config.vue b/client/pages/config.vue index 2b63d83c..542b7f2c 100644 --- a/client/pages/config.vue +++ b/client/pages/config.vue @@ -55,6 +55,7 @@ export default { else if (pageName === 'library-stats') return this.$strings.HeaderLibraryStats else if (pageName === 'users') return this.$strings.HeaderUsers else if (pageName === 'item-metadata-utils') return this.$strings.HeaderItemMetadataUtils + else if (pageName === 'rss-feeds') return this.$strings.HeaderRSSFeeds else if (pageName === 'email') return this.$strings.HeaderEmail } return this.$strings.HeaderSettings diff --git a/client/pages/config/rss-feeds.vue b/client/pages/config/rss-feeds.vue new file mode 100644 index 00000000..28dba670 --- /dev/null +++ b/client/pages/config/rss-feeds.vue @@ -0,0 +1,176 @@ + + + + + diff --git a/client/strings/de.json b/client/strings/de.json index 53c39c84..f140aedb 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -138,6 +138,7 @@ "HeaderRemoveEpisodes": "Lösche {0} Episoden", "HeaderRSSFeedGeneral": "RSS Details", "HeaderRSSFeedIsOpen": "RSS-Feed ist geöffnet", + "HeaderRSSFeeds": "RSS Feeds", "HeaderSavedMediaProgress": "Gespeicherte Hörfortschritte", "HeaderSchedule": "Zeitplan", "HeaderScheduleLibraryScans": "Automatische Bibliotheksscans", @@ -201,6 +202,7 @@ "LabelClosePlayer": "Player schließen", "LabelCodec": "Codec", "LabelCollapseSeries": "Serien zusammenfassen", + "LabelCollection": "Collection", "LabelCollections": "Sammlungen", "LabelComplete": "Vollständig", "LabelConfirmPassword": "Passwort bestätigen", @@ -428,6 +430,7 @@ "LabelShowAll": "Alles anzeigen", "LabelSize": "Größe", "LabelSleepTimer": "Einschlaf-Timer", + "LabelSlug": "Slug", "LabelStart": "Start", "LabelStarted": "Gestartet", "LabelStartedAt": "Gestartet am", @@ -516,6 +519,7 @@ "MessageChapterErrorStartLtPrev": "Ungültige Kapitelstartzeit: Kapitelanfang < Kapitelanfang vorheriges Kapitel (Kapitelanfang liegt zeitlich vor dem Beginn des vorherigen Kapitels -> Lösung: Kapitelanfang >= Startzeit des vorherigen Kapitels)", "MessageChapterStartIsAfter": "Ungültige Kapitelstartzeit: Kapitelanfang > Mediumende (Kapitelanfang liegt nach dem Ende des Mediums)", "MessageCheckingCron": "Überprüfe Cron...", + "MessageConfirmCloseFeed": "Are you sure you want to close this feed?", "MessageConfirmDeleteBackup": "Sind Sie sicher, dass Sie die Sicherung für {0} löschen wollen?", "MessageConfirmDeleteFile": "This will delete the file from your file system. Are you sure?", "MessageConfirmDeleteLibrary": "Sind Sie sicher, dass Sie die Bibliothek \"{0}\" dauerhaft löschen wollen?", diff --git a/client/strings/en-us.json b/client/strings/en-us.json index 3937e8c5..34151322 100644 --- a/client/strings/en-us.json +++ b/client/strings/en-us.json @@ -138,6 +138,7 @@ "HeaderRemoveEpisodes": "Remove {0} Episodes", "HeaderRSSFeedGeneral": "RSS Details", "HeaderRSSFeedIsOpen": "RSS Feed is Open", + "HeaderRSSFeeds": "RSS Feeds", "HeaderSavedMediaProgress": "Saved Media Progress", "HeaderSchedule": "Schedule", "HeaderScheduleLibraryScans": "Schedule Automatic Library Scans", @@ -201,6 +202,7 @@ "LabelClosePlayer": "Close player", "LabelCodec": "Codec", "LabelCollapseSeries": "Collapse Series", + "LabelCollection": "Collection", "LabelCollections": "Collections", "LabelComplete": "Complete", "LabelConfirmPassword": "Confirm Password", @@ -428,6 +430,7 @@ "LabelShowAll": "Show All", "LabelSize": "Size", "LabelSleepTimer": "Sleep timer", + "LabelSlug": "Slug", "LabelStart": "Start", "LabelStarted": "Started", "LabelStartedAt": "Started At", @@ -516,6 +519,7 @@ "MessageChapterErrorStartLtPrev": "Invalid start time must be greater than or equal to previous chapter start time", "MessageChapterStartIsAfter": "Chapter start is after the end of your audiobook", "MessageCheckingCron": "Checking cron...", + "MessageConfirmCloseFeed": "Are you sure you want to close this feed?", "MessageConfirmDeleteBackup": "Are you sure you want to delete backup for {0}?", "MessageConfirmDeleteFile": "This will delete the file from your file system. Are you sure?", "MessageConfirmDeleteLibrary": "Are you sure you want to permanently delete library \"{0}\"?", diff --git a/client/strings/es.json b/client/strings/es.json index 5be1e3b5..c96f3791 100644 --- a/client/strings/es.json +++ b/client/strings/es.json @@ -138,6 +138,7 @@ "HeaderRemoveEpisodes": "Remover {0} Episodios", "HeaderRSSFeedGeneral": "Detalles RSS", "HeaderRSSFeedIsOpen": "Fuente RSS esta abierta", + "HeaderRSSFeeds": "RSS Feeds", "HeaderSavedMediaProgress": "Guardar Progreso de multimedia", "HeaderSchedule": "Horario", "HeaderScheduleLibraryScans": "Programar Escaneo Automático de Biblioteca", @@ -201,6 +202,7 @@ "LabelClosePlayer": "Close player", "LabelCodec": "Codec", "LabelCollapseSeries": "Colapsar Series", + "LabelCollection": "Collection", "LabelCollections": "Colecciones", "LabelComplete": "Completo", "LabelConfirmPassword": "Confirmar Contraseña", @@ -428,6 +430,7 @@ "LabelShowAll": "Mostrar Todos", "LabelSize": "Tamaño", "LabelSleepTimer": "Temporizador para Dormir", + "LabelSlug": "Slug", "LabelStart": "Iniciar", "LabelStarted": "Indiciado", "LabelStartedAt": "Iniciado En", @@ -516,6 +519,7 @@ "MessageChapterErrorStartLtPrev": "El tiempo de inicio no es válida debe ser mayor o igual que la hora de inicio del capítulo anterior", "MessageChapterStartIsAfter": "El comienzo del capítulo es después del final de su audiolibro", "MessageCheckingCron": "Checking cron...", + "MessageConfirmCloseFeed": "Are you sure you want to close this feed?", "MessageConfirmDeleteBackup": "Esta seguro que desea eliminar el respaldo {0}?", "MessageConfirmDeleteFile": "This will delete the file from your file system. Are you sure?", "MessageConfirmDeleteLibrary": "Esta seguro que desea eliminar permanentemente la biblioteca \"{0}\"?", diff --git a/client/strings/fr.json b/client/strings/fr.json index ea98d08e..2ef89df5 100644 --- a/client/strings/fr.json +++ b/client/strings/fr.json @@ -138,6 +138,7 @@ "HeaderRemoveEpisodes": "Suppression de {0} épisodes", "HeaderRSSFeedGeneral": "Détails de flux RSS", "HeaderRSSFeedIsOpen": "Le Flux RSS est actif", + "HeaderRSSFeeds": "RSS Feeds", "HeaderSavedMediaProgress": "Progression de la sauvegarde des médias", "HeaderSchedule": "Programmation", "HeaderScheduleLibraryScans": "Analyse automatique de la bibliothèque", @@ -201,6 +202,7 @@ "LabelClosePlayer": "Fermer le lecteur", "LabelCodec": "Codec", "LabelCollapseSeries": "Réduire les séries", + "LabelCollection": "Collection", "LabelCollections": "Collections", "LabelComplete": "Complet", "LabelConfirmPassword": "Confirmer le mot de passe", @@ -428,6 +430,7 @@ "LabelShowAll": "Afficher Tout", "LabelSize": "Taille", "LabelSleepTimer": "Minuterie", + "LabelSlug": "Slug", "LabelStart": "Démarrer", "LabelStarted": "Démarré", "LabelStartedAt": "Démarré à", @@ -516,6 +519,7 @@ "MessageChapterErrorStartLtPrev": "Horodatage invalide car il doit débuter au moins après le précédent chapitre", "MessageChapterStartIsAfter": "Le premier chapitre est situé au début de votre livre audio", "MessageCheckingCron": "Vérification du cron…", + "MessageConfirmCloseFeed": "Are you sure you want to close this feed?", "MessageConfirmDeleteBackup": "Êtes-vous sûr de vouloir supprimer la Sauvegarde de {0} ?", "MessageConfirmDeleteFile": "Cela Le fichier sera supprimer de votre système. Êtes-vous sûr ?", "MessageConfirmDeleteLibrary": "Êtes-vous sûr de vouloir supprimer définitivement la bibliothèque « {0} » ?", diff --git a/client/strings/gu.json b/client/strings/gu.json index 9c6fd369..b819b775 100644 --- a/client/strings/gu.json +++ b/client/strings/gu.json @@ -138,6 +138,7 @@ "HeaderRemoveEpisodes": "Remove {0} Episodes", "HeaderRSSFeedGeneral": "RSS Details", "HeaderRSSFeedIsOpen": "RSS Feed is Open", + "HeaderRSSFeeds": "RSS Feeds", "HeaderSavedMediaProgress": "Saved Media Progress", "HeaderSchedule": "Schedule", "HeaderScheduleLibraryScans": "Schedule Automatic Library Scans", @@ -201,6 +202,7 @@ "LabelClosePlayer": "Close player", "LabelCodec": "Codec", "LabelCollapseSeries": "Collapse Series", + "LabelCollection": "Collection", "LabelCollections": "Collections", "LabelComplete": "Complete", "LabelConfirmPassword": "Confirm Password", @@ -428,6 +430,7 @@ "LabelShowAll": "Show All", "LabelSize": "Size", "LabelSleepTimer": "Sleep timer", + "LabelSlug": "Slug", "LabelStart": "Start", "LabelStarted": "Started", "LabelStartedAt": "Started At", @@ -516,6 +519,7 @@ "MessageChapterErrorStartLtPrev": "Invalid start time must be greater than or equal to previous chapter start time", "MessageChapterStartIsAfter": "Chapter start is after the end of your audiobook", "MessageCheckingCron": "Checking cron...", + "MessageConfirmCloseFeed": "Are you sure you want to close this feed?", "MessageConfirmDeleteBackup": "Are you sure you want to delete backup for {0}?", "MessageConfirmDeleteFile": "This will delete the file from your file system. Are you sure?", "MessageConfirmDeleteLibrary": "Are you sure you want to permanently delete library \"{0}\"?", diff --git a/client/strings/hi.json b/client/strings/hi.json index 96d551f4..af0d02a7 100644 --- a/client/strings/hi.json +++ b/client/strings/hi.json @@ -138,6 +138,7 @@ "HeaderRemoveEpisodes": "Remove {0} Episodes", "HeaderRSSFeedGeneral": "RSS Details", "HeaderRSSFeedIsOpen": "RSS Feed is Open", + "HeaderRSSFeeds": "RSS Feeds", "HeaderSavedMediaProgress": "Saved Media Progress", "HeaderSchedule": "Schedule", "HeaderScheduleLibraryScans": "Schedule Automatic Library Scans", @@ -201,6 +202,7 @@ "LabelClosePlayer": "Close player", "LabelCodec": "Codec", "LabelCollapseSeries": "Collapse Series", + "LabelCollection": "Collection", "LabelCollections": "Collections", "LabelComplete": "Complete", "LabelConfirmPassword": "Confirm Password", @@ -428,6 +430,7 @@ "LabelShowAll": "Show All", "LabelSize": "Size", "LabelSleepTimer": "Sleep timer", + "LabelSlug": "Slug", "LabelStart": "Start", "LabelStarted": "Started", "LabelStartedAt": "Started At", @@ -516,6 +519,7 @@ "MessageChapterErrorStartLtPrev": "Invalid start time must be greater than or equal to previous chapter start time", "MessageChapterStartIsAfter": "Chapter start is after the end of your audiobook", "MessageCheckingCron": "Checking cron...", + "MessageConfirmCloseFeed": "Are you sure you want to close this feed?", "MessageConfirmDeleteBackup": "Are you sure you want to delete backup for {0}?", "MessageConfirmDeleteFile": "This will delete the file from your file system. Are you sure?", "MessageConfirmDeleteLibrary": "Are you sure you want to permanently delete library \"{0}\"?", diff --git a/client/strings/hr.json b/client/strings/hr.json index f36d62c4..dcca8df8 100644 --- a/client/strings/hr.json +++ b/client/strings/hr.json @@ -138,6 +138,7 @@ "HeaderRemoveEpisodes": "Ukloni {0} epizoda/-e", "HeaderRSSFeedGeneral": "RSS Details", "HeaderRSSFeedIsOpen": "RSS Feed je otvoren", + "HeaderRSSFeeds": "RSS Feeds", "HeaderSavedMediaProgress": "Spremljen Media Progress", "HeaderSchedule": "Schedule", "HeaderScheduleLibraryScans": "Zakaži automatsko skeniranje biblioteke", @@ -201,6 +202,7 @@ "LabelClosePlayer": "Close player", "LabelCodec": "Codec", "LabelCollapseSeries": "Collapse Series", + "LabelCollection": "Collection", "LabelCollections": "Kolekcije", "LabelComplete": "Complete", "LabelConfirmPassword": "Potvrdi lozinku", @@ -428,6 +430,7 @@ "LabelShowAll": "Prikaži sve", "LabelSize": "Veličina", "LabelSleepTimer": "Sleep timer", + "LabelSlug": "Slug", "LabelStart": "Pokreni", "LabelStarted": "Pokrenuto", "LabelStartedAt": "Pokrenuto", @@ -516,6 +519,7 @@ "MessageChapterErrorStartLtPrev": "Invalid start time must be greater than or equal to previous chapter start time", "MessageChapterStartIsAfter": "Početak poglavlja je nakon kraja audioknjige.", "MessageCheckingCron": "Provjeravam cron...", + "MessageConfirmCloseFeed": "Are you sure you want to close this feed?", "MessageConfirmDeleteBackup": "Jeste li sigurni da želite obrisati backup za {0}?", "MessageConfirmDeleteFile": "This will delete the file from your file system. Are you sure?", "MessageConfirmDeleteLibrary": "Jeste li sigurni da želite trajno obrisati biblioteku \"{0}\"?", diff --git a/client/strings/it.json b/client/strings/it.json index 68912781..797495a9 100644 --- a/client/strings/it.json +++ b/client/strings/it.json @@ -138,6 +138,7 @@ "HeaderRemoveEpisodes": "Rimuovi {0} Episodi", "HeaderRSSFeedGeneral": "RSS Details", "HeaderRSSFeedIsOpen": "RSS Feed è aperto", + "HeaderRSSFeeds": "RSS Feeds", "HeaderSavedMediaProgress": "Progressi salvati", "HeaderSchedule": "Schedula", "HeaderScheduleLibraryScans": "Schedula la scansione della libreria", @@ -201,6 +202,7 @@ "LabelClosePlayer": "Chiudi player", "LabelCodec": "Codec", "LabelCollapseSeries": "Comprimi Serie", + "LabelCollection": "Collection", "LabelCollections": "Raccolte", "LabelComplete": "Completo", "LabelConfirmPassword": "Conferma Password", @@ -428,6 +430,7 @@ "LabelShowAll": "Mostra Tutto", "LabelSize": "Dimensione", "LabelSleepTimer": "Sleep timer", + "LabelSlug": "Slug", "LabelStart": "Inizo", "LabelStarted": "Iniziato", "LabelStartedAt": "Iniziato al", @@ -516,6 +519,7 @@ "MessageChapterErrorStartLtPrev": "L'ora di inizio non valida deve essere maggiore o uguale all'ora di inizio del capitolo precedente", "MessageChapterStartIsAfter": "L'inizio del capitolo è dopo la fine del tuo audiolibro", "MessageCheckingCron": "Controllo cron...", + "MessageConfirmCloseFeed": "Are you sure you want to close this feed?", "MessageConfirmDeleteBackup": "Sei sicuro di voler eliminare il backup {0}?", "MessageConfirmDeleteFile": "Questo eliminerà il file dal tuo file system. Sei sicuro?", "MessageConfirmDeleteLibrary": "Sei sicuro di voler eliminare definitivamente la libreria \"{0}\"?", diff --git a/client/strings/lt.json b/client/strings/lt.json index 0c4cda1f..0bb51a46 100644 --- a/client/strings/lt.json +++ b/client/strings/lt.json @@ -138,6 +138,7 @@ "HeaderRemoveEpisodes": "Pašalinti {0} epizodus", "HeaderRSSFeedGeneral": "RSS informacija", "HeaderRSSFeedIsOpen": "RSS srautas yra atidarytas", + "HeaderRSSFeeds": "RSS Feeds", "HeaderSavedMediaProgress": "Išsaugota medijos pažanga", "HeaderSchedule": "Tvarkaraštis", "HeaderScheduleLibraryScans": "Nustatyti bibliotekų nuskaitymo tvarkaraštį", @@ -201,6 +202,7 @@ "LabelClosePlayer": "Uždaryti grotuvą", "LabelCodec": "Kodekas", "LabelCollapseSeries": "Suskleisti seriją", + "LabelCollection": "Collection", "LabelCollections": "Kolekcijos", "LabelComplete": "Baigta", "LabelConfirmPassword": "Patvirtinkite slaptažodį", @@ -428,6 +430,7 @@ "LabelShowAll": "Rodyti viską", "LabelSize": "Dydis", "LabelSleepTimer": "Miego laikmatis", + "LabelSlug": "Slug", "LabelStart": "Pradėti", "LabelStarted": "Pradėta", "LabelStartedAt": "Pradėta", @@ -516,6 +519,7 @@ "MessageChapterErrorStartLtPrev": "Netinkamas pradžios laikas. Turi būti didesnis arba lygus ankstesnio skyriaus pradžios laikui", "MessageChapterStartIsAfter": "Skyriaus pradžia yra po jūsų garso knygos pabaigos", "MessageCheckingCron": "Tikrinamas cron...", + "MessageConfirmCloseFeed": "Are you sure you want to close this feed?", "MessageConfirmDeleteBackup": "Ar tikrai norite ištrinti atsarginę kopiją, skirtą {0}?", "MessageConfirmDeleteFile": "Tai ištrins failą iš jūsų failų sistemos. Ar tikrai?", "MessageConfirmDeleteLibrary": "Ar tikrai norite visam laikui ištrinti biblioteką \"{0}\"?", diff --git a/client/strings/nl.json b/client/strings/nl.json index 62b3be68..bba0070e 100644 --- a/client/strings/nl.json +++ b/client/strings/nl.json @@ -138,6 +138,7 @@ "HeaderRemoveEpisodes": "Verwijder {0} afleveringen", "HeaderRSSFeedGeneral": "RSS-details", "HeaderRSSFeedIsOpen": "RSS-feed is open", + "HeaderRSSFeeds": "RSS Feeds", "HeaderSavedMediaProgress": "Opgeslagen mediavoortgang", "HeaderSchedule": "Schema", "HeaderScheduleLibraryScans": "Schema automatische bibliotheekscans", @@ -201,6 +202,7 @@ "LabelClosePlayer": "Sluit speler", "LabelCodec": "Codec", "LabelCollapseSeries": "Series inklappen", + "LabelCollection": "Collection", "LabelCollections": "Collecties", "LabelComplete": "Compleet", "LabelConfirmPassword": "Bevestig wachtwoord", @@ -428,6 +430,7 @@ "LabelShowAll": "Toon alle", "LabelSize": "Grootte", "LabelSleepTimer": "Slaaptimer", + "LabelSlug": "Slug", "LabelStart": "Start", "LabelStarted": "Gestart", "LabelStartedAt": "Gestart op", @@ -516,6 +519,7 @@ "MessageChapterErrorStartLtPrev": "Ongeldig: starttijd moet be groter zijn dan of equal aan starttijd van vorig hoofdstuk", "MessageChapterStartIsAfter": "Start van hoofdstuk is na het einde van je audioboek", "MessageCheckingCron": "Cron aan het checken...", + "MessageConfirmCloseFeed": "Are you sure you want to close this feed?", "MessageConfirmDeleteBackup": "Weet je zeker dat je de backup voor {0} wil verwijderen?", "MessageConfirmDeleteFile": "This will delete the file from your file system. Are you sure?", "MessageConfirmDeleteLibrary": "Weet je zeker dat je de bibliotheek \"{0}\" permanent wil verwijderen?", diff --git a/client/strings/pl.json b/client/strings/pl.json index c55e7360..c98c33f8 100644 --- a/client/strings/pl.json +++ b/client/strings/pl.json @@ -138,6 +138,7 @@ "HeaderRemoveEpisodes": "Usuń {0} odcinków", "HeaderRSSFeedGeneral": "RSS Details", "HeaderRSSFeedIsOpen": "Kanał RSS jest otwarty", + "HeaderRSSFeeds": "RSS Feeds", "HeaderSavedMediaProgress": "Zapisany postęp", "HeaderSchedule": "Harmonogram", "HeaderScheduleLibraryScans": "Zaplanuj automatyczne skanowanie biblioteki", @@ -201,6 +202,7 @@ "LabelClosePlayer": "Zamknij odtwarzacz", "LabelCodec": "Codec", "LabelCollapseSeries": "Podsumuj serię", + "LabelCollection": "Collection", "LabelCollections": "Kolekcje", "LabelComplete": "Ukończone", "LabelConfirmPassword": "Potwierdź hasło", @@ -428,6 +430,7 @@ "LabelShowAll": "Pokaż wszystko", "LabelSize": "Rozmiar", "LabelSleepTimer": "Wyłącznik czasowy", + "LabelSlug": "Slug", "LabelStart": "Rozpocznij", "LabelStarted": "Rozpoczęty", "LabelStartedAt": "Rozpoczęto", @@ -516,6 +519,7 @@ "MessageChapterErrorStartLtPrev": "Invalid start time must be greater than or equal to previous chapter start time", "MessageChapterStartIsAfter": "Początek rozdziału następuje po zakończeniu audiobooka", "MessageCheckingCron": "Sprawdzanie cron...", + "MessageConfirmCloseFeed": "Are you sure you want to close this feed?", "MessageConfirmDeleteBackup": "Czy na pewno chcesz usunąć kopię zapasową dla {0}?", "MessageConfirmDeleteFile": "This will delete the file from your file system. Are you sure?", "MessageConfirmDeleteLibrary": "Czy na pewno chcesz trwale usunąć bibliotekę \"{0}\"?", diff --git a/client/strings/ru.json b/client/strings/ru.json index ab986e85..13827930 100644 --- a/client/strings/ru.json +++ b/client/strings/ru.json @@ -138,6 +138,7 @@ "HeaderRemoveEpisodes": "Удалить {0} эпизодов", "HeaderRSSFeedGeneral": "Сведения о RSS", "HeaderRSSFeedIsOpen": "RSS-канал открыт", + "HeaderRSSFeeds": "RSS Feeds", "HeaderSavedMediaProgress": "Прогресс медиа сохранен", "HeaderSchedule": "Планировщик", "HeaderScheduleLibraryScans": "Планировщик автоматического сканирования библиотеки", @@ -201,6 +202,7 @@ "LabelClosePlayer": "Закрыть проигрыватель", "LabelCodec": "Кодек", "LabelCollapseSeries": "Свернуть серии", + "LabelCollection": "Collection", "LabelCollections": "Коллекции", "LabelComplete": "Завершить", "LabelConfirmPassword": "Подтвердить пароль", @@ -428,6 +430,7 @@ "LabelShowAll": "Показать все", "LabelSize": "Размер", "LabelSleepTimer": "Таймер сна", + "LabelSlug": "Slug", "LabelStart": "Начало", "LabelStarted": "Начат", "LabelStartedAt": "Начато В", @@ -516,6 +519,7 @@ "MessageChapterErrorStartLtPrev": "Неверное время начала, должно быть больше или равно времени начала предыдущей главы", "MessageChapterStartIsAfter": "Глава начинается после окончания аудиокниги", "MessageCheckingCron": "Проверка cron...", + "MessageConfirmCloseFeed": "Are you sure you want to close this feed?", "MessageConfirmDeleteBackup": "Вы уверены, что хотите удалить бэкап для {0}?", "MessageConfirmDeleteFile": "Это удалит файл из Вашей файловой системы. Вы уверены?", "MessageConfirmDeleteLibrary": "Вы уверены, что хотите навсегда удалить библиотеку \"{0}\"?", diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json index de11b591..9e8c357d 100644 --- a/client/strings/zh-cn.json +++ b/client/strings/zh-cn.json @@ -138,6 +138,7 @@ "HeaderRemoveEpisodes": "移除 {0} 剧集", "HeaderRSSFeedGeneral": "RSS 详细信息", "HeaderRSSFeedIsOpen": "RSS 源已打开", + "HeaderRSSFeeds": "RSS Feeds", "HeaderSavedMediaProgress": "保存媒体进度", "HeaderSchedule": "计划任务", "HeaderScheduleLibraryScans": "自动扫描媒体库", @@ -201,6 +202,7 @@ "LabelClosePlayer": "关闭播放器", "LabelCodec": "编解码", "LabelCollapseSeries": "折叠系列", + "LabelCollection": "Collection", "LabelCollections": "收藏", "LabelComplete": "已完成", "LabelConfirmPassword": "确认密码", @@ -428,6 +430,7 @@ "LabelShowAll": "全部显示", "LabelSize": "文件大小", "LabelSleepTimer": "睡眠定时", + "LabelSlug": "Slug", "LabelStart": "开始", "LabelStarted": "开始于", "LabelStartedAt": "从这开始", @@ -516,6 +519,7 @@ "MessageChapterErrorStartLtPrev": "无效的开始时间, 必须大于或等于上一章节的开始时间", "MessageChapterStartIsAfter": "章节开始是在有声读物结束之后", "MessageCheckingCron": "检查计划任务...", + "MessageConfirmCloseFeed": "Are you sure you want to close this feed?", "MessageConfirmDeleteBackup": "你确定要删除备份 {0}?", "MessageConfirmDeleteFile": "这将从文件系统中删除该文件. 你确定吗?", "MessageConfirmDeleteLibrary": "你确定要永久删除媒体库 \"{0}\"?", diff --git a/server/controllers/RSSFeedController.js b/server/controllers/RSSFeedController.js index 95cd5e2d..68d31ee1 100644 --- a/server/controllers/RSSFeedController.js +++ b/server/controllers/RSSFeedController.js @@ -5,6 +5,14 @@ const libraryItemsBookFilters = require('../utils/queries/libraryItemsBookFilter class RSSFeedController { constructor() { } + async getAll(req, res) { + const feeds = await this.rssFeedManager.getFeeds() + res.json({ + feeds: feeds.map(f => f.toJSON()), + minified: feeds.map(f => f.toJSONMinified()) + }) + } + // POST: api/feeds/item/:itemId/open async openRSSFeedForItem(req, res) { const options = req.body || {} diff --git a/server/managers/RssFeedManager.js b/server/managers/RssFeedManager.js index e13c9aa5..fa2ae7e1 100644 --- a/server/managers/RssFeedManager.js +++ b/server/managers/RssFeedManager.js @@ -52,7 +52,7 @@ class RssFeedManager { /** * Find open feed for an entity (e.g. collection id, playlist id, library item id) - * @param {string} entityId + * @param {string} entityId * @returns {Promise} oldFeed */ findFeedForEntityId(entityId) { @@ -61,7 +61,7 @@ class RssFeedManager { /** * Find open feed for a slug - * @param {string} slug + * @param {string} slug * @returns {Promise} oldFeed */ findFeedBySlug(slug) { @@ -70,7 +70,7 @@ class RssFeedManager { /** * Find open feed for a slug - * @param {string} slug + * @param {string} slug * @returns {Promise} oldFeed */ findFeed(id) { @@ -262,5 +262,11 @@ class RssFeedManager { if (!feed) return return this.handleCloseFeed(feed) } + + async getFeeds() { + const feeds = await Database.models.feed.getOldFeeds() + Logger.info(`[RssFeedManager] Fetched all feeds`) + return feeds + } } module.exports = RssFeedManager diff --git a/server/routers/ApiRouter.js b/server/routers/ApiRouter.js index 5a4ed727..0dc49dff 100644 --- a/server/routers/ApiRouter.js +++ b/server/routers/ApiRouter.js @@ -295,9 +295,10 @@ class ApiRouter { this.router.post('/tools/item/:id/embed-metadata', ToolsController.middleware.bind(this), ToolsController.embedAudioFileMetadata.bind(this)) this.router.post('/tools/batch/embed-metadata', ToolsController.middleware.bind(this), ToolsController.batchEmbedMetadata.bind(this)) - // + // // RSS Feed Routes (Admin and up) // + this.router.get('/feeds', RSSFeedController.middleware.bind(this), RSSFeedController.getAll.bind(this)) this.router.post('/feeds/item/:itemId/open', RSSFeedController.middleware.bind(this), RSSFeedController.openRSSFeedForItem.bind(this)) this.router.post('/feeds/collection/:collectionId/open', RSSFeedController.middleware.bind(this), RSSFeedController.openRSSFeedForCollection.bind(this)) this.router.post('/feeds/series/:seriesId/open', RSSFeedController.middleware.bind(this), RSSFeedController.openRSSFeedForSeries.bind(this)) @@ -353,8 +354,8 @@ class ApiRouter { // /** * Remove library item and associated entities - * @param {string} mediaType - * @param {string} libraryItemId + * @param {string} mediaType + * @param {string} libraryItemId * @param {string[]} mediaItemIds array of bookId or podcastEpisodeId */ async handleDeleteLibraryItem(mediaType, libraryItemId, mediaItemIds) {