implemented suggestions, extended CMPs with series

This commit is contained in:
FlyinPancake 2024-01-12 21:45:03 +01:00
parent 12c6a1baa0
commit 3b531144cf
No known key found for this signature in database
6 changed files with 33 additions and 28 deletions

View File

@ -9,7 +9,7 @@
</ui-tooltip> </ui-tooltip>
<div class="flex-grow" /> <div class="flex-grow" />
<ui-btn color="primary" small @click="setShowAddModal()">{{ $strings.ButtonAdd }}</ui-btn> <ui-btn color="primary" small @click="setShowAddModal">{{ $strings.ButtonAdd }}</ui-btn>
</template> </template>
<tables-custom-metadata-provider-table class="pt-2" /> <tables-custom-metadata-provider-table class="pt-2" />
@ -40,6 +40,4 @@ export default {
} }
</script> </script>
<style> <style></style>
</style>

View File

@ -96,7 +96,6 @@
"HeaderAudiobookTools": "Audiobook File Management Tools", "HeaderAudiobookTools": "Audiobook File Management Tools",
"HeaderAudioTracks": "Audio Tracks", "HeaderAudioTracks": "Audio Tracks",
"HeaderAuthentication": "Authentication", "HeaderAuthentication": "Authentication",
"HeaderCustomMetadataProviders": "Custom metadata providers",
"HeaderBackups": "Backups", "HeaderBackups": "Backups",
"HeaderChangePassword": "Change Password", "HeaderChangePassword": "Change Password",
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
@ -105,6 +104,7 @@
"HeaderCollectionItems": "Collection Items", "HeaderCollectionItems": "Collection Items",
"HeaderCover": "Cover", "HeaderCover": "Cover",
"HeaderCurrentDownloads": "Current Downloads", "HeaderCurrentDownloads": "Current Downloads",
"HeaderCustomMetadataProviders": "Custom metadata providers",
"HeaderDetails": "Details", "HeaderDetails": "Details",
"HeaderDownloadQueue": "Download Queue", "HeaderDownloadQueue": "Download Queue",
"HeaderEbookFiles": "Ebook Files", "HeaderEbookFiles": "Ebook Files",
@ -194,6 +194,7 @@
"LabelAllUsersExcludingGuests": "All users excluding guests", "LabelAllUsersExcludingGuests": "All users excluding guests",
"LabelAllUsersIncludingGuests": "All users including guests", "LabelAllUsersIncludingGuests": "All users including guests",
"LabelAlreadyInYourLibrary": "Already in your library", "LabelAlreadyInYourLibrary": "Already in your library",
"LabelApiKey": "API Key",
"LabelAppend": "Append", "LabelAppend": "Append",
"LabelAuthor": "Author", "LabelAuthor": "Author",
"LabelAuthorFirstLast": "Author (First Last)", "LabelAuthorFirstLast": "Author (First Last)",
@ -526,6 +527,7 @@
"LabelUploaderDragAndDrop": "Drag & drop files or folders", "LabelUploaderDragAndDrop": "Drag & drop files or folders",
"LabelUploaderDropFiles": "Drop files", "LabelUploaderDropFiles": "Drop files",
"LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series", "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series",
"LabelUrl": "URL",
"LabelUseChapterTrack": "Use chapter track", "LabelUseChapterTrack": "Use chapter track",
"LabelUseFullTrack": "Use full track", "LabelUseFullTrack": "Use full track",
"LabelUser": "User", "LabelUser": "User",
@ -541,8 +543,6 @@
"LabelYourBookmarks": "Your Bookmarks", "LabelYourBookmarks": "Your Bookmarks",
"LabelYourPlaylists": "Your Playlists", "LabelYourPlaylists": "Your Playlists",
"LabelYourProgress": "Your Progress", "LabelYourProgress": "Your Progress",
"LabelUrl": "URL",
"LabelApiKey": "API Key",
"MessageAddToPlayerQueue": "Add to player queue", "MessageAddToPlayerQueue": "Add to player queue",
"MessageAppriseDescription": "To use this feature you will need to have an instance of <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> running or an api that will handle those same requests. <br />The Apprise API Url should be the full URL path to send the notification, e.g., if your API instance is served at <code>http://192.168.1.1:8337</code> then you would put <code>http://192.168.1.1:8337/notify</code>.", "MessageAppriseDescription": "To use this feature you will need to have an instance of <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> running or an api that will handle those same requests. <br />The Apprise API Url should be the full URL path to send the notification, e.g., if your API instance is served at <code>http://192.168.1.1:8337</code> then you would put <code>http://192.168.1.1:8337/notify</code>.",
"MessageBackupsDescription": "Backups include users, user progress, library item details, server settings, and images stored in <code>/metadata/items</code> & <code>/metadata/authors</code>. Backups <strong>do not</strong> include any files stored in your library folders.", "MessageBackupsDescription": "Backups include users, user progress, library item details, server settings, and images stored in <code>/metadata/items</code> & <code>/metadata/authors</code>. Backups <strong>do not</strong> include any files stored in your library folders.",

