11/// <reference lib="webworker" />
22
3+ // TODO: change to https://github.com/101arrowz/fflate
4+ // because jszip is toooo slow
5+ // https://chatgpt.com/c/68cadcf9-6c28-8329-add8-cb20abaa2f85
6+
37import JSZip from 'jszip' ;
8+ import { filterImages , getAcbfFile , getComicInfoFile , processFile , processImagesInBatches } from '../utils' ;
9+
10+ const metadataFiles = [
11+ { getter : getComicInfoFile , type : 'comicinfo' } ,
12+ { getter : getAcbfFile , type : 'acbf' } ,
13+ ] ;
414
515addEventListener ( 'message' , ( { data } ) => {
616 const arrayBuffer = data . arrayBuffer ;
@@ -11,59 +21,19 @@ addEventListener('message', ({ data }) => {
1121 . then ( async zip => {
1222 const filesName : string [ ] = Object . keys ( zip . files ) ;
1323
14- // console.dir(zip.files)
15-
16- const comicInfoFile = getComicInfoFile ( filesName )
17-
18- if ( comicInfoFile ) {
19- const comicinfo = zip . files [ comicInfoFile ]
20- await comicinfo . async ( 'text' ) . then ( text => { postMessage ( { type : 'comicinfo' , data : text } ) ; } )
21- }
24+ console . log ( filesName ) ;
25+
2226
23- const acbf = getAcbfFile ( filesName )
24- if ( acbf ) {
25- const acbfF = zip . files [ acbf ]
26- await acbfF . async ( 'text' ) . then ( text => { postMessage ( { type : 'acbf' , data : text } ) ; } )
27+ // metadata
28+ for ( const { getter, type } of metadataFiles ) {
29+ await processFile ( getter ( filesName ) , zip , type ) ;
2730 }
2831
29- const images = filterImages ( filesName ) . sort ( )
32+ // images
33+ const images = filterImages ( filesName ) . sort ( ) ;
3034 postMessage ( { type : 'zipopen' , data : { count : images . length } } ) ;
3135
32- for ( let i = 0 ; i < images . length ; i ++ ) {
33- const filename = images [ i ] ;
34-
35- await zip . files [ filename ] . async ( 'blob' ) . then ( blob => {
36- const url = URL . createObjectURL ( blob ) ;
37- postMessage ( { type : 'file' , url : url , index : i } ) ;
38- } ) ;
39- }
40-
36+ await processImagesInBatches ( zip , images , 30 ) ;
4137
4238 } ) ;
43- } ) ;
44-
45- function filterImages ( fileList : Array < string > ) {
46- const imageExtensions = [ '.jpg' , '.jpeg' , '.png' , '.gif' , '.bmp' , '.webp' ] ;
47-
48- return fileList . filter ( file => {
49- const extension = file . substring ( file . lastIndexOf ( '.' ) ) . toLowerCase ( ) ;
50- return imageExtensions . includes ( extension ) ;
51- } ) ;
52- }
53-
54- function getComicInfoFile ( fileList : Array < string > ) {
55- const resultArray = fileList . filter ( f => f . toLowerCase ( ) == 'comicinfo.xml' )
56-
57- return resultArray . length > 0 ? resultArray [ 0 ] : false
58- }
59-
60- function getAcbfFile ( fileList : Array < string > ) {
61- const imageExtensions = [ '.acbf' ] ;
62-
63- const result = fileList . filter ( file => {
64- const extension = file . substring ( file . lastIndexOf ( '.' ) ) . toLowerCase ( ) ;
65- return imageExtensions . includes ( extension ) ;
66- } )
67-
68- return result . length > 0 ? result [ 0 ] : null ;
69- }
39+ } ) ;
0 commit comments