mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2024-12-30 18:48:55 +01:00
Update:Backups include author images #781
This commit is contained in:
parent
4ec217e5d0
commit
0aadf579f3
@ -45,7 +45,7 @@
|
|||||||
<div v-if="selectedBackup" class="px-4 w-full text-sm py-6 rounded-lg bg-bg shadow-lg border border-black-300">
|
<div v-if="selectedBackup" class="px-4 w-full text-sm py-6 rounded-lg bg-bg shadow-lg border border-black-300">
|
||||||
<p class="text-error text-lg font-semibold">Important Notice!</p>
|
<p class="text-error text-lg font-semibold">Important Notice!</p>
|
||||||
<p class="text-base py-1">Applying a backup will overwrite users, user progress, book details, settings, and covers stored in metadata with the backed up data.</p>
|
<p class="text-base py-1">Applying a backup will overwrite users, user progress, book details, settings, and covers stored in metadata with the backed up data.</p>
|
||||||
<p class="text-base py-1">Backups <strong>do not</strong> modify any files in your library folders, only data in the audiobookshelf created <span class="font-mono">/config</span> and <span class="font-mono">/metadata</span> directories. If you have enabled server settings to store cover art and metadata in your library folders then those are not backup up or overwritten.</p>
|
<p class="text-base py-1">Backups <strong>do not</strong> modify any files in your library folders, only data in the audiobookshelf created <span class="font-mono">/config</span> and <span class="font-mono">/metadata</span> directories. If you have enabled server settings to store cover art and metadata in your library folders then those are not backed up or overwritten.</p>
|
||||||
<p class="text-base py-1">All clients using your server will be automatically refreshed.</p>
|
<p class="text-base py-1">All clients using your server will be automatically refreshed.</p>
|
||||||
|
|
||||||
<p class="text-lg text-center my-8">Are you sure you want to apply the backup created on {{ selectedBackup.datePretty }}?</p>
|
<p class="text-lg text-center my-8">Are you sure you want to apply the backup created on {{ selectedBackup.datePretty }}?</p>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<h1 class="text-xl">Backups</h1>
|
<h1 class="text-xl">Backups</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="text-base mb-4 text-gray-300">Backups include users, user progress, book details, server settings and covers stored in <span class="font-mono text-gray-100">/metadata/items</span>. <br />Backups <strong>do not</strong> include any files stored in your library folders.</p>
|
<p class="text-base mb-4 text-gray-300">Backups include users, user progress, library item details, server settings, and images stored in <span class="font-mono text-gray-100">/metadata/items</span> & <span class="font-mono text-gray-100">/metadata/authors</span>. <br />Backups <strong>do not</strong> include any files stored in your library folders.</p>
|
||||||
|
|
||||||
<div class="flex items-center py-2">
|
<div class="flex items-center py-2">
|
||||||
<ui-toggle-switch v-model="enableBackups" small :disabled="updatingServerSettings" @input="updateBackupsSettings" />
|
<ui-toggle-switch v-model="enableBackups" small :disabled="updatingServerSettings" @input="updateBackupsSettings" />
|
||||||
|
@ -16,6 +16,7 @@ class BackupManager {
|
|||||||
constructor(db, emitter) {
|
constructor(db, emitter) {
|
||||||
this.BackupPath = Path.join(global.MetadataPath, 'backups')
|
this.BackupPath = Path.join(global.MetadataPath, 'backups')
|
||||||
this.ItemsMetadataPath = Path.join(global.MetadataPath, 'items')
|
this.ItemsMetadataPath = Path.join(global.MetadataPath, 'items')
|
||||||
|
this.AuthorsMetadataPath = Path.join(global.MetadataPath, 'authors')
|
||||||
|
|
||||||
this.db = db
|
this.db = db
|
||||||
this.emitter = emitter
|
this.emitter = emitter
|
||||||
@ -119,6 +120,7 @@ class BackupManager {
|
|||||||
await zip.extract('config/', global.ConfigPath)
|
await zip.extract('config/', global.ConfigPath)
|
||||||
if (backup.backupMetadataCovers) {
|
if (backup.backupMetadataCovers) {
|
||||||
await zip.extract('metadata-items/', this.ItemsMetadataPath)
|
await zip.extract('metadata-items/', this.ItemsMetadataPath)
|
||||||
|
await zip.extract('metadata-authors/', this.AuthorsMetadataPath)
|
||||||
}
|
}
|
||||||
await this.db.reinit()
|
await this.db.reinit()
|
||||||
this.emitter('backup_applied')
|
this.emitter('backup_applied')
|
||||||
@ -178,8 +180,6 @@ class BackupManager {
|
|||||||
async runBackup() {
|
async runBackup() {
|
||||||
// Check if Metadata Path is inside Config Path (otherwise there will be an infinite loop as the archiver tries to zip itself)
|
// Check if Metadata Path is inside Config Path (otherwise there will be an infinite loop as the archiver tries to zip itself)
|
||||||
Logger.info(`[BackupManager] Running Backup`)
|
Logger.info(`[BackupManager] Running Backup`)
|
||||||
var metadataItemsPath = this.serverSettings.backupMetadataCovers ? this.ItemsMetadataPath : null
|
|
||||||
|
|
||||||
var newBackup = new Backup()
|
var newBackup = new Backup()
|
||||||
|
|
||||||
const newBackData = {
|
const newBackData = {
|
||||||
@ -188,7 +188,10 @@ class BackupManager {
|
|||||||
}
|
}
|
||||||
newBackup.setData(newBackData)
|
newBackup.setData(newBackData)
|
||||||
|
|
||||||
var zipResult = await this.zipBackup(metadataItemsPath, newBackup).then(() => true).catch((error) => {
|
var metadataAuthorsPath = this.AuthorsMetadataPath
|
||||||
|
if (!await fs.pathExists(metadataAuthorsPath)) metadataAuthorsPath = null
|
||||||
|
|
||||||
|
var zipResult = await this.zipBackup(metadataAuthorsPath, newBackup).then(() => true).catch((error) => {
|
||||||
Logger.error(`[BackupManager] Backup Failed ${error}`)
|
Logger.error(`[BackupManager] Backup Failed ${error}`)
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
@ -228,7 +231,7 @@ class BackupManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
zipBackup(metadataItemsPath, backup) {
|
zipBackup(metadataAuthorsPath, backup) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
// create a file to stream archive data to
|
// create a file to stream archive data to
|
||||||
const output = fs.createWriteStream(backup.fullPath)
|
const output = fs.createWriteStream(backup.fullPath)
|
||||||
@ -299,10 +302,16 @@ class BackupManager {
|
|||||||
archive.directory(this.db.AuthorsPath, 'config/authors')
|
archive.directory(this.db.AuthorsPath, 'config/authors')
|
||||||
archive.directory(this.db.SeriesPath, 'config/series')
|
archive.directory(this.db.SeriesPath, 'config/series')
|
||||||
|
|
||||||
if (metadataItemsPath) {
|
if (this.serverSettings.backupMetadataCovers) {
|
||||||
Logger.debug(`[BackupManager] Backing up Metadata Items "${metadataItemsPath}"`)
|
Logger.debug(`[BackupManager] Backing up Metadata Items "${this.ItemsMetadataPath}"`)
|
||||||
archive.directory(metadataItemsPath, 'metadata-items')
|
archive.directory(this.ItemsMetadataPath, 'metadata-items')
|
||||||
|
|
||||||
|
if (metadataAuthorsPath) {
|
||||||
|
Logger.debug(`[BackupManager] Backing up Metadata Authors "${metadataAuthorsPath}"`)
|
||||||
|
archive.directory(metadataAuthorsPath, 'metadata-authors')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
archive.append(backup.detailsString, { name: 'details' })
|
archive.append(backup.detailsString, { name: 'details' })
|
||||||
|
|
||||||
archive.finalize()
|
archive.finalize()
|
||||||
|
Loading…
Reference in New Issue
Block a user