From e9d7efbc5cae1d1237dfd36b40c0b4265a10a0bd Mon Sep 17 00:00:00 2001 From: Dmitry Naboychenko Date: Mon, 11 Sep 2023 21:35:36 +0300 Subject: [PATCH 1/9] Update russian localization --- client/strings/ru.json | 62 +++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/client/strings/ru.json b/client/strings/ru.json index 68319a32..b9a7929b 100644 --- a/client/strings/ru.json +++ b/client/strings/ru.json @@ -103,7 +103,7 @@ "HeaderEmailSettings": "Настройки Email", "HeaderEpisodes": "Эпизоды", "HeaderEreaderDevices": "Устройства E-книга", - "HeaderEreaderSettings": "Ereader Settings", + "HeaderEreaderSettings": "Настройки E-ридера", "HeaderFiles": "Файлы", "HeaderFindChapters": "Найти главы", "HeaderIgnoredFiles": "Игнорируемые Файлы", @@ -138,7 +138,7 @@ "HeaderRemoveEpisodes": "Удалить {0} эпизодов", "HeaderRSSFeedGeneral": "Сведения о RSS", "HeaderRSSFeedIsOpen": "RSS-канал открыт", - "HeaderRSSFeeds": "RSS Feeds", + "HeaderRSSFeeds": "RSS-каналы", "HeaderSavedMediaProgress": "Прогресс медиа сохранен", "HeaderSchedule": "Планировщик", "HeaderScheduleLibraryScans": "Планировщик автоматического сканирования библиотеки", @@ -156,7 +156,7 @@ "HeaderStatsRecentSessions": "Последние сеансы", "HeaderStatsTop10Authors": "Топ 10 авторов", "HeaderStatsTop5Genres": "Топ 5 жанров", - "HeaderTableOfContents": "Table of Contents", + "HeaderTableOfContents": "Содержание", "HeaderTools": "Инструменты", "HeaderUpdateAccount": "Обновить учетную запись", "HeaderUpdateAuthor": "Обновить автора", @@ -202,7 +202,7 @@ "LabelClosePlayer": "Закрыть проигрыватель", "LabelCodec": "Кодек", "LabelCollapseSeries": "Свернуть серии", - "LabelCollection": "Collection", + "LabelCollection": "Коллекция", "LabelCollections": "Коллекции", "LabelComplete": "Завершить", "LabelConfirmPassword": "Подтвердить пароль", @@ -224,9 +224,9 @@ "LabelDirectory": "Каталог", "LabelDiscFromFilename": "Диск из Имени файла", "LabelDiscFromMetadata": "Диск из Метаданных", - "LabelDiscover": "Discover", + "LabelDiscover": "Не начато", "LabelDownload": "Скачать", - "LabelDownloadNEpisodes": "Download {0} episodes", + "LabelDownloadNEpisodes": "Скачать {0} эпизодов", "LabelDuration": "Длина", "LabelDurationFound": "Найденная длина:", "LabelEbook": "E-книга", @@ -255,7 +255,7 @@ "LabelFinished": "Закончен", "LabelFolder": "Папка", "LabelFolders": "Папки", - "LabelFontScale": "Font scale", + "LabelFontScale": "Масштаб шрифта", "LabelFormat": "Формат", "LabelGenre": "Жанр", "LabelGenres": "Жанры", @@ -287,16 +287,16 @@ "LabelLastSeen": "Последнее сканирование", "LabelLastTime": "Последний по времени", "LabelLastUpdate": "Последний обновленный", - "LabelLayout": "Layout", - "LabelLayoutSinglePage": "Single page", - "LabelLayoutSplitPage": "Split page", + "LabelLayout": "Макет", + "LabelLayoutSinglePage": "Одна страница", + "LabelLayoutSplitPage": "Разделенная страница", "LabelLess": "Менее", "LabelLibrariesAccessibleToUser": "Библиотеки доступные для пользователя", "LabelLibrary": "Библиотека", "LabelLibraryItem": "Элемент библиотеки", "LabelLibraryName": "Имя библиотеки", "LabelLimit": "Лимит", - "LabelLineSpacing": "Line spacing", + "LabelLineSpacing": "Межстрочный интервал", "LabelListenAgain": "Послушать снова", "LabelLogLevelDebug": "Debug", "LabelLogLevelInfo": "Info", @@ -321,7 +321,7 @@ "LabelNewPassword": "Новый пароль", "LabelNextBackupDate": "Следующая дата бэкапирования", "LabelNextScheduledRun": "Следущий запланированный запуск", - "LabelNoEpisodesSelected": "No episodes selected", + "LabelNoEpisodesSelected": "Эпизоды не выбраны", "LabelNotes": "Заметки", "LabelNotFinished": "Не завершено", "LabelNotificationAppriseURL": "URL(ы) для извещений", @@ -381,8 +381,8 @@ "LabelSearchTitle": "Поиск по названию", "LabelSearchTitleOrASIN": "Поиск по названию или ASIN", "LabelSeason": "Сезон", - "LabelSelectAllEpisodes": "Select all episodes", - "LabelSelectEpisodesShowing": "Select {0} episodes showing", + "LabelSelectAllEpisodes": "Выбрать все эпизоды", + "LabelSelectEpisodesShowing": "Выберите {0} эпизодов для показа", "LabelSendEbookToDevice": "Отправить e-книгу в...", "LabelSequence": "Последовательность", "LabelSeries": "Серия", @@ -398,15 +398,15 @@ "LabelSettingsDisableWatcher": "Отключить отслеживание", "LabelSettingsDisableWatcherForLibrary": "Отключить отслеживание для библиотеки", "LabelSettingsDisableWatcherHelp": "Отключает автоматическое добавление/обновление элементов, когда обнаружено изменение файлов. *Требуется перезапуск сервера", - "LabelSettingsEnableWatcher": "Enable Watcher", - "LabelSettingsEnableWatcherForLibrary": "Enable folder watcher for library", - "LabelSettingsEnableWatcherHelp": "Enables the automatic adding/updating of items when file changes are detected. *Requires server restart", + "LabelSettingsEnableWatcher": "Включить отслеживание", + "LabelSettingsEnableWatcherForLibrary": "Включить отслеживание за папками библиотеки", + "LabelSettingsEnableWatcherHelp": "Включает автоматическое добавление/обновление элементов при обнаружении изменений файлов. *Требуется перезапуск сервера", "LabelSettingsExperimentalFeatures": "Экспериментальные функции", "LabelSettingsExperimentalFeaturesHelp": "Функционал в разработке на который Вы могли бы дать отзыв или помочь в тестировании. Нажмите для открытия обсуждения на github.", "LabelSettingsFindCovers": "Найти обложки", "LabelSettingsFindCoversHelp": "Если у Ваших аудиокниг нет встроенной обложки или файла обложки в папке книги, то сканер попробует найти обложку.
Примечание: Это увеличит время сканирования", - "LabelSettingsHideSingleBookSeries": "Hide single book series", - "LabelSettingsHideSingleBookSeriesHelp": "Series that have a single book will be hidden from the series page and home page shelves.", + "LabelSettingsHideSingleBookSeries": "Скрыть серии с одной книгой", + "LabelSettingsHideSingleBookSeriesHelp": "Серии, в которых всего одна книга, будут скрыты со страницы серий и полок домашней страницы.", "LabelSettingsHomePageBookshelfView": "Вид книжной полки на Домашней странице", "LabelSettingsLibraryBookshelfView": "Вид книжной полки в Библиотеке", "LabelSettingsOverdriveMediaMarkers": "Overdrive Media Markers для глав", @@ -433,7 +433,7 @@ "LabelShowAll": "Показать все", "LabelSize": "Размер", "LabelSleepTimer": "Таймер сна", - "LabelSlug": "Slug", + "LabelSlug": "Слизень", "LabelStart": "Начало", "LabelStarted": "Начат", "LabelStartedAt": "Начато В", @@ -460,9 +460,9 @@ "LabelTagsAccessibleToUser": "Теги доступные для пользователя", "LabelTagsNotAccessibleToUser": "Теги не доступные для пользователя", "LabelTasks": "Запущенные задачи", - "LabelTheme": "Theme", - "LabelThemeDark": "Dark", - "LabelThemeLight": "Light", + "LabelTheme": "Тема", + "LabelThemeDark": "Темная", + "LabelThemeLight": "Светлая", "LabelTimeBase": "Временная база", "LabelTimeListened": "Время прослушивания", "LabelTimeListenedToday": "Время прослушивания сегодня", @@ -481,7 +481,7 @@ "LabelTrackFromMetadata": "Трек из Метаданных", "LabelTracks": "Треков", "LabelTracksMultiTrack": "Мультитрек", - "LabelTracksNone": "No tracks", + "LabelTracksNone": "Нет треков", "LabelTracksSingleTrack": "Один трек", "LabelType": "Тип", "LabelUnabridged": "Полное издание", @@ -522,16 +522,16 @@ "MessageChapterErrorStartLtPrev": "Неверное время начала, должно быть больше или равно времени начала предыдущей главы", "MessageChapterStartIsAfter": "Глава начинается после окончания аудиокниги", "MessageCheckingCron": "Проверка cron...", - "MessageConfirmCloseFeed": "Are you sure you want to close this feed?", + "MessageConfirmCloseFeed": "Вы уверены, что хотите закрыть этот канал?", "MessageConfirmDeleteBackup": "Вы уверены, что хотите удалить бэкап для {0}?", "MessageConfirmDeleteFile": "Это удалит файл из Вашей файловой системы. Вы уверены?", "MessageConfirmDeleteLibrary": "Вы уверены, что хотите навсегда удалить библиотеку \"{0}\"?", "MessageConfirmDeleteSession": "Вы уверены, что хотите удалить этот сеанс?", "MessageConfirmForceReScan": "Вы уверены, что хотите принудительно выполнить повторное сканирование?", - "MessageConfirmMarkAllEpisodesFinished": "Are you sure you want to mark all episodes as finished?", - "MessageConfirmMarkAllEpisodesNotFinished": "Are you sure you want to mark all episodes as not finished?", - "MessageConfirmMarkSeriesFinished": "Вы уверены, что хотите отметить все книги этой серии как законченные?", - "MessageConfirmMarkSeriesNotFinished": "Вы уверены, что хотите отметить все книги этой серии как незаконченные?", + "MessageConfirmMarkAllEpisodesFinished": "Вы уверены, что хотите отметить все эпизоды как завершенные?", + "MessageConfirmMarkAllEpisodesNotFinished": "Вы уверены, что хотите отметить все эпизоды как не завершенные?", + "MessageConfirmMarkSeriesFinished": "Вы уверены, что хотите отметить все книги этой серии как завершенные?", + "MessageConfirmMarkSeriesNotFinished": "Вы уверены, что хотите отметить все книги этой серии как не завершенные?", "MessageConfirmRemoveAllChapters": "Вы уверены, что хотите удалить все главы?", "MessageConfirmRemoveCollection": "Вы уверены, что хотите удалить коллекцию \"{0}\"?", "MessageConfirmRemoveEpisode": "Вы уверены, что хотите удалить эпизод \"{0}\"?", @@ -563,8 +563,8 @@ "MessageM4BFailed": "M4B Ошибка!", "MessageM4BFinished": "M4B Завершено!", "MessageMapChapterTitles": "Сопоставление названий глав с существующими главами аудиокниги без корректировки временных меток", - "MessageMarkAllEpisodesFinished": "Mark all episodes finished", - "MessageMarkAllEpisodesNotFinished": "Mark all episodes not finished", + "MessageMarkAllEpisodesFinished": "Отметить все эпизоды как завершенные", + "MessageMarkAllEpisodesNotFinished": "Отметить все эпизоды как не завершенные", "MessageMarkAsFinished": "Отметить, как завершенную", "MessageMarkAsNotFinished": "Отметить, как не завершенную", "MessageMatchBooksDescription": "попытается сопоставить книги в библиотеке с книгой из выбранного поставщика поиска и заполнить пустые детали и обложку. Не перезаписывает сведения.", From f1a7fd0d5060e5b82fa9a133ab51dbf87f931870 Mon Sep 17 00:00:00 2001 From: advplyr Date: Mon, 11 Sep 2023 17:51:39 -0500 Subject: [PATCH 2/9] Fix:Podcast library include number of incomplete episodes in home page shelf api request #2081 --- server/utils/queries/libraryFilters.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/utils/queries/libraryFilters.js b/server/utils/queries/libraryFilters.js index 2a1a2bc0..2d93ebaf 100644 --- a/server/utils/queries/libraryFilters.js +++ b/server/utils/queries/libraryFilters.js @@ -108,6 +108,9 @@ module.exports = { if (li.size && !oldLibraryItem.media.size) { oldLibraryItem.media.size = li.size } + if (li.numEpisodesIncomplete) { + oldLibraryItem.numEpisodesIncomplete = li.numEpisodesIncomplete + } return oldLibraryItem }), count From ab97a9d6137470bf254353b5ced8b7a457c63637 Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 12 Sep 2023 10:41:39 -0500 Subject: [PATCH 3/9] Fix:Crash when updating book author or series that includes an apostrophe #2070 --- server/models/Author.js | 7 +++++-- server/models/Series.js | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/server/models/Author.js b/server/models/Author.js index 790b35dd..220abeb8 100644 --- a/server/models/Author.js +++ b/server/models/Author.js @@ -114,11 +114,14 @@ class Author extends Model { static async getOldByNameAndLibrary(authorName, libraryId) { const author = (await this.findOne({ where: [ - literal(`name = '${authorName}' COLLATE NOCASE`), + literal(`name = ':authorName' COLLATE NOCASE`), { libraryId } - ] + ], + replacements: { + authorName + } }))?.getOldAuthor() return author } diff --git a/server/models/Series.js b/server/models/Series.js index e8407d5c..2b37002d 100644 --- a/server/models/Series.js +++ b/server/models/Series.js @@ -105,11 +105,14 @@ class Series extends Model { static async getOldByNameAndLibrary(seriesName, libraryId) { const series = (await this.findOne({ where: [ - literal(`name = '${seriesName}' COLLATE NOCASE`), + literal(`name = ':seriesName' COLLATE NOCASE`), { libraryId } - ] + ], + replacements: { + seriesName + } }))?.getOldSeries() return series } From 2cbc9a07cb359145dfee35a1e5678cd93229b684 Mon Sep 17 00:00:00 2001 From: Machou Date: Tue, 12 Sep 2023 18:11:38 +0200 Subject: [PATCH 4/9] Update fr.json --- client/strings/fr.json | 56 +++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/client/strings/fr.json b/client/strings/fr.json index 230e7348..b2bf2873 100644 --- a/client/strings/fr.json +++ b/client/strings/fr.json @@ -138,7 +138,7 @@ "HeaderRemoveEpisodes": "Suppression de {0} épisodes", "HeaderRSSFeedGeneral": "Détails de flux RSS", "HeaderRSSFeedIsOpen": "Le Flux RSS est actif", - "HeaderRSSFeeds": "RSS Feeds", + "HeaderRSSFeeds": "Flux RSS", "HeaderSavedMediaProgress": "Progression de la sauvegarde des médias", "HeaderSchedule": "Programmation", "HeaderScheduleLibraryScans": "Analyse automatique de la bibliothèque", @@ -148,7 +148,7 @@ "HeaderSettingsDisplay": "Affichage", "HeaderSettingsExperimental": "Fonctionnalités expérimentales", "HeaderSettingsGeneral": "Général", - "HeaderSettingsScanner": "Scanneur", + "HeaderSettingsScanner": "Analyseur", "HeaderSleepTimer": "Minuterie", "HeaderStatsLargestItems": "Articles les plus lourd", "HeaderStatsLongestItems": "Articles les plus long (heures)", @@ -224,7 +224,7 @@ "LabelDirectory": "Répertoire", "LabelDiscFromFilename": "Disque depuis le fichier", "LabelDiscFromMetadata": "Disque depuis les métadonnées", - "LabelDiscover": "Discover", + "LabelDiscover": "Découvrir", "LabelDownload": "Téléchargement", "LabelDownloadNEpisodes": "Télécharger {0} épisode(s)", "LabelDuration": "Durée", @@ -235,8 +235,8 @@ "LabelEmail": "Courriel", "LabelEmailSettingsFromAddress": "Expéditeur", "LabelEmailSettingsSecure": "Sécurisé", - "LabelEmailSettingsSecureHelp": "Si coché, la connexion utilisera TLS lors de la connexion au serveur. Sinon TLS est utilisé si le serveur prend en charge l’extension STARTTLS. Dans la plupart des cas, cochez si vous vous connectez au port 465. Décochez pour le port 587 ou 25. (source: nodemailer.com/smtp/#authentication)", - "LabelEmailSettingsTestAddress": "Test Address", + "LabelEmailSettingsSecureHelp": "Utiliser TLS lors de la connexion au serveur, autrement TLS sera utilisé si le serveur prend en charge l’extension STARTTLS. Dans la plupart des cas, actviez l’option si vous vous connectez au port 465. Désactivez l’option pour utiliser port 587 ou 25. (source: nodemailer.com/smtp/#authentication)", + "LabelEmailSettingsTestAddress": "Adresse de test", "LabelEmbeddedCover": "Couverture du livre intégrée", "LabelEnable": "Activer", "LabelEnd": "Fin", @@ -397,10 +397,10 @@ "LabelSettingsDateFormat": "Format de date", "LabelSettingsDisableWatcher": "Désactiver la surveillance", "LabelSettingsDisableWatcherForLibrary": "Désactiver la surveillance des dossiers pour la bibliothèque", - "LabelSettingsDisableWatcherHelp": "Désactive la mise à jour automatique lorsque les fichiers changent. *Nécessite un redémarrage*", - "LabelSettingsEnableWatcher": "Enable Watcher", - "LabelSettingsEnableWatcherForLibrary": "Enable folder watcher for library", - "LabelSettingsEnableWatcherHelp": "Enables the automatic adding/updating of items when file changes are detected. *Requires server restart", + "LabelSettingsDisableWatcherHelp": "Désactive la mise à jour automatique lorsque des modifications de fichiers sont détectées. *Nécessite le redémarrage du serveur", + "LabelSettingsEnableWatcher": "Activer la veille", + "LabelSettingsEnableWatcherForLibrary": "Activer la surveillance des dossiers pour la bibliothèque", + "LabelSettingsEnableWatcherHelp": "Active la mise à jour automatique automatique lorsque des modifications de fichiers sont détectées. *Nécessite le redémarrage du serveur", "LabelSettingsExperimentalFeatures": "Fonctionnalités expérimentales", "LabelSettingsExperimentalFeaturesHelp": "Fonctionnalités en cours de développement sur lesquelles nous attendons votre retour et expérience. Cliquez pour ouvrir la discussion Github.", "LabelSettingsFindCovers": "Chercher des couvertures de livre", @@ -411,20 +411,20 @@ "LabelSettingsLibraryBookshelfView": "La bibliothèque utilise la vue étagère", "LabelSettingsOverdriveMediaMarkers": "Utiliser Overdrive Media Marker pour les chapitres", "LabelSettingsOverdriveMediaMarkersHelp": "Les fichiers MP3 d’Overdrive viennent avec les minutages des chapitres intégrés en métadonnées. Activer ce paramètre utilisera ces minutages pour les chapitres automatiquement.", - "LabelSettingsParseSubtitles": "Analyse des sous-titres", + "LabelSettingsParseSubtitles": "Analyser les sous-titres", "LabelSettingsParseSubtitlesHelp": "Extrait les sous-titres depuis le dossier du Livre Audio.
Les sous-titres doivent être séparés par « - »
i.e. « Titre du Livre - Ceci est un sous-titre » aura le sous-titre « Ceci est un sous-titre »", - "LabelSettingsPreferAudioMetadata": "Préférer les Métadonnées audio", + "LabelSettingsPreferAudioMetadata": "Préférer les métadonnées audio", "LabelSettingsPreferAudioMetadataHelp": "Les méta étiquettes ID3 des fichiers audios seront utilisés à la place des noms de dossier pour les détails du livre audio", - "LabelSettingsPreferMatchedMetadata": "Préférer les Métadonnées par correspondance", + "LabelSettingsPreferMatchedMetadata": "Préférer les métadonnées par correspondance", "LabelSettingsPreferMatchedMetadataHelp": "Les métadonnées par correspondance écrase les détails de l’article lors d’une recherche par correspondance rapide. Par défaut, la recherche par correspondance rapide ne comblera que les éléments manquant.", - "LabelSettingsPreferOPFMetadata": "Préférer les Métadonnées OPF", + "LabelSettingsPreferOPFMetadata": "Préférer les métadonnées OPF", "LabelSettingsPreferOPFMetadataHelp": "Les fichiers de métadonnées OPF seront utilisés à la place des noms de dossier pour les détails du Livre Audio", "LabelSettingsSkipMatchingBooksWithASIN": "Ignorer la recherche par correspondance sur les livres ayant déjà un ASIN", "LabelSettingsSkipMatchingBooksWithISBN": "Ignorer la recherche par correspondance sur les livres ayant déjà un ISBN", "LabelSettingsSortingIgnorePrefixes": "Ignorer les préfixes lors du tri", "LabelSettingsSortingIgnorePrefixesHelp": "i.e. pour le préfixe « le », le livre avec pour titre « Le Titre du Livre » sera trié en tant que « Titre du Livre, Le »", "LabelSettingsSquareBookCovers": "Utiliser des couvertures carrées", - "LabelSettingsSquareBookCoversHelp": "Préférer les couvertures carrées par rapport aux couvertures standardes de 1.6:1.", + "LabelSettingsSquareBookCoversHelp": "Préférer les couvertures carrées par rapport aux couvertures standards de ratio 1.6:1.", "LabelSettingsStoreCoversWithItem": "Enregistrer la couverture avec les articles", "LabelSettingsStoreCoversWithItemHelp": "Par défaut, les couvertures sont enregistrées dans /metadata/items. Activer ce paramètre enregistrera les couvertures dans le dossier avec les fichiers de l’article. Seul un fichier nommé « cover » sera conservé.", "LabelSettingsStoreMetadataWithItem": "Enregistrer les Métadonnées avec les articles", @@ -522,21 +522,21 @@ "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 ?", + "MessageConfirmCloseFeed": "Êtes-vous sûr de vouloir fermer ce flux ?", + "MessageConfirmDeleteBackup": "Êtes-vous sûr de vouloir supprimer la sauvegarde de « {0} » ?", + "MessageConfirmDeleteFile": "Cela supprimera le fichier de votre système de fichiers. Êtes-vous sûr ?", "MessageConfirmDeleteLibrary": "Êtes-vous sûr de vouloir supprimer définitivement la bibliothèque « {0} » ?", "MessageConfirmDeleteSession": "Êtes-vous sûr de vouloir supprimer cette session ?", - "MessageConfirmForceReScan": "Êtes-vous sûr de vouloir lancer une Analyse Forcée ?", + "MessageConfirmForceReScan": "Êtes-vous sûr de vouloir lancer une analyse forcée ?", "MessageConfirmMarkAllEpisodesFinished": "Êtes-vous sûr de marquer tous les épisodes comme terminés ?", - "MessageConfirmMarkAllEpisodesNotFinished": "Are you sure you want to mark all episodes as not finished?", - "MessageConfirmMarkSeriesFinished": "Êtes-vous sûr de vouloir marquer comme terminé tous les livres de cette série ?", - "MessageConfirmMarkSeriesNotFinished": "Êtes-vous sûr de vouloir marquer comme non terminé tous les livres de cette série ?", + "MessageConfirmMarkAllEpisodesNotFinished": "Êtes-vous sûr de vouloir marquer tous les épisodes comme non terminés ?", + "MessageConfirmMarkSeriesFinished": "Êtes-vous sûr de vouloir marquer tous les livres de cette série comme terminées ?", + "MessageConfirmMarkSeriesNotFinished": "Êtes-vous sûr de vouloir marquer tous les livres de cette série comme comme non terminés ?", "MessageConfirmRemoveAllChapters": "Êtes-vous sûr de vouloir supprimer tous les chapitres ?", "MessageConfirmRemoveCollection": "Êtes-vous sûr de vouloir supprimer la collection « {0} » ?", "MessageConfirmRemoveEpisode": "Êtes-vous sûr de vouloir supprimer l’épisode « {0} » ?", "MessageConfirmRemoveEpisodes": "Êtes-vous sûr de vouloir supprimer {0} épisodes ?", - "MessageConfirmRemoveNarrator": "Êtes-vous sûr de vouloir supprimer le narrateur \"{0}\"?", + "MessageConfirmRemoveNarrator": "Êtes-vous sûr de vouloir supprimer le narrateur « {0} » ?", "MessageConfirmRemovePlaylist": "Êtes-vous sûr de vouloir supprimer la liste de lecture « {0} » ?", "MessageConfirmRenameGenre": "Êtes-vous sûr de vouloir renommer le genre « {0} » en « {1} » pour tous les articles ?", "MessageConfirmRenameGenreMergeNote": "Information: Ce genre existe déjà et sera fusionné.", @@ -544,12 +544,12 @@ "MessageConfirmRenameTag": "Êtes-vous sûr de vouloir renommer l’étiquette « {0} » en « {1} » pour tous les articles ?", "MessageConfirmRenameTagMergeNote": "Information: Cette étiquette existe déjà et sera fusionnée.", "MessageConfirmRenameTagWarning": "Attention ! Une étiquette similaire avec une casse différente existe déjà « {0} ».", - "MessageConfirmSendEbookToDevice": "Êtes-vous sûr de vouloir envoyer le livre numérique {0} \"{1}\" à l’appareil \"{2}\"?", + "MessageConfirmSendEbookToDevice": "Êtes-vous sûr de vouloir envoyer le livre numérique {0} « {1} » à l’appareil « {2} »?", "MessageDownloadingEpisode": "Téléchargement de l’épisode", "MessageDragFilesIntoTrackOrder": "Faire glisser les fichiers dans l’ordre correct", - "MessageEmbedFinished": "Intégration Terminée !", + "MessageEmbedFinished": "Intégration terminée !", "MessageEpisodesQueuedForDownload": "{0} épisode(s) mis en file pour téléchargement", - "MessageFeedURLWillBe": "l’URL du Flux sera {0}", + "MessageFeedURLWillBe": "l’URL du flux sera {0}", "MessageFetching": "Récupération…", "MessageForceReScanDescription": "Analysera tous les fichiers de nouveau. Les étiquettes ID3 des fichiers audios, fichiers OPF, et les fichiers textes seront analysés comme s’ils étaient nouveaux.", "MessageImportantNotice": "Information Importante !", @@ -560,8 +560,8 @@ "MessageListeningSessionsInTheLastYear": "{0} sessions d’écoute l’an dernier", "MessageLoading": "Chargement…", "MessageLoadingFolders": "Chargement des dossiers…", - "MessageM4BFailed": "M4B en échec !", - "MessageM4BFinished": "M4B terminé !", + "MessageM4BFailed": "M4B échec", + "MessageM4BFinished": "M4B terminé", "MessageMapChapterTitles": "Faire correspondre les titres des chapitres aux chapitres existants de votre livre audio sans ajuster l’horodatage.", "MessageMarkAllEpisodesFinished": "Marquer tous les épisodes terminés", "MessageMarkAllEpisodesNotFinished": "Marquer tous les épisodes non terminés", @@ -711,4 +711,4 @@ "ToastSocketFailedToConnect": "Échec de la connexion WebSocket", "ToastUserDeleteFailed": "Échec de la suppression de l’utilisateur", "ToastUserDeleteSuccess": "Utilisateur supprimé" -} \ No newline at end of file +} From 9553c19b33fc619e92b55a03e43ae267f7443e83 Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 12 Sep 2023 12:33:41 -0500 Subject: [PATCH 5/9] Fix:Authors dropdown to use filter data instead of API endpoint #2077 --- .../components/ui/MultiSelectQueryInput.vue | 23 ++++++++----------- client/components/widgets/BookDetailsEdit.vue | 4 ++-- client/pages/batch/index.vue | 4 ++-- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/client/components/ui/MultiSelectQueryInput.vue b/client/components/ui/MultiSelectQueryInput.vue index 27274103..fb9528ce 100644 --- a/client/components/ui/MultiSelectQueryInput.vue +++ b/client/components/ui/MultiSelectQueryInput.vue @@ -46,7 +46,7 @@ export default { type: Array, default: () => [] }, - endpoint: String, + filterKey: String, label: String, disabled: Boolean, readonly: Boolean, @@ -60,7 +60,6 @@ export default { return { textInput: null, currentSearch: null, - searching: false, typingTimeout: null, isFocused: false, menu: null, @@ -97,6 +96,9 @@ export default { }, itemsToShow() { return this.items + }, + filterData() { + return this.$store.state.libraries.filterData || {} } }, methods: { @@ -109,20 +111,15 @@ export default { getIsSelected(itemValue) { return !!this.selected.find((i) => i.id === itemValue) }, - async search() { - if (this.searching) return + search() { this.currentSearch = this.textInput - this.searching = true - const results = await this.$axios - .$get(`/api/${this.endpoint}?q=${this.currentSearch}&limit=15&token=${this.userToken}`) - .then((res) => res.results || res) - .catch((error) => { - console.error('Failed to get search results', error) - return [] - }) + const dataToSearch = this.filterData[this.filterKey] || [] + + const results = dataToSearch.filter((au) => { + return au.name.toLowerCase().includes(this.currentSearch.toLowerCase().trim()) + }) this.items = results || [] - this.searching = false }, keydownInput() { clearTimeout(this.typingTimeout) diff --git a/client/components/widgets/BookDetailsEdit.vue b/client/components/widgets/BookDetailsEdit.vue index 14a6797e..b42082b5 100644 --- a/client/components/widgets/BookDetailsEdit.vue +++ b/client/components/widgets/BookDetailsEdit.vue @@ -12,8 +12,8 @@
- - + +
diff --git a/client/pages/batch/index.vue b/client/pages/batch/index.vue index 50410405..15675fb8 100644 --- a/client/pages/batch/index.vue +++ b/client/pages/batch/index.vue @@ -26,8 +26,8 @@
- - + +
From 1024bc5a75c736cec19670eca1cac05f7d8b9389 Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 12 Sep 2023 13:43:28 -0500 Subject: [PATCH 6/9] Fix:Podcast library stat for total size #2072 --- server/utils/queries/libraryItemsPodcastFilters.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/server/utils/queries/libraryItemsPodcastFilters.js b/server/utils/queries/libraryItemsPodcastFilters.js index 1f8d70a9..63dc915f 100644 --- a/server/utils/queries/libraryItemsPodcastFilters.js +++ b/server/utils/queries/libraryItemsPodcastFilters.js @@ -469,12 +469,20 @@ module.exports = { * @returns {Promise<{ totalSize:number, totalDuration:number, numAudioFiles:number, totalItems:number}>} */ async getPodcastLibraryStats(libraryId) { - const [statResults] = await Database.sequelize.query(`SELECT SUM(json_extract(pe.audioFile, '$.duration')) AS totalDuration, SUM(li.size) AS totalSize, COUNT(DISTINCT(li.id)) AS totalItems, COUNT(pe.id) AS numAudioFiles FROM libraryItems li, podcasts p LEFT OUTER JOIN podcastEpisodes pe ON pe.podcastId = p.id WHERE p.id = li.mediaId AND li.libraryId = :libraryId;`, { + const [sizeResults] = await Database.sequelize.query(`SELECT SUM(li.size) AS totalSize FROM libraryItems li WHERE li.mediaType = "podcast" AND li.libraryId = :libraryId;`, { replacements: { libraryId } }) - return statResults[0] + const [statResults] = await Database.sequelize.query(`SELECT SUM(json_extract(pe.audioFile, '$.duration')) AS totalDuration, COUNT(DISTINCT(li.id)) AS totalItems, COUNT(pe.id) AS numAudioFiles FROM libraryItems li, podcasts p LEFT OUTER JOIN podcastEpisodes pe ON pe.podcastId = p.id WHERE p.id = li.mediaId AND li.libraryId = :libraryId;`, { + replacements: { + libraryId + } + }) + return { + ...statResults[0], + totalSize: sizeResults[0].totalSize || 0 + } }, /** From 083ba2fe194ebfc8871672ca5119fcffa5c4f49c Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 12 Sep 2023 15:35:14 -0500 Subject: [PATCH 7/9] Fix:Podcast download queue page available on refresh #2088 --- server/Server.js | 1 + 1 file changed, 1 insertion(+) diff --git a/server/Server.js b/server/Server.js index 6b867464..d1d36d0b 100644 --- a/server/Server.js +++ b/server/Server.js @@ -184,6 +184,7 @@ class Server { '/library/:library/series/:id?', '/library/:library/podcast/search', '/library/:library/podcast/latest', + '/library/:library/podcast/download-queue', '/config/users/:id', '/config/users/:id/sessions', '/config/item-metadata-utils/:id', From 5d84c426fe549d3dbae09ed56d81eab743f50915 Mon Sep 17 00:00:00 2001 From: Lionfox2 <50257663+Lionfox2@users.noreply.github.com> Date: Tue, 12 Sep 2023 23:30:58 +0200 Subject: [PATCH 8/9] Update de.json The more suitable translation for "discover" is "Entdecken", same wording as in other media apps like Spotify --- client/strings/de.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/strings/de.json b/client/strings/de.json index 8ed43eae..4d1ca73e 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -224,7 +224,7 @@ "LabelDirectory": "Verzeichnis", "LabelDiscFromFilename": "CD aus dem Dateinamen", "LabelDiscFromMetadata": "CD aus den Metadaten", - "LabelDiscover": "Finden", + "LabelDiscover": "Entdecken", "LabelDownload": "Herunterladen", "LabelDownloadNEpisodes": "Download {0} episodes", "LabelDuration": "Laufzeit", @@ -711,4 +711,4 @@ "ToastSocketFailedToConnect": "Verbindung zum WebSocket fehlgeschlagen", "ToastUserDeleteFailed": "Benutzer konnte nicht gelöscht werden", "ToastUserDeleteSuccess": "Benutzer gelöscht" -} \ No newline at end of file +} From fea28351f9e5dbe945a85ffd4606eab419bf1e05 Mon Sep 17 00:00:00 2001 From: advplyr Date: Wed, 13 Sep 2023 16:48:28 -0500 Subject: [PATCH 9/9] Version bump 2.4.2 --- client/package-lock.json | 4 ++-- client/package.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 6f24e887..497a1030 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,12 +1,12 @@ { "name": "audiobookshelf-client", - "version": "2.4.1", + "version": "2.4.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "audiobookshelf-client", - "version": "2.4.1", + "version": "2.4.2", "license": "ISC", "dependencies": { "@nuxtjs/axios": "^5.13.6", diff --git a/client/package.json b/client/package.json index 0bb4bd60..c6d1e812 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "audiobookshelf-client", - "version": "2.4.1", + "version": "2.4.2", "description": "Self-hosted audiobook and podcast client", "main": "index.js", "scripts": { diff --git a/package-lock.json b/package-lock.json index 05ec0be5..a22b954c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "audiobookshelf", - "version": "2.4.1", + "version": "2.4.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "audiobookshelf", - "version": "2.4.1", + "version": "2.4.2", "license": "GPL-3.0", "dependencies": { "axios": "^0.27.2", diff --git a/package.json b/package.json index fca69a3a..ff008aed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "audiobookshelf", - "version": "2.4.1", + "version": "2.4.2", "description": "Self-hosted audiobook and podcast server", "main": "index.js", "scripts": {