View File

@ -86,7 +86,7 @@ components:
type: string type: string
publisher: publisher:
type: string type: string
published_year: publishedYear:
type: string type: string
description: description:
type: string type: string
@ -107,6 +107,17 @@ components:
type: array type: array
items: items:
type: string type: string
series:
type: array
items:
type: object
properties:
series:
type: string
required: true
sequence:
type: number
format: int64
language: language:
type: string type: string
duration: duration:

View File

@ -763,7 +763,7 @@ class MiscController {
return res.sendStatus(403) return res.sendStatus(403)
} }
const { name, url, apiKey } = req.body; const { name, url, apiKey } = req.body
if (!name || !url || !apiKey) { if (!name || !url || !apiKey) {
return res.status(500).send(`Invalid patch data`) return res.status(500).send(`Invalid patch data`)
@ -794,18 +794,18 @@ class MiscController {
return res.sendStatus(403) return res.sendStatus(403)
} }
const { id } = req.params; const { id } = req.params
if (!id) { if (!id) {
return res.status(500).send(`Invalid delete data`) return res.status(500).send(`Invalid delete data`)
} }
const provider = await Database.customMetadataProviderModel.findByPk(id); const provider = await Database.customMetadataProviderModel.findByPk(id)
await Database.removeCustomMetadataProviderById(id); await Database.removeCustomMetadataProviderById(id)
SocketAuthority.adminEmitter('custom_metadata_provider_removed', provider) SocketAuthority.adminEmitter('custom_metadata_provider_removed', provider)
res.json({}) res.sendStatus(200)
} }
} }
module.exports = new MiscController() module.exports = new MiscController()

View File

@ -26,13 +26,7 @@ class CustomMetadataProvider extends Model {
} }
} }
static findByPk(id) {
return this.findOne({
where: {
id,
}
})
}
/** /**
* Initialize model * Initialize model
@ -47,7 +41,7 @@ class CustomMetadataProvider extends Model {
}, },
name: DataTypes.STRING, name: DataTypes.STRING,
url: DataTypes.STRING, url: DataTypes.STRING,
apiKey: DataTypes.STRING apiKey: DataTypes.STRING,
}, { }, {
sequelize, sequelize,
modelName: 'customMetadataProvider' modelName: 'customMetadataProvider'

View File

@ -1,6 +1,6 @@
const Database = require('../Database') const Database = require('../Database')
const axios = require("axios"); const axios = require("axios")
const Logger = require("../Logger"); const Logger = require("../Logger")
class CustomProviderAdapter { class CustomProviderAdapter {
constructor() { constructor() {
@ -8,10 +8,10 @@ class CustomProviderAdapter {
async search(title, author, providerSlug) { async search(title, author, providerSlug) {
const providerId = providerSlug.split("custom-")[1] const providerId = providerSlug.split("custom-")[1]
const provider = await Database.customMetadataProviderModel.findByPk(providerId); const provider = await Database.customMetadataProviderModel.findByPk(providerId)
if (!provider) { if (!provider) {
throw new Error("Custom provider not found for the given id"); throw new Error("Custom provider not found for the given id")
} }
const matches = await axios.get(`${provider.url}/search?query=${encodeURIComponent(title)}${!!author ? `&author=${encodeURIComponent(author)}` : ""}`, { const matches = await axios.get(`${provider.url}/search?query=${encodeURIComponent(title)}${!!author ? `&author=${encodeURIComponent(author)}` : ""}`, {
@ -27,7 +27,7 @@ class CustomProviderAdapter {
}) })
if (matches === null) { if (matches === null) {
throw new Error("Custom provider returned malformed response"); throw new Error("Custom provider returned malformed response")
} }
// re-map keys to throw out // re-map keys to throw out
@ -37,13 +37,14 @@ class CustomProviderAdapter {
author, author,
narrator, narrator,
publisher, publisher,
published_year, publishedYear,
description, description,
cover, cover,
isbn, isbn,
asin, asin,
genres, genres,
tags, tags,
series,
language, language,
duration, duration,
}) => { }) => {
@ -53,13 +54,14 @@ class CustomProviderAdapter {
author, author,
narrator, narrator,
publisher, publisher,
publishedYear: published_year, publishedYear,
description, description,
cover, cover,
isbn, isbn,
asin, asin,
genres, genres,
tags: tags.join(","), tags: tags.join(","),
series: series.length ? series : null,
language, language,
duration, duration,
} }