2021-08-18 00:01:11 +02:00
< template >
2021-09-29 00:36:41 +02:00
< div id = "page-wrapper" class = "page p-6 overflow-y-auto" : class = "streamAudiobook ? 'streaming' : ''" >
2021-08-18 00:01:11 +02:00
< div class = "w-full max-w-4xl mx-auto" >
2021-10-05 05:11:42 +02:00
< tables -users -table / >
<!-- < div class = "h-0.5 bg-primary bg-opacity-50 w-full" / > -- >
< tables -libraries -table / >
<!-- < div class = "h-0.5 bg-primary bg-opacity-50 w-full" / > -- >
< div class = "bg-bg rounded-md shadow-lg border border-white border-opacity-5 p-4 mb-8" >
< div class = "flex items-center mb-2" >
< h1 class = "text-xl" > Settings < / h1 >
2021-08-22 17:46:04 +02:00
< / div >
2021-10-01 01:52:32 +02:00
2021-10-05 05:11:42 +02:00
< div class = "flex items-center py-2" >
< ui -toggle -switch v -model = " newServerSettings.scannerParseSubtitle " small :disabled ="updatingServerSettings" @input ="updateScannerParseSubtitle" / >
< ui -tooltip :text ="parseSubtitleTooltip" >
< p class = "pl-4 text-lg" > Scanner parse subtitles < span class = "material-icons icon-text" > info _outlined < / span > < / p >
< / u i - t o o l t i p >
< / div >
< div class = "flex items-center py-2" >
2021-10-06 04:10:49 +02:00
< ui -toggle -switch v -model = " newServerSettings.scannerFindCovers " :disabled ="updatingServerSettings" @input ="updateScannerFindCovers" / >
2021-10-05 05:11:42 +02:00
< ui -tooltip :text ="scannerFindCoversTooltip" >
< p class = "pl-4 text-lg" > Scanner find covers < span class = "material-icons icon-text" > info _outlined < / span > < / p >
< / u i - t o o l t i p >
< / div >
2021-10-01 01:52:32 +02:00
2021-10-05 05:11:42 +02:00
< div class = "flex items-center py-2" >
< ui -toggle -switch v -model = " storeCoversInAudiobookDir " :disabled ="updatingServerSettings" @input ="updateCoverStorageDestination" / >
< ui -tooltip :text ="coverDestinationTooltip" >
< p class = "pl-4 text-lg" > Store covers with audiobook < span class = "material-icons icon-text" > info _outlined < / span > < / p >
< / u i - t o o l t i p >
< / div >
< / div >
2021-08-21 23:23:35 +02:00
< div class = "h-0.5 bg-primary bg-opacity-50 w-full" / >
< div class = "flex items-center py-4" >
2021-08-22 17:46:04 +02:00
< ui -btn color = "bg" small :padding-x ="4" :loading ="isResettingAudiobooks" @click ="resetAudiobooks" > Reset All Audiobooks < / ui -btn >
2021-10-01 01:52:32 +02:00
< div class = "flex-grow" / >
< ui -btn to = "/config/log" > View Logger < / u i - b t n >
2021-08-21 23:23:35 +02:00
< / div >
2021-08-18 00:51:07 +02:00
< div class = "h-0.5 bg-primary bg-opacity-50 w-full" / >
2021-08-21 23:23:35 +02:00
2021-08-18 13:50:24 +02:00
< div class = "flex items-center py-4" >
2021-08-21 20:02:24 +02:00
< p class = "font-mono" > v { { $config . version } } < / p >
2021-08-21 01:29:10 +02:00
< div class = "flex-grow" / >
< p class = "pr-2 text-sm font-book text-yellow-400" > Report bugs , request features , provide feedback , and contribute on < a class = "underline" href = "https://github.com/advplyr/audiobookshelf" target = "_blank" > github < / a > . < / p >
< a href = "https://github.com/advplyr/audiobookshelf" target = "_blank" class = "text-white hover:text-gray-200 hover:scale-150 hover:rotate-6 transform duration-500" >
< svg xmlns = "http://www.w3.org/2000/svg" fill = "currentColor" width = "24" height = "24" viewBox = "0 0 24 24" >
< path
d = "M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"
/ >
< / svg >
< / a >
2021-08-18 13:50:24 +02:00
< / div >
2021-10-02 20:50:39 +02:00
< div class = "h-0.5 bg-primary bg-opacity-30 w-full" / >
< div class = "py-12 mb-4 opacity-60 hover:opacity-100" >
< div class = "flex items-center" >
< div >
< div class = "flex items-center" >
2021-10-07 04:08:52 +02:00
< ui -toggle -switch v -model = " showExperimentalFeatures " / >
2021-10-02 20:50:39 +02:00
< ui -tooltip :text ="experimentalFeaturesTooltip" >
< p class = "pl-4 text-lg" > Experimental Features < span class = "material-icons icon-text" > info _outlined < / span > < / p >
< / u i - t o o l t i p >
< / div >
< / div >
<!-- < div class = "flex-grow" / > -- >
< div >
< a href = "https://github.com/advplyr/audiobookshelf/discussions/75#discussion-3604812" target = "_blank" class = "text-blue-500 hover:text-blue-300 underline" > Join the discussion < / a >
< / div >
< / div >
< / div >
2021-08-18 00:01:11 +02:00
< / div >
2021-10-02 20:50:39 +02:00
2021-08-23 21:08:54 +02:00
< div class = "fixed bottom-0 left-0 w-10 h-10" @dblclick ="setDeveloperMode" > < / div >
2021-08-18 00:01:11 +02:00
< / div >
< / template >
< script >
export default {
2021-08-27 14:01:47 +02:00
asyncData ( { store , redirect } ) {
if ( ! store . getters [ 'user/getIsRoot' ] ) {
redirect ( '/?error=unauthorized' )
}
} ,
2021-08-18 00:01:11 +02:00
data ( ) {
2021-08-21 23:23:35 +02:00
return {
2021-10-02 03:29:00 +02:00
storeCoversInAudiobookDir : false ,
2021-08-22 17:46:04 +02:00
isResettingAudiobooks : false ,
2021-10-02 03:29:00 +02:00
newServerSettings : { } ,
updatingServerSettings : false
2021-09-05 02:58:39 +02:00
}
} ,
watch : {
serverSettings ( newVal , oldVal ) {
if ( newVal && ! oldVal ) {
this . newServerSettings = { ... this . serverSettings }
2021-10-02 03:29:00 +02:00
this . storeCoversInAudiobookDir = this . newServerSettings . coverDestination === this . $constants . CoverDestination . AUDIOBOOK
2021-09-05 02:58:39 +02:00
}
2021-08-21 23:23:35 +02:00
}
2021-08-18 00:01:11 +02:00
} ,
2021-08-18 13:50:24 +02:00
computed : {
2021-09-05 02:58:39 +02:00
parseSubtitleTooltip ( ) {
return 'Extract subtitles from audiobook directory names.<br>Subtitle must be seperated by " - "<br>i.e. "Book Title - A Subtitle Here" has the subtitle "A Subtitle Here"'
} ,
2021-10-02 03:29:00 +02:00
coverDestinationTooltip ( ) {
return 'By default covers are stored in /metadata/books, enabling this setting will store covers inside your audiobooks directory. Only one file named "cover" will be kept.'
} ,
2021-10-05 05:11:42 +02:00
scannerFindCoversTooltip ( ) {
return 'If your audiobook does not have an embedded cover or a cover image inside the folder, the scanner will attempt to find a cover.<br>Note: This will extend scan time'
} ,
2021-10-02 03:29:00 +02:00
saveMetadataTooltip ( ) {
return 'This will write a "metadata.nfo" file in all of your audiobook directories.'
} ,
2021-10-02 20:50:39 +02:00
experimentalFeaturesTooltip ( ) {
return 'Features in development that could use your feedback and help testing.'
} ,
2021-09-05 02:58:39 +02:00
serverSettings ( ) {
return this . $store . state . serverSettings
} ,
2021-08-18 13:50:24 +02:00
streamAudiobook ( ) {
return this . $store . state . streamAudiobook
2021-08-25 03:24:40 +02:00
} ,
isScanning ( ) {
return this . $store . state . isScanning
} ,
isScanningCovers ( ) {
return this . $store . state . isScanningCovers
2021-10-02 20:50:39 +02:00
} ,
2021-10-07 04:08:52 +02:00
showExperimentalFeatures : {
get ( ) {
return this . $store . state . showExperimentalFeatures
} ,
set ( val ) {
this . $store . commit ( 'setExperimentalFeatures' , val )
}
2021-08-18 13:50:24 +02:00
}
} ,
2021-08-18 00:01:11 +02:00
methods : {
2021-10-07 04:08:52 +02:00
// toggleShowExperimentalFeatures() {
// var newExperimentalValue = !this.showExperimentalFeatures
// this.$store.commit('setExperimentalFeatures', newExperimentalValue)
// },
2021-10-06 04:10:49 +02:00
updateScannerFindCovers ( val ) {
this . updateServerSettings ( {
scannerFindCovers : ! ! val
} )
} ,
2021-10-02 03:29:00 +02:00
updateCoverStorageDestination ( val ) {
this . newServerSettings . coverDestination = val ? this . $constants . CoverDestination . AUDIOBOOK : this . $constants . CoverDestination . METADATA
this . updateServerSettings ( {
coverDestination : this . newServerSettings . coverDestination
} )
} ,
2021-09-05 02:58:39 +02:00
updateScannerParseSubtitle ( val ) {
2021-10-06 04:10:49 +02:00
this . updateServerSettings ( {
scannerParseSubtitle : ! ! val
} )
2021-10-01 01:52:32 +02:00
} ,
updateServerSettings ( payload ) {
2021-10-02 03:29:00 +02:00
this . updatingServerSettings = true
2021-09-05 02:58:39 +02:00
this . $store
. dispatch ( 'updateServerSettings' , payload )
. then ( ( success ) => {
console . log ( 'Updated Server Settings' , success )
2021-10-02 03:29:00 +02:00
this . updatingServerSettings = false
2021-09-05 02:58:39 +02:00
} )
. catch ( ( error ) => {
console . error ( 'Failed to update server settings' , error )
2021-10-02 03:29:00 +02:00
this . updatingServerSettings = false
2021-09-05 02:58:39 +02:00
} )
} ,
2021-08-23 21:08:54 +02:00
setDeveloperMode ( ) {
var value = ! this . $store . state . developerMode
this . $store . commit ( 'setDeveloperMode' , value )
this . $toast . info ( ` Developer Mode ${ value ? 'Enabled' : 'Disabled' } ` )
} ,
2021-08-18 00:01:11 +02:00
scan ( ) {
2021-10-05 05:11:42 +02:00
this . $root . socket . emit ( 'scan' , this . $store . state . libraries . currentLibraryId )
2021-08-21 23:23:35 +02:00
} ,
2021-10-02 03:29:00 +02:00
saveMetadataComplete ( result ) {
this . savingMetadata = false
if ( ! result ) return
this . $toast . success ( ` Metadata saved for ${ result . success } audiobooks ` )
} ,
2021-09-29 17:16:38 +02:00
saveMetadataFiles ( ) {
2021-10-02 03:29:00 +02:00
this . savingMetadata = true
this . $root . socket . once ( 'save_metadata_complete' , this . saveMetadataComplete )
2021-09-29 17:16:38 +02:00
this . $root . socket . emit ( 'save_metadata' )
} ,
2021-08-21 23:23:35 +02:00
resetAudiobooks ( ) {
if ( confirm ( 'WARNING! This action will remove all audiobooks from the database including any updates or matches you have made. This does not do anything to your actual files. Shall we continue?' ) ) {
this . isResettingAudiobooks = true
this . $axios
. $delete ( '/api/audiobooks' )
. then ( ( ) => {
this . isResettingAudiobooks = false
this . $toast . success ( 'Successfully reset audiobooks' )
2021-10-01 01:52:32 +02:00
location . reload ( )
2021-08-21 23:23:35 +02:00
} )
. catch ( ( error ) => {
console . error ( 'failed to reset audiobooks' , error )
this . isResettingAudiobooks = false
2021-09-30 03:43:36 +02:00
this . $toast . error ( 'Failed to reset audiobooks - manually remove the /config/audiobooks folder' )
2021-08-21 23:23:35 +02:00
} )
}
2021-08-27 14:01:47 +02:00
} ,
2021-10-05 05:11:42 +02:00
init ( ) {
2021-09-05 02:58:39 +02:00
this . newServerSettings = this . serverSettings ? { ... this . serverSettings } : { }
2021-10-02 03:29:00 +02:00
this . storeCoversInAudiobookDir = this . newServerSettings . coverDestination === this . $constants . CoverDestination . AUDIOBOOK
2021-08-18 00:01:11 +02:00
}
} ,
2021-08-22 17:46:04 +02:00
mounted ( ) {
2021-08-27 14:01:47 +02:00
this . init ( )
2021-08-22 17:46:04 +02:00
}
}
< / script >
< style >
# accounts {
table - layout : fixed ;
border - collapse : collapse ;
width : 100 % ;
}
# accounts td ,
# accounts th {
border : 1 px solid # 2 e2e2e ;
padding : 8 px 8 px ;
text - align : left ;
}
# accounts tr : nth - child ( even ) {
background - color : # 3 a3a3a ;
}
# accounts tr : hover {
background - color : # 444 ;
}
# accounts th {
font - size : 0.8 rem ;
font - weight : 600 ;
padding - top : 5 px ;
padding - bottom : 5 px ;
background - color : # 333 ;
2021-08-18 00:01:11 +02:00
}
2021-08-22 17:46:04 +02:00
< / style >