Fixing LibraryItem polymorphism

This commit is contained in:
Nicholas Wallace 2024-02-25 19:24:06 +00:00
parent 85586315f7
commit 0ffc6fbad9
2 changed files with 192 additions and 309 deletions

View file

@ -1656,29 +1656,45 @@
} }
} }
}, },
"oldFolderId": {
"type": "string",
"description": "The ID of folders created on server version 2.2.23 and before.",
"format": "fol_[a-z0-9]{18}",
"example": "fol_o78uaoeuh78h6aoeif"
},
"newFolderId": {
"type": "string",
"description": "The folder ID for any folders added after 2.3.0.",
"format": "uuid",
"example": "e4bb1afb-4a4f-4dd6-8be0-e615d233185b"
},
"folderId": {
"type": "string",
"anyOf": [
{
"$ref": "#/components/schemas/oldFolderId"
},
{
"$ref": "#/components/schemas/newFolderId"
}
]
},
"folder": { "folder": {
"type": "object", "type": "object",
"properties": { "properties": {
"id": { "id": {
"description": "The ID of the folder. (Read Only)", "$ref": "#/components/schemas/folderId"
"type": "string",
"example": "fol_bev1zuxhb0j0s1wehr"
}, },
"fullPath": { "fullPath": {
"description": "The path on the server for the folder. (Read Only)", "description": "The path on the server for the folder. (Read Only)",
"type": "string", "type": "string",
"example": "/podcasts" "example": "/podcasts"
}, },
"libraryId": { "libraryId": [
"oneOf": [ {
{ "$ref": "#/components/schemas/libraryId"
"$ref": "#/components/schemas/oldLibraryId" }
}, ],
{
"$ref": "#/components/schemas/newLibraryId"
}
]
},
"addedAt": { "addedAt": {
"description": "The time (in ms since POSIX epoch) when the folder was added. (Read Only)", "description": "The time (in ms since POSIX epoch) when the folder was added. (Read Only)",
"type": "integer", "type": "integer",
@ -1686,14 +1702,6 @@
} }
} }
}, },
"mediaType": {
"type": "string",
"description": "The type of media, will be book or podcast.",
"enum": [
"book",
"podcast"
]
},
"oldLibraryId": { "oldLibraryId": {
"type": "string", "type": "string",
"description": "The ID of the libraries created on server version 2.2.23 and before.", "description": "The ID of the libraries created on server version 2.2.23 and before.",
@ -1855,7 +1863,7 @@
} }
} }
}, },
"libraryItem": { "libraryItemBase": {
"type": "object", "type": "object",
"properties": { "properties": {
"id": { "id": {
@ -1865,21 +1873,14 @@
}, },
"ino": { "ino": {
"description": "The inode of the library item.", "description": "The inode of the library item.",
"type": "string" "type": "string",
"format": "[0-9]*"
}, },
"libraryId": { "libraryId": {
"oneOf": [ "$ref": "#/components/schemas/libraryId"
{
"$ref": "#/components/schemas/oldLibraryId"
},
{
"$ref": "#/components/schemas/newLibraryId"
}
]
}, },
"folderId": { "folderId": {
"description": "The ID of the folder the library item is in.", "$ref": "#/components/schemas/folderId"
"type": "string"
}, },
"path": { "path": {
"description": "The path of the library item on the server.", "description": "The path of the library item on the server.",
@ -1913,14 +1914,6 @@
"description": "The time (in ms since POSIX epoch) when the library item was last updated. (Read Only)", "description": "The time (in ms since POSIX epoch) when the library item was last updated. (Read Only)",
"type": "integer" "type": "integer"
}, },
"lastScan": {
"description": "The time (in ms since POSIX epoch) when the library item was last scanned. Will be null if the server has not yet scanned the library item.",
"type": "integer"
},
"scanVersion": {
"description": "The version of the scanner when last scanned. Will be null if it has not been scanned.",
"type": "string"
},
"isMissing": { "isMissing": {
"description": "Whether the library item was scanned and no longer exists.", "description": "Whether the library item was scanned and no longer exists.",
"type": "boolean" "type": "boolean"
@ -1933,256 +1926,99 @@
{ {
"$ref": "#/components/schemas/mediaType" "$ref": "#/components/schemas/mediaType"
} }
], ]
"media": { }
"description": "The media of the library item.", },
"oneOf": [ "libraryItem": {
{ "type": "object",
"$ref": "#/components/schemas/book" "description": "A single item on the server, like a book or podcast.",
}, "allOf": [
{ {
"$ref": "#/components/schemas/podcast" "$ref": "#/components/schemas/libraryItemBase"
}
]
}, },
"libraryFiles": { {
"description": "The files of the library item.", "type": "object",
"type": "array", "properties": {
"items": { "folderId": {
"$ref": "#/components/schemas/libraryFile" "$ref": "#/components/schemas/folderId"
},
"lastScan": {
"description": "The time (in ms since POSIX epoch) when the library item was last scanned. Will be null if the server has not yet scanned the library item.",
"type": "integer"
},
"scanVersion": {
"description": "The version of the scanner when last scanned. Will be null if it has not been scanned.",
"type": "string"
},
"media": {
"$ref": "#/components/schemas/media"
},
"libraryFiles": {
"description": "The files of the library item.",
"type": "array",
"items": {
"$ref": "#/components/schemas/libraryFile"
}
}
} }
} }
} ]
}, },
"libraryItemMinified": { "libraryItemMinified": {
"type": "object", "type": "object",
"properties": { "description": "A single item on the server, like a book or podcast. Minified media format.",
"id": { "allOf": [
"description": "The ID of the library item.", {
"type": "string", "$ref": "#/components/schemas/libraryItemBase"
"example": "li_8gch9ve09orgn4fdz8"
}, },
"ino": { {
"description": "The inode of the library item.",
"type": "string",
"example": "649641337522215266"
},
"libraryId": {
"oneOf": [
{
"$ref": "#/components/schemas/oldLibraryId"
},
{
"$ref": "#/components/schemas/newLibraryId"
}
]
},
"folderId": {
"description": "The ID of the folder the library item is in.",
"type": "string",
"example": "fol_bev1zuxhb0j0s1wehr"
},
"path": {
"description": "The path of the library item on the server.",
"type": "string",
"example": "/audiobooks/Terry Goodkind/Sword of Truth/Wizards First Rule"
},
"relPath": {
"description": "The path, relative to the library folder, of the library item.",
"type": "string",
"example": "Terry Goodkind/Sword of Truth/Wizards First Rule"
},
"isFile": {
"description": "Whether the library item is a single file in the root of the library folder.",
"type": "boolean",
"example": false
},
"mtimeMs": {
"description": "The time (in ms since POSIX epoch) when the library item was last modified on disk.",
"type": "integer",
"example": 1650621074299
},
"ctimeMs": {
"description": "The time (in ms since POSIX epoch) when the library item status was changed on disk.",
"type": "integer",
"example": 1650621074299
},
"birthtimeMs": {
"description": "The time (in ms since POSIX epoch) when the library item was created on disk. Will be 0 if unknown.",
"type": "integer",
"example": 0
},
"addedAt": {
"description": "The time (in ms since POSIX epoch) when the library item was added to the library.",
"type": "integer",
"example": 1650621073750
},
"updatedAt": {
"description": "The time (in ms since POSIX epoch) when the library item was last updated. (Read Only)",
"type": "integer",
"example": 1650621110769
},
"isMissing": {
"description": "Whether the library item was scanned and no longer exists.",
"type": "boolean",
"example": false
},
"isInvalid": {
"description": "Whether the library item was scanned and no longer has media files.",
"type": "boolean",
"example": false
},
"mediaType": [
{
"$ref": "#/components/schemas/mediaType"
}
],
"media": {
"description": "The media of the library item.",
"type": "object", "type": "object",
"additionalProperties": { "properties": {
"oneOf": [ "media": {
{ "$ref": "#/components/schemas/mediaMinified"
"$ref": "#/components/schemas/bookMinified" }
},
{
"$ref": "#/components/schemas/podcastMinified"
}
]
} }
},
"numFiles": {
"description": "The number of library files for the library item.",
"type": "integer",
"example": 2
},
"size": {
"description": "The total size (in bytes) of the library item.",
"type": "integer",
"example": 268990279
} }
} ]
}, },
"libraryItemExpanded": { "libraryItemExpanded": {
"type": "object", "type": "object",
"properties": { "allOf": [
"id": { {
"description": "The ID of the library item.", "$ref": "#/components/schemas/libraryItemBase"
"type": "string",
"example": "li_8gch9ve09orgn4fdz8"
}, },
"ino": { {
"description": "The inode of the library item.",
"type": "string",
"example": "649641337522215266"
},
"libraryId": {
"oneOf": [
{
"$ref": "#/components/schemas/oldLibraryId"
},
{
"$ref": "#/components/schemas/newLibraryId"
}
]
},
"folderId": {
"description": "The ID of the folder the library item is in.",
"type": "string",
"example": "fol_bev1zuxhb0j0s1wehr"
},
"path": {
"description": "The path of the library item on the server.",
"type": "string",
"example": "/audiobooks/Terry Goodkind/Sword of Truth/Wizards First Rule"
},
"relPath": {
"description": "The path, relative to the library folder, of the library item.",
"type": "string",
"example": "Terry Goodkind/Sword of Truth/Wizards First Rule"
},
"isFile": {
"description": "Whether the library item is a single file in the root of the library folder.",
"type": "boolean",
"example": false
},
"mtimeMs": {
"description": "The time (in ms since POSIX epoch) when the library item was last modified on disk.",
"type": "integer",
"example": 1650621074299
},
"ctimeMs": {
"description": "The time (in ms since POSIX epoch) when the library item status was changed on disk.",
"type": "integer",
"example": 1650621074299
},
"birthtimeMs": {
"description": "The time (in ms since POSIX epoch) when the library item was created on disk. Will be 0 if unknown.",
"type": "integer",
"example": 0
},
"addedAt": {
"description": "The time (in ms since POSIX epoch) when the library item was added to the library.",
"type": "integer",
"example": 1650621073750
},
"updatedAt": {
"description": "The time (in ms since POSIX epoch) when the library item was last updated. (Read Only)",
"type": "integer",
"example": 1650621110769
},
"lastScan": {
"description": "The time (in ms since POSIX epoch) when the library item was last scanned. Will be null if the server has not yet scanned the library item.",
"type": "integer",
"example": 1651830827825
},
"scanVersion": {
"description": "The version of the scanner when last scanned. Will be null if it has not been scanned.",
"type": "string",
"example": "2.0.21"
},
"isMissing": {
"description": "Whether the library item was scanned and no longer exists.",
"type": "boolean",
"example": false
},
"isInvalid": {
"description": "Whether the library item was scanned and no longer has media files.",
"type": "boolean",
"example": false
},
"mediaType": [
{
"$ref": "#/components/schemas/mediaType"
}
],
"media": {
"description": "The media of the library item.",
"type": "object", "type": "object",
"additionalProperties": { "properties": {
"oneOf": [ "folderId": {
{ "$ref": "#/components/schemas/folderId"
"$ref": "#/components/schemas/bookExpanded" },
}, "lastScan": {
{ "description": "The time (in ms since POSIX epoch) when the library item was last scanned. Will be null if the server has not yet scanned the library item.",
"$ref": "#/components/schemas/podcastExpanded" "type": "integer"
},
"scanVersion": {
"description": "The version of the scanner when last scanned. Will be null if it has not been scanned.",
"type": "string"
},
"media": {
"$ref": "#/components/schemas/mediaExpanded"
},
"libraryFiles": {
"description": "The files of the library item.",
"type": "array",
"items": {
"$ref": "#/components/schemas/libraryFile"
} }
] },
"size": {
"description": "The total size (in bytes) of the library item.",
"type": "integer",
"example": 268990279
}
} }
},
"libraryFiles": {
"description": "The files of the library item.",
"type": "array",
"items": {
"$ref": "#/components/schemas/libraryFile"
}
},
"size": {
"description": "The total size (in bytes) of the library item.",
"type": "integer",
"example": 268990279
} }
} ]
}, },
"book": { "book": {
"type": "object", "type": "object",
@ -2353,6 +2189,47 @@
} }
} }
}, },
"mediaType": {
"type": "string",
"description": "The type of media, will be book or podcast.",
"enum": [
"book",
"podcast"
]
},
"media": {
"description": "The media of the library item.",
"oneOf": [
{
"$ref": "#/components/schemas/book"
},
{
"$ref": "#/components/schemas/podcast"
}
]
},
"mediaMinified": {
"description": "The minified media of the library item.",
"oneOf": [
{
"$ref": "#/components/schemas/bookMinified"
},
{
"$ref": "#/components/schemas/podcastMinified"
}
]
},
"mediaExpanded": {
"description": "The expanded media of the library item.",
"oneOf": [
{
"$ref": "#/components/schemas/bookExpanded"
},
{
"$ref": "#/components/schemas/podcastExpanded"
}
]
},
"podcast": { "podcast": {
"type": "object", "type": "object",
"properties": { "properties": {

View file

@ -66,51 +66,57 @@ const { filePathToPOSIX, getFileTimestampsWithIno } = require('../utils/fileUtil
* description: A single item on the server, like a book or podcast. * description: A single item on the server, like a book or podcast.
* allOf: * allOf:
* - $ref : '#/components/schemas/libraryItemBase' * - $ref : '#/components/schemas/libraryItemBase'
* - folderId: * - type: object
* - $ref : '#/components/schemas/folderId' * properties:
* - lastScan: * folderId:
* description: The time (in ms since POSIX epoch) when the library item was last scanned. Will be null if the server has not yet scanned the library item. * $ref : '#/components/schemas/folderId'
* type: integer * lastScan:
* - scanVersion: * description: The time (in ms since POSIX epoch) when the library item was last scanned. Will be null if the server has not yet scanned the library item.
* description: The version of the scanner when last scanned. Will be null if it has not been scanned. * type: integer
* type: string * scanVersion:
* - media: * description: The version of the scanner when last scanned. Will be null if it has not been scanned.
* - $ref: '#/components/schemas/media' * type: string
* - libraryFiles: * media:
* description: The files of the library item. * $ref: '#/components/schemas/media'
* type: array * libraryFiles:
* items: * description: The files of the library item.
* $ref: '#/components/schemas/libraryFile' * type: array
* items:
* $ref: '#/components/schemas/libraryFile'
* libraryItemMinified: * libraryItemMinified:
* type: object * type: object
* description: A single item on the server, like a book or podcast. Minified media format. * description: A single item on the server, like a book or podcast. Minified media format.
* allOf: * allOf:
* - $ref : '#/components/schemas/libraryItemBase' * - $ref : '#/components/schemas/libraryItemBase'
* - media: * - type: object
* - $ref: '#/components/schemas/mediaMinified' * properties:
* media:
* $ref: '#/components/schemas/mediaMinified'
* libraryItemExpanded: * libraryItemExpanded:
* type: object * type: object
* allOf: * allOf:
* - $ref : '#/components/schemas/libraryItemBase' * - $ref : '#/components/schemas/libraryItemBase'
* - folderId: * - type: object
* - $ref : '#/components/schemas/folderId' * properties:
* - lastScan: * folderId:
* description: The time (in ms since POSIX epoch) when the library item was last scanned. Will be null if the server has not yet scanned the library item. * $ref : '#/components/schemas/folderId'
* type: integer * lastScan:
* - scanVersion: * description: The time (in ms since POSIX epoch) when the library item was last scanned. Will be null if the server has not yet scanned the library item.
* description: The version of the scanner when last scanned. Will be null if it has not been scanned. * type: integer
* type: string * scanVersion:
* - media: * description: The version of the scanner when last scanned. Will be null if it has not been scanned.
* - $ref: '#/components/schemas/mediaExpanded' * type: string
* - libraryFiles: * media:
* description: The files of the library item. * $ref: '#/components/schemas/mediaExpanded'
* type: array * libraryFiles:
* items: * description: The files of the library item.
* $ref: '#/components/schemas/libraryFile' * type: array
* - size: * items:
* description: The total size (in bytes) of the library item. * $ref: '#/components/schemas/libraryFile'
* type: integer * size:
* example: 268990279 * description: The total size (in bytes) of the library item.
* type: integer
* example: 268990279
*/ */
class LibraryItem { class LibraryItem {
constructor(libraryItem = null) { constructor(libraryItem = null) {