From 22e94264eebd65fd1273484dc6a79ae09e96f105 Mon Sep 17 00:00:00 2001 From: tigeren Date: Wed, 27 Aug 2025 17:03:55 +0000 Subject: [PATCH] feat: improve media type detection and scanning functionality - Enhanced media type detection by normalizing file extensions to handle case variations for videos and photos. - Updated the scanning process to accommodate different case formats for video and photo file extensions, improving accuracy in file recognition. - Refactored related code for better readability and maintainability. --- media.db | Bin 364544 -> 462848 bytes src/app/api/files/route.ts | 5 +++-- src/lib/scanner.ts | 25 +++++++++++++++---------- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/media.db b/media.db index d6cbc9c7fb5e85713de45f7fc50c61cc80ed66e4..c07baf7f9f22b8e442109535ef75896c4dea609d 100644 GIT binary patch delta 43329 zcmeI5cbFB$*01;O?w!*xgdr&dC^_sLP;!)v1VuoyA}U!_1O^6X#)u$Fn?Nw@F%Xmy z17HAAFrXMfQ7~XY5l}JfUG=NlOz+;+oYi1ry1Hsr?5YK;Yb{t^ ze`#H(cACv*o4%~LgQA_bZcMC!=1^^Y^g+ke2KQ`iP@p+d>P&rig+0FENZSJ;yJPtq z9oq)g!wymk2M-f%)0X=?^)C$73)KvTLY|Ns{3G~N@L2Hh@@fTNZy473mOu&p(Ugjb z#7ip9C0_b#;!fMJAm!MGr=>!c3=if zgDEfxCcwBuEg|zU2vINshQYRA8?ZIl3Tz3s0Gor&z@}gm@O1Drurb&OYzP*E4TzNg zPla#_SRbqh)&=W;wZS5=7FZLk0agbK!D?Uu7y^S}0Q7@C(92k&dLXz#7w7~Xpa!a- z0@^_vqw*K{C-?{WJNO&;EBFieGx!sD0{jsy`2qiY4;}}Pfk(mbz$4(d;5Xo5@N4iZ z@JsLu@DTVp_!;;q_z8FrJOF--{I7fjVL$jG_yM>N+zY-Bz6ZVwz60(7-v-|TcY|+& zZ-B3ZuYtS3o#3m;|H>;6c7QK~+re$%OW=#(3*htMR&Wcr8GH_W7JLSL8r%dv1y+I^ z!6zMRBYKNZK-d7T2iJjX!N)gz_E4d-Hq{y9nQSjK)FR_TCzcniPHpJEw&FillN=9? zWp@8?+C5`TIpcn5epcpG>tsDmrOTfm#a<={==GH@w)Be(>-0lXf(4!jn;hI^8$ zAyk0nU>Ud=Tm+Va3&8~-@}N2&zt02bf>(iaz$?Kkz{|ne;AP+}B6*UT5N3eW!D--B za0+-ScnNqhI2pVMoCID7UI0!6CxFNR>Nxz)U& z4g-gRL%_k{+29~>AUFW*5B3B5f_=c=V98ndrx(~0>;ZNMyMbN7E?{S{6W9^#0JaCu z1kV85ff+Cjrobea0OR~E#vnw&2p9(2f^ERoU@NdC*aB=0HUpc2O~BK^)4;}HBd{S@ z3^w33>8TJ-0qcYHz`9@^ur^o()&gsSHNfg%Ay^G807GC941j*n2YPw__dsxiF3<@& zKn+wu1+;@U#{Y3$Qlcn7AfWHT+rXE=7r__6=fSPu7H~889QZ8w4EQv-3498y1UG_DB7gq-x@1$Kll6|q zG9`QU^;@;0O$zJ}*+MmgEdpKr6MSXf`#mqazjS+CEt~@!W3`!TnWEDlJVTwaW%}w( z_Am4?kJ+7-cWttdb?Re#s~_tPx7gpW+*(KJ=B(7V+W%<4IzLJP0b7F}s?d+C%}Z6}PKHMVll zm-gT6`kGDlL;Ao&cBg&3PFGIoYx^k9%ASYqpDOxyPuf3orJJ{zJnh1n5Gn_)v(I$4 zVGmc`Hrz(NNN2#~_xq}QYk2JL;kMzf)%IGB8O~PDL&~*kH}y~LDf^rBP%Rw`&(KOQ z*N+{wKkADVH;XoJ(|ce~b)r7#cl!ocm>E#X{O|Us6mM)CmilXr=vFj2h}! z9k9=;e(Cs&rcRtbeSDjK1BNNvORH&%8=t&;*rmL@aGthkp1$xI`)&GP)9eE)hkauI zQ+qm3_tn^tsDor-c)pI2LZ${lIm=F(|#4h-q2$QzBmG1%% z*_`tfVLyg2hU)X`u?T;yx3ACsJ*@wMf4@Np{umG8Tgn=(^xap{^RdKsC7^pY1pVV0 z>@^JLcX+5n%8Qka#i~}|4k$m7uB~OIKdk;3YDvEq*blNRlaS3C_}ltAdHZ|%xo>ps zbRM@Kbk=or(I%@mDNk>xR`8VF*?-|+ZBbMGU{CesKs3QK*lVOdSzlME?F=Ns{L&qC z>0*8vY!N*_1d32!xFJn}YosN+t*RLw=_6e1p`lvgU<-5-PQ+Ezf8|dM_%G-Lu z`}DqT_iP-fYSUD&a%QD#tNKTS`d-^QoBOw*9%$p+=AGc2ui2F^?7M91?DOsOnHMQ6 zEh>uzZ1&QgMP0Sa-EMcxp;!A^y;vybUXg8I`m(DQwKR%0AYR2O09aGtWK@6h|p1u_CkNCLu2^!WHKSQ7hZg2 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 diff --git a/src/app/api/files/route.ts b/src/app/api/files/route.ts index 9092650..ffcfea0 100644 --- a/src/app/api/files/route.ts +++ b/src/app/api/files/route.ts @@ -31,9 +31,10 @@ export async function GET(request: Request) { const ext = path.extname(file).toLowerCase(); let type = 'file'; - if (VIDEO_EXTENSIONS.some(v => ext.includes(v))) { + const cleanExt = ext.replace('.', '').toLowerCase(); + if (VIDEO_EXTENSIONS.some(v => v.toLowerCase() === cleanExt)) { type = 'video'; - } else if (PHOTO_EXTENSIONS.some(p => ext.includes(p))) { + } else if (PHOTO_EXTENSIONS.some(p => p.toLowerCase() === cleanExt)) { type = 'photo'; } diff --git a/src/lib/scanner.ts b/src/lib/scanner.ts index b16fccf..53a2c1e 100644 --- a/src/lib/scanner.ts +++ b/src/lib/scanner.ts @@ -34,15 +34,19 @@ const generatePhotoThumbnail = (photoPath: string, thumbnailPath: string) => { }; const scanLibrary = async (library: { id: number; path: string }) => { - // Scan videos - const videoFiles = await glob(`${library.path}/**/*.{${VIDEO_EXTENSIONS.join(",")}}`, { - nodir: true, - }); + // Scan videos - handle case variations + const videoPatterns = VIDEO_EXTENSIONS.flatMap(ext => [ + `${library.path}/**/*.${ext}`, + `${library.path}/**/*.${ext.toUpperCase()}`, + ]); + const videoFiles = await glob(videoPatterns, { nodir: true }); - // Scan photos - const photoFiles = await glob(`${library.path}/**/*.{${PHOTO_EXTENSIONS.join(",")}}`, { - nodir: true, - }); + // Scan photos - handle case variations + const photoPatterns = PHOTO_EXTENSIONS.flatMap(ext => [ + `${library.path}/**/*.${ext}`, + `${library.path}/**/*.${ext.toUpperCase()}`, + ]); + const photoFiles = await glob(photoPatterns, { nodir: true }); const allFiles = [...videoFiles, ...photoFiles]; @@ -50,8 +54,9 @@ const scanLibrary = async (library: { id: number; path: string }) => { const stats = fs.statSync(file); const title = path.basename(file); const ext = path.extname(file).toLowerCase(); - const isVideo = VIDEO_EXTENSIONS.some(v => ext.includes(v)); - const isPhoto = PHOTO_EXTENSIONS.some(p => ext.includes(p)); + const cleanExt = ext.replace('.', '').toLowerCase(); + const isVideo = VIDEO_EXTENSIONS.some(v => v.toLowerCase() === cleanExt); + const isPhoto = PHOTO_EXTENSIONS.some(p => p.toLowerCase() === cleanExt); const mediaType = isVideo ? "video" : "photo"; const thumbnailFileName = `${path.parse(title).name}_${Date.now()}.png`;