Chris Pomeroy
9 days ago 2bca657babf8bec3f9cee673c92eb21f68a68a68
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#!/usr/local/bin/python -u
 
import os
import sys
import subprocess
import shutil
import time
import hashlib
 
# path = "/home/audiobooks/Incoming"
path = str(os.environ['AAXPATH'])
archivepath = str(os.environ['ARCHIVEPATH'])
dpath = str(os.environ['DESTPATH'])
errorinprocessing = False
 
 
def getMD5(fpathaudiofile):
    with open(fpathaudiofile, "rb") as f:
        file_hash = hashlib.md5()
        while chunk := f.read(8192):
            file_hash.update(chunk)
    return file_hash.digest()
 
 
def changebadfilename(fpathaudiofile):
    # This is used in the case of a zero length file
    os.rename(fpathaudiofile, str(fpathaudiofile) + ".bad")
 
 
def waitforupload(fpathaudiofile):
    # Wait for the file to finish uploading
    fsize_a = 0
    fsizecompare = 0
    loopcount = 0
 
    while fsizecompare == 0:
        fsize_b = os.path.getsize(fpathaudiofile)
        if fsize_b == 0:
            loopcount += 1
            if loopcount == 24:
                changebadfilename(fpathaudiofile)
                return False
            time.sleep(5)
            continue
        if fsize_a == fsize_b:
            fsizecompare = 1
        else:
            fsize_a = fsize_b
        time.sleep(1)
    return True
 
 
def checkforaudiofile():
    # Check the directory for files to process
    if os.path.isdir(path):
        files = os.listdir(path)
        for audio in files:
            fpath = path + "/" + audio
            if ((audio.endswith('aax')) and (checkforlock(fpath) is False)):
                if waitforupload(fpath):
                    return audio
                else:
                    return "None"
 
 
def createlockfile(fpath):
    # create 0byte file with filename.aax.lock
    lockfile = fpath + ".lock"
    print(f"{time.asctime()} #Creating Lock file: {lockfile}")
    try:
        open(lockfile, "w")
    except Exception as err:
        sys.stderr.write("Couldn't create lock file: {}\n".format(err))
        errorinprocessing = True
 
 
def cpfiletoprocessing(fpath, audio):
    # Copy the file to the processing location
    print("Copying the file to processing " + audio)
    try:
        shutil.copy(fpath, "/processing/")
    except Exception as err:
        sys.stderr.write("Couldn't copy the file to processing: {}\n"
                         .format(err)
                         )
        errorinprocessing = True
 
 
def processfile(audio):
    # process the file.  Convert from aax to mp3 back on the NAS
    print(f"{time.asctime()} #Processing {audio}")
    command = "./aaxConvert.py -v -d {} /processing/{}\n".format(dpath, audio)
    subprocess.run(command, shell=True)
 
 
def copyToArchive(fpath, audio):
    # move aax to archive filesystem
    archive = archivepath + "/" + audio
    try:
        shutil.copy(fpath, archive)
    except Exception as err:
        sys.stderr.write(
            f"{time.asctime()} #Couldn't copy file to the archive: {err}\n"
        )
        errorinprocessing = True
 
 
def cleanup(fpath, audio):
    # cleanup after yourself
    #  print"clean up debug: {}".format(fpath)
    # TODO verify md5 hash of archive and original before delete
    archive = archivepath + "/" + audio
    orginial_hash = getMD5(fpath)
    archive_file = getMD5(archive)
 
    if orginial_hash == archive_file:
        try:
            lockfile = fpath + ".lock"
            print("Removing lock file: " + lockfile)
            os.remove(lockfile)
            os.remove(fpath)
            os.remove('/processing/' + audio)
        except Exception as err:
            sys.stderr.write(
                f"{time.asctime()} Couldn't clean up after myself to the archive: {err}\n"  # noqa E501
            )
            errorinprocessing = True
    else:
        print("Checksum's do not match for fpath.  I am not cleaning up")
 
 
def checkforlock(fpathaudiofile):
    # Need to check for .lock file in this function.
    lockfile = fpathaudiofile + ".lock"
    if os.path.exists(lockfile):
        return True
    else:
        return False
 
 
def loopforever():
    # main loop for running the app
    while True:
        # print("Looking for files in {}\n").format(path)
        audio = str(checkforaudiofile())
        if audio != "None":
            fpath = path + '/' + audio
            print(f"Debug: {fpath}")
            print(f"{time.asctime()} #Processing file: {audio}\n")
            try:
                createlockfile(fpath)
                cpfiletoprocessing(fpath, audio)  # copy file
                processfile(audio)  # process file
 
                # Copy file from Incoming to archive
                copyToArchive(fpath, audio)
 
                cleanup(fpath, audio)  # Clean up the processing dir
 
                if errorinprocessing is True: # noqa F823
                    print(f"{time.asctime()}There is a error with {audio}\n")
 
            except Exception:
                continue
            time.sleep(15)
            errorinprocessing = False
 
 
if __name__ == "__main__":
    loopforever()