{"id":1447,"date":"2008-07-09T00:38:31","date_gmt":"2008-07-08T22:38:31","guid":{"rendered":"http:\/\/www.lubica.net\/bigwhale\/blog\/?p=1447"},"modified":"2008-07-09T00:40:41","modified_gmt":"2008-07-08T22:40:41","slug":"camfetch","status":"publish","type":"post","link":"https:\/\/lubica.net\/bigwhale\/blog\/camfetch\/","title":{"rendered":"CamFetch!"},"content":{"rendered":"<p>Pozdravljeni ljubitelji ka\u010d!<br \/>\nTorej, ste uspeli popraviti pixle? Juhu! Vas pestijo druga\u010dne te\u017eave? Na primer, kako 530 razli\u010dnih slik, posnetih ob razli\u010dnih \u010dasih in na razli\u010dnih krajih spraviti v nek poljuben direktorij in jih datumsko urediti? Vse slike posnete v\u010deraj v enem direktoriju, vse slike posnete tri dni nazaj v drugem? Si \u017eelite tega? Ni\u010d la\u017ejega! Uporabite camfetch!<\/p>\n<p>Hkrati bo program va\u0161e slike opremil tudi z imenom avtorja in imetnika avtorskih pravic. Z mojim imenom. \ud83d\ude09<\/p>\n<p>\u0160e ve\u010d! Celo timestamp datoteke na datote\u010dnem sistemu se bo ohranil tako kot je treba. Prav tako bodo vse datoteke preimenovane, saj bodo njihova imena zapisana z malimi \u010drkami. Vse to v pi\u010dlih 99ih vrsticah ali pa trikrat po 33 vrstic. To je malenkost ve\u010d kot ena vrstica na mesec!<\/p>\n<p>PS: Tudi tukaj ne odgovarjam za kakr\u0161nekoli po\u0161kodbe slik, ki bi se morebiti utegnile zgoditi.<br \/>\nDISCLAIMER: <em>Men vse dela!<\/em> Od mene za vas, z ljubeznijo&#8230;<br \/>\n<!--more--><br \/>\n[python]<br \/>\n#!\/usr\/bin\/env python<br \/>\n############################################################################<br \/>\n#    Copyright (C) 2008 by David Klasinc<br \/>\n#    bigwhale@lubica.net<br \/>\n#<br \/>\n#    This program is free software; you can redistribute it and or modify<br \/>\n#    it under the terms of the GNU General Public License as published by<br \/>\n#    the Free Software Foundation; either version 2 of the License, or<br \/>\n#    (at your option) any later version.<br \/>\n#<br \/>\n#    This program is distributed in the hope that it will be useful,<br \/>\n#    but WITHOUT ANY WARRANTY; without even the implied warranty of<br \/>\n#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br \/>\n#    GNU General Public License for more details.<br \/>\n#<br \/>\n#    You should have received a copy of the GNU General Public License<br \/>\n#    along with this program; if not, write to the<br \/>\n#    Free Software Foundation, Inc.,<br \/>\n#    59 Temple Place &#8211; Suite 330, Boston, MA  02111-1307, USA.<br \/>\n############################################################################<\/p>\n<p>import os<br \/>\nimport sys<br \/>\nimport time<br \/>\nimport Image<br \/>\nimport shutil<br \/>\nimport pyexiv2<br \/>\nfrom stat import *<\/p>\n<p>def walkTree (top, callback, DST_DIR):<\/p>\n<p>    for f in os.listdir (top):<br \/>\n        pathname = os.path.join (top, f)<br \/>\n        mode = os.stat(pathname)[ST_MODE]<br \/>\n        if S_ISDIR (mode):<br \/>\n            walkTree (pathname, callback, DST_DIR)<br \/>\n        elif S_ISREG (mode):<br \/>\n            callback (pathname, DST_DIR)<br \/>\n        else:<br \/>\n            print &#8216;Skipping %s&#8217; % pathname<\/p>\n<p>def processFile (srcFile, DST_DIR):<br \/>\n    srcFile = srcFile.lower ()<br \/>\n    if (not srcFile.endswith (&#8220;.jpg&#8221;)):<br \/>\n        print srcFile, &#8221; is not a JPEG file.&#8221;<br \/>\n        return False<br \/>\n    try:<br \/>\n        tmpImage = pyexiv2.Image (srcFile)<br \/>\n        tmpImage.readMetadata ()<br \/>\n        tmpTime = tmpImage[&#8216;Exif.Image.DateTime&#8217;]<br \/>\n    except:<br \/>\n        print &#8220;Skipping: Unable to read meta data for&#8221;, srcFile<br \/>\n        return False<\/p>\n<p>    tmpDir = tmpTime.strftime(&#8216;%Y-%m-%d&#8217;)<br \/>\n    cYear = tmpTime.strftime (&#8216;%Y&#8217;)<br \/>\n    tgtDir = DST_DIR + &#8220;\/&#8221; + tmpDir<br \/>\n    tgtFile = tgtDir + &#8220;\/&#8221; + os.path.basename (srcFile)<br \/>\n    unixTime = time.mktime (tmpTime.timetuple())<\/p>\n<p>    if not os.path.isdir (tgtDir):<br \/>\n        os.makedirs (tgtDir)<br \/>\n    try:<br \/>\n        # print &#8220;C:&#8221;, srcFile, &#8221; ->\\n   &#8220;, tgtDir<br \/>\n        if os.path.exists (tgtFile):<br \/>\n            tgtFile = tgtDir + &#8220;\/dup_&#8221; + os.path.basename (srcFile)<br \/>\n            print &#8220;Not overwriting target file, trying to rename\\n&#8221;, tgtFile<br \/>\n            if os.path.exists (tgtFile):<br \/>\n                print &#8220;Not overwriting duplicate, skipping&#8221;, srcFile<br \/>\n                return False<\/p>\n<p>        shutil.copy2(srcFile, tgtFile)<\/p>\n<p>    except:<br \/>\n        print &#8220;Copy failed for&#8221;, srcFile<br \/>\n        return False<\/p>\n<p>    newImage = pyexiv2.Image (tgtFile)<br \/>\n    newImage.readMetadata ()<\/p>\n<p>    newImage[&#8216;Exif.Image.Artist&#8217;] = &#8220;David Klasinc&#8221;<br \/>\n    newImage[&#8216;Exif.Image.Copyright&#8217;] = &#8220;David Klasinc (c)&#8221; + cYear + &#8220;, All rights reserved.&#8221;<br \/>\n    newImage.writeMetadata ()<br \/>\n    os.utime(tgtFile, (unixTime, unixTime))<br \/>\n    os.utime(tgtDir, (unixTime, unixTime))<\/p>\n<p>    return True<\/p>\n<p>if __name__ == &#8216;__main__&#8217;:<\/p>\n<p>    try:<br \/>\n        SRC_DIR = sys.argv[1]<br \/>\n        DST_DIR = sys.argv[2]<br \/>\n    except:<br \/>\n        print &#8220;Usage: camfetch.py<source><destination>\\n&#8221;<br \/>\n        sys.exit ()<br \/>\n    walkTree (SRC_DIR, processFile, DST_DIR)<\/p>\n<p>    print &#8220;Done.&#8221;<br \/>\n[\/python]<\/destination><\/source><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pozdravljeni ljubitelji ka\u010d! Torej, ste uspeli popraviti pixle? Juhu! Vas pestijo druga\u010dne te\u017eave? Na primer, kako 530 razli\u010dnih slik, posnetih ob razli\u010dnih \u010dasih in na razli\u010dnih krajih spraviti v nek poljuben direktorij in jih datumsko urediti? Vse slike posnete v\u010deraj v enem direktoriju, vse slike posnete tri dni nazaj v drugem? Si \u017eelite tega? Ni\u010d la\u017ejega! Uporabite camfetch! Hkrati bo program va\u0161e slike opremil tudi z imenom avtorja in imetnika avtorskih pravic. Z mojim imenom. \ud83d\ude09 \u0160e ve\u010d! Celo timestamp&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/lubica.net\/bigwhale\/blog\/camfetch\/\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,7],"tags":[],"class_list":["post-1447","post","type-post","status-publish","format-standard","hentry","category-open-source","category-tech-stuff"],"_links":{"self":[{"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/posts\/1447","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/comments?post=1447"}],"version-history":[{"count":0,"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/posts\/1447\/revisions"}],"wp:attachment":[{"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/media?parent=1447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/categories?post=1447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/tags?post=1447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}