diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml index 1d4228109..ca044b711 100644 --- a/.github/ISSUE_TEMPLATE/bug.yaml +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -11,7 +11,7 @@ body: value: "### Mobile app issues report [here](https://github.com/advplyr/audiobookshelf-app/issues/new/choose)." - type: markdown attributes: - value: "### Join the [discord server](https://discord.gg/pJsjuNCKRq) for questions or if you are not sure about a bug." + value: "### Join the [discord server](https://discord.gg/HQgCbd6E75) for questions or if you are not sure about a bug." - type: markdown attributes: value: "## Be as descriptive as you can. Include screenshots, error logs, browser, file types, everything you can think of that might be relevant." diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 63cb88055..2c6cc1912 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,7 +1,7 @@ blank_issues_enabled: false contact_links: - name: Discord - url: https://discord.gg/pJsjuNCKRq + url: https://discord.gg/HQgCbd6E75 about: Ask questions, get help troubleshooting, and join the Abs community here. - name: Matrix url: https://matrix.to/#/#audiobookshelf:matrix.org diff --git a/.gitignore b/.gitignore index 9360600a5..0690f38f5 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,8 @@ /deploy/ /coverage/ /.nyc_output/ +/ffmpeg* +/ffprobe* sw.* .DS_STORE diff --git a/Dockerfile b/Dockerfile index 254720004..943fc5674 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,7 +18,8 @@ RUN apk update && \ ffmpeg \ make \ python3 \ - g++ + g++ \ + tini COPY --from=tone /usr/local/bin/tone /usr/local/bin/ COPY --from=build /client/dist /client/dist @@ -31,4 +32,5 @@ RUN apk del make python3 g++ EXPOSE 80 +ENTRYPOINT ["tini", "--"] CMD ["node", "index.js"] diff --git a/client/components/app/StreamContainer.vue b/client/components/app/StreamContainer.vue index e9b6969de..0cae1421c 100644 --- a/client/components/app/StreamContainer.vue +++ b/client/components/app/StreamContainer.vue @@ -349,7 +349,7 @@ export default { } if ('mediaSession' in navigator) { - var coverImageSrc = this.$store.getters['globals/getLibraryItemCoverSrc'](this.streamLibraryItem, '/Logo.png') + var coverImageSrc = this.$store.getters['globals/getLibraryItemCoverSrc'](this.streamLibraryItem, '/Logo.png', true) const artwork = [ { src: coverImageSrc diff --git a/client/components/cards/LazyBookCard.vue b/client/components/cards/LazyBookCard.vue index c4d1345da..04b3ce599 100644 --- a/client/components/cards/LazyBookCard.vue +++ b/client/components/cards/LazyBookCard.vue @@ -8,10 +8,10 @@
{{ displayTitle }}
{{ displayLineTwo || ' ' }}
{{ displaySortLine }}
@@ -164,6 +164,7 @@ export default { imageReady: false, selected: false, isSelectionMode: false, + displayTitleTruncated: false, showCoverBg: false } }, @@ -642,6 +643,12 @@ export default { } this.libraryItem = libraryItem + + this.$nextTick(() => { + if (this.$refs.displayTitle) { + this.displayTitleTruncated = this.$refs.displayTitle.scrollWidth > this.$refs.displayTitle.clientWidth + } + }) }, clickCard(e) { if (this.processing) return diff --git a/client/components/modals/item/tabs/Tools.vue b/client/components/modals/item/tabs/Tools.vue index 5f2ca6b33..de19e04c3 100644 --- a/client/components/modals/item/tabs/Tools.vue +++ b/client/components/modals/item/tabs/Tools.vue @@ -2,8 +2,11 @@{{ $strings.HeaderAudiobookTools }}
+ +{{ $strings.LabelToolsMakeM4b }}
@@ -19,22 +22,8 @@{{ $strings.LabelToolsEmbedMetadata }}
@@ -122,6 +111,12 @@ export default { }, isEncodeTaskRunning() { return this.encodeTask && !this.encodeTask?.isFinished + }, + isWindowsInstall() { + return this.Source == 'windows' + }, + Source() { + return this.$store.state.Source } }, methods: { diff --git a/client/components/modals/libraries/EditLibrary.vue b/client/components/modals/libraries/EditLibrary.vue index 598f3bcd4..d29d79298 100644 --- a/client/components/modals/libraries/EditLibrary.vue +++ b/client/components/modals/libraries/EditLibrary.vue @@ -31,7 +31,7 @@{{ $strings.HeaderChooseAFolder }}
{{ selectedPath || '\\' }}
+{{ selectedPath || '/' }}
..
{{ dir.dirname }}
- +{{ dir.dirname }}
{{ $strings.MessageLoadingFolders }}
{{ $strings.MessageNoFoldersAvailable }}
{{ $strings.NoteFolderPicker }}
-{{ $strings.NoteFolderPickerDebian }}
/login?autoLaunch=0)",
- "LabelAutoRegister": "Auto Register",
- "LabelAutoRegisterDescription": "Automatically create new users after logging in",
- "LabelBackToUser": "Revenir à l’Utilisateur",
- "LabelBackupLocation": "Backup Location",
+ "LabelAutoFetchMetadata": "Recherche automatique de métadonnées",
+ "LabelAutoFetchMetadataHelp": "Récupère les métadonnées du titre, de l’auteur et de la série pour simplifier le téléchargement. Il se peut que des métadonnées supplémentaires doivent être ajoutées après le téléchargement.",
+ "LabelAutoLaunch": "Lancement automatique",
+ "LabelAutoLaunchDescription": "Redirection automatique vers le fournisseur d'authentification lors de la navigation vers la page de connexion (chemin de remplacement manuel /login?autoLaunch=0)",
+ "LabelAutoRegister": "Enregistrement automatique",
+ "LabelAutoRegisterDescription": "Créer automatiquement de nouveaux utilisateurs après la connexion",
+ "LabelBackToUser": "Retour à l’utilisateur",
+ "LabelBackupLocation": "Emplacement de la sauvegarde",
"LabelBackupsEnableAutomaticBackups": "Activer les sauvegardes automatiques",
- "LabelBackupsEnableAutomaticBackupsHelp": "Sauvegardes Enregistrées dans /metadata/backups",
+ "LabelBackupsEnableAutomaticBackupsHelp": "Sauvegardes enregistrées dans /metadata/backups",
"LabelBackupsMaxBackupSize": "Taille maximale de la sauvegarde (en Go)",
"LabelBackupsMaxBackupSizeHelp": "Afin de prévenir les mauvaises configuration, la sauvegarde échouera si elle excède la taille limite.",
- "LabelBackupsNumberToKeep": "Nombre de sauvegardes à maintenir",
- "LabelBackupsNumberToKeepHelp": "Une seule sauvegarde sera effacée à la fois. Si vous avez plus de sauvegardes à effacer, vous devrez le faire manuellement.",
+ "LabelBackupsNumberToKeep": "Nombre de sauvegardes à conserver",
+ "LabelBackupsNumberToKeepHelp": "Seule une sauvegarde sera supprimée à la fois. Si vous avez déjà plus de sauvegardes à effacer, vous devez les supprimer manuellement.",
"LabelBitrate": "Bitrate",
"LabelBooks": "Livres",
- "LabelButtonText": "Button Text",
+ "LabelButtonText": "Texte du bouton",
"LabelChangePassword": "Modifier le mot de passe",
"LabelChannels": "Canaux",
"LabelChapters": "Chapitres",
- "LabelChaptersFound": "Chapitres trouvés",
- "LabelChapterTitle": "Titres du chapitre",
- "LabelClickForMoreInfo": "Click for more info",
+ "LabelChaptersFound": "chapitres trouvés",
+ "LabelChapterTitle": "Titre du chapitre",
+ "LabelClickForMoreInfo": "Cliquez ici pour plus d’informations",
"LabelClosePlayer": "Fermer le lecteur",
"LabelCodec": "Codec",
"LabelCollapseSeries": "Réduire les séries",
@@ -235,20 +235,20 @@
"LabelCover": "Couverture",
"LabelCoverImageURL": "URL vers l’image de couverture",
"LabelCreatedAt": "Créé le",
- "LabelCronExpression": "Expression Cron",
- "LabelCurrent": "Courrant",
- "LabelCurrently": "En ce moment :",
- "LabelCustomCronExpression": "Expression cron personnalisée:",
- "LabelDatetime": "Datetime",
- "LabelDeleteFromFileSystemCheckbox": "Delete from file system (uncheck to only remove from database)",
+ "LabelCronExpression": "Expression cron",
+ "LabelCurrent": "Actuel",
+ "LabelCurrently": "Actuellement :",
+ "LabelCustomCronExpression": "Expression cron personnalisée :",
+ "LabelDatetime": "Date",
+ "LabelDeleteFromFileSystemCheckbox": "Supprimer du système de fichiers (décocher pour ne supprimer que de la base de données)",
"LabelDescription": "Description",
"LabelDeselectAll": "Tout déselectionner",
"LabelDevice": "Appareil",
"LabelDeviceInfo": "Détail de l’appareil",
- "LabelDeviceIsAvailableTo": "Device is available to...",
+ "LabelDeviceIsAvailableTo": "L’appareil est disponible pour…",
"LabelDirectory": "Répertoire",
- "LabelDiscFromFilename": "Disque depuis le fichier",
- "LabelDiscFromMetadata": "Disque depuis les métadonnées",
+ "LabelDiscFromFilename": "Depuis le fichier",
+ "LabelDiscFromMetadata": "Depuis les métadonnées",
"LabelDiscover": "Découvrir",
"LabelDownload": "Téléchargement",
"LabelDownloadNEpisodes": "Télécharger {0} épisode(s)",
@@ -271,17 +271,17 @@
"LabelExample": "Exemple",
"LabelExplicit": "Restriction",
"LabelFeedURL": "URL du flux",
- "LabelFetchingMetadata": "Fetching Metadata",
+ "LabelFetchingMetadata": "Récupération des métadonnées",
"LabelFile": "Fichier",
"LabelFileBirthtime": "Création du fichier",
"LabelFileModified": "Modification du fichier",
"LabelFilename": "Nom de fichier",
- "LabelFilterByUser": "Filtrer par l’utilisateur",
+ "LabelFilterByUser": "Filtrer par utilisateur",
"LabelFindEpisodes": "Trouver des épisodes",
- "LabelFinished": "Fini(e)",
+ "LabelFinished": "Terminé le",
"LabelFolder": "Dossier",
"LabelFolders": "Dossiers",
- "LabelFontFamily": "Famille de polices",
+ "LabelFontFamily": "Polices de caractères",
"LabelFontScale": "Taille de la police de caractère",
"LabelFormat": "Format",
"LabelGenre": "Genre",
@@ -289,16 +289,16 @@
"LabelHardDeleteFile": "Suppression du fichier",
"LabelHasEbook": "Dispose d’un livre numérique",
"LabelHasSupplementaryEbook": "Dispose d’un livre numérique supplémentaire",
- "LabelHighestPriority": "Highest priority",
+ "LabelHighestPriority": "Priorité la plus élevée",
"LabelHost": "Hôte",
"LabelHour": "Heure",
- "LabelIcon": "Icone",
- "LabelImageURLFromTheWeb": "Image URL from the web",
- "LabelIncludeInTracklist": "Inclure dans la liste des pistes",
+ "LabelIcon": "Icône",
+ "LabelImageURLFromTheWeb": "URL de l’image à partir du web",
+ "LabelIncludeInTracklist": "Inclure dans la liste de lecture",
"LabelIncomplete": "Incomplet",
"LabelInProgress": "En cours",
"LabelInterval": "Intervalle",
- "LabelIntervalCustomDailyWeekly": "Journalier / Hebdomadaire personnalisé",
+ "LabelIntervalCustomDailyWeekly": "Personnaliser quotidiennement / hebdomadairement",
"LabelIntervalEvery12Hours": "Toutes les 12 heures",
"LabelIntervalEvery15Minutes": "Toutes les 15 minutes",
"LabelIntervalEvery2Hours": "Toutes les 2 heures",
@@ -331,22 +331,22 @@
"LabelLogLevelInfo": "Info",
"LabelLogLevelWarn": "Warn",
"LabelLookForNewEpisodesAfterDate": "Chercher de nouveaux épisode après cette date",
- "LabelLowestPriority": "Lowest Priority",
- "LabelMatchExistingUsersBy": "Match existing users by",
- "LabelMatchExistingUsersByDescription": "Used for connecting existing users. Once connected, users will be matched by a unique id from your SSO provider",
+ "LabelLowestPriority": "Priorité la plus basse",
+ "LabelMatchExistingUsersBy": "Faire correspondre les utilisateurs existants par",
+ "LabelMatchExistingUsersByDescription": "Utilisé pour connecter les utilisateurs existants. Une fois connectés, les utilisateurs seront associés à un identifiant unique provenant de votre fournisseur SSO.",
"LabelMediaPlayer": "Lecteur multimédia",
"LabelMediaType": "Type de média",
- "LabelMetadataOrderOfPrecedenceDescription": "Higher priority metadata sources will override lower priority metadata sources",
+ "LabelMetadataOrderOfPrecedenceDescription": "Les sources de métadonnées ayant une priorité plus élevée auront la priorité sur celles ayant une priorité moins élevée.",
"LabelMetadataProvider": "Fournisseur de métadonnées",
- "LabelMetaTag": "Etiquette de métadonnée",
- "LabelMetaTags": "Etiquettes de métadonnée",
+ "LabelMetaTag": "Balise de métadonnée",
+ "LabelMetaTags": "Balises de métadonnée",
"LabelMinute": "Minute",
"LabelMissing": "Manquant",
"LabelMissingParts": "Parties manquantes",
- "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs",
- "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is audiobookshelf://oauth, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (*) as the sole entry permits any URI.",
+ "LabelMobileRedirectURIs": "URI de redirection mobile autorisés",
+ "LabelMobileRedirectURIsDescription": "Il s'agit d'une liste blanche d’URI de redirection valides pour les applications mobiles. Celui par défaut est audiobookshelf://oauth, que vous pouvez supprimer ou compléter avec des URIs supplémentaires pour l'intégration d'applications tierces. L’utilisation d’un astérisque (*) comme seule entrée autorise n’importe quel URI.",
"LabelMore": "Plus",
- "LabelMoreInfo": "Plus d’info",
+ "LabelMoreInfo": "Plus d’informations",
"LabelName": "Nom",
"LabelNarrator": "Narrateur",
"LabelNarrators": "Narrateurs",
@@ -358,7 +358,7 @@
"LabelNextScheduledRun": "Prochain lancement prévu",
"LabelNoEpisodesSelected": "Aucun épisode sélectionné",
"LabelNotes": "Notes",
- "LabelNotFinished": "Non terminé(e)",
+ "LabelNotFinished": "Non terminé",
"LabelNotificationAppriseURL": "URL(s) d’Apprise",
"LabelNotificationAvailableVariables": "Variables disponibles",
"LabelNotificationBodyTemplate": "Modèle de Message",
@@ -367,10 +367,10 @@
"LabelNotificationsMaxFailedAttemptsHelp": "La notification est abandonnée une fois ce seuil atteint",
"LabelNotificationsMaxQueueSize": "Nombres de notifications maximum à mettre en attente",
"LabelNotificationsMaxQueueSizeHelp": "La limite de notification est de un évènement par seconde. Les notifications seront ignorées si la file d’attente est à son maximum. Cela empêche un flot trop important.",
- "LabelNotificationTitleTemplate": "Modèle de Titre",
- "LabelNotStarted": "Non Démarré(e)",
- "LabelNumberOfBooks": "Nombre de Livres",
- "LabelNumberOfEpisodes": "Nombre d’Episodes",
+ "LabelNotificationTitleTemplate": "Modèle de titre",
+ "LabelNotStarted": "Pas commencé",
+ "LabelNumberOfBooks": "Nombre de livres",
+ "LabelNumberOfEpisodes": "Nombre d’épisodes",
"LabelOpenRSSFeed": "Ouvrir le flux RSS",
"LabelOverwrite": "Écraser",
"LabelPassword": "Mot de passe",
@@ -406,12 +406,12 @@
"LabelRegion": "Région",
"LabelReleaseDate": "Date de parution",
"LabelRemoveCover": "Supprimer la couverture",
- "LabelRowsPerPage": "Rows per page",
+ "LabelRowsPerPage": "Lignes par page",
"LabelRSSFeedCustomOwnerEmail": "Courriel du propriétaire personnalisé",
"LabelRSSFeedCustomOwnerName": "Nom propriétaire personnalisé",
"LabelRSSFeedOpen": "Flux RSS ouvert",
"LabelRSSFeedPreventIndexing": "Empêcher l’indexation",
- "LabelRSSFeedSlug": "Identificateur d’adresse du Flux RSS ",
+ "LabelRSSFeedSlug": "Balise URL du flux RSS",
"LabelRSSFeedURL": "Adresse du flux RSS",
"LabelSearchTerm": "Terme de recherche",
"LabelSearchTitle": "Titre de recherche",
@@ -419,8 +419,8 @@
"LabelSeason": "Saison",
"LabelSelectAllEpisodes": "Sélectionner tous les épisodes",
"LabelSelectEpisodesShowing": "Sélectionner {0} episode(s) en cours",
- "LabelSelectUsers": "Select users",
- "LabelSendEbookToDevice": "Envoyer le livre numérique à...",
+ "LabelSelectUsers": "Sélectionner les utilisateurs",
+ "LabelSendEbookToDevice": "Envoyer le livre numérique à…",
"LabelSequence": "Séquence",
"LabelSeries": "Séries",
"LabelSeriesName": "Nom de la série",
@@ -428,18 +428,18 @@
"LabelSetEbookAsPrimary": "Définir comme principale",
"LabelSetEbookAsSupplementary": "Définir comme supplémentaire",
"LabelSettingsAudiobooksOnly": "Livres audios seulement",
- "LabelSettingsAudiobooksOnlyHelp": "L’activation de ce paramètre ignorera les fichiers “ ebook ”, à moins qu’ils ne se trouvent dans un dossier de livres audio, auquel cas ils seront définis comme des livres numériques supplémentaires.",
+ "LabelSettingsAudiobooksOnlyHelp": "L'activation de ce paramètre ignorera les fichiers de type « livre numériques », sauf s'ils se trouvent dans un dossier spécifique , auquel cas ils seront définis comme des livres numériques supplémentaires.",
"LabelSettingsBookshelfViewHelp": "Interface skeuomorphique avec une étagère en bois",
"LabelSettingsChromecastSupport": "Support du Chromecast",
"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 des modifications de fichiers sont détectées. *Nécessite le redémarrage du serveur",
+ "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",
+ "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.",
+ "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",
"LabelSettingsFindCoversHelp": "Si votre livre audio ne possède pas de couverture intégrée ou une image de couverture dans le dossier, l’analyseur tentera de récupérer une couverture.http://192.168.1.1:8337 alors vous devez mettre http://192.168.1.1:8337/notify.",
+ "MessageAppriseDescription": "Nécessite une instance d’API Apprise pour utiliser cette fonctionnalité ou une api qui prend en charge les mêmes requêtes.http://192.168.1.1:8337 alors vous devez mettre http://192.168.1.1:8337/notify.",
"MessageBackupsDescription": "Les sauvegardes incluent les utilisateurs, la progression de lecture par utilisateur, les détails des articles des bibliothèques, les paramètres du serveur et les images sauvegardées. Les sauvegardes n’incluent pas les fichiers de votre bibliothèque.",
"MessageBatchQuickMatchDescription": "La recherche par correspondance rapide tentera d’ajouter les couvertures et les métadonnées manquantes pour les articles sélectionnés. Activer l’option suivante pour autoriser la recherche par correspondance à écraser les données existantes.",
"MessageBookshelfNoCollections": "Vous n’avez pas encore de collections",
- "MessageBookshelfNoResultsForFilter": "Aucun résultat pour le filtre « {0}: {1} »",
+ "MessageBookshelfNoResultsForFilter": "Aucun résultat pour le filtre « {0} : {1} »",
"MessageBookshelfNoRSSFeeds": "Aucun flux RSS n’est ouvert",
"MessageBookshelfNoSeries": "Vous n’avez aucune série",
- "MessageChapterEndIsAfter": "Le Chapitre Fin est situé à la fin de votre Livre Audio",
+ "MessageChapterEndIsAfter": "La fin du chapitre se situe après la fin de votre livre audio.",
"MessageChapterErrorFirstNotZero": "Le premier capitre doit débuter à 0",
"MessageChapterErrorStartGteDuration": "Horodatage invalide car il doit débuter avant la fin du livre",
"MessageChapterErrorStartLtPrev": "Horodatage invalide car il doit débuter au moins après le précédent chapitre",
@@ -558,15 +558,15 @@
"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} » ?",
- "MessageConfirmDeleteLibraryItem": "This will delete the library item from the database and your file system. Are you sure?",
- "MessageConfirmDeleteLibraryItems": "This will delete {0} library items from the database and your file system. Are you sure?",
+ "MessageConfirmDeleteLibraryItem": "Cette opération supprimera l’élément de la base de données et de votre système de fichiers. Êtes-vous sûr ?",
+ "MessageConfirmDeleteLibraryItems": "Cette opération supprimera {0} éléments de la base de données et de votre système de fichiers. Êtes-vous sûr ?",
"MessageConfirmDeleteSession": "Êtes-vous sûr de vouloir supprimer cette session ?",
"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": "Ê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 ?",
- "MessageConfirmQuickEmbed": "Warning! Quick embed will not backup your audio files. Make sure that you have a backup of your audio files.