2021-08-17 17:01:11 -05:00
< template >
2021-09-28 17:36:41 -05:00
< div id = "page-wrapper" class = "page p-6 overflow-y-auto" : class = "streamAudiobook ? 'streaming' : ''" >
2021-08-17 17:01:11 -05:00
< div class = "w-full max-w-4xl mx-auto" >
2021-10-04 22:11:42 -05: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 10:46:04 -05:00
< / div >
2021-09-30 18:52:32 -05:00
2021-10-04 22:11:42 -05: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 >
< / ui-tooltip >
< / div >
< div class = "flex items-center py-2" >
2021-10-05 21:10:49 -05:00
< ui-toggle-switch v-model = "newServerSettings.scannerFindCovers" :disabled="updatingServerSettings" @input="updateScannerFindCovers" / >
2021-10-04 22:11:42 -05:00
< ui-tooltip :text = "scannerFindCoversTooltip" >
< p class = "pl-4 text-lg" > Scanner find covers < span class = "material-icons icon-text" > info _outlined < / span > < / p >
< / ui-tooltip >
< / div >
2021-09-30 18:52:32 -05:00
2021-10-04 22:11:42 -05: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 >
< / ui-tooltip >
< / div >
< / div >
2021-08-21 16:23:35 -05:00
< div class = "h-0.5 bg-primary bg-opacity-50 w-full" / >
< div class = "flex items-center py-4" >
2021-08-22 10:46:04 -05:00
< ui-btn color = "bg" small :padding-x = "4" :loading = "isResettingAudiobooks" @click ="resetAudiobooks" > Reset All Audiobooks < / ui -btn >
2021-09-30 18:52:32 -05:00
< div class = "flex-grow" / >
< ui-btn to = "/config/log" > View Logger < / ui-btn >
2021-08-21 16:23:35 -05:00
< / div >
2021-08-17 17:51:07 -05:00
< div class = "h-0.5 bg-primary bg-opacity-50 w-full" / >
2021-08-21 16:23:35 -05:00
2021-08-18 06:50:24 -05:00
< div class = "flex items-center py-4" >
2021-08-21 13:02:24 -05:00
< p class = "font-mono" > v { { $config . version } } < / p >
2021-08-20 18:29:10 -05: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 06:50:24 -05:00
< / div >
2021-10-02 13:50:39 -05: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-06 21:08:52 -05:00
< ui-toggle-switch v-model = "showExperimentalFeatures" / >
2021-10-02 13:50:39 -05:00
< ui-tooltip :text = "experimentalFeaturesTooltip" >
< p class = "pl-4 text-lg" > Experimental Features < span class = "material-icons icon-text" > info _outlined < / span > < / p >
< / ui-tooltip >
< / 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-17 17:01:11 -05:00
< / div >
2021-10-02 13:50:39 -05:00
2021-08-23 14:08:54 -05:00
< div class = "fixed bottom-0 left-0 w-10 h-10" @dblclick ="setDeveloperMode" > < / div >
2021-08-17 17:01:11 -05:00
< / div >
< / template >
< script >
export default {
2021-08-27 07:01:47 -05:00
asyncData ( { store , redirect } ) {
if ( ! store . getters [ 'user/getIsRoot' ] ) {
redirect ( '/?error=unauthorized' )
}
} ,
2021-08-17 17:01:11 -05:00
data ( ) {
2021-08-21 16:23:35 -05:00
return {
2021-10-01 20:29:00 -05:00
storeCoversInAudiobookDir : false ,
2021-08-22 10:46:04 -05:00
isResettingAudiobooks : false ,
2021-10-01 20:29:00 -05:00
newServerSettings : { } ,
updatingServerSettings : false
2021-09-04 19:58:39 -05:00
}
} ,
watch : {
serverSettings ( newVal , oldVal ) {
if ( newVal && ! oldVal ) {
this . newServerSettings = { ... this . serverSettings }
2021-10-01 20:29:00 -05:00
this . storeCoversInAudiobookDir = this . newServerSettings . coverDestination === this . $constants . CoverDestination . AUDIOBOOK
2021-09-04 19:58:39 -05:00
}
2021-08-21 16:23:35 -05:00
}
2021-08-17 17:01:11 -05:00
} ,
2021-08-18 06:50:24 -05:00
computed : {
2021-09-04 19:58:39 -05: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-01 20:29:00 -05: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-04 22:11:42 -05: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-01 20:29:00 -05:00
saveMetadataTooltip ( ) {
return 'This will write a "metadata.nfo" file in all of your audiobook directories.'
} ,
2021-10-02 13:50:39 -05:00
experimentalFeaturesTooltip ( ) {
return 'Features in development that could use your feedback and help testing.'
} ,
2021-09-04 19:58:39 -05:00
serverSettings ( ) {
return this . $store . state . serverSettings
} ,
2021-08-18 06:50:24 -05:00
streamAudiobook ( ) {
return this . $store . state . streamAudiobook
2021-08-24 20:24:40 -05:00
} ,
isScanning ( ) {
return this . $store . state . isScanning
} ,
isScanningCovers ( ) {
return this . $store . state . isScanningCovers
2021-10-02 13:50:39 -05:00
} ,
2021-10-06 21:08:52 -05:00
showExperimentalFeatures : {
get ( ) {
return this . $store . state . showExperimentalFeatures
} ,
set ( val ) {
this . $store . commit ( 'setExperimentalFeatures' , val )
}
2021-08-18 06:50:24 -05:00
}
} ,
2021-08-17 17:01:11 -05:00
methods : {
2021-10-06 21:08:52 -05:00
// toggleShowExperimentalFeatures() {
// var newExperimentalValue = !this.showExperimentalFeatures
// this.$store.commit('setExperimentalFeatures', newExperimentalValue)
// },
2021-10-05 21:10:49 -05:00
updateScannerFindCovers ( val ) {
this . updateServerSettings ( {
scannerFindCovers : ! ! val
} )
} ,
2021-10-01 20:29:00 -05:00
updateCoverStorageDestination ( val ) {
this . newServerSettings . coverDestination = val ? this . $constants . CoverDestination . AUDIOBOOK : this . $constants . CoverDestination . METADATA
this . updateServerSettings ( {
coverDestination : this . newServerSettings . coverDestination
} )
} ,
2021-09-04 19:58:39 -05:00
updateScannerParseSubtitle ( val ) {
2021-10-05 21:10:49 -05:00
this . updateServerSettings ( {
scannerParseSubtitle : ! ! val
} )
2021-09-30 18:52:32 -05:00
} ,
updateServerSettings ( payload ) {
2021-10-01 20:29:00 -05:00
this . updatingServerSettings = true
2021-09-04 19:58:39 -05:00
this . $store
. dispatch ( 'updateServerSettings' , payload )
. then ( ( success ) => {
console . log ( 'Updated Server Settings' , success )
2021-10-01 20:29:00 -05:00
this . updatingServerSettings = false
2021-09-04 19:58:39 -05:00
} )
. catch ( ( error ) => {
console . error ( 'Failed to update server settings' , error )
2021-10-01 20:29:00 -05:00
this . updatingServerSettings = false
2021-09-04 19:58:39 -05:00
} )
} ,
2021-08-23 14:08:54 -05:00
setDeveloperMode ( ) {
var value = ! this . $store . state . developerMode
this . $store . commit ( 'setDeveloperMode' , value )
this . $toast . info ( ` Developer Mode ${ value ? 'Enabled' : 'Disabled' } ` )
} ,
2021-08-17 17:01:11 -05:00
scan ( ) {
2021-10-04 22:11:42 -05:00
this . $root . socket . emit ( 'scan' , this . $store . state . libraries . currentLibraryId )
2021-08-21 16:23:35 -05:00
} ,
2021-10-01 20:29:00 -05:00
saveMetadataComplete ( result ) {
this . savingMetadata = false
if ( ! result ) return
this . $toast . success ( ` Metadata saved for ${ result . success } audiobooks ` )
} ,
2021-09-29 10:16:38 -05:00
saveMetadataFiles ( ) {
2021-10-01 20:29:00 -05:00
this . savingMetadata = true
this . $root . socket . once ( 'save_metadata_complete' , this . saveMetadataComplete )
2021-09-29 10:16:38 -05:00
this . $root . socket . emit ( 'save_metadata' )
} ,
2021-08-21 16:23:35 -05: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-09-30 18:52:32 -05:00
location . reload ( )
2021-08-21 16:23:35 -05:00
} )
. catch ( ( error ) => {
console . error ( 'failed to reset audiobooks' , error )
this . isResettingAudiobooks = false
2021-09-29 20:43:36 -05:00
this . $toast . error ( 'Failed to reset audiobooks - manually remove the /config/audiobooks folder' )
2021-08-21 16:23:35 -05:00
} )
}
2021-08-27 07:01:47 -05:00
} ,
2021-10-04 22:11:42 -05:00
init ( ) {
2021-09-04 19:58:39 -05:00
this . newServerSettings = this . serverSettings ? { ... this . serverSettings } : { }
2021-10-01 20:29:00 -05:00
this . storeCoversInAudiobookDir = this . newServerSettings . coverDestination === this . $constants . CoverDestination . AUDIOBOOK
2021-08-17 17:01:11 -05:00
}
} ,
2021-08-22 10:46:04 -05:00
mounted ( ) {
2021-08-27 07:01:47 -05:00
this . init ( )
2021-08-22 10:46:04 -05: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-17 17:01:11 -05:00
}
2021-08-22 10:46:04 -05:00
< / style >