mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Merge pull request #3672 from Techwolfy/disc-folder-support
Support additional disc folder names
This commit is contained in:
		
						commit
						95c80a5b18
					
				| @ -133,8 +133,8 @@ class AudioFileScanner { | ||||
| 
 | ||||
|     // Look for disc number in folder path e.g. /Book Title/CD01/audiofile.mp3
 | ||||
|     const pathdir = Path.dirname(path).split('/').pop() | ||||
|     if (pathdir && /^cd\d{1,3}$/i.test(pathdir)) { | ||||
|       const discFromFolder = Number(pathdir.replace(/cd/i, '')) | ||||
|     if (pathdir && /^(cd|dis[ck])\s*\d{1,3}$/i.test(pathdir)) { | ||||
|       const discFromFolder = Number(pathdir.replace(/^(cd|dis[ck])\s*/i, '')) | ||||
|       if (!isNaN(discFromFolder) && discFromFolder !== null) discNumber = discFromFolder | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -96,7 +96,7 @@ function groupFilesIntoLibraryItemPaths(mediaType, paths) { | ||||
|           // This is the last directory, create group
 | ||||
|           itemGroup[_path] = [Path.basename(path)] | ||||
|           return | ||||
|         } else if (dirparts.length === 1 && /^cd\d{1,3}$/i.test(dirparts[0])) { | ||||
|         } else if (dirparts.length === 1 && /^(cd|dis[ck])\s*\d{1,3}$/i.test(dirparts[0])) { | ||||
|           // Next directory is the last and is a CD dir, create group
 | ||||
|           itemGroup[_path] = [Path.posix.join(dirparts[0], Path.basename(path))] | ||||
|           return | ||||
| @ -179,7 +179,7 @@ function groupFileItemsIntoLibraryItemDirs(mediaType, fileItems, audiobooksOnly | ||||
|           // This is the last directory, create group
 | ||||
|           libraryItemGroup[_path] = [item.name] | ||||
|           return | ||||
|         } else if (dirparts.length === 1 && /^cd\d{1,3}$/i.test(dirparts[0])) { | ||||
|         } else if (dirparts.length === 1 && /^(cd|dis[ck])\s*\d{1,3}$/i.test(dirparts[0])) { | ||||
|           // Next directory is the last and is a CD dir, create group
 | ||||
|           libraryItemGroup[_path] = [Path.posix.join(dirparts[0], item.name)] | ||||
|           return | ||||
|  | ||||
							
								
								
									
										52
									
								
								test/server/utils/scandir.test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								test/server/utils/scandir.test.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | ||||
| const Path = require('path') | ||||
| const chai = require('chai') | ||||
| const expect = chai.expect | ||||
| const scanUtils = require('../../../server/utils/scandir') | ||||
| 
 | ||||
| describe('scanUtils', async () => { | ||||
|   it('should properly group files into potential book library items', async () => { | ||||
|     global.isWin = process.platform === 'win32' | ||||
|     global.ServerSettings = { | ||||
|       scannerParseSubtitle: true | ||||
|     } | ||||
| 
 | ||||
|     const filePaths = [ | ||||
|       'randomfile.txt', // Should be ignored because it's not a book media file
 | ||||
|       'Book1.m4b', // Root single file audiobook
 | ||||
|       'Book2/audiofile.m4b', | ||||
|       'Book2/disk 001/audiofile.m4b', | ||||
|       'Book2/disk 002/audiofile.m4b', | ||||
|       'Author/Book3/audiofile.mp3', | ||||
|       'Author/Book3/Disc 1/audiofile.mp3', | ||||
|       'Author/Book3/Disc 2/audiofile.mp3', | ||||
|       'Author/Series/Book4/cover.jpg', | ||||
|       'Author/Series/Book4/CD1/audiofile.mp3', | ||||
|       'Author/Series/Book4/CD2/audiofile.mp3', | ||||
|       'Author/Series2/Book5/deeply/nested/cd 01/audiofile.mp3', | ||||
|       'Author/Series2/Book5/deeply/nested/cd 02/audiofile.mp3', | ||||
|       'Author/Series2/Book5/randomfile.js' // Should be ignored because it's not a book media file
 | ||||
|     ] | ||||
| 
 | ||||
|     // Create fileItems to match the format of fileUtils.recurseFiles
 | ||||
|     const fileItems = [] | ||||
|     for (const filePath of filePaths) { | ||||
|       const dirname = Path.dirname(filePath) | ||||
|       fileItems.push({ | ||||
|         name: Path.basename(filePath), | ||||
|         reldirpath: dirname === '.' ? '' : dirname, | ||||
|         extension: Path.extname(filePath), | ||||
|         deep: filePath.split('/').length - 1 | ||||
|       }) | ||||
|     } | ||||
| 
 | ||||
|     const libraryItemGrouping = scanUtils.groupFileItemsIntoLibraryItemDirs('book', fileItems, false) | ||||
| 
 | ||||
|     expect(libraryItemGrouping).to.deep.equal({ | ||||
|       'Book1.m4b': 'Book1.m4b', | ||||
|       Book2: ['audiofile.m4b', 'disk 001/audiofile.m4b', 'disk 002/audiofile.m4b'], | ||||
|       'Author/Book3': ['audiofile.mp3', 'Disc 1/audiofile.mp3', 'Disc 2/audiofile.mp3'], | ||||
|       'Author/Series/Book4': ['CD1/audiofile.mp3', 'CD2/audiofile.mp3', 'cover.jpg'], | ||||
|       'Author/Series2/Book5/deeply/nested': ['cd 01/audiofile.mp3', 'cd 02/audiofile.mp3'] | ||||
|     }) | ||||
|   }) | ||||
| }) | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user