2021-08-18 00:01:11 +02:00
|
|
|
const Path = require('path')
|
|
|
|
const dir = require('node-dir')
|
|
|
|
const Logger = require('../Logger')
|
2021-08-22 15:52:37 +02:00
|
|
|
const { cleanString } = require('./index')
|
2021-08-18 00:01:11 +02:00
|
|
|
|
|
|
|
const AUDIOBOOK_PARTS_FORMATS = ['m4b', 'mp3']
|
|
|
|
const INFO_FORMATS = ['nfo']
|
|
|
|
const IMAGE_FORMATS = ['png', 'jpg', 'jpeg', 'webp']
|
|
|
|
const EBOOK_FORMATS = ['epub', 'pdf']
|
|
|
|
|
|
|
|
function getPaths(path) {
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
dir.paths(path, function (err, res) {
|
|
|
|
if (err) {
|
|
|
|
console.error(err)
|
|
|
|
resolve(false)
|
|
|
|
}
|
|
|
|
resolve(res)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
function getFileType(ext) {
|
|
|
|
var ext_cleaned = ext.toLowerCase()
|
|
|
|
if (ext_cleaned.startsWith('.')) ext_cleaned = ext_cleaned.slice(1)
|
|
|
|
if (AUDIOBOOK_PARTS_FORMATS.includes(ext_cleaned)) return 'abpart'
|
|
|
|
if (INFO_FORMATS.includes(ext_cleaned)) return 'info'
|
|
|
|
if (IMAGE_FORMATS.includes(ext_cleaned)) return 'image'
|
|
|
|
if (EBOOK_FORMATS.includes(ext_cleaned)) return 'ebook'
|
2021-08-19 01:31:19 +02:00
|
|
|
return 'unknown'
|
2021-08-18 00:01:11 +02:00
|
|
|
}
|
|
|
|
|
2021-08-20 02:14:24 +02:00
|
|
|
async function getAllAudiobookFiles(abRootPath) {
|
|
|
|
var paths = await getPaths(abRootPath)
|
2021-08-19 01:31:19 +02:00
|
|
|
var audiobooks = {}
|
2021-08-18 00:01:11 +02:00
|
|
|
|
|
|
|
paths.files.forEach((filepath) => {
|
2021-08-20 02:14:24 +02:00
|
|
|
var relpath = filepath.replace(abRootPath, '').slice(1)
|
2021-08-18 00:01:11 +02:00
|
|
|
var pathformat = Path.parse(relpath)
|
2021-08-20 02:14:24 +02:00
|
|
|
var path = pathformat.dir
|
|
|
|
|
2021-08-23 21:08:54 +02:00
|
|
|
if (!path) {
|
|
|
|
Logger.error('Ignoring file in root dir', filepath)
|
2021-08-21 20:02:24 +02:00
|
|
|
return
|
|
|
|
}
|
2021-08-23 21:08:54 +02:00
|
|
|
|
|
|
|
// If relative file directory has 3 folders, then the middle folder will be series
|
|
|
|
var splitDir = pathformat.dir.split(Path.sep)
|
|
|
|
var author = null
|
|
|
|
if (splitDir.length > 1) author = splitDir.shift()
|
2021-08-20 02:14:24 +02:00
|
|
|
var series = null
|
|
|
|
if (splitDir.length > 1) series = splitDir.shift()
|
|
|
|
var title = splitDir.shift()
|
|
|
|
|
|
|
|
var publishYear = null
|
|
|
|
|
|
|
|
// If Title is of format 1999 - Title, then use 1999 as publish year
|
|
|
|
var publishYearMatch = title.match(/^([0-9]{4}) - (.+)/)
|
|
|
|
if (publishYearMatch && publishYearMatch.length > 2) {
|
|
|
|
if (!isNaN(publishYearMatch[1])) {
|
|
|
|
publishYear = publishYearMatch[1]
|
|
|
|
title = publishYearMatch[2]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!audiobooks[path]) {
|
|
|
|
audiobooks[path] = {
|
|
|
|
author: author,
|
|
|
|
title: title,
|
2021-08-22 15:52:37 +02:00
|
|
|
series: cleanString(series),
|
2021-08-20 02:14:24 +02:00
|
|
|
publishYear: publishYear,
|
|
|
|
path: relpath,
|
|
|
|
fullPath: Path.join(abRootPath, path),
|
2021-08-18 00:01:11 +02:00
|
|
|
parts: [],
|
|
|
|
otherFiles: []
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var filetype = getFileType(pathformat.ext)
|
|
|
|
if (filetype === 'abpart') {
|
2021-08-20 02:14:24 +02:00
|
|
|
audiobooks[path].parts.push(pathformat.base)
|
2021-08-18 00:01:11 +02:00
|
|
|
} else {
|
2021-08-19 01:31:19 +02:00
|
|
|
var fileObj = {
|
|
|
|
filetype: filetype,
|
|
|
|
filename: pathformat.base,
|
|
|
|
path: relpath,
|
|
|
|
fullPath: filepath,
|
|
|
|
ext: pathformat.ext
|
|
|
|
}
|
2021-08-20 02:14:24 +02:00
|
|
|
audiobooks[path].otherFiles.push(fileObj)
|
2021-08-18 00:01:11 +02:00
|
|
|
}
|
|
|
|
})
|
2021-08-19 01:31:19 +02:00
|
|
|
return Object.values(audiobooks)
|
2021-08-18 00:01:11 +02:00
|
|
|
}
|
|
|
|
module.exports.getAllAudiobookFiles = getAllAudiobookFiles
|