Repository Analysis

advplyr/audiobookshelf

Self-hosted audiobook and podcast server

0.8 Likely human-written View on GitHub
0.8
Adjusted Score
0.8
Raw Score
100%
Time Factor
2026-05-28
Last Push
13,025
Stars
JavaScript
Language
215,885
Lines of Code
807
Files
125
Pattern Hits
2026-05-31
Scan Date

Score History

Severity Breakdown

CRITICAL 2HIGH 1MEDIUM 1LOW 121

Pattern Findings

125 matches across 8 categories. Click a row to expand file-level details.

Fake / Example Data49 hits · 61 pts
SeverityFileLineSnippet
LOWtest/server/utils/ffmpegHelpers.test.js15 artist: 'John Doe',
LOWtest/server/utils/parsers/parseNameString.test.js24 expect(result.names).to.deep.equal(['John Smith', 'Jane Doe'])
LOWtest/server/utils/parsers/parseNameString.test.js29 expect(result.names).to.deep.equal(['John Smith', 'Jane Doe'])
LOWtest/server/utils/parsers/parseNameString.test.js34 expect(result.names).to.deep.equal(['John Smith', 'Jane Doe', 'John Doe'])
LOWtest/server/utils/parsers/parseNameString.test.js34 expect(result.names).to.deep.equal(['John Smith', 'Jane Doe', 'John Doe'])
LOWtest/server/utils/parsers/parseNameString.test.js39 expect(result.names).to.deep.equal(['John Smith', 'Jane Doe'])
LOWtest/server/utils/parsers/parseNameString.test.js44 expect(result.names).to.deep.equal(['John Smith', 'Jane Doe'])
LOWtest/server/finders/BookFinder.test.js405 const bookResults = [{ duration: 10, title: 'The Great Novel', author: 'John Doe' }]
LOWtest/server/finders/BookFinder.test.js407 const results = await bookFinder.search(libraryItemPerfectDuration, provider, 'The Great Novel', 'John Doe')
LOWtest/server/finders/BookFinder.test.js416 const bookResults = [{ duration: 21, title: 'The Great Novel', author: 'John Doe' }] // 21 min, diff = 11 min
LOWtest/server/finders/BookFinder.test.js418 const results = await bookFinder.search(libraryItemPerfectDuration, provider, 'The Great Novel', 'John Doe')
LOWtest/server/finders/BookFinder.test.js427 const bookResults = [{ duration: 16, title: 'The Great Novel', author: 'John Doe' }] // 16 min, diff = 6 min
LOWtest/server/finders/BookFinder.test.js429 const results = await bookFinder.search(libraryItemPerfectDuration, provider, 'The Great Novel', 'John Doe')
LOWtest/server/finders/BookFinder.test.js438 const bookResults = [{ duration: 14, title: 'The Great Novel', author: 'John Doe' }] // 14 min, diff = 4 min
LOWtest/server/finders/BookFinder.test.js440 const results = await bookFinder.search(libraryItemPerfectDuration, provider, 'The Great Novel', 'John Doe')
LOWtest/server/finders/BookFinder.test.js449 const bookResults = [{ duration: 11, title: 'The Great Novel', author: 'John Doe' }] // 11 min, diff = 1 min
LOWtest/server/finders/BookFinder.test.js451 const results = await bookFinder.search(libraryItemPerfectDuration, provider, 'The Great Novel', 'John Doe')
LOWtest/server/finders/BookFinder.test.js460 const bookResults = [{ duration: 10, title: 'The Great Novel', author: 'John Doe' }]
LOWtest/server/finders/BookFinder.test.js462 const results = await bookFinder.search({ media: {} }, provider, 'The Great Novel', 'John Doe')
LOWtest/server/finders/BookFinder.test.js469 const bookResults = [{ title: 'The Great Novel', author: 'John Doe' }] // No duration in book
LOWtest/server/finders/BookFinder.test.js471 const results = await bookFinder.search(libraryItemPerfectDuration, provider, 'The Great Novel', 'John Doe')
LOWtest/server/finders/BookFinder.test.js478 const bookResults = [{ duration: 10, title: 'Novel', author: 'John Doe' }]
LOWtest/server/finders/BookFinder.test.js484 const results = await bookFinder.search(libraryItemPerfectDuration, provider, 'Novel Ex', 'John Doe')
LOWtest/server/finders/BookFinder.test.js508 const results = await bookFinder.search(libraryItemPerfectDuration, provider, 'The Great Novel', 'John Doe')
LOWtest/server/finders/BookFinder.test.js515 const bookResults = [{ duration: 10, title: 'The Great Novel', author: 'John Doe' }]
LOWtest/server/finders/BookFinder.test.js524 const results = await bookFinder.search(libraryItemPerfectDuration, provider, 'The Great Novel', 'John Doe')
LOWtest/server/finders/BookFinder.test.js533 const bookResults = [{ duration: 10, title: 'The Great Novel', author: 'John Doe' }]
LOWtest/server/finders/BookFinder.test.js542 const results = await bookFinder.search(libraryItemPerfectDuration, provider, 'The Great Novel', 'John Doe')
LOWtest/server/finders/BookFinder.test.js554 const bookResults = [{ duration: 10, title: 'The Great Novel', subtitle: 'A Novel', author: 'John Doe' }]
LOWtest/server/finders/BookFinder.test.js556 const results = await bookFinder.search(libraryItemPerfectDuration, provider, 'The Great Novel: A Novel', 'John
LOWtest/server/finders/BookFinder.test.js561 const bookResults = [{ duration: 10, title: 'The Great Novel', subtitle: 'A Novel', author: 'John Doe' }]
LOWtest/server/finders/BookFinder.test.js563 const results = await bookFinder.search(libraryItemPerfectDuration, provider, 'The Great Novel', 'John Doe')
LOWtest/server/finders/BookFinder.test.js569 const bookResults = [{ duration: 10, title: 'The Great Novel', author: 'John Doe' }]
LOWtest/server/finders/BookFinder.test.js572 const results = await bookFinder.search(libraryItemPerfectDuration, provider, 'The Great Novel - A Novel', 'Jo
LOWtest/server/finders/BookFinder.test.js577 const bookResults = [{ duration: 10, title: 'The Great Novel', author: 'John Doe' }]
LOWtest/server/finders/BookFinder.test.js589 const bookResults = [{ title: 'The Great Novel', author: 'John Doe' }]
LOWtest/server/finders/BookFinder.test.js591 const results = await bookFinder.search(libraryItemPerfectDuration, provider, 'The Great Novel', 'John Doe')
LOWclient/cypress/tests/components/cards/AuthorCard.cy.js10 name: 'John Doe',
LOWclient/cypress/tests/components/cards/AuthorCard.cy.js79 .and('have.text', 'John Doe')
LOWclient/cypress/tests/components/cards/AuthorCard.cy.js137 $post: cy.stub().resolves({ updated: false, author: { name: 'John Doe' } })
LOWclient/cypress/tests/components/cards/AuthorCard.cy.js159 $post: cy.stub().resolves({ updated: true, author: { name: 'John Doe' } })
LOWclient/cypress/tests/components/cards/AuthorCard.cy.js181 $post: cy.stub().resolves({ updated: true, author: { name: 'John Doe', imagePath: 'path/to/image' } })
LOW…ient/cypress/tests/components/cards/NarratorCard.cy.js5 name: 'John Doe',
LOW…ient/cypress/tests/components/cards/NarratorCard.cy.js36 cy.get('&name').should('have.text', 'John Doe')
LOW…ient/cypress/tests/components/cards/NarratorCard.cy.js47 let propsData = { narrator: { name: 'John Doe', numBooks: 1 }, width: 200, height: 150 }
LOWclient/cypress/tests/components/cards/ItemSlider.cy.js8 { name: 'John Doe', numBooks: 5 },
LOWclient/cypress/tests/components/cards/ItemSlider.cy.js9 { name: 'Jane Doe', numBooks: 3 },
LOWclient/cypress/tests/components/cards/ItemSlider.cy.js14 { id: 1, name: 'John Doe', numBooks: 5 },
LOWclient/cypress/tests/components/cards/ItemSlider.cy.js15 { id: 2, name: 'Jane Doe', numBooks: 3 },
Over-Commented Block44 hits · 44 pts
SeverityFileLineSnippet
LOWdocker-compose.yml1### EXAMPLE DOCKER COMPOSE ###
LOWdocker-compose.yml21 # you are running ABS on
LOWserver/providers/FantLab.js1const axios = require('axios')
LOWserver/libs/async/index.js1//
LOWserver/libs/umzug/storage/json.js61//# sourceMappingURL=json.js.map
LOW…ver/libs/archiver/archiverUtils/stringDecoder/index.js1// Copyright Joyent, Inc. and other Node contributors.
LOWserver/libs/archiver/archiverUtils/minimatch/index.js101// a{b,c}d -> abd acd
LOWserver/libs/archiver/archiverUtils/minimatch/index.js281 if (p === false) return false
LOWserver/libs/archiver/archiverUtils/minimatch/index.js301 // - matchOne(b/x/y/z/c, b/**/c)
LOWserver/libs/archiver/archiverUtils/minimatch/index.js381 // If the file ends in /, then it can only match a
LOWserver/libs/archiver/archiverUtils/minimatch/index.js601 // a right bracket shall lose its special
LOW…r/libs/archiver/archiverUtils/readableStream/stream.js1// Copyright Joyent, Inc. and other Node contributors.
LOW…erUtils/readableStream/internal/streams/passthrough.js1// Copyright Joyent, Inc. and other Node contributors.
LOW…hiverUtils/readableStream/internal/streams/readable.js1// Copyright Joyent, Inc. and other Node contributors.
LOW…hiverUtils/readableStream/internal/streams/readable.js401 // 2. If that resulting state will trigger a _read, then call _read.
LOW…hiverUtils/readableStream/internal/streams/readable.js541// it's in progress.
LOW…hiverUtils/readableStream/internal/streams/readable.js561 // - No data in the buffer, and the stream is in flowing mode. In this mode
LOW…hiverUtils/readableStream/internal/streams/writable.js1// Copyright Joyent, Inc. and other Node contributors.
LOW…iverUtils/readableStream/internal/streams/transform.js1// Copyright Joyent, Inc. and other Node contributors.
LOW…iverUtils/readableStream/internal/streams/transform.js21// a transform stream is a readable/writable stream where you do
LOW…iverUtils/readableStream/internal/streams/transform.js41// _read(n) is called, it transforms the queued up data, calling the
LOW…rchiverUtils/readableStream/internal/streams/duplex.js1// Copyright Joyent, Inc. and other Node contributors.
LOWserver/libs/archiver/archiverUtils/glob/index.js1// Approach:
LOWserver/libs/archiver/archiverUtils/glob/index.js21// // by pruning it out, and testing the resulting pattern
LOWserver/libs/archiver/archiverUtils/fsRealpath/old.js1/* istanbul ignore file - tested in node */
LOW…/lazystream/readable-stream/lib/_stream_passthrough.js1// Copyright Joyent, Inc. and other Node contributors.
LOW…ls/lazystream/readable-stream/lib/_stream_transform.js1// Copyright Joyent, Inc. and other Node contributors.
LOW…ls/lazystream/readable-stream/lib/_stream_transform.js21
LOW…ls/lazystream/readable-stream/lib/_stream_transform.js41// In a transform stream, the written data is placed in a buffer. When
LOW…Utils/lazystream/readable-stream/lib/_stream_duplex.js1// Copyright Joyent, Inc. and other Node contributors.
LOW…ils/lazystream/readable-stream/lib/_stream_readable.js1// Copyright Joyent, Inc. and other Node contributors.
LOW…ils/lazystream/readable-stream/lib/_stream_readable.js401 }
LOW…ils/lazystream/readable-stream/lib/_stream_writable.js1// Copyright Joyent, Inc. and other Node contributors.
LOW…ils/lazystream/readable-stream/lib/_stream_writable.js141 // when 'finish' is emitted
LOWserver/libs/libarchive/wasm-module.js161 // void * archive_open( const void * buffer, size_t buffer_size)
LOWserver/libs/sanitizeHtml/index.js81
LOWserver/libs/sanitizeHtml/index.js381 // Chrome accepts \ as a substitute for / in the // at the
LOWserver/libs/sanitizeHtml/index.js421 }
LOWserver/libs/sanitizeHtml/index.js441 // if (!parsed.length) {
LOWserver/libs/sanitizeHtml/index.js481 if (a === 'style') {
LOWserver/libs/fsExtra/remove/rimraf.js61// Two possible strategies.
LOWserver/finders/BookFinder.js461 */
LOWclient/cypress/support/component.js1// ***********************************************************
LOWclient/cypress/support/commands.js1// ***********************************************
Hallucination Indicators2 hits · 20 pts
SeverityFileLineSnippet
CRITICALclient/components/cards/LazyBookCard.vue549 subitems: this.store.state.libraries.ereaderDevices.map((d) => {
CRITICALclient/static/libs/marked/index.js6 !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?de
Verbosity Indicators10 hits · 16 pts
SeverityFileLineSnippet
LOWserver/managers/MigrationManager.js118 // Step 3: If migration fails, save the failed original and restore the backup
LOWserver/utils/scandir.js49 // Step 1: Filter out non-book-media files in root dir (with depth of 0)
LOWserver/utils/scandir.js54 // Step 2: Separate media files and other files
LOWserver/utils/scandir.js68 // Step 3: Group media files (or non-media files if includeNonMediaFiles is true) in library items
LOWserver/utils/scandir.js102 // Step 4: Add other files into library item groups
LOWserver/utils/queries/libraryItemsBookFilters.js851 // Step 1: Get the first book of every series that hasnt been started yet
LOWserver/utils/queries/libraryItemsBookFilters.js995 // Step 3: Map books to library items
LOW…ver/libs/archiver/archiverUtils/stringDecoder/index.js233// number of bytes available, we need to check if we end on a leading/high
LOW…hiverUtils/readableStream/internal/streams/readable.js840 // We need to check if there is someone still listening to
LOW…hiverUtils/readableStream/internal/streams/readable.js858 // We need to check if there is someone still listening to
Hyper-Verbose Identifiers16 hits · 16 pts
SeverityFileLineSnippet
LOWserver/utils/podcastUtils.js78function extractFirstArrayItemString(json, key) {
LOWserver/utils/ffmpegHelpers.js302async function addCoverAndMetadataToFile(audioFilePath, coverFilePath, metadataFilePath, track, mimeType, progressCB = n
LOWserver/utils/scandir.js48function groupFileItemsIntoLibraryItemDirs(mediaType, fileItems, audiobooksOnly, includeNonMediaFiles = false) {
LOWserver/utils/parsers/parseOverdriveMediaMarkers.js6function cleanOverdriveMediaMarkers(overdriveMediaMarkers) {
LOWserver/utils/parsers/parseOverdriveMediaMarkers.js63function objectValuesArrayToString(arrayOfObjects) {
LOWserver/libs/nodeStreamZip/index.js224 function readCentralDirectoryComplete() {
LOWserver/libs/requestIp/index.js16function getClientIpFromXForwardedFor(value) {
LOWserver/libs/umzug/storage/mongodb.js4function isMongoDBCollectionOptions(arg) {
LOW…hiverUtils/readableStream/internal/streams/readable.js756 return function pipeOnDrainFunctionResult() {
LOWserver/libs/libarchive/wasm-libarchive.js11 var Module = typeof libarchive !== "undefined" ? libarchive : {}; var moduleOverrides = {}; var key; for (key in M
LOWserver/controllers/LibraryItemController.js48function ensureUserCanAccessLibraryItemsForBatch(req, res, libraryItems) {
LOWserver/scanner/LibraryScanner.js661async function findLibraryItemByItemToItemInoMatch(libraryId, fullPath) {
LOWserver/scanner/LibraryScanner.js672async function findLibraryItemByItemToFileInoMatch(libraryId, fullPath, isSingleMedia) {
LOWserver/scanner/LibraryScanner.js694async function findLibraryItemByFileToItemInoMatch(libraryId, fullPath, isSingleMedia, itemFiles) {
LOWclient/components/ui/VueTrix.vue48function enableBreakParagraphOnReturn() {
LOWclient/static/libarchive/wasm-gen/libarchive.js8 var Module = typeof libarchive !== "undefined" ? libarchive : {}; var moduleOverrides = {}; var key; for (key in M
Cross-Language Confusion (JS/TS)1 hit · 5 pts
SeverityFileLineSnippet
HIGHserver/libs/libarchive/wasm-module.js149 print(...text) {
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippet
MEDIUMserver/utils/parsers/parseOverdriveMediaMarkers.js112 // this allows us to leverage the individual track durations when calculating the start times of chapters in track
Overly Generic Function Names2 hits · 2 pts
SeverityFileLineSnippet
LOWserver/libs/libarchive/wasm-libarchive.js11 var Module = typeof libarchive !== "undefined" ? libarchive : {}; var moduleOverrides = {}; var key; for (key in M
LOWclient/static/libarchive/wasm-gen/libarchive.js8 var Module = typeof libarchive !== "undefined" ? libarchive : {}; var moduleOverrides = {}; var key; for (key in M