From b372cde326320c767622cea8338bb5f2bc040f52 Mon Sep 17 00:00:00 2001 From: Jaisen Mathai Date: Tue, 20 Oct 2015 23:51:14 -0700 Subject: [PATCH] Get album updates working for all file types --- elodie/constants.py | 2 ++ elodie/media/media.py | 68 ++++++++++++++++++++++++++++++++++++------- elodie/media/photo.py | 23 ++------------- elodie/media/video.py | 16 ++-------- 4 files changed, 65 insertions(+), 44 deletions(-) diff --git a/elodie/constants.py b/elodie/constants.py index 2e5d894..4afa0b0 100644 --- a/elodie/constants.py +++ b/elodie/constants.py @@ -2,3 +2,5 @@ from os import path application_directory = '{}/.elodie'.format(path.expanduser('~')) hash_db = '{}/hash.json'.format(application_directory) +script_directory = path.dirname(path.dirname(path.abspath(__file__))) +exiftool_config = '%s/configs/ExifTool_config' % script_directory diff --git a/elodie/media/media.py b/elodie/media/media.py index 44eaecd..3d43bd0 100644 --- a/elodie/media/media.py +++ b/elodie/media/media.py @@ -4,9 +4,12 @@ Media package that handles all video operations """ # load modules -from sys import argv from datetime import datetime +from distutils.spawn import find_executable +from elodie import constants from fractions import Fraction +from sys import argv + import LatLon import mimetypes import os @@ -34,22 +37,18 @@ class Media(object): 'latitude_ref': 'Exif.GPSInfo.GPSLatitudeRef', 'longitude': 'Exif.GPSInfo.GPSLongitude', 'longitude_ref': 'Exif.GPSInfo.GPSLongitudeRef', - 'album': 'Xmp.elodie.album' } - try: - pyexiv2.xmp.register_namespace('https://github.com/jmathai/elodie/', 'elodie') - except KeyError: - pass + self.exiftool_attributes = None def get_album(self): if(not self.is_valid()): return None - exif = self.get_exif() - try: - return exif[self.exif_map['album']].value - except KeyError: + exiftool_attributes = self.get_exiftool_attributes() + if('album' not in exiftool_attributes): return None + + return exiftool_attributes['album'] """ Get the full path to the video. @@ -153,6 +152,30 @@ class Media(object): return self.exif + def get_exiftool_attributes(self): + if(self.exiftool_attributes is not None): + return self.exiftool_attributes + + exiftool = find_executable('exiftool') + if(exiftool is None): + return False + + source = self.source + process_output = subprocess.Popen(['%s "%s"' % (exiftool, source)], stdout=subprocess.PIPE, shell=True) + output = process_output.stdout.read() + + album = None + album_regex = re.search('Album +: +(.+)', output) + if(album_regex is not None): + album = album_regex.group(1) + + self.exiftool_attributes = { + 'album': album + } + + return self.exiftool_attributes + + """ Get the file extension as a lowercased string. @@ -205,6 +228,31 @@ class Media(object): return mimetype[0] + """ + Set album for a photo + + @param, name, string, Name of album + + @returns, boolean + """ + def set_album(self, name): + if(name is None): + return False + + exiftool = find_executable('exiftool') + if(exiftool is None): + return False + + source = self.source + exiftool_config = constants.exiftool_config + process_output = subprocess.Popen(['%s -config "%s" -xmp-elodie:Album="%s" "%s"' % (exiftool, exiftool_config, name, source)], stdout=subprocess.PIPE, shell=True) + streamdata = process_output.communicate()[0] + if(process_output.returncode != 0): + return False + + os.remove('%s%s' % (source, '_original')) + return True + @classmethod def get_class_by_file(Media, _file, classes): extension = os.path.splitext(_file)[1][1:].lower() diff --git a/elodie/media/photo.py b/elodie/media/photo.py index b640f88..f986d9a 100644 --- a/elodie/media/photo.py +++ b/elodie/media/photo.py @@ -4,13 +4,15 @@ Photo package that handles all photo operations """ # load modules -from sys import argv from datetime import datetime +from distutils.spawn import find_executable +from sys import argv import mimetypes import os import pyexiv2 import re +import subprocess import time from media import Media @@ -48,25 +50,6 @@ class Photo(Media): return re.search('(\d{2}:\d{2}.\d{2})', key).group(1).replace('.', ':') return None - """ - Set album for a photo - - @param, name, string, Name of album - - @returns, boolean - """ - def set_album(self, name): - if(name is None): - return False - - source = self.source - exif_metadata = pyexiv2.ImageMetadata(source) - exif_metadata.read() - - exif_metadata['Xmp.elodie.album'] = name - - exif_metadata.write() - """ Set the date/time a photo was taken diff --git a/elodie/media/video.py b/elodie/media/video.py index 70d1043..6479c05 100644 --- a/elodie/media/video.py +++ b/elodie/media/video.py @@ -137,7 +137,7 @@ class Video(Media): "date_taken": self.get_date_taken(), "latitude": self.get_coordinate('latitude'), "longitude": self.get_coordinate('longitude'), - "album": None, + "album": self.get_album(), #"length": self.get_duration(), "mime_type": self.get_mimetype(), "base_name": os.path.splitext(os.path.basename(source))[0], @@ -146,18 +146,6 @@ class Video(Media): return metadata - """ - Set album for a photo - Not yet implemented - - @param, name, string, Name of album - - @returns, boolean - """ - def set_album(self, name): - if(name is None): - return False - """ Set the date/time a photo was taken @@ -270,7 +258,7 @@ class Video(Media): metadata = self.get_metadata() temp_movie = None with tempfile.NamedTemporaryFile() as temp_file: - temp_movie = '%s.%s' % (temp_file.name, metadata['extenseon']) + temp_movie = '%s.%s' % (temp_file.name, metadata['extension']) # We need to block until the child process completes. # http://stackoverflow.com/a/5631819/1318758