@@ -29,37 +29,55 @@ function minDate(file) {
2929async function run ( ) {
3030 const folderId = Number . parseInt ( process . env . FOLDER_ID , 10 ) ;
3131 const allFiles = await client . listfolder ( folderId , { recursive : true } ) ;
32- const goodFolders = allFiles . contents . filter ( f => f . name . match ( / ^ [ \w - ] + \d + $ / ) ) ;
32+ const goodFolders = allFiles . contents . filter ( ( f ) =>
33+ f . name . match ( / ^ [ \w - ] + \d + $ / )
34+ ) ;
3335
34- const dupFilesPerFolderUnfiltered = await pMap ( goodFolders , async folder => {
35- const name = folder . name ;
36- const imageFiles = folder . contents . filter ( file => file . contenttype === 'image/jpeg' ) ;
37- const hashToFilesMap = groupByHash ( imageFiles ) ;
38- const fileGroups = [ ...hashToFilesMap . values ( ) ] . filter ( files => files . length > 1 ) ;
39- fileGroups . sort ( ( a , b ) => {
40- return minDate ( a ) - minDate ( b ) ;
41- } ) ;
42- return { name, fileGroups} ;
43- } ) ;
36+ const dupFilesPerFolderUnfiltered = await pMap (
37+ goodFolders ,
38+ async ( folder ) => {
39+ const name = folder . name ;
40+ const imageFiles = folder . contents . filter (
41+ ( file ) => file . contenttype === 'image/jpeg'
42+ ) ;
43+ const hashToFilesMap = groupByHash ( imageFiles ) ;
44+ const fileGroups = [ ...hashToFilesMap . values ( ) ] . filter (
45+ ( files ) => files . length > 1
46+ ) ;
47+ fileGroups . sort ( ( a , b ) => {
48+ return minDate ( a ) - minDate ( b ) ;
49+ } ) ;
50+ return { name, fileGroups} ;
51+ }
52+ ) ;
4453
45- const dupFilesPerFolder = dupFilesPerFolderUnfiltered . filter ( ( { fileGroups} ) => fileGroups . length ) ;
54+ const dupFilesPerFolder = dupFilesPerFolderUnfiltered . filter (
55+ ( { fileGroups} ) => fileGroups . length
56+ ) ;
4657
47- const lineFormat = f => `${ f . name } (${ new Date ( minDate ( f ) ) . toISOString ( ) } )` ;
58+ const deletion = dupFilesPerFolder . map ( ( { name, fileGroups} ) => {
59+ const keepDelGroups = fileGroups . map ( ( g ) => ( {
60+ keep : g [ 0 ] ,
61+ del : g . slice ( 1 )
62+ } ) ) ;
63+ return { name, keepDelGroups} ;
64+ } ) ;
4865
49- // Delete dups
50- await pMap ( dupFilesPerFolder , async ( { name, fileGroups} ) => {
51- console . log ( name ) ;
52- await pMap ( fileGroups , async group => {
53- const first = group [ 0 ] ;
54- console . log ( ` Keep ${ lineFormat ( first ) } ` ) ;
55- await pMap ( group . slice ( 1 ) , file => {
56- console . log ( ` Del ${ lineFormat ( file ) } ` ) ;
57- client . deletefile ( file . fileid ) ;
58- } ) ;
59- } , { concurrency : 1 } ) ;
60- } , { concurrency : 1 } ) ;
66+ console . log ( JSON . stringify ( deletion , null , 4 ) ) ;
67+
68+ const allToDelete = deletion
69+ . flatMap ( ( { keepDelGroups} ) => keepDelGroups . map ( ( { del} ) => del ) )
70+ . flat ( ) ;
71+ await pMap (
72+ allToDelete ,
73+ async ( file ) => {
74+ console . log ( `Deleting ${ file . name } ` ) ;
75+ await client . deletefile ( file . fileid ) ;
76+ } ,
77+ { concurrency : 10 }
78+ ) ;
6179}
6280
63- run ( ) . catch ( error => {
81+ run ( ) . catch ( ( error ) => {
6482 console . error ( error ) ;
6583} ) ;
0 commit comments