1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import java.util.concurrent.*

File f = new File('.')
def toScan = []
def imgs = []

toScan << f

def pool = Executors.newFixedThreadPool(10)

class JPEGFilter implements FilenameFilter {  
    public boolean accept(File f, String filename) {  
      String lower = filename.toLowerCase();  
      return lower.endsWith("jpg") || lower.endsWith("JPG") || lower.endsWith("jpeg") || lower.endsWith("JPEG")
    }  
}

class JPEGInfo
{
  boolean corrupted

  JPEGInfo(boolean corrupted)
  {
    this.corrupted = corrupted
  }
}

class CallableJPEGInfo implements Callable<JPEGInfo>
{
  String name
  int i

  CallableJPEGInfo(name, int i)
  {
    this.name = name;
    this.i = i;
  }
  
  public JPEGInfo call()
  {
    def command = ['jpeginfo','-c',name]
    def proc = command.execute()                 
    proc.waitFor()
    
    String res = proc.in.text
    
    if (res.contains("WARNING") || res.contains("ERROR"))
    {
      print "\n"+i+"   "+res
      return new JPEGInfo(true)
    }
    else
    {
      print "${i} "
      return new JPEGInfo(false)
    }
      
  }
}

while (toScan.size() > 0)
{
  File c = toScan.remove(0)
  
  if (c.isDirectory())
  {
    println "Scan directory ${c.name}"
    c.listFiles(new JPEGFilter()).each { i ->  
      imgs << i
    }
  }

  c.eachDir{ toScan.add(it) }   
}

println "Found ${imgs.size()} images."

int c = 0
imgs.each{
  pool.submit(new CallableJPEGInfo(it.getAbsolutePath(), c++))
}