summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2011-05-06 22:48:09 -0400
committerJason A. Donenfeld <Jason@zx2c4.com>2011-05-06 22:48:09 -0400
commit8bd9d1519eee62660c395333a764a5d7443b85e2 (patch)
treecb505b1eb95f0731ecbcb1e248f65406b31aabaa
parentPolishing... (diff)
downloadPhotoFloat-8bd9d1519eee62660c395333a764a5d7443b85e2.tar.xz
PhotoFloat-8bd9d1519eee62660c395333a764a5d7443b85e2.zip
LIl things.
-rw-r--r--scanner/CachePath.py2
-rw-r--r--scanner/PhotoAlbum.py20
-rw-r--r--scanner/TreeWalker.py33
-rw-r--r--web/css/000-controls.css38
-rw-r--r--web/index.html16
-rw-r--r--web/js/010-control.js20
-rw-r--r--web/redirect.php8
7 files changed, 109 insertions, 28 deletions
diff --git a/scanner/CachePath.py b/scanner/CachePath.py
index 0d3032b..89fc20e 100644
--- a/scanner/CachePath.py
+++ b/scanner/CachePath.py
@@ -14,7 +14,7 @@ def trim_base_custom(path, base):
def trim_base(path):
return trim_base_custom(path, trim_base.base)
def cache_base(path):
- path = trim_base(path).replace('/', '-').replace(' ', '_').replace('(', '').replace(')', '').replace('#', '').replace('[', '').replace(']', '').replace('"', '').replace("'", '').replace('_-_', '-').lower()
+ path = trim_base(path).replace('/', '-').replace(' ', '_').replace('(', '').replace('&', '').replace(',', '').replace(')', '').replace('#', '').replace('[', '').replace(']', '').replace('"', '').replace("'", '').replace('_-_', '-').lower()
while path.find("--") != -1:
path = path.replace("--", "-")
while path.find("__") != -1:
diff --git a/scanner/PhotoAlbum.py b/scanner/PhotoAlbum.py
index 18cd425..50216c9 100644
--- a/scanner/PhotoAlbum.py
+++ b/scanner/PhotoAlbum.py
@@ -52,6 +52,17 @@ class Album(object):
if not self._albums_sorted:
self._albums.sort()
self._albums_sorted = True
+ @property
+ def empty(self):
+ if len(self._photos) != 0:
+ return False
+ if len(self._albums) == 0:
+ return True
+ for album in self._albums:
+ if not album.empty:
+ return False
+ return True
+
def cache(self, base_dir):
self._sort()
fp = open(os.path.join(base_dir, self.cache_path), 'w')
@@ -75,10 +86,15 @@ class Album(object):
return album
def to_dict(self, cripple=True):
self._sort()
+ subalbums = []
if cripple:
- subalbums = [ { "path": trim_base_custom(sub.path, self._path), "date": sub.date } for sub in self._albums ]
+ for sub in self._albums:
+ if not sub.empty:
+ subalbums.append({ "path": trim_base_custom(sub.path, self._path), "date": sub.date })
else:
- subalbums = self._albums
+ for sub in self._albums:
+ if not sub.empty:
+ subalbums.append(sub)
return { "path": self.path, "date": self.date, "albums": subalbums, "photos": self._photos }
def photo_from_path(self, path):
for photo in self._photos:
diff --git a/scanner/TreeWalker.py b/scanner/TreeWalker.py
index 96ca5e5..872b830 100644
--- a/scanner/TreeWalker.py
+++ b/scanner/TreeWalker.py
@@ -49,9 +49,12 @@ class TreeWalker:
if photo.is_valid:
self.all_photos.append(photo)
album.add_photo(photo)
- print "Writing cache of %s" % album.cache_path
- album.cache(self.cache_path)
- self.all_albums.append(album)
+ if not album.empty:
+ print "Writing cache of %s" % album.cache_path
+ album.cache(self.cache_path)
+ self.all_albums.append(album)
+ else:
+ print "Not writing cache of %s because it's empty" % album.cache_path
return album
def big_lists(self):
photo_list = []
@@ -69,19 +72,15 @@ class TreeWalker:
fp.close()
def remove_stale(self):
- print "Removing stale cache entries."
+ print "Building list of all cache entries."
+ all_cache_entries = { "all_photos.json": True, "latest_photos.json": True }
+ for album in self.all_albums:
+ all_cache_entries[album.cache_path] = True
+ for photo in self.all_photos:
+ for entry in photo.image_caches:
+ all_cache_entries[entry] = True
+ print "Searching stale cache entries."
for cache in os.listdir(self.cache_path):
- match = False
- for album in self.all_albums:
- if cache == album.cache_path:
- match = True
- break
- if match:
- continue
- for photo in self.all_photos:
- if cache in photo.image_caches:
- match = True
- break
- if not match:
+ if cache not in all_cache_entries:
print "Removing stale cache %s" % cache
- os.unlink(os.path.join(self.cache_path, cache)) \ No newline at end of file
+ os.unlink(os.path.join(self.cache_path, cache))
diff --git a/web/css/000-controls.css b/web/css/000-controls.css
index 30ae0a1..3c3d986 100644
--- a/web/css/000-controls.css
+++ b/web/css/000-controls.css
@@ -17,7 +17,7 @@ a:hover {
top: 0;
padding: 0.4em;
font-weight: bold;
- font-size: 1.2em;
+ font-size: 1.15em;
}
#loading {
display: none;
@@ -82,6 +82,33 @@ a:hover {
right: 0;
text-align: center;
}
+#photo-box {
+ display: inline;
+}
+#photo-links {
+ background-color: #000000;
+ font-weight: bold;
+ height: 10px;
+ font-size: 10px;
+ line-height: 7px;
+ padding-top: 3px;
+ padding-bottom: 3px;
+ padding-right: 10px;
+ padding-left: 10px;
+ display: none;
+ border-top-right-radius: 5px;
+ border-top-left-radius: 5px;
+ -moz-border-top-right-radius: 5px;
+ -moz-border-top-left-radius: 5px;
+ -webkit-border-top-right-radius: 5px;
+ -webkit-border-top-left-radius: 5px;
+}
+#photo-bar {
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ text-align: center;
+}
.photo-view-container {
position: absolute;
height: 150px;
@@ -94,3 +121,12 @@ a:hover {
padding: 0 !important;
text-align: center;
}
+
+#error {
+ display: none;
+ text-align: center;
+ padding-top: 20%;
+ font-size: 4em;
+ font-weight: bold;
+ font-style: italic;
+}
diff --git a/web/index.html b/web/index.html
index c96bfaa..4326185 100644
--- a/web/index.html
+++ b/web/index.html
@@ -3,12 +3,12 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
- <title>JasonDonenfeld.com &#8211; Colors</title>
+ <title>JasonDonenfeld.com &#8211; Photos</title>
<link href="css/styles.min.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/scripts.min.js"></script>
</head>
<body>
-<div id="title">Colors</div>
+<div id="title">Photos</div>
<div id="album-view">
<div id="thumbs">
<div id="loading">Loading...</div>
@@ -16,10 +16,20 @@
<div id="subalbums"></div>
</div>
<div id="photo-view">
- <a id="next-photo"><img id="photo" /></a>
+ <div id="photo-box">
+ <a id="next-photo"><img id="photo" /></a>
+ <div id="photo-bar">
+ <div id="photo-links">
+ <a id="metadata-link">metadata</a> | <a id="original-link" target="_blank">download original</a>
+ </div>
+ </div>
+ </div>
+
<a id="back">&larr;</a>
<a id="next">&rarr;</a>
</div>
+<div id="error">Forgot my camera...</div>
+
</body>
</html>
diff --git a/web/js/010-control.js b/web/js/010-control.js
index ab3a410..d41d41d 100644
--- a/web/js/010-control.js
+++ b/web/js/010-control.js
@@ -10,6 +10,8 @@ $(document).ready(function() {
.replace(/\(/g, "")
.replace(/\)/g, "")
.replace(/#/g, "")
+ .replace(/&/g, "")
+ .replace(/,/g, "")
.replace(/\[/g, "")
.replace(/\]/g, "")
.replace(/"/g, "")
@@ -42,7 +44,7 @@ $(document).ready(function() {
$.ajax({
type: "GET",
url: "cache/" + current_album_cache + ".json",
- error: function() { $(document.body).html("Couldn't fetch it."); },
+ error: die,
success: albumLoaded
});
}
@@ -147,6 +149,8 @@ $(document).ready(function() {
$("#back").attr("href", "#" + current_album_cache + "/" + cachePath(current_album.photos[
(current_photo_index - 1 < 0) ? (current_album.photos.length - 1) : (current_photo_index - 1)
].name));
+ $("#original-link").attr("target", "_blank").attr("href", "albums/" + current_album.path + "/" + current_photo.name);
+ $("#metadata-link").attr("href", "javascript:alert('Coming soon...')");
$("#album-view").addClass("photo-view-container");
$("#subalbums").hide();
@@ -188,13 +192,19 @@ $(document).ready(function() {
$.ajax({
type: "GET",
url: "cache/" + album + ".json",
- error: function() { $(document.body).html("Couldn't fetch it."); },
+ error: die,
success: callback
});
}
function albumThumbFinder(album, callback) {
fetchAlbumForThumb(album, function(fetchedAlbum) { albumForThumbIteration(fetchedAlbum, callback); });
}
+ function die() {
+ $("#album-view").hide();
+ $("#photo-view").hide();
+ $("#title").hide();
+ $("#error").fadeIn(5000);
+ }
var current_album_cache = null;
var current_photo_cache = null;
@@ -237,4 +247,10 @@ $(document).ready(function() {
}
return true;
});
+ $("#photo-box").mouseenter(function() {
+ $("#photo-links").stop().fadeTo("slow", 0.50).css("display", "inline");
+ });
+ $("#photo-box").mouseleave(function() {
+ $("#photo-links").stop().fadeOut("slow");
+ });
});
diff --git a/web/redirect.php b/web/redirect.php
index d291fb6..06a2561 100644
--- a/web/redirect.php
+++ b/web/redirect.php
@@ -4,7 +4,7 @@ function cachePath($path) {
$path = substr($path, 1);
if ($path[strlen($path) - 1] == '/')
$path = substr($path, 0, strlen($path) - 1);
- $path = str_replace('_-_', '-', str_replace('/', '-', str_replace(' ', '_', str_replace('(', '', str_replace(')', '', str_replace('#', '', str_replace('[', '', str_replace(']', '', str_replace('"', '', str_replace("'", '', strtolower($path)))))))))));
+ $path = str_replace('_-_', '-', str_replace('/', '-', str_replace(' ', '_', str_replace('(', '', str_replace(')', '', str_replace('#', '', str_replace('[', '', str_replace(']', '', str_replace('&', '', str_replace(',', '', str_replace('"', '', str_replace("'", '', strtolower($path)))))))))))));
while (strpos($path, "--") !== false)
$path = str_replace("--", "-", $path);
while (strpos($path, "__") !== false)
@@ -23,9 +23,13 @@ if (strpos(strtolower($url), ".php") == strlen($url) - 4) {
$url = substr($url, 0, strlen($url) - 4);
$index = strrpos($url, "/");
$redirect = "/#".cachePath(substr($url, 0, $index))."/".cachePath(substr($url, $index));
+} else if (strpos($url, "/cache/") === 0 || strpos($url, "/albums/") === 0 || strpos($url, "/img/") === 0 || strpos($url, "/img/") === 0 || strpos($url, "/js/") === 0 || strpos($url, "/css/") === 0) {
+ header("HTTP/1.1 404 Not Found");
+ exit();
} else
$redirect = "/#".cachePath($url);
-
+
+header("HTTP/1.1 301 Moved Permanently");
header("Location: $redirect");
?> \ No newline at end of file