summaryrefslogtreecommitdiff
path: root/test-flacs
blob: 3028adc32c381068c4ccb6c61fcaf86c60faa669 (plain)
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
#!/usr/bin/python


import multiprocessing
import os
import subprocess
import sys
import time


def test_flacs(job_queue, result_queue):
    i = 0
    for filename in iter(job_queue.get, None):
        p = subprocess.Popen(['flac', '--totally-silent', '--test', filename])
        p.communicate()
        result_queue.put((filename, p.returncode == 0))
        i += 1
        if i >= 10:
            time.sleep(1)
            i = 0


def find_files(root):
    pathnames = set()
    for dirname, subdirs, filenames in os.walk(root):
        for pathname in [os.path.join(dirname, x) for x in filenames]:
            if pathname.endswith('.flac'):
                pathnames.add(pathname)
    return pathnames


files = find_files(sys.argv[1])
        
job_queue = multiprocessing.Queue()
result_queue = multiprocessing.Queue()
for job in files:
    job_queue.put(job)
for i in range(multiprocessing.cpu_count()):
    p = multiprocessing.Process(target=test_flacs,
                                args=(job_queue, result_queue))
    p.start()
total = len(files)
bad = list()
for done in range(total):
    result = result_queue.get()
    sys.stderr.write('\r%d / %d done' % (done + 1, total))
    sys.stderr.flush()
    if result:
        filename, ok = result
        if not ok:
            bad.append(filename)

for i in range(multiprocessing.cpu_count()):
    job_queue.put(None)

sys.stderr.write('\n')

for filename in bad:
    print 'BAD:', filename