From 62e5f08deb39b4edb00eb519307d86a8de10cf55 Mon Sep 17 00:00:00 2001 From: Xevion Date: Thu, 8 Aug 2019 16:01:52 -0500 Subject: [PATCH] XMP restructuring, mostly ready for production usage --- package/__pycache__/app.cpython-37.pyc | Bin 3645 -> 3755 bytes package/__pycache__/xmp.cpython-37.pyc | Bin 0 -> 2284 bytes package/app.py | 29 +++++++++++++++---- package/xmp.py | 38 +++++-------------------- 4 files changed, 30 insertions(+), 37 deletions(-) create mode 100644 package/__pycache__/xmp.cpython-37.pyc diff --git a/package/__pycache__/app.cpython-37.pyc b/package/__pycache__/app.cpython-37.pyc index 5b1f19e439e037be3496e8a133ce0729538bdd9f..ab674fa19c8ad35dceb1b693da973f34237edea0 100644 GIT binary patch delta 1531 zcmZux&2Jk;6rb5$uXnw>w&OUC^F>2QlbAHEp|mt5szj7SQL9vj zW64FwNf3A*e{*{!n>kMA=`Y9A z6Zp(a_yq9%%wqOFDP@_%k}wZ2dY2SZPjUC<0uA-gJ>P3KU=V=_+57hjhCrkLaact7-@8i98M#${sx;%x2D^LW!_g66FWv1s1(K2jIOO z4>Xj4<}=O!tJJBLNV0Tb1o07)C#)|Ex-7G*=VcwBrOo9~ z$RkL>DvXtVZ^s>#?`uzsSriQ*j71`^UfFPay3Y*EaEVU=k+=2$PInmdM*t4NMD%RvCP|*Rk!9}AOE7gqg)s- zC_E1)d_@RJk#sh6kGH_ssSBWMV(0ECLy4C9O2!u8*~!_P@Ce&ZI8p}=ZxiPn}V zw<_XZ!3oWEujZB;mAV_M59%$RMh}AsucEfLTJhbI$~RU^YKyxit=04eAD4f`&rM?3 zaF`@2NBOf`yt(H3ei?mYQ2tx;HDh)rO|#0Rs#BdBlwSdU4My}}yl0o8D21^&_Va@$ zB2i5UOV|PQ0(4mnZ|$MFL{>WTH{;vn0b!Y_$aHwjayVPO9&B0mq3yK*w|``T4hjfDwcRJic(d*a?ns)3LEgofK-k>J#$ z0r~K~)tU>5cpKHunj`YN0+g=<=tQA8%CE{#EPg&}h+as1;mqhoOD6xaK6NHQ3R}I2 zN|)swdwH&iOFUf|uX(;;9_Ozkbpa{0<~Bm3UfFbk_xX(c)t<1T7MVt!EAnsqov7(g zqm9a@@~y@#dDEG?oTeElQi2*P6zV3J6monna_n#Wy<9AzqXNP#!n?BTTyK=DR%LAy zF33e}A#5{_|79NS8ihB5pKl;w{UhJc)#2>up|MbJvaOnX18xQy;sdscnxFz EKQd-T`Tzg` delta 1386 zcmZux&2Jk;6rb5ydw0FN{{C!Q@b)wR*Pk4Ho?YUn%#&d ztW}9xq6k_M4F?Vg*%DHv!lk!fpf~;k4ru=aIB|vx@2!)xMV-;UnfblqovwT~R7Wsl+xZP}cZ2#@e6*T!l!@d8{2Joy6L06fKG z+#Hf>np@n4HN)u#q!K^+drnT%g_{&_hGD~}!N=fp1)yJ$UCJp}hWdbV#?>JiDEti9 zxIUx<=8+a1DLxs~8_GZ(M8Y%kRA1#rfsBvaN(48|B7?XYbL0;pJNe-{3jeo4(m94lH2Kk1SpoF<#`QA@QxZfoBX8 zWB8DCvy|ZU=^c=tlk23bY#*OEfx=F0?LY-j2bMEKq{*&n7Ht1nzbyCICe6u*?7OHA zh%n?8bt#WZ5sEnMf=JD69y(L7634O6YPB+Qixi493KhjU5P{O{1={9;=eX})6)(vL+Qxdt4vgJq z+o^Ty9Y-Y4G>>8i?bSxzb*jv{JZQG$VeI#vH8hO`G1sdL z&;7LNeSBOqz(bxuce*@OoG|K;s@rU|9mw%DG&}8Y$h!@Y8wC+13e8ioCLft%KJ4ry zB(Z+#^t@+HUa@Y_S^3D?T3SXM%qY;>P1oa1Au0$hAjH~EH_$uvPaMEqQI?DLoEi4_ z0@|#~>-L-BTRn*|>;e<}-FM_e`@)(<(@^yo)frU&GPqQ-VlgCk58O%qZz0huC|*Ue zAzA!lLm0RZ?+Ak_!?9}i_PzeTSL@fIcB^QBjL%g3G|51})amj4wzGl1GZ!EJ8`Q$d KiWH`4G^4g8k1l$(tv861&p)6;08Bekig_tU~xOJxf3{ik-NO~f(9=4co}v} zyuue?^f>*7_)C{ylQaff5BHmgom8f65oVo>=7Tg&Maa|b&-OmO*KAQd1r0|G=K=H_ zBQD4Y0ve+!))<)8#=}QGRc@5<{H!ZGFgH)Sar7GzCY*kGF9J6Lo%DL$q}@EckexJX zewn82IBI4Xz$Y?nw{b5ETTjDw)I9HH)$BsKwK(h@^RRBAZ|FqWAO=rrytSYAk58kP ztT&TpzFQOgWdDBH25sl_{cUV|Del&*yS3(B+=h8G@o(el$-?CPM89EhusZ#Cr+VA3 zU4K1TzhU~v;cU-qF^mry)(R8X_1c5Uv|dA2z!etkC$>&FTP2`VaYxcqHZlrYurY%b z230j0idLbpPzB#qmN@AqT(LA)W){khGEdWP;u``TDfc+cBU}y~IQ|IguB$!~ST<$1 zBl-C2L%cbCeS~^+nVNKwiUn9}p&4u?=vZAH_a88k5ILvM*@%wG(2x+NGz$ZwGz&9- z%-PT?jFH8SG36#?V;2TwXJdASwMq)3usJ~u_HKO5$;+MkFn!QdE#=-8;)qY%EMQ7w`s6$l`$aBD?_Uq31B?aXkmUY#8ru(MsiqRcdl5@kXXfG`m$ zJC8!q>Zo!r>?YFyfX)Cw7bO@J%7YN6dsbVd{Y;s87A68-F`_K()-MI6Zj$vei%#IB zeR(xkCL{n*=AjIg1!;meH{@Wsn?fXUnm$!7IGF4>Xcu0VS29+mS#Gy5;|&mmE*ceP zYGiNHieb_3s#ZH;_qgF=f0NZsV}&B_8jmi%f;2mE!3~L;fyMB0eG;;?Ky7zs=2WQ+yFKJH+~0hpyp_9 z*spNI9Wh?w-V4CnKX3!HECV-|=eSX6h()N@|I7}tgf^|}HvBY6#4;=hyu1I%6S0B@ zUIXDX@jA}mK!HTNe*46mpdLV~9{K>qhbWN4 z;$sv$C~l^tyz3NpVLL~wgsvd?0s8o?1Nhkrb*Xzz0Vb+&%7+K0tn*Vwevwbo!2AL) zI+sr%GGO;4C7ppTu}&Qcq)p64qvO*5FmA1v@_roE@!`qwX4im+t`5g!p5t!(1(1La AGXMYp literal 0 HcmV?d00001 diff --git a/package/app.py b/package/app.py index 6e5ea77..e94f842 100644 --- a/package/app.py +++ b/package/app.py @@ -2,6 +2,7 @@ import io, sys, os, time, rawpy, imageio, progressbar from google.cloud import vision from google.cloud.vision import types from PIL import Image +from package.xmp import writeTags # The name of the image file to annotate input_path = os.path.join(sys.path[0], 'package', 'processing', 'input') @@ -14,7 +15,7 @@ output_path = os.path.join(sys.path[0], 'package', 'processing', 'output') # 3) Read XMP, then write new tags to it # 4) Delete temporary file, move NEF/JPEG and XMP -def process_file(file_name): +def process_file(file_name, xmp): global client # Remove the temporary file @@ -35,7 +36,7 @@ def process_file(file_name): image.thumbnail(size, resample=Image.ANTIALIAS) image.save(file_path, format='jpeg', optimize=True, quality=quality) - base, ext = os.path.splitext(file_name) + base = os.path.splitext(file_name)[0] temp_file_path = os.path.join(temp_path, base + '.jpeg') try: @@ -59,8 +60,14 @@ def process_file(file_name): # Performs label detection on the image file response = client.label_detection(image=image) - labels = response.label_annotations - print('\tLabels: {}'.format(', '.join([label.description for label in labels]))) + labels = [label.description for label in response.label_annotations] + print('\tLabels: {}'.format(', '.join(labels))) + + print('\tWriting {} tags to output folder...') + writeTags(os.path.join(input_path, xmp), os.path.join(output_path, xmp), labels) + print('\tMoving associated original image file...') + os.rename(os.path.join(input_path, file_name), os.path.join(output_path, file_name)) + except: _cleanup() raise @@ -70,6 +77,16 @@ def process_file(file_name): def run(): global client + # Ensure that 'input' and 'output' directories are created + if not os.path.exists(input_path): + print('Input directory did not exist, creating and quitting.') + os.makedirs(input_path) + return + + if not os.path.exists(output_path): + print('Output directory did not exist. Creating...') + os.makedirs(output_path) + # Clients client = vision.ImageAnnotatorClient() @@ -80,7 +97,7 @@ def run(): # Create the 'temp' directory print(f'Initializing file processing for {len(select)} files...') os.makedirs(temp_path) - + try: # Process files for index, file in progressbar.progressbar(list(enumerate(select)), redirect_stdout=True, term_width=110): @@ -99,7 +116,7 @@ def run(): # Process individual file else: print('Processing file {}, \'{}\''.format(index + 1, possibles[0]), end=' | ') - process_file(possibles[0]) + process_file(file_name=possibles[0], xmp=file) time.sleep(0.3) except: os.rmdir(temp_path) diff --git a/package/xmp.py b/package/xmp.py index 7a5cc0c..84e8370 100644 --- a/package/xmp.py +++ b/package/xmp.py @@ -1,57 +1,33 @@ # from libxmp import file_to_dict import os, sys, re -basepath = "E:\\Photography\\Colorado 2019\\" ext_filter = lambda file : file.endswith('.NEF') mainPattern = r'\n\s+\n(?: .+<\/rdf:li>\n)*\s+<\/rdf:Bag>\n\s+<\/dc:subject>\n' subPattern = r'(.*)\n' subFormatPattern = ' {}\n' -def getXMP(file, basepath=None): - xmpFile = file.rfind('.') - xmpFile = file[:xmpFile] + '.xmp' - if basepath: - xmpFile = os.path.join(basepath, xmpFile) - return xmpFile - -def writeTags(tags, filename): - fullpath = os.path.join(basepath, getXMP(filename)) - if not os.path.exists(fullpath): - raise FileNotFoundError(f'No XMP file found for {filename}.') - data = open(fullpath, 'r').read() +def writeTags(inputPath, outputPath, tags): + data = open(inputPath, 'r').read() # Detect and find the \n \n \n """ look = data.find('') + 13 data = data[:look] + addition + data[look:] match = re.search(mainPattern, data) - print(os.path.join(basepath, filename)) - print(fullpath) - print('. . .') - # Get last matching tag submatch = None for submatch in re.finditer(subPattern, match.group(0)): pass + # Calculate very end spanend = match.span()[0] + (submatch.span()[1] if submatch else 0) + # add tags to end data = data[:spanend] + ''.join(subFormatPattern.format(tag) for tag in tags) + data[spanend:] + # Write file to disk - open(fullpath, 'w').write( data) - -files = os.listdir(basepath) -print(f'Total Files: {len(files)}') -files = list(filter(ext_filter, files)) -print(f'Total Files after .NEF filter: {len(files)}') - -xmps = [file for file in files if os.path.exists(getXMP(file, basepath=basepath))] -print(f'Total .NEF files with .XMP pair: {len(xmps)}') -print(f'{len(xmps)} x 2 == {len(xmps) * 2}') - -select = files[43] -writeTags(['helpgod', 'ohfuck'], select) -print(select) \ No newline at end of file + open(outputPath, 'w+').write( data) \ No newline at end of file