Add import support
This commit is contained in:
parent
4b5a736e6f
commit
a252a29c6b
File diff suppressed because it is too large
Load Diff
|
@ -30,6 +30,18 @@
|
||||||
"code": 59397,
|
"code": 59397,
|
||||||
"src": "fontawesome"
|
"src": "fontawesome"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"uid": "b091a8bd0fdade174951f17d936f51e4",
|
||||||
|
"css": "folder-closed",
|
||||||
|
"code": 59402,
|
||||||
|
"src": "fontawesome"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uid": "6533bdc16ab201eb3f3b27ce989cab33",
|
||||||
|
"css": "folder-open",
|
||||||
|
"code": 59401,
|
||||||
|
"src": "fontawesome"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"uid": "c5845105a87df2ee1999826d90622f6a",
|
"uid": "c5845105a87df2ee1999826d90622f6a",
|
||||||
"css": "title",
|
"css": "title",
|
||||||
|
@ -42,6 +54,12 @@
|
||||||
"code": 59395,
|
"code": 59395,
|
||||||
"src": "typicons"
|
"src": "typicons"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"uid": "bd517dbd6ccbc464f6d80efca97abb7d",
|
||||||
|
"css": "media-add",
|
||||||
|
"code": 59400,
|
||||||
|
"src": "typicons"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"uid": "dplw5xo88mzzr7b45nvjcamyyhni6drs",
|
"uid": "dplw5xo88mzzr7b45nvjcamyyhni6drs",
|
||||||
"css": "book",
|
"css": "book",
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'elodie';
|
font-family: 'elodie';
|
||||||
src: url('../font/elodie.eot?4814273');
|
src: url('../font/elodie.eot?43975196');
|
||||||
src: url('../font/elodie.eot?4814273#iefix') format('embedded-opentype'),
|
src: url('../font/elodie.eot?43975196#iefix') format('embedded-opentype'),
|
||||||
url('../font/elodie.woff?4814273') format('woff'),
|
url('../font/elodie.woff?43975196') format('woff'),
|
||||||
url('../font/elodie.ttf?4814273') format('truetype'),
|
url('../font/elodie.ttf?43975196') format('truetype'),
|
||||||
url('../font/elodie.svg?4814273#elodie') format('svg');
|
url('../font/elodie.svg?43975196#elodie') format('svg');
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@
|
||||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'elodie';
|
font-family: 'elodie';
|
||||||
src: url('../font/elodie.svg?4814273#elodie') format('svg');
|
src: url('../font/elodie.svg?43975196#elodie') format('svg');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
@ -62,3 +62,6 @@
|
||||||
.icon-video:before { content: '\e805'; } /* '' */
|
.icon-video:before { content: '\e805'; } /* '' */
|
||||||
.icon-calendar:before { content: '\e806'; } /* '' */
|
.icon-calendar:before { content: '\e806'; } /* '' */
|
||||||
.icon-title:before { content: '\e807'; } /* '' */
|
.icon-title:before { content: '\e807'; } /* '' */
|
||||||
|
.icon-media-add:before { content: '\e808'; } /* '' */
|
||||||
|
.icon-folder-open:before { content: '\e809'; } /* '' */
|
||||||
|
.icon-folder-closed:before { content: '\e80a'; } /* '' */
|
Binary file not shown.
|
@ -14,6 +14,9 @@
|
||||||
<glyph glyph-name="video" unicode="" d="m1000 654v-608q0-23-22-32-7-3-14-3-15 0-25 10l-225 225v-92q0-67-47-114t-113-47h-393q-67 0-114 47t-47 114v392q0 67 47 114t114 47h393q66 0 113-47t47-114v-92l225 225q10 10 25 10 7 0 14-3 22-9 22-32z" horiz-adv-x="1000" />
|
<glyph glyph-name="video" unicode="" d="m1000 654v-608q0-23-22-32-7-3-14-3-15 0-25 10l-225 225v-92q0-67-47-114t-113-47h-393q-67 0-114 47t-47 114v392q0 67 47 114t114 47h393q66 0 113-47t47-114v-92l225 225q10 10 25 10 7 0 14-3 22-9 22-32z" horiz-adv-x="1000" />
|
||||||
<glyph glyph-name="calendar" unicode="" d="m0-150l0 649 893 0 0-649-893 0z m0 705l0 221 109 0 0-141 200 0 0 141 275 0 0-141 199 0 0 141 110 0 0-221-893 0z m168 139l0 156 82 0 0-156-82 0z m59-619q0-112 123-112 47 0 84 32 39 31 39 80 0 68-78 90 48 15 64 48 12 28-2 73-27 62-107 62-51 0-86-26t-37-77l72 0q0 45 49 46 43 0 45-52 0-49-84-47l0-57q48 0 68-8 23-11 23-46 0-57-54-61-43 0-47 55l-72 0z m281 146q49 14 88 47l0-297 70 0 0 371-64 0q-38-37-94-58l0-63z m135 473l0 156 82 0 0-156-82 0z" horiz-adv-x="893" />
|
<glyph glyph-name="calendar" unicode="" d="m0-150l0 649 893 0 0-649-893 0z m0 705l0 221 109 0 0-141 200 0 0 141 275 0 0-141 199 0 0 141 110 0 0-221-893 0z m168 139l0 156 82 0 0-156-82 0z m59-619q0-112 123-112 47 0 84 32 39 31 39 80 0 68-78 90 48 15 64 48 12 28-2 73-27 62-107 62-51 0-86-26t-37-77l72 0q0 45 49 46 43 0 45-52 0-49-84-47l0-57q48 0 68-8 23-11 23-46 0-57-54-61-43 0-47 55l-72 0z m281 146q49 14 88 47l0-297 70 0 0 371-64 0q-38-37-94-58l0-63z m135 473l0 156 82 0 0-156-82 0z" horiz-adv-x="893" />
|
||||||
<glyph glyph-name="title" unicode="" d="m713 745v-41q0-16-10-34t-24-18q-28 0-30-1-15-3-18-17-2-6-2-36v-643q0-14-10-24t-24-10h-60q-14 0-24 10t-10 24v680h-80v-680q0-14-9-24t-25-10h-60q-14 0-24 10t-10 24v277q-82 7-137 33-70 33-107 100-36 65-36 145 0 92 50 159 49 66 116 89 62 21 233 21h267q14 0 24-10t10-24z" horiz-adv-x="714.3" />
|
<glyph glyph-name="title" unicode="" d="m713 745v-41q0-16-10-34t-24-18q-28 0-30-1-15-3-18-17-2-6-2-36v-643q0-14-10-24t-24-10h-60q-14 0-24 10t-10 24v680h-80v-680q0-14-9-24t-25-10h-60q-14 0-24 10t-10 24v277q-82 7-137 33-70 33-107 100-36 65-36 145 0 92 50 159 49 66 116 89 62 21 233 21h267q14 0 24-10t10-24z" horiz-adv-x="714.3" />
|
||||||
|
<glyph glyph-name="media-add" unicode="" d="m573 350q21 0 36-15t16-37-16-36-36-15l-104 0 0-105q0-22-16-37t-37-15-36 15-15 37l0 105-105 0q-21 0-36 15t-15 36 15 37 36 15l105 0 0 104q0 21 15 37t36 16 37-16 16-37l0-104 104 0z m245 245q16-16 16-36l0-521q0-65-46-111t-110-46l-522 0q-65 0-110 46t-46 111l0 625q0 65 46 110t110 46l417 0q22 0 37-15z m-110-36l-135 134 0-56q0-32 23-55t55-23l57 0z m-30-574q21 0 36 16t15 37l0 469-78 0q-53 0-92 38t-38 92l0 78-365 0q-21 0-37-15t-15-37l0-625q0-21 15-37t37-16l522 0z" horiz-adv-x="834" />
|
||||||
|
<glyph glyph-name="folder-open" unicode="" d="m994 330q0 20-30 20h-607q-22 0-48-12t-39-29l-164-203q-11-13-11-22 0-20 30-20h607q22 0 48 13t40 29l164 203q10 12 10 21z m-637 91h429v90q0 22-16 38t-38 15h-321q-23 0-38 16t-16 38v36q0 22-15 38t-38 15h-179q-22 0-38-15t-16-38v-476l143 175q25 30 65 49t78 19z m708-91q0-34-25-66l-165-203q-24-30-65-49t-78-19h-607q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h303q51 0 88-37t37-88v-90h107q30 0 56-13t37-40q8-17 8-38z" horiz-adv-x="1071.4" />
|
||||||
|
<glyph glyph-name="folder-closed" unicode="" d="m857 118v393q0 22-15 38t-38 15h-393q-23 0-38 16t-16 38v36q0 22-15 38t-38 15h-179q-22 0-38-15t-16-38v-536q0-22 16-38t38-16h679q22 0 38 16t15 38z m72 393v-393q0-51-37-88t-88-37h-679q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h375q51 0 88-37t37-88z" horiz-adv-x="928.6" />
|
||||||
</font>
|
</font>
|
||||||
</defs>
|
</defs>
|
||||||
</svg>
|
</svg>
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 5.7 KiB |
Binary file not shown.
Binary file not shown.
|
@ -1,4 +1,4 @@
|
||||||
* {
|
*, body, div {
|
||||||
font-family: 'Lato', 'Helvetica';
|
font-family: 'Lato', 'Helvetica';
|
||||||
font-weight: 300;
|
font-weight: 300;
|
||||||
font-size: 1.1em;
|
font-size: 1.1em;
|
||||||
|
@ -14,15 +14,23 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
.titlebar {
|
.titlebar {
|
||||||
height: 30px;
|
height: 45px;
|
||||||
padding-top:10px;
|
padding-top:10px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background-color: #eee;
|
background-color: #eee;
|
||||||
border-bottom: solid 1.5px #aaa;
|
border-bottom: solid 1.5px #aaa;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
.titlebar a {
|
||||||
|
font-weight: 300;
|
||||||
|
font-size:.9em;
|
||||||
|
float:right;
|
||||||
|
padding-top:3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content, .content-index {
|
||||||
padding: 0 10px 10px 10px;
|
padding: 0 10px 10px 10px;
|
||||||
|
font-size: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content > div {
|
.content > div {
|
||||||
|
@ -30,6 +38,14 @@ body {
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.content > p {
|
||||||
|
padding: 10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content .import-success, .content .import-success a {
|
||||||
|
font-size:.9em;
|
||||||
|
}
|
||||||
|
|
||||||
.status {
|
.status {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
@ -42,17 +58,18 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
.status ul li {
|
.status ul li {
|
||||||
|
font-size:.9em;
|
||||||
padding:0;
|
padding:0;
|
||||||
margin:0 0 10px;
|
margin:0 0 10px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
.status ul li .destination {
|
.status ul li .destination {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
font-size: .75em;
|
font-size: .75em;
|
||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.preview {
|
.preview {
|
||||||
|
@ -94,13 +111,16 @@ i.icon-unhappy {
|
||||||
}
|
}
|
||||||
|
|
||||||
label {
|
label {
|
||||||
|
font-size: .9em;
|
||||||
|
font-weight: 300;
|
||||||
display: block;
|
display: block;
|
||||||
padding-bottom:3px;
|
padding-bottom:3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
input, button {
|
input, button {
|
||||||
font-family: 'Lato', 'Helvetica';
|
font-family: 'Lato', 'Helvetica';
|
||||||
font-size: 1.1em;
|
font-weight: 300;
|
||||||
|
font-size: .9em;
|
||||||
color: #666;
|
color: #666;
|
||||||
border: solid 1px #eee;
|
border: solid 1px #eee;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
|
@ -116,11 +136,23 @@ button:focus {
|
||||||
|
|
||||||
input {
|
input {
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
width: 250px;
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="file"] {
|
||||||
|
height:0px;
|
||||||
|
width:0px;
|
||||||
|
overflow:hidden;
|
||||||
|
display:none;
|
||||||
}
|
}
|
||||||
|
|
||||||
button {
|
button {
|
||||||
|
cursor: pointer;
|
||||||
background-color: #eee;
|
background-color: #eee;
|
||||||
padding: 4px 10px;
|
padding: 4px 10px;
|
||||||
color:
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
small {
|
||||||
|
font-size:.7em;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,35 @@
|
||||||
<html>
|
<html>
|
||||||
|
<head>
|
||||||
|
<script src="js/handlers.js"></script>
|
||||||
|
<link href='https://fonts.googleapis.com/css?family=Lato:400,100,300,100italic,300italic' rel='stylesheet' type='text/css'>
|
||||||
|
<link rel="stylesheet" href="css/bootstrap.css"></script>
|
||||||
|
<link rel="stylesheet" href="css/boilerplate.css"></script>
|
||||||
|
<link rel="stylesheet" href="css/styles.css"></script>
|
||||||
|
<link rel="stylesheet" href="css/fontello/css/animation.css"></script>
|
||||||
|
<link rel="stylesheet" href="css/fontello/css/elodie.css"></script>
|
||||||
|
</head>
|
||||||
<body>
|
<body>
|
||||||
Hi,
|
<div class="titlebar">
|
||||||
Lorem ipsum
|
How can I help you? <em>-- Elodie</em><i></i>
|
||||||
|
<a href="index.html"><i class="icon-media-add"></i></a>
|
||||||
|
</div>
|
||||||
|
<form class="importPhotos" action="" method="post">
|
||||||
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
Let me know where your photos are and where you'd like me to put them as I sort them.
|
||||||
|
</p>
|
||||||
|
<div>
|
||||||
|
<label for="source"><i class="icon-folder-open"></i> Choose the folder your photos are in</label>
|
||||||
|
<input type="text" name="source" id="source" placeholder="Path to your photos folder">
|
||||||
|
<small><em>Hint: Right clicking on your folder in Finder, pressing option and clicking "Copy as Pathname" will put the full path on your clipboard</em></small>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="destination"><i class="icon-folder-closed"></i> Choose a destination folder</label>
|
||||||
|
<input type="text" name="destination" id="destination" placeholder="Path to your photos folder">
|
||||||
|
<button type="submit" class="push">Start Organizing<i></i></button>
|
||||||
|
</div>
|
||||||
|
<div class="import-success"></div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -4,58 +4,102 @@ var __constants__ = {
|
||||||
|
|
||||||
var __process__ = {};
|
var __process__ = {};
|
||||||
|
|
||||||
var ipc = require('ipc');
|
if(typeof(require) === 'function') {
|
||||||
ipc.on('files', function(files) {
|
var ipc = require('ipc');
|
||||||
|
ipc.on('files', function(files) {
|
||||||
__process__.files = files;
|
__process__.files = files;
|
||||||
});
|
});
|
||||||
ipc.on('preview', function(files) {
|
ipc.on('preview', function(files) {
|
||||||
handlers.renderPreview(files)
|
handlers.renderPreview(files);
|
||||||
});
|
});
|
||||||
ipc.on('update-photos-success', function(args) {
|
ipc.on('update-import-success', function(args) {
|
||||||
var response = JSON.parse(args['stdout'])
|
//var response = JSON.parse(args['stdout']);
|
||||||
handlers.setSuccessTitle()
|
handlers.setSuccessTitle();
|
||||||
handlers.removeProgressIcons()
|
handlers.removeProgressIcons();
|
||||||
handlers.updateStatus(response)
|
handlers.addSuccessImportMessage(args);
|
||||||
});
|
});
|
||||||
|
ipc.on('update-photos-success', function(args) {
|
||||||
|
var response = JSON.parse(args['stdout']);
|
||||||
|
handlers.setSuccessTitle();
|
||||||
|
handlers.removeProgressIcons();
|
||||||
|
handlers.updateStatus(response);
|
||||||
|
});
|
||||||
|
|
||||||
function Broadcast() {
|
function Broadcast() {
|
||||||
this.send = function(name, message) {
|
this.send = function(name, message) {
|
||||||
ipc.send(name, message);
|
ipc.send(name, message);
|
||||||
};
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function Handlers() {
|
function Handlers() {
|
||||||
var self = this;
|
var self = this;
|
||||||
var broadcast = new Broadcast();
|
var broadcast = new Broadcast();
|
||||||
this.updatePhotos = function(ev) {
|
this.click = {};
|
||||||
|
this.submit = {};
|
||||||
|
this.change = {};
|
||||||
|
// CHANGE
|
||||||
|
this.change.fileSelected = function(ev) {
|
||||||
|
var el = ev.target,
|
||||||
|
dir = el.value.substr(el.value.lastIndexOf("\\")+1),
|
||||||
|
tgt = document.querySelector(el.dataset.display);
|
||||||
|
tgt.innerHTML = dir;
|
||||||
|
};
|
||||||
|
// CLICK
|
||||||
|
this.click.selectFile = function(ev) {
|
||||||
|
var el = ev.target,
|
||||||
|
tgt = document.querySelector(el.dataset.for);
|
||||||
|
ev.preventDefault();
|
||||||
|
tgt.click();
|
||||||
|
};
|
||||||
|
this.click.launchFinder = function(ev) {
|
||||||
|
var el = ev.target,
|
||||||
|
tgt = el.dataset.path;
|
||||||
|
ev.preventDefault();
|
||||||
|
broadcast.send('launch-finder', tgt);
|
||||||
|
};
|
||||||
|
// SUBMIT
|
||||||
|
this.submit.importPhotos = function(ev) {
|
||||||
var el = ev.target,
|
var el = ev.target,
|
||||||
cls = el.className,
|
cls = el.className,
|
||||||
params;
|
params;
|
||||||
|
ev.preventDefault();
|
||||||
el.getElementsByTagName('i')[0].className = 'icon-spin animate-spin';
|
document.querySelector('button.push i').className = 'icon-spin animate-spin';
|
||||||
|
|
||||||
|
params = {};
|
||||||
|
params['source'] = document.querySelector('input[name="source"]').value
|
||||||
|
params['destination'] = document.querySelector('input[name="destination"]').value
|
||||||
|
broadcast.send('import-photos', params);
|
||||||
|
};
|
||||||
|
this.submit.updatePhotos = function(ev) {
|
||||||
|
var el = ev.target,
|
||||||
|
cls = el.className,
|
||||||
|
params;
|
||||||
|
ev.preventDefault();
|
||||||
|
document.querySelector('button.push i').className = 'icon-spin animate-spin';
|
||||||
|
|
||||||
params = {};
|
params = {};
|
||||||
if(cls.search('add-location') !== -1) {
|
|
||||||
params['location'] = document.querySelector('input[id="location-field"]').value;
|
params['location'] = document.querySelector('input[id="location-field"]').value;
|
||||||
} else if(cls.search('add-datetime') !== -1) {
|
|
||||||
params['datetime'] = document.querySelector('input[id="datetime-field"]').value;
|
params['datetime'] = document.querySelector('input[id="datetime-field"]').value;
|
||||||
} else if(cls.search('add-album') !== -1) {
|
|
||||||
params['album'] = document.querySelector('input[id="album-field"]').value;
|
params['album'] = document.querySelector('input[id="album-field"]').value;
|
||||||
} else if(cls.search('add-title') !== -1) {
|
|
||||||
params['title'] = document.querySelector('input[id="title-field"]').value;
|
params['title'] = document.querySelector('input[id="title-field"]').value;
|
||||||
} else {
|
|
||||||
|
if(params['location'].length === 0 && params['datetime'].length === 0 && params['album'].length === 0 && params['title'].length === 0)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
params['files'] = __process__.files;
|
params['files'] = __process__.files;
|
||||||
broadcast.send('update-photos', params);
|
broadcast.send('update-photos', params);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.addSuccessImportMessage = function(args) {
|
||||||
|
document.querySelector('.import-success').innerHTML = 'Your photos were successfully imported. <a href="#" class="launchFinder" data-path="'+args['destination'] +'">View them here</a>.';
|
||||||
|
};
|
||||||
|
|
||||||
this.dispatch = function(ev) {
|
this.dispatch = function(ev) {
|
||||||
var classes = ev.target.className.split(' ');
|
var classes = ev.target.className.split(' ');
|
||||||
for(i=0; i<classes.length; i++) {
|
for(i=0; i<classes.length; i++) {
|
||||||
if(typeof(self[classes[i]]) !== 'undefined') {
|
if(typeof(self[ev.type][classes[i]]) !== 'undefined') {
|
||||||
self[classes[i]](ev);
|
self[ev.type][classes[i]](ev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -63,35 +107,35 @@ function Handlers() {
|
||||||
this.removeProgressIcons = function() {
|
this.removeProgressIcons = function() {
|
||||||
var els = document.querySelectorAll('i.icon-spin');
|
var els = document.querySelectorAll('i.icon-spin');
|
||||||
for(el in els) {
|
for(el in els) {
|
||||||
els[el].className = ''
|
els[el].className = '';
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
this.renderPreview = function(files) {
|
this.renderPreview = function(files) {
|
||||||
html = '<label>You selected ' + (files.length > 1 ? 'these photos' : 'this photo') + '</label>'
|
html = '<label>You selected ' + (files.length > 1 ? 'these photos' : 'this photo') + '</label>';
|
||||||
for(var i=0; i<files.length && i<16; i++) {
|
for(var i=0; i<files.length && i<16; i++) {
|
||||||
if(files[i].match(/(mov|mp4|3gp|avi)/i) === null) {
|
if(files[i].match(/(mov|mp4|3gp|avi)/i) === null) {
|
||||||
html += '<div class="center-cropped" style="background-image:url(\'file://'+files[i]+'\');" title="'+files[i]+'"></div>'
|
html += '<div class="center-cropped" style="background-image:url(\'file://'+files[i]+'\');" title="'+files[i]+'"></div>';
|
||||||
} else {
|
} else {
|
||||||
html += '<div class="center-cropped video"></div>'
|
html += '<div class="center-cropped video"></div>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(files.length >= 16) {
|
if(files.length >= 16) {
|
||||||
html += '<br>...and ' + (files.length -16) + ' more.'
|
html += '<br>...and ' + (files.length -16) + ' more.';
|
||||||
}
|
}
|
||||||
document.querySelector('.preview').innerHTML = html
|
document.querySelector('.preview').innerHTML = html;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.setSuccessTitle = function() {
|
this.setSuccessTitle = function() {
|
||||||
var el = document.querySelector('.titlebar i').className = 'icon-happy'
|
var el = document.querySelector('.titlebar i').className = 'icon-happy';
|
||||||
};
|
};
|
||||||
|
|
||||||
this.updateStatus = function(response) {
|
this.updateStatus = function(response) {
|
||||||
var el = document.querySelector('.status'),
|
var el = document.querySelector('.status'),
|
||||||
source, destination, html;
|
source, destination, html;
|
||||||
|
|
||||||
console.log('update status')
|
console.log('update status');
|
||||||
console.log(response);
|
console.log(response);;
|
||||||
|
|
||||||
if(response.length > 0) {
|
if(response.length > 0) {
|
||||||
html = '<label>Status</label><ul>';
|
html = '<label>Status</label><ul>';
|
||||||
|
@ -112,4 +156,6 @@ function Handlers() {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
var handlers = new Handlers();
|
var handlers = new Handlers();
|
||||||
document.addEventListener('click', handlers.dispatch);
|
window.addEventListener('click', handlers.dispatch);
|
||||||
|
window.addEventListener('submit', handlers.dispatch);
|
||||||
|
window.addEventListener('change', handlers.dispatch);
|
||||||
|
|
|
@ -2,35 +2,39 @@
|
||||||
<head>
|
<head>
|
||||||
<script src="js/handlers.js"></script>
|
<script src="js/handlers.js"></script>
|
||||||
<link href='https://fonts.googleapis.com/css?family=Lato:400,100,300,100italic,300italic' rel='stylesheet' type='text/css'>
|
<link href='https://fonts.googleapis.com/css?family=Lato:400,100,300,100italic,300italic' rel='stylesheet' type='text/css'>
|
||||||
|
<link rel="stylesheet" href="css/bootstrap.css"></script>
|
||||||
<link rel="stylesheet" href="css/boilerplate.css"></script>
|
<link rel="stylesheet" href="css/boilerplate.css"></script>
|
||||||
<link rel="stylesheet" href="css/styles.css"></script>
|
<link rel="stylesheet" href="css/styles.css"></script>
|
||||||
<link rel="stylesheet" href="css/fontello/css/animation.css"></script>
|
<link rel="stylesheet" href="css/fontello/css/animation.css"></script>
|
||||||
<link rel="stylesheet" href="css/fontello/css/elodie.css"></script>
|
<link rel="stylesheet" href="css/fontello/css/elodie.css"></script>
|
||||||
</head>
|
</head>
|
||||||
<body style="width:100%; height:100%">
|
<body>
|
||||||
<div class="titlebar">
|
<div class="titlebar">
|
||||||
How can I help you? <em>-- Elodie</em><i></i>
|
How can I help you? <em>-- Elodie</em><i></i>
|
||||||
|
<a href="index.html"><i class="icon-media-add"></i></a>
|
||||||
</div>
|
</div>
|
||||||
|
<form class="updatePhotos" action="" method="post">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="location">
|
<div class="location">
|
||||||
<label for="location-field"><i class="icon-map"></i>Change geolocation</label>
|
<label for="location-field"><i class="icon-map"></i>Change geolocation</label>
|
||||||
<input id="location-field" type="text" placeholder="i.e. Sunnyvale, CA">
|
<input id="location-field" type="text" placeholder="i.e. Sunnyvale, CA">
|
||||||
<button class="push add-location updatePhotos">Update<i></i></button>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="datetime">
|
<div class="datetime">
|
||||||
<label for="datetime-field"><i class="icon-calendar"></i>Change date and time</label>
|
<label for="datetime-field"><i class="icon-calendar"></i>Change date and time</label>
|
||||||
<input id="datetime-field" type="text" placeholder="i.e. 2015-07-31">
|
<input id="datetime-field" type="text" placeholder="i.e. 2015-07-31">
|
||||||
<button class="push add-datetime updatePhotos">Update<i></i></button>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<label for="title-field"><i class="icon-title"></i>Change title</label>
|
<label for="title-field"><i class="icon-title"></i>Change title</label>
|
||||||
<input id="title-field" type="text" placeholder="i.e. Elodie smiling at dinner">
|
<input id="title-field" type="text" placeholder="i.e. Elodie smiling at dinner">
|
||||||
<button class="push add-title updatePhotos">Update<i></i></button>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="album">
|
<div class="album">
|
||||||
<label for="album-field"><i class="icon-book"></i>Create album</label>
|
<label for="album-field"><i class="icon-book"></i>Create album</label>
|
||||||
<input id="album-field" type="text" placeholder="i.e. Elodie's Birthday Party">
|
<input id="album-field" type="text" placeholder="i.e. Elodie's Birthday Party">
|
||||||
<button class="push add-album updatePhotos">Update<i></i></button>
|
<button class="push" type="submit">Update<i></i></button>
|
||||||
|
<!--<button class="push add-location updatePhotos">Update Photos<i></i></button>
|
||||||
|
<button class="push add-datetime updatePhotos">Update<i></i></button>
|
||||||
|
<button class="push add-title updatePhotos">Update<i></i></button>
|
||||||
|
<button class="push add-album updatePhotos">Update<i></i></button>-->
|
||||||
</div>
|
</div>
|
||||||
<div class="status">
|
<div class="status">
|
||||||
<!--<ul>
|
<!--<ul>
|
||||||
|
@ -55,6 +59,7 @@
|
||||||
<div class="center-cropped" style="background-image:url('file:///Users/jaisenmathai/Downloads/media/2015-10-Oct/Sunnyvale/2015-10-17_01-03-50-img_6365.jpg');"></div>-->
|
<div class="center-cropped" style="background-image:url('file:///Users/jaisenmathai/Downloads/media/2015-10-Oct/Sunnyvale/2015-10-17_01-03-50-img_6365.jpg');"></div>-->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</form>
|
||||||
<script>
|
<script>
|
||||||
document.getElementById('location-field').focus();
|
document.getElementById('location-field').focus();
|
||||||
</script>
|
</script>
|
||||||
|
|
77
app/index.js
77
app/index.js
|
@ -7,16 +7,50 @@ var menubar = require('menubar'),
|
||||||
* The main process listens for events from the web renderer.
|
* The main process listens for events from the web renderer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// When photos are dragged onto the toolbar and photos are requested to be updated it will fire an 'update-photos' ipc event.
|
||||||
|
// The web renderer will send the list of photos, type of update and new value to apply
|
||||||
|
// Once this main process completes the update it will send a 'update-photos-completed' event back to the renderer with information
|
||||||
|
// so a proper response can be displayed.
|
||||||
|
ipc.on('import-photos', function(event, args) {
|
||||||
|
var params = args,
|
||||||
|
normalize;
|
||||||
|
|
||||||
|
console.log('import-photos');
|
||||||
|
console.log(args);
|
||||||
|
if(typeof(args['source']) === 'undefined' || args['source'].length === 0 || typeof(args['destination']) === 'undefined' || args['destination'].length === 0) {
|
||||||
|
console.log('no source or destination passed in to import-photos');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = __dirname + '/../elodie.py import --source="' + args['source'] + '" --destination="' + args['destination'] + '"';
|
||||||
|
|
||||||
|
console.log(update_command)
|
||||||
|
exec(update_command, function(error, stdout, stderr) {
|
||||||
|
console.log('out ' + stdout)
|
||||||
|
console.log('err ' + stderr)
|
||||||
|
/*params['error'] = error
|
||||||
|
params['stdout'] = '[' + stdout.replace(/\n/g,',').replace(/\,+$/g, '').replace(/\n/g,'') + ']'
|
||||||
|
params['stderr'] = stderr
|
||||||
|
console.log('parsed')
|
||||||
|
console.log(params['stdout'])*/
|
||||||
|
event.sender.send('update-import-success', args);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// When photos are dragged onto the toolbar and photos are requested to be updated it will fire an 'update-photos' ipc event.
|
// When photos are dragged onto the toolbar and photos are requested to be updated it will fire an 'update-photos' ipc event.
|
||||||
// The web renderer will send the list of photos, type of update and new value to apply
|
// The web renderer will send the list of photos, type of update and new value to apply
|
||||||
// Once this main process completes the update it will send a 'update-photos-completed' event back to the renderer with information
|
// Once this main process completes the update it will send a 'update-photos-completed' event back to the renderer with information
|
||||||
// so a proper response can be displayed.
|
// so a proper response can be displayed.
|
||||||
ipc.on('update-photos', function(event, args) {
|
ipc.on('update-photos', function(event, args) {
|
||||||
var params = args,
|
var params = args,
|
||||||
normalize
|
normalize;
|
||||||
|
|
||||||
console.log('update-photos')
|
console.log('update-photos');
|
||||||
console.log(args)
|
console.log(args);
|
||||||
if(typeof(args['files']) === 'undefined' || args['files'].length === 0) {
|
if(typeof(args['files']) === 'undefined' || args['files'].length === 0) {
|
||||||
console.log('no files passed in to update-photos');
|
console.log('no files passed in to update-photos');
|
||||||
return;
|
return;
|
||||||
|
@ -32,36 +66,46 @@ ipc.on('update-photos', function(event, args) {
|
||||||
|
|
||||||
update_command = __dirname + '/../dist/elodie/elodie update'
|
update_command = __dirname + '/../dist/elodie/elodie update'
|
||||||
//update_command = __dirname + '/../elodie.py update'
|
//update_command = __dirname + '/../elodie.py update'
|
||||||
if(typeof(args['location']) !== 'undefined') {
|
if(args['location'].length > 0) {
|
||||||
update_command += ' --location="' + args['location'] + '" "' + files.join('" "') + '"';
|
update_command += ' --location="' + args['location'] + '"';
|
||||||
} else if(typeof(args['album']) !== 'undefined') {
|
|
||||||
update_command += ' --album="' + args['album'] + '" "' + files.join('" "') + '"';
|
|
||||||
} else if(typeof(args['datetime']) !== 'undefined') {
|
|
||||||
update_command += ' --time="' + args['datetime'] + '" "' + files.join('" "') + '"';
|
|
||||||
} else if(typeof(args['title']) !== 'undefined') {
|
|
||||||
update_command += ' --title="' + args['title'] + '" "' + files.join('" "') + '"';
|
|
||||||
} else {
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
if(args['album'].length > 0) {
|
||||||
|
update_command += ' --album="' + args['album'] + '"';
|
||||||
|
}
|
||||||
|
if(args['datetime'].length > 0) {
|
||||||
|
update_command += ' --time="' + args['datetime'] + '"';
|
||||||
|
}
|
||||||
|
if(args['title'].length > 0) {
|
||||||
|
update_command += ' --title="' + args['title'] + '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
update_command += ' "' + files.join('" "') + '"'
|
||||||
|
|
||||||
console.log(update_command)
|
console.log(update_command)
|
||||||
exec(update_command, function(error, stdout, stderr) {
|
exec(update_command, function(error, stdout, stderr) {
|
||||||
console.log('out ' + stdout)
|
console.log('out ' + stdout)
|
||||||
console.log('err ' + stderr)
|
console.log('err ' + stderr)
|
||||||
params['error'] = error
|
params['error'] = error
|
||||||
params['stdout'] = '[' + stdout.replace("\n",',').replace(/\,+$/, '').replace("\n",'') + ']'
|
params['stdout'] = '[' + stdout.replace(/\n/g,',').replace(/\,+$/g, '').replace(/\n/g,'') + ']'
|
||||||
params['stderr'] = stderr
|
params['stderr'] = stderr
|
||||||
console.log('parsed')
|
console.log('parsed')
|
||||||
console.log(params['stdout'])
|
console.log(params['stdout'])
|
||||||
event.sender.send('update-photos-success', params);
|
event.sender.send('update-photos-success', params);
|
||||||
});
|
});
|
||||||
})
|
});
|
||||||
|
|
||||||
|
|
||||||
|
ipc.on('launch-finder', function(event, path) {
|
||||||
|
console.log(path);
|
||||||
|
var shell = require('shell');
|
||||||
|
shell.showItemInFolder(path);
|
||||||
|
});
|
||||||
|
|
||||||
var mb = menubar(
|
var mb = menubar(
|
||||||
{
|
{
|
||||||
preloadWindow: true,
|
preloadWindow: true,
|
||||||
dir: __dirname + '/html',
|
dir: __dirname + '/html',
|
||||||
index: 'location.html',
|
index: 'index.html',
|
||||||
pages: {
|
pages: {
|
||||||
'location': 'location.html'
|
'location': 'location.html'
|
||||||
},
|
},
|
||||||
|
@ -97,6 +141,7 @@ mb.on('after-create-window', function afterCreateWindow () {
|
||||||
})
|
})
|
||||||
|
|
||||||
mb.on('show', function show () {
|
mb.on('show', function show () {
|
||||||
|
//this.window.openDevTools();
|
||||||
this.window.loadUrl('file://' + this.getOption('dir') + '/' + this.getOption('index'))
|
this.window.loadUrl('file://' + this.getOption('dir') + '/' + this.getOption('index'))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -33,12 +33,12 @@ def _import(params):
|
||||||
if(params['--source'] is not None):
|
if(params['--source'] is not None):
|
||||||
source = params['--source']
|
source = params['--source']
|
||||||
|
|
||||||
for current_file in filesystem.get_all_files(source, media_type.get_valid_extensions()):
|
for current_file in filesystem.get_all_files(source, None):
|
||||||
media = Media.get_class_by_file(current_file, [Photo, Video])
|
media = Media.get_class_by_file(current_file, [Photo, Video])
|
||||||
if(media is None):
|
if(media is None):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if(media_type.__name__ == 'Video'):
|
if(type(media).__name__ == 'Video'):
|
||||||
filesystem.set_date_from_path_video(media)
|
filesystem.set_date_from_path_video(media)
|
||||||
|
|
||||||
dest_path = filesystem.process_file(current_file, destination, media, allowDuplicate=False, move=False)
|
dest_path = filesystem.process_file(current_file, destination, media, allowDuplicate=False, move=False)
|
||||||
|
|
|
@ -85,6 +85,7 @@ class FileSystem:
|
||||||
base_name = metadata['base_name']
|
base_name = metadata['base_name']
|
||||||
if('title' in metadata and metadata['title'] is not None and len(metadata['title']) > 0):
|
if('title' in metadata and metadata['title'] is not None and len(metadata['title']) > 0):
|
||||||
title_sanitized = re.sub('\W+', '-', metadata['title'].strip())
|
title_sanitized = re.sub('\W+', '-', metadata['title'].strip())
|
||||||
|
base_name = base_name.replace('-%s' % title_sanitized, '')
|
||||||
base_name = '%s-%s' % (base_name, title_sanitized)
|
base_name = '%s-%s' % (base_name, title_sanitized)
|
||||||
|
|
||||||
file_name = '%s-%s.%s' % (time.strftime('%Y-%m-%d_%H-%M-%S', metadata['date_taken']), base_name, metadata['extension'])
|
file_name = '%s-%s.%s' % (time.strftime('%Y-%m-%d_%H-%M-%S', metadata['date_taken']), base_name, metadata['extension'])
|
||||||
|
|
Loading…
Reference in New Issue