-
-
Save iangreenleaf/4b65e448f44fd94d077906d76f4f57d0 to your computer and use it in GitHub Desktop.
A Liquid tag for Jekyll sites that allows embedding Lychee albums. See https://tobrunet.ch/articles/jekyll-meets-lychee-a-liquid-tag-plugin/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Connects Jekyll with Lychee (http://lychee.electerious.com/) | |
# | |
# # Features | |
# | |
# * Generate album overview and link to image | |
# * Caching of JSON data | |
# | |
# # Usage | |
# | |
# {% lychee_album <album_id> %} | |
# {% lychee_album_no_cache <album_id> %} | |
# | |
# # Example | |
# | |
# {% lychee_album 1 %} | |
# {% lychee_album_no_cache 1 %} | |
# | |
# # Default configuration (override in _config.yml) | |
# | |
# lychee: | |
# url: http://electerious.com/lychee_demo | |
# album_title_tag: h1 | |
# link_big_to: lychee | |
# cache_folder: _lychee_cache | |
# | |
# Change at least "url" to your own Lychee installation | |
# album_title_tag: let's you chose which HTML tag to use around the album title | |
# link_big_to: choose "lychee" or "img". | |
# lychee: links the image to the Lychee image view | |
# img: links the image to it's original image | |
# | |
# # Author and license | |
# | |
# Tobias Brunner <tobias@tobru.ch> - https://tobrunet.ch | |
# License: MIT | |
require 'json' | |
require 'net/http' | |
require 'net/https' | |
require 'uri' | |
module Jekyll | |
class LycheeAlbumTag < Liquid::Tag | |
def initialize(tag_name, config, token) | |
super | |
# params coming from the liquid tag | |
@params = config.strip | |
# get config from _config.yml | |
@config = Jekyll.configuration({})['lychee'] || {} | |
# set default values | |
@config['album_title_tag'] ||= 'h1' | |
@config['link_big_to'] ||= 'lychee' | |
@config['url'] ||= 'http://electerious.com/lychee_demo' | |
@config['cache_folder'] ||= '_lychee_cache' | |
# construct class wide usable variables | |
@thumb_url = @config['url'] + "/" | |
@big_url = @config['url'] + "/" | |
@album_id = @params | |
# initialize caching | |
@cache_disabled = false | |
@cache_folder = File.expand_path "../#{@config['cache_folder']}", File.dirname(__FILE__) | |
FileUtils.mkdir_p @cache_folder | |
end | |
def render(context) | |
# initialize session with Lychee | |
api_url = @config['url'] + "/php/index.php" | |
uri = URI.parse(api_url) | |
@http = Net::HTTP.new(uri.host, uri.port) | |
@http.use_ssl = true | |
@request = Net::HTTP::Post.new(uri.request_uri) | |
@request['Cookie'] = init_lychee_session | |
album = cached_response(@album_id, 'album') || get_album(@album_id) | |
puts "[Lychee Tag] Processing Lychee album id #{@album_id}: '#{album['title']}'" | |
html = "<#{@config['album_title_tag']}>#{album['title']}</#{@config['album_title_tag']}>\n" | |
album_content = album['photos'] | |
album_content.each do |photo_data| | |
big_href = case @config['link_big_to'] | |
when "img" | |
photo_data = cached_response(photo_data['id'], 'photo') || get_photo(@album_id, photo_data['id']) | |
@big_url + photo_data['url'] | |
when "lychee" then @config['url'] + "#" + @album_id + "/" + photo_data['id'] | |
else "#" | |
end | |
html << "<a href=\"#{big_href}\" title=\"#{photo_data['title']}\"><img src=\"#{@thumb_url}#{photo_data['thumbUrl']}\"/></a>\n" | |
end | |
return html | |
end | |
# Caching | |
def cache(id, type, data) | |
puts "[Lychee Tag] Caching Lychee #{type} id #{id}" | |
cache_file = cache_file_for(id, type) | |
File.open(cache_file, "w") do |f| | |
f.write(data) | |
end | |
end | |
def cache_file_for(id, type) | |
filename = "#{type}_#{id}" | |
File.join(@cache_folder, filename) | |
end | |
def cached_response(id, type) | |
return nil if @cache_disabled | |
cache_file = cache_file_for(id, type) | |
JSON.parse(File.read(cache_file)) if File.exist?(cache_file) | |
end | |
# Lychee API mapping | |
def init_lychee_session | |
# construct request | |
@request.set_form_data({'function' => 'Session::init'}) | |
# send request now and save cookies | |
response = @http.request(@request) | |
return response.response['set-cookie'] | |
end | |
def get_albums | |
@request.set_form_data({'function' => 'Album::getAll'}) | |
return JSON.parse(@http.request(@request).body) | |
end | |
def get_album(id) | |
@request.set_form_data({'function' => 'Album::get', 'albumID' => id, 'password' => ''}) | |
response = @http.request(@request).body | |
cache(id, 'album', response) unless @cache_disabled | |
return JSON.parse(response) | |
end | |
def get_photo(album_id, photo_id) | |
@request.set_form_data({'function' => 'Photo::get', 'albumID' => album_id, 'photoID' => photo_id, 'password' => ''}) | |
response = @http.request(@request).body | |
cache(photo_id, 'photo', response) unless @cache_disabled | |
return JSON.parse(response) | |
end | |
end | |
class LycheeAlbumTagNoCache < LycheeAlbumTag | |
def initialize(tag_name, config, token) | |
super | |
@cache_disabled = true | |
end | |
end | |
end | |
Liquid::Template.register_tag('lychee_album', Jekyll::LycheeAlbumTag) | |
Liquid::Template.register_tag('lychee_album_no_cache', Jekyll::LycheeAlbumTagNoCache) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment