Merge pull request #77 from Psycojoker/python3

add Python3 compatibility
This commit is contained in:
abeudin 2017-07-14 14:15:42 +02:00 committed by GitHub
commit 9dedb37445
8 changed files with 99 additions and 54 deletions

View File

@ -1,6 +1,11 @@
Changelog Changelog
========= =========
0.6
* Compatibility python 2 and 3
* Possibility to add custom css and js
0.5 (2017-06-04) 0.5 (2017-06-04)
* Add audio HTML5 player https://prosopopee.readthedocs.org/en/latest/sections.html#audio by beudbeud * Add audio HTML5 player https://prosopopee.readthedocs.org/en/latest/sections.html#audio by beudbeud

24
docs/theme.rst Normal file
View File

@ -0,0 +1,24 @@
Theming
=======
Custom css and js
-----------------
You can add easily css code and js code. You need create custom.css or custom.js
in root directory.
Override template
-----------------
If you wanna override template, you need create a "templates" directory and create your own template.
* home page : index.html
* gallery page: gallery-index.html
And for override sections you need create file in "templates/sections".
Create theme
------------
TODO

View File

@ -33,7 +33,7 @@ class Cache(object):
self.cache = {"version": CACHE_VERSION} self.cache = {"version": CACHE_VERSION}
if "version" not in self.cache or self.cache["version"] != CACHE_VERSION: if "version" not in self.cache or self.cache["version"] != CACHE_VERSION:
print "info: cache format as changed, prune cache" print("info: cache format as changed, prune cache")
self.cache = {"version": CACHE_VERSION} self.cache = {"version": CACHE_VERSION}
def needs_to_be_generated(self, source, target, options): def needs_to_be_generated(self, source, target, options):
@ -53,8 +53,7 @@ class Cache(object):
def cache_picture(self, source, target, options): def cache_picture(self, source, target, options):
self.cache[target] = {"size": os.path.getsize(source), "options": remove_superficial_options(options)} self.cache[target] = {"size": os.path.getsize(source), "options": remove_superficial_options(options)}
def __del__(self): def cache_dump(self):
self.json.dump(self.cache, open(self.cache_file_path, "w")) self.json.dump(self.cache, open(self.cache_file_path, "w"))
CACHE = Cache(json=json) CACHE = Cache(json=json)

View File

@ -13,15 +13,14 @@ Options:
""" """
import os import os
import yaml
import shutil import shutil
import socketserver
import http.server
import ruamel.yaml as yaml
#import yaml
from docopt import docopt from docopt import docopt
import SocketServer
import SimpleHTTPServer
import subprocess
from path import Path from path import Path
from jinja2 import Environment, FileSystemLoader from jinja2 import Environment, FileSystemLoader
@ -94,18 +93,18 @@ class Video(object):
return return
ffmpeg_switches = { ffmpeg_switches = {
"source": source, "source": source,
"target": target, "target": target,
"loglevel": "-loglevel %s" % options["loglevel"], "loglevel": "-loglevel %s" % options["loglevel"],
"resolution": "-s %s" % options["resolution"], "resolution": "-s %s" % options["resolution"],
"resize": "-vf scale=-1:%s" % options.get("resize"), "resize": "-vf scale=-1:%s" % options.get("resize"),
"vbitrate": "-b:v %s" % options["vbitrate"], "vbitrate": "-b:v %s" % options["vbitrate"],
"abitrate": "-b:v %s" % options["abitrate"], "abitrate": "-b:v %s" % options["abitrate"],
"format": "-f %s" % options["format"], "format": "-f %s" % options["format"],
"binary": "%s" % options["binary"], "binary": "%s" % options["binary"],
"video": "-c:v %s" % options["video"], "video": "-c:v %s" % options["video"],
"audio": "-c:a %s" % options["audio"], "audio": "-c:a %s" % options["audio"],
"other": "%s" % options["other"] "other": "%s" % options["other"]
} }
warning("Generation", source) warning("Generation", source)
@ -168,11 +167,11 @@ class Audio(object):
return return
ffmpeg_switches = { ffmpeg_switches = {
"source": source, "source": source,
"target": target, "target": target,
"binary": "%s" % options["binary"], "binary": "%s" % options["binary"],
"loglevel": "-loglevel %s" % options["loglevel"], "loglevel": "-loglevel %s" % options["loglevel"],
"audio": "-c:a %s" % options["audio"] "audio": "-c:a %s" % options["audio"]
} }
warning("Generation", source) warning("Generation", source)
@ -215,13 +214,13 @@ class Image(object):
return return
gm_switches = { gm_switches = {
"source": source, "source": source,
"target": target, "target": target,
"auto-orient": "-auto-orient" if options["auto-orient"] else "", "auto-orient": "-auto-orient" if options["auto-orient"] else "",
"strip": "-strip" if options["strip"] else "", "strip": "-strip" if options["strip"] else "",
"quality": "-quality %s" % options["quality"] if "quality" in options else "-define jpeg:preserve-settings", "quality": "-quality %s" % options["quality"] if "quality" in options else "-define jpeg:preserve-settings",
"resize": "-resize %s" % options["resize"] if options.get("resize", None) is not None else "", "resize": "-resize %s" % options["resize"] if options.get("resize", None) is not None else "",
"progressive": "-interlace Line" if options.get("progressive", None) is True else "" "progressive": "-interlace Line" if options.get("progressive", None) is True else ""
} }
command = "gm convert '{source}' {auto-orient} {strip} {progressive} {quality} {resize} '{target}'".format(**gm_switches) command = "gm convert '{source}' {auto-orient} {strip} {progressive} {quality} {resize} '{target}'".format(**gm_switches)
@ -244,7 +243,7 @@ class Image(object):
if not options["auto-orient"] and not options["strip"]: if not options["auto-orient"] and not options["strip"]:
shutil.copyfile(source, target) shutil.copyfile(source, target)
print("%s%s%s" % (source, "->", target)) print(("%s%s%s" % (source, "->", target)))
else: else:
# Do not consider quality settings here, since we aim to copy the input image # Do not consider quality settings here, since we aim to copy the input image
# better to preserve input encoding setting # better to preserve input encoding setting
@ -275,20 +274,20 @@ def get_settings():
try: try:
settings = yaml.safe_load(open("settings.yaml", "r")) settings = yaml.safe_load(open("settings.yaml", "r"))
except yaml.YAMLError, exc: except yaml.YAMLError as exc:
if hasattr(exc, 'problem_mark'): if hasattr(exc, 'problem_mark'):
mark = exc.problem_mark mark = exc.problem_mark
error(False, "There are something wrong in settings.yaml line %s" % (mark.line+1)) error(False, "There are something wrong in settings.yaml line %s" % (mark.line))
else: else:
erro(False, "There are omething wrong in settings.yaml") error(False, "There are omething wrong in settings.yaml")
error(isinstance(settings, dict), "Your settings.yaml should be a dict") error(isinstance(settings, dict), "Your settings.yaml should be a dict")
for key, value in DEFAULTS.items(): for key, value in list(DEFAULTS.items()):
if key not in settings: if key not in settings:
settings[key] = value settings[key] = value
for key, value in SETTINGS.items(): for key, value in list(SETTINGS.items()):
if key not in settings: if key not in settings:
settings[key] = value settings[key] = value
@ -366,12 +365,12 @@ def process_directory(gallery_name, settings, parent_templates, parent_gallery_p
try: try:
gallery_settings = yaml.safe_load(open(Path(".").joinpath(gallery_path, "settings.yaml").abspath(), "r")) gallery_settings = yaml.safe_load(open(Path(".").joinpath(gallery_path, "settings.yaml").abspath(), "r"))
except yaml.YAMLError, exc: except yaml.YAMLError as exc:
if hasattr(exc, 'problem_mark'): if hasattr(exc, 'problem_mark'):
mark = exc.problem_mark mark = exc.problem_mark
error(False, "There are something wrong in %s/settings.yaml line %s" % (gallery_path, mark.line+1)) error(False, "There are something wrong in %s/settings.yaml line %s" % (gallery_path, mark.line))
else: else:
erro(False, "There are omething wrong in %s/settings.yaml" % (gallery_path)) error(False, "There are something wrong in %s/settings.yaml" % (gallery_path))
error(isinstance(gallery_settings, dict), "Your %s should be a dict" % gallery_name.joinpath("settings.yaml")) error(isinstance(gallery_settings, dict), "Your %s should be a dict" % gallery_name.joinpath("settings.yaml"))
error(gallery_settings.get("title"), "You should specify a title in %s" % gallery_name.joinpath("settings.yaml")) error(gallery_settings.get("title"), "You should specify a title in %s" % gallery_name.joinpath("settings.yaml"))
@ -472,7 +471,7 @@ def build_gallery(settings, gallery_settings, gallery_path, template):
name=gallery_path.split('/', 1)[-1] name=gallery_path.split('/', 1)[-1]
).encode("Utf-8") ).encode("Utf-8")
open(Path("build").joinpath(gallery_path, "index.html"), "w").write(html) open(Path("build").joinpath(gallery_path, "index.html"), "wb").write(html)
# XXX shouldn't this be a call to build_gallery? # XXX shouldn't this be a call to build_gallery?
# Build light mode gallery # Build light mode gallery
@ -507,13 +506,13 @@ def build_gallery(settings, gallery_settings, gallery_path, template):
name=gallery_path.split('/', 1)[-1] name=gallery_path.split('/', 1)[-1]
).encode("Utf-8") ).encode("Utf-8")
open(Path("build").joinpath(gallery_light_path, "index.html"), "w").write(html) open(Path("build").joinpath(gallery_light_path, "index.html"), "wb").write(html)
def build_index(settings, galleries_cover, templates, gallery_path='', sub_index=False): def build_index(settings, galleries_cover, templates, gallery_path='', sub_index=False):
index_template = templates.get_template("index.html") index_template = templates.get_template("index.html")
galleries_cover = reversed(sorted(filter(lambda x: x != {}, galleries_cover), key=lambda x: x["date"])) galleries_cover = reversed(sorted([x for x in galleries_cover if x != {}], key=lambda x: x["date"]))
# this should probably be a factory # this should probably be a factory
Image.base_dir = Path(".").joinpath(gallery_path) Image.base_dir = Path(".").joinpath(gallery_path)
@ -530,7 +529,7 @@ def build_index(settings, galleries_cover, templates, gallery_path='', sub_index
Video=Video Video=Video
).encode("Utf-8") ).encode("Utf-8")
open(Path("build").joinpath(gallery_path, "index.html"), "w").write(html) open(Path("build").joinpath(gallery_path, "index.html"), "wb").write(html)
def main(): def main():
@ -549,11 +548,10 @@ def main():
error(Path("build").exists(), "Please build the website before launch preview") error(Path("build").exists(), "Please build the website before launch preview")
os.chdir('build') os.chdir('build')
handler = http.server.SimpleHTTPRequestHandler
httpd = socketserver.TCPServer(("", 9000), handler)
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler print('Start server on http://localhost:9000')
httpd = SocketServer.TCPServer(("", 9000), Handler)
print "Start server on http://localhost:9000"
# gracefully handle interrupt here # gracefully handle interrupt here
httpd.serve_forever() httpd.serve_forever()
@ -561,7 +559,7 @@ def main():
error(os.system("which rsync > /dev/null") == 0, "I can't locate the rsync, " error(os.system("which rsync > /dev/null") == 0, "I can't locate the rsync, "
"please install the 'rsync' package.\n") "please install the 'rsync' package.\n")
error(Path("build").exists(), "Please build the website before launch deployment") error(Path("build").exists(), "Please build the website before launch deployment")
r_dest = settings["settings"]["deploy"]["dest"] r_dest = settings["settings"]["deploy"]["dest"]
if settings["settings"]["deploy"]["others"]: if settings["settings"]["deploy"]["others"]:
r_others = settings["settings"]["deploy"]["others"] r_others = settings["settings"]["deploy"]["others"]
@ -581,6 +579,14 @@ def main():
templates = get_gallery_templates(theme) templates = get_gallery_templates(theme)
templates.add_extension('jinja2.ext.with_') templates.add_extension('jinja2.ext.with_')
if Path("custom.js").exists():
shutil.copy(Path("custom.js"), Path(".").joinpath("build", "", "static", "js"))
settings["custom_js"] = True
if Path("custom.css").exists():
shutil.copy(Path("custom.css"), Path(".").joinpath("build", "", "static", "css"))
settings["custom_css"] = True
for gallery in galleries_dirs: for gallery in galleries_dirs:
front_page_galleries_cover.append(process_directory(gallery, settings, templates)) front_page_galleries_cover.append(process_directory(gallery, settings, templates))
@ -589,12 +595,13 @@ def main():
xml = feed_template.render( xml = feed_template.render(
settings=settings, settings=settings,
galleries=reversed(sorted(filter(lambda x: x != {}, front_page_galleries_cover), key=lambda x: x["date"])) galleries=reversed(sorted([x for x in front_page_galleries_cover if x != {}], key=lambda x: x["date"]))
).encode("Utf-8") ).encode("Utf-8")
open(Path("build").joinpath("feed.xml"), "w").write(xml) open(Path("build").joinpath("feed.xml"), "wb").write(xml)
build_index(settings, front_page_galleries_cover, templates) build_index(settings, front_page_galleries_cover, templates)
CACHE.cache_dump()
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -5,6 +5,9 @@
{% set licence_url = settings.licence.url %} {% set licence_url = settings.licence.url %}
{% set licence_name = settings.licence.name %} {% set licence_name = settings.licence.name %}
{% endif %} {% endif %}
{% if settings.custom_js %}
<script type="text/javascript" src="../static/js/custom.js" charset="utf-8"></script>
{% endif %}
<footer> <footer>
<p>Generated using <a href="https://github.com/psycojoker/prosopopee">Prosopopée</a> · content under <a href="{{ licence_url }}">{{ licence_name }}</a> · atom logo by <a href="https://thenounproject.com/jjjon/">Jonathan Li</a> under <a href="https://creativecommons.org/licenses/by/3.0/">CC-BY</a></p> <p>Generated using <a href="https://github.com/psycojoker/prosopopee">Prosopopée</a> · content under <a href="{{ licence_url }}">{{ licence_name }}</a> · atom logo by <a href="https://thenounproject.com/jjjon/">Jonathan Li</a> under <a href="https://creativecommons.org/licenses/by/3.0/">CC-BY</a></p>
</footer> </footer>

