Thank you to anyone who has already donated - your generous donations helped make three months of treatment possible.

My brother Nate continues to fight stage IV Hodgkin's lymphoma. He's just 31, with a wife and baby girl. They have no active income (since he's been unable to return to work), no insurance, and cannot afford the treatment he needs. Nate and his family need your help. Please consider a donation, every dollar helps. Thanks.


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++))
}