Change geolocation
diff --git a/app/index.js b/app/index.js
index 787921b..6e74642 100644
--- a/app/index.js
+++ b/app/index.js
@@ -16,3 +16,4 @@ ipc.on('update-photos', broadcast.updatePhotos);
ipc.on('launch-finder', broadcast.launchFinder);
ipc.on('launch-url', broadcast.launchUrl);
ipc.on('program-quit', broadcast.programQuit);
+ipc.on('load-update-photos', toolbarUi.onDropFiles);
\ No newline at end of file
diff --git a/app/modules/broadcast.js b/app/modules/broadcast.js
index 3f8ff72..9953063 100644
--- a/app/modules/broadcast.js
+++ b/app/modules/broadcast.js
@@ -1,5 +1,5 @@
var exports = module.exports = {};
-
+var path = require('path');
var exec = require('child_process').exec,
config = require('./config.js');
@@ -24,7 +24,7 @@ exports.importPhotos = function(event, args) {
args['source'] = args['source'].normalize();
args['destination'] = args['destination'].normalize();
- update_command = __dirname + '/../../dist/elodie/elodie import --source="' + args['source'] + '" --destination="' + args['destination'] + '"';
+ update_command = path.normalize(__dirname + '/../../dist/elodie/elodie') + ' import --source="' + args['source'] + '" --destination="' + args['destination'] + '"';
//update_command = __dirname + '/../../elodie.py import --source="' + args['source'] + '" --destination="' + args['destination'] + '"';
console.log(update_command);
@@ -73,8 +73,8 @@ exports.updatePhotos = function(event, args) {
return files
}
files = normalize(args['files'])
-
- update_command = __dirname + '/../../dist/elodie/elodie update'
+ elodie_path = path.normalize(__dirname + '/../../dist/elodie/elodie');
+ update_command = elodie_path +' update'
//update_command = __dirname + '/../../elodie.py update'
if(args['location'].length > 0) {
update_command += ' --location="' + args['location'] + '"';
diff --git a/app/modules/config.js b/app/modules/config.js
index c4150b7..60d9064 100644
--- a/app/modules/config.js
+++ b/app/modules/config.js
@@ -1,13 +1,14 @@
var exports = module.exports = {};
var fs = require('fs'),
+ os = require('os'),
defaultConfigFile = (function() {
var f = __dirname;
for(var i=0; i<2; i++) {
- f = f.substr(0, f.lastIndexOf('/'));
+ f = f.substr(0, f.lastIndexOf(os.platform() == 'win32' ? '\\' : '/'));
}
- return f + '/config.ini-sample';
+ return f + (os.platform() == 'win32' ? '\\config.ini-sample': '/config.ini-sample');
})(),
- configFile = (process.env.HOME || process.env.USERPROFILE) + '/.elodie/config.ini',
+ configFile = (process.env.HOME || process.env.USERPROFILE) + (os.platform() == 'win32' ? '\\.elodie\\config.ini' : '/.elodie/config.ini'),
hasConfig,
setConfig;
diff --git a/app/modules/toolbar-ui.js b/app/modules/toolbar-ui.js
index f32852b..224e596 100644
--- a/app/modules/toolbar-ui.js
+++ b/app/modules/toolbar-ui.js
@@ -5,11 +5,15 @@ var menubar = require('menubar'),
tray = require('tray'),
config = require('./config.js'),
loadUrl = null;
+var os = require('os')
+var s_dir = __dirname.substr(0,__dirname.lastIndexOf(os.platform() == 'win32' ? '\\' : '/')) +
+ (os.platform() == 'win32' ? '\\html' : '/html');
+
exports.app = app = menubar(
{
preloadWindow: true,
- dir: __dirname.substr(0, __dirname.lastIndexOf('/')) + '/html',
+ dir: s_dir,
index: 'index.html',
pages: {
'blank': 'blank.html',
@@ -18,7 +22,9 @@ exports.app = app = menubar(
},
width: 400,
height: 500,
- 'window-position': 'trayCenter'
+ 'window-position': 'trayCenter',
+ 'frame': os.platform() == 'win32' ? true : false,
+ 'always-on-top': os.platform() == 'win32' ? true : false
}
);
@@ -59,6 +65,18 @@ exports.ready = function() {
});
};
+exports.onDropFiles = function(event, args) {
+ var files = args;
+ loadUrl = app.getOption('pages')['location'];
+ app.showWindow();
+
+ app.window.webContents.on('did-finish-load', function() {
+ app.window.webContents.send('files', files);
+ app.window.webContents.send('preview', files);
+ });
+};
+
+
exports.createWindow = function() {
console.log('create-window')
};
diff --git a/elodie/constants.py b/elodie/constants.py
index c3c0f61..052eb45 100644
--- a/elodie/constants.py
+++ b/elodie/constants.py
@@ -5,7 +5,7 @@ Settings used by Elodie.
from os import path
#: If True, debug messages will be printed.
-debug = True
+debug = False
#: Directory in which to store Elodie settings.
application_directory = '{}/.elodie'.format(path.expanduser('~'))
@@ -20,4 +20,7 @@ location_db = '{}/location.json'.format(application_directory)
script_directory = path.dirname(path.dirname(path.abspath(__file__)))
#: Path to Elodie's ExifTool config file.
-exiftool_config = '%s/configs/ExifTool_config' % script_directory
+exiftool_config = path.join(script_directory, 'configs', 'ExifTool_config')
+
+#: Accepted language in responses from MapQuest
+accepted_language = 'en'
diff --git a/elodie/filesystem.py b/elodie/filesystem.py
index be0f58e..0dcec4f 100644
--- a/elodie/filesystem.py
+++ b/elodie/filesystem.py
@@ -68,7 +68,7 @@ class FileSystem(object):
extensions is None or
filename.lower().endswith(extensions)
):
- files.append('%s/%s' % (dirname, filename))
+ files.append(os.path.join(dirname, filename))
return files
def get_current_directory(self):
@@ -164,7 +164,7 @@ class FileSystem(object):
path.append('Unknown Location')
# return '/'.join(path[::-1])
- return '/'.join(path)
+ return os.path.join(*path)
def process_file(self, _file, destination, media, **kwargs):
move = False
@@ -179,9 +179,9 @@ class FileSystem(object):
directory_name = self.get_folder_path(metadata)
- dest_directory = '%s/%s' % (destination, directory_name)
+ dest_directory = os.path.join(destination, directory_name)
file_name = self.get_file_name(media)
- dest_path = '%s/%s' % (dest_directory, file_name)
+ dest_path = os.path.join(dest_directory, file_name)
db = Db()
checksum = db.checksum(_file)
diff --git a/elodie/geolocation.py b/elodie/geolocation.py
index a615761..75b003d 100644
--- a/elodie/geolocation.py
+++ b/elodie/geolocation.py
@@ -161,9 +161,10 @@ def reverse_lookup(lat, lon):
try:
params = {'format': 'json', 'key': key, 'lat': lat, 'lon': lon}
+ headers = {"Accept-Language": constants.accepted_language}
r = requests.get(
'http://open.mapquestapi.com/nominatim/v1/reverse.php?%s' %
- urllib.urlencode(params)
+ urllib.urlencode(params), headers=headers
)
return r.json()
except requests.exceptions.RequestException as e:
diff --git a/elodie/localstorage.py b/elodie/localstorage.py
index 9373ef4..8f1d837 100644
--- a/elodie/localstorage.py
+++ b/elodie/localstorage.py
@@ -98,7 +98,7 @@ class Db(object):
:returns: str or None
"""
hasher = hashlib.sha256()
- with open(file_path, 'r') as f:
+ with open(file_path, 'rb') as f:
buf = f.read(blocksize)
while len(buf) > 0:
diff --git a/elodie/media/media.py b/elodie/media/media.py
index 57813f1..b98df36 100644
--- a/elodie/media/media.py
+++ b/elodie/media/media.py
@@ -106,9 +106,10 @@ class Media(object):
source = self.source
process_output = subprocess.Popen(
- ['%s "%s"' % (exiftool, source)],
+ '%s "%s"' % (exiftool, source),
stdout=subprocess.PIPE,
- shell=True
+ shell=True,
+ universal_newlines=True
)
output = process_output.stdout.read()
@@ -224,8 +225,8 @@ class Media(object):
if(constants.debug is True):
print '%s -config "%s" -xmp-elodie:Album="%s" "%s"' % (exiftool, exiftool_config, name, source) # noqa
process_output = subprocess.Popen(
- ['%s -config "%s" -xmp-elodie:Album="%s" "%s"' %
- (exiftool, exiftool_config, name, source)],
+ '%s -config "%s" -xmp-elodie:Album="%s" "%s"' %
+ (exiftool, exiftool_config, name, source),
stdout=subprocess.PIPE,
shell=True
)
diff --git a/elodie/media/video.py b/elodie/media/video.py
index ad5021a..3ea78fc 100644
--- a/elodie/media/video.py
+++ b/elodie/media/video.py
@@ -156,9 +156,10 @@ class Video(Media):
source = self.source
process_output = subprocess.Popen(
- ['%s "%s"' % (exiftool, source)],
+ '%s "%s"' % (exiftool, source),
stdout=subprocess.PIPE,
- shell=True
+ shell=True,
+ universal_newlines=True
)
return process_output.stdout.read()
diff --git a/elodie/tests/filesystem_test.py b/elodie/tests/filesystem_test.py
index fe4c4a7..2c67112 100644
--- a/elodie/tests/filesystem_test.py
+++ b/elodie/tests/filesystem_test.py
@@ -4,6 +4,9 @@ import sys
import re
import shutil
+from datetime import datetime
+from datetime import timedelta
+import time
sys.path.insert(0, os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))))
@@ -12,13 +15,14 @@ from elodie.filesystem import FileSystem
from elodie.media.media import Media
from elodie.media.photo import Photo
from elodie.media.video import Video
+from nose.plugins.skip import SkipTest
os.environ['TZ'] = 'GMT'
def test_create_directory_success():
filesystem = FileSystem()
- folder = '%s/%s' % (helper.temp_dir(), helper.random_string(10))
+ folder = os.path.join(helper.temp_dir(), helper.random_string(10))
status = filesystem.create_directory(folder)
# Needs to be a subdirectory
@@ -34,7 +38,7 @@ def test_create_directory_success():
def test_create_directory_recursive_success():
filesystem = FileSystem()
- folder = '%s/%s/%s' % (helper.temp_dir(), helper.random_string(10), helper.random_string(10))
+ folder = os.path.join(helper.temp_dir(), helper.random_string(10), helper.random_string(10))
status = filesystem.create_directory(folder)
# Needs to be a subdirectory
@@ -47,6 +51,8 @@ def test_create_directory_recursive_success():
shutil.rmtree(folder)
def test_create_directory_invalid_permissions():
+ if os.name == 'nt':
+ raise SkipTest("It isn't implemented on Windows")
filesystem = FileSystem()
status = filesystem.create_directory('/apathwhichdoesnotexist/afolderwhichdoesnotexist')
@@ -54,7 +60,7 @@ def test_create_directory_invalid_permissions():
def test_delete_directory_if_empty():
filesystem = FileSystem()
- folder = '%s/%s' % (helper.temp_dir(), helper.random_string(10))
+ folder = os.path.join(helper.temp_dir(), helper.random_string(10))
os.makedirs(folder)
assert os.path.isdir(folder) == True
@@ -67,7 +73,7 @@ def test_delete_directory_if_empty():
def test_delete_directory_if_empty_when_not_empty():
filesystem = FileSystem()
- folder = '%s/%s/%s' % (helper.temp_dir(), helper.random_string(10), helper.random_string(10))
+ folder = os.path.join(helper.temp_dir(), helper.random_string(10), helper.random_string(10))
os.makedirs(folder)
parent_folder = os.path.dirname(folder)
@@ -126,14 +132,14 @@ def test_get_file_name_plain():
media = Photo(helper.get_file('plain.jpg'))
file_name = filesystem.get_file_name(media)
- assert file_name == '2015-12-05_00-59-26-plain.jpg', file_name
+ assert file_name == helper.path_tz_fix('2015-12-05_00-59-26-plain.jpg'), file_name
def test_get_file_name_with_title():
filesystem = FileSystem()
media = Photo(helper.get_file('with-title.jpg'))
file_name = filesystem.get_file_name(media)
- assert file_name == '2015-12-05_00-59-26-with-title-some-title.jpg', file_name
+ assert file_name == helper.path_tz_fix('2015-12-05_00-59-26-with-title-some-title.jpg'), file_name
def test_get_folder_name_by_date():
filesystem = FileSystem()
@@ -152,34 +158,34 @@ def test_get_folder_path_plain():
media = Photo(helper.get_file('plain.jpg'))
path = filesystem.get_folder_path(media.get_metadata())
- assert path == '2015-12-Dec/Unknown Location', path
+ assert path == os.path.join('2015-12-Dec','Unknown Location'), path
def test_get_folder_path_with_title():
filesystem = FileSystem()
media = Photo(helper.get_file('with-title.jpg'))
path = filesystem.get_folder_path(media.get_metadata())
- assert path == '2015-12-Dec/Unknown Location', path
+ assert path == os.path.join('2015-12-Dec','Unknown Location'), path
def test_get_folder_path_with_location():
filesystem = FileSystem()
media = Photo(helper.get_file('with-location.jpg'))
path = filesystem.get_folder_path(media.get_metadata())
- assert path == '2015-12-Dec/Sunnyvale', path
+ assert path == os.path.join('2015-12-Dec','Sunnyvale'), path
def test_get_folder_path_with_location_and_title():
filesystem = FileSystem()
media = Photo(helper.get_file('with-location-and-title.jpg'))
path = filesystem.get_folder_path(media.get_metadata())
- assert path == '2015-12-Dec/Sunnyvale', path
+ assert path == os.path.join('2015-12-Dec','Sunnyvale'), path
def test_process_file_plain():
filesystem = FileSystem()
temporary_folder, folder = helper.create_working_folder()
- origin = '%s/photo.jpg' % folder
+ origin = os.path.join(folder,'photo.jpg')
shutil.copyfile(helper.get_file('plain.jpg'), origin)
media = Photo(origin)
@@ -193,7 +199,7 @@ def test_process_file_plain():
assert origin_checksum is not None, origin_checksum
assert origin_checksum == destination_checksum, destination_checksum
- assert '2015-12-Dec/Unknown Location/2015-12-05_00-59-26-photo.jpg' in destination, destination
+ assert helper.path_tz_fix(os.path.join('2015-12-Dec','Unknown Location','2015-12-05_00-59-26-photo.jpg')) in destination, destination
def test_process_file_with_title():
filesystem = FileSystem()
@@ -213,13 +219,13 @@ def test_process_file_with_title():
assert origin_checksum is not None, origin_checksum
assert origin_checksum == destination_checksum, destination_checksum
- assert '2015-12-Dec/Unknown Location/2015-12-05_00-59-26-photo-some-title.jpg' in destination, destination
+ assert helper.path_tz_fix(os.path.join('2015-12-Dec','Unknown Location','2015-12-05_00-59-26-photo-some-title.jpg')) in destination, destination
def test_process_file_with_location():
filesystem = FileSystem()
temporary_folder, folder = helper.create_working_folder()
- origin = '%s/photo.jpg' % folder
+ origin = os.path.join(folder,'photo.jpg')
shutil.copyfile(helper.get_file('with-location.jpg'), origin)
media = Photo(origin)
@@ -233,13 +239,13 @@ def test_process_file_with_location():
assert origin_checksum is not None, origin_checksum
assert origin_checksum == destination_checksum, destination_checksum
- assert '2015-12-Dec/Sunnyvale/2015-12-05_00-59-26-photo.jpg' in destination, destination
+ assert helper.path_tz_fix(os.path.join('2015-12-Dec','Sunnyvale','2015-12-05_00-59-26-photo.jpg')) in destination, destination
def test_process_file_with_location_and_title():
filesystem = FileSystem()
temporary_folder, folder = helper.create_working_folder()
- origin = '%s/photo.jpg' % folder
+ origin = os.path.join(folder,'photo.jpg')
shutil.copyfile(helper.get_file('with-location-and-title.jpg'), origin)
media = Photo(origin)
@@ -253,13 +259,13 @@ def test_process_file_with_location_and_title():
assert origin_checksum is not None, origin_checksum
assert origin_checksum == destination_checksum, destination_checksum
- assert '2015-12-Dec/Sunnyvale/2015-12-05_00-59-26-photo-some-title.jpg' in destination, destination
+ assert helper.path_tz_fix(os.path.join('2015-12-Dec','Sunnyvale','2015-12-05_00-59-26-photo-some-title.jpg')) in destination, destination
def test_process_file_with_album():
filesystem = FileSystem()
temporary_folder, folder = helper.create_working_folder()
- origin = '%s/photo.jpg' % folder
+ origin = os.path.join(folder,'photo.jpg')
shutil.copyfile(helper.get_file('with-album.jpg'), origin)
media = Photo(origin)
@@ -273,13 +279,13 @@ def test_process_file_with_album():
assert origin_checksum is not None, origin_checksum
assert origin_checksum == destination_checksum, destination_checksum
- assert '2015-12-Dec/Test Album/2015-12-05_00-59-26-photo.jpg' in destination, destination
+ assert helper.path_tz_fix(os.path.join('2015-12-Dec','Test Album','2015-12-05_00-59-26-photo.jpg')) in destination, destination
def test_process_file_with_album_and_title():
filesystem = FileSystem()
temporary_folder, folder = helper.create_working_folder()
- origin = '%s/photo.jpg' % folder
+ origin = os.path.join(folder,'photo.jpg')
shutil.copyfile(helper.get_file('with-album-and-title.jpg'), origin)
media = Photo(origin)
@@ -293,13 +299,13 @@ def test_process_file_with_album_and_title():
assert origin_checksum is not None, origin_checksum
assert origin_checksum == destination_checksum, destination_checksum
- assert '2015-12-Dec/Test Album/2015-12-05_00-59-26-photo-some-title.jpg' in destination, destination
+ assert helper.path_tz_fix(os.path.join('2015-12-Dec','Test Album','2015-12-05_00-59-26-photo-some-title.jpg')) in destination, destination
def test_process_file_with_album_and_title_and_location():
filesystem = FileSystem()
temporary_folder, folder = helper.create_working_folder()
- origin = '%s/photo.jpg' % folder
+ origin = os.path.join(folder,'photo.jpg')
shutil.copyfile(helper.get_file('with-album-and-title-and-location.jpg'), origin)
media = Photo(origin)
@@ -313,4 +319,4 @@ def test_process_file_with_album_and_title_and_location():
assert origin_checksum is not None, origin_checksum
assert origin_checksum == destination_checksum, destination_checksum
- assert '2015-12-Dec/Test Album/2015-12-05_00-59-26-photo-some-title.jpg' in destination, destination
+ assert helper.path_tz_fix(os.path.join('2015-12-Dec','Test Album','2015-12-05_00-59-26-photo-some-title.jpg')) in destination, destination
diff --git a/elodie/tests/helper.py b/elodie/tests/helper.py
index 023726c..9959165 100644
--- a/elodie/tests/helper.py
+++ b/elodie/tests/helper.py
@@ -3,6 +3,11 @@ import os
import random
import string
import tempfile
+import re
+import time
+
+from datetime import datetime
+from datetime import timedelta
def checksum(file_path, blocksize=65536):
hasher = hashlib.sha256()
@@ -17,14 +22,14 @@ def checksum(file_path, blocksize=65536):
def create_working_folder():
temporary_folder = tempfile.gettempdir()
- folder = '%s/%s/%s' % (temporary_folder, random_string(10), random_string(10))
+ folder = os.path.join(temporary_folder, random_string(10), random_string(10))
os.makedirs(folder)
return (temporary_folder, folder)
def get_file(name):
current_folder = os.path.dirname(os.path.realpath(__file__))
- return '%s/files/%s' % (current_folder, name)
+ return os.path.join(current_folder, 'files', name)
def get_test_location():
return (61.013710, 99.196656, 'Siberia')
@@ -53,3 +58,37 @@ def random_coordinate(coordinate, precision):
def temp_dir():
return tempfile.gettempdir()
+
+def is_windows():
+ return os.name == 'nt'
+
+# path_tz_fix(file_name)
+# Change timestamp in file_name by the offset
+# between UTC and local time, i.e.
+# 2015-12-05_00-59-26-with-title-some-title.jpg ->
+# 2015-12-04_20-59-26-with-title-some-title.jpg
+# (Windows only)
+
+def path_tz_fix(file_name):
+ if is_windows():
+ # Calculate the offset between UTC and local time
+ tz_shift = (datetime.fromtimestamp(0) -
+ datetime.utcfromtimestamp(0)).seconds/3600
+ # replace timestamp in file_name
+ m = re.search('(\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2})',file_name)
+ t_date = datetime.fromtimestamp(time.mktime(time.strptime(m.group(0), '%Y-%m-%d_%H-%M-%S')))
+ s_date_fix = (t_date-timedelta(hours=tz_shift)).strftime('%Y-%m-%d_%H-%M-%S')
+ return re.sub('\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}',s_date_fix,file_name)
+ else:
+ return file_name
+
+# time_convert(s_time)
+# Change s_time (struct_time) by the offset
+# between UTC and local time
+# (Windows only)
+
+def time_convert(s_time):
+ if is_windows():
+ return time.gmtime((time.mktime(s_time)))
+ else:
+ return s_time
diff --git a/elodie/tests/media/photo_test.py b/elodie/tests/media/photo_test.py
index 41809b6..9ae5938 100644
--- a/elodie/tests/media/photo_test.py
+++ b/elodie/tests/media/photo_test.py
@@ -3,7 +3,7 @@
import os
import sys
-import datetime
+from datetime import datetime
import shutil
import tempfile
import time
@@ -95,7 +95,8 @@ def test_get_date_taken():
photo = Photo(helper.get_file('plain.jpg'))
date_taken = photo.get_date_taken()
- assert date_taken == (2015, 12, 5, 0, 59, 26, 5, 339, 0), date_taken
+# assert date_taken == (2015, 12, 5, 0, 59, 26, 5, 339, 0), date_taken
+ assert date_taken == helper.time_convert((2015, 12, 5, 0, 59, 26, 5, 339, 0)), date_taken
def test_get_date_taken_without_exif():
source = helper.get_file('no-exif.jpg')
@@ -125,7 +126,7 @@ def test_set_date_taken_with_missing_datetimeoriginal():
shutil.copyfile(helper.get_file('no-exif.jpg'), origin)
photo = Photo(origin)
- status = photo.set_date_taken(datetime.datetime(2013, 9, 30, 7, 6, 5))
+ status = photo.set_date_taken(datetime(2013, 9, 30, 7, 6, 5))
assert status == True, status
@@ -136,7 +137,8 @@ def test_set_date_taken_with_missing_datetimeoriginal():
shutil.rmtree(folder)
- assert date_taken == (2013, 9, 30, 7, 6, 5, 0, 273, 0), metadata['date_taken']
+ #assert date_taken == (2013, 9, 30, 7, 6, 5, 0, 273, 0), metadata['date_taken']
+ assert date_taken == helper.time_convert((2013, 9, 30, 7, 6, 5, 0, 273, 0)), metadata['date_taken']
def test_set_date_taken():
temporary_folder, folder = helper.create_working_folder()
@@ -145,7 +147,7 @@ def test_set_date_taken():
shutil.copyfile(helper.get_file('plain.jpg'), origin)
photo = Photo(origin)
- status = photo.set_date_taken(datetime.datetime(2013, 9, 30, 7, 6, 5))
+ status = photo.set_date_taken(datetime(2013, 9, 30, 7, 6, 5))
assert status == True, status
@@ -156,7 +158,8 @@ def test_set_date_taken():
shutil.rmtree(folder)
- assert date_taken == (2013, 9, 30, 7, 6, 5, 0, 273, 0), metadata['date_taken']
+ #assert date_taken == (2013, 9, 30, 7, 6, 5, 0, 273, 0), metadata['date_taken']
+ assert date_taken == helper.time_convert((2013, 9, 30, 7, 6, 5, 0, 273, 0)), metadata['date_taken']
def test_set_location():
raise SkipTest('gh-31, precision is lost in conversion from decimal to dms')
diff --git a/requirements.txt b/requirements.txt
index cfb3339..8305605 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,3 +2,4 @@ click>=6.2,<7.0
LatLon>=1.0.2,<2.0
requests>=2.9.1,<3.0
send2trash>=1.3.0,<2.0
+mock>=1.3.0