View File

@ -12,6 +12,9 @@
{% if gallery.audio_enabled %} {% if gallery.audio_enabled %}
<link type="text/css" rel="stylesheet" href="../static/css/mediaelementplayer.css" media="screen,projection"/> <link type="text/css" rel="stylesheet" href="../static/css/mediaelementplayer.css" media="screen,projection"/>
{% endif %} {% endif %}
{% if settings.custom_css %}
<link type="text/css" rel="stylesheet" href="../static/css/custom.css" media="screen,projection"/>
{% endif %}
<!--Let browser know website is optimized for mobile--> <!--Let browser know website is optimized for mobile-->
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
{% if gallery.description %} {% if gallery.description %}

View File

@ -3,6 +3,9 @@
{% block css %} {% block css %}
<link type="text/css" rel="stylesheet" href="static/css/fonts.css" media="screen,projection"/> <link type="text/css" rel="stylesheet" href="static/css/fonts.css" media="screen,projection"/>
<link type="text/css" rel="stylesheet" href="static/css/style.css" media="screen,projection"/> <link type="text/css" rel="stylesheet" href="static/css/style.css" media="screen,projection"/>
{% if settings.custom_css %}
<link type="text/css" rel="stylesheet" href="static/css/custom.css" media="screen,projection"/>
{% endif %}
{% endblock %} {% endblock %}
{% block logo %} {% block logo %}

View File

@ -1,4 +1,5 @@
jinja2 jinja2
pyyaml
path.py path.py
docopt docopt
ruamel.yaml
future