octopod-exe 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +8 -0
  3. data/Rakefile +11 -0
  4. data/assets/_config.yml.sample +48 -0
  5. data/assets/_includes/disqus_count.html +13 -0
  6. data/assets/_includes/disqus_thread.html +13 -0
  7. data/assets/_includes/flattr_loader.html +14 -0
  8. data/assets/_includes/isso_thread.html +6 -0
  9. data/assets/_includes/post.html +20 -0
  10. data/assets/_includes/post_header.html +17 -0
  11. data/assets/_includes/post_line.html +3 -0
  12. data/assets/_includes/sidebar.html +109 -0
  13. data/assets/_includes/tweet_us.html +3 -0
  14. data/assets/_layouts/default.html +86 -0
  15. data/assets/_layouts/feed.xml +107 -0
  16. data/assets/_layouts/jsonfeed.json +48 -0
  17. data/assets/_layouts/page.html +15 -0
  18. data/assets/_layouts/player_index.html +36 -0
  19. data/assets/_layouts/post.html +10 -0
  20. data/assets/_layouts/with_twitter_card.html +98 -0
  21. data/assets/_posts/2016-03-22-episode0.md +24 -0
  22. data/assets/_sass/_overrides.scss +68 -0
  23. data/assets/apple-touch-icon-precomposed.png +0 -0
  24. data/assets/episodes.m4a.rss +5 -0
  25. data/assets/episodes.mp3.rss +5 -0
  26. data/assets/episodes.ogg.rss +5 -0
  27. data/assets/episodes/episode0.m4a +0 -0
  28. data/assets/episodes/episode0.mp3 +0 -0
  29. data/assets/episodes/episode0.ogg +0 -0
  30. data/assets/favicon.ico +0 -0
  31. data/assets/feed.m4a.json +5 -0
  32. data/assets/feed.mp3.json +5 -0
  33. data/assets/feed.ogg.json +5 -0
  34. data/assets/general_feed.xml +30 -0
  35. data/assets/img/favicon.ico +0 -0
  36. data/assets/img/logo-360x360.png +0 -0
  37. data/assets/img/logo-itunes.jpg +0 -0
  38. data/assets/img/logo.jpg +0 -0
  39. data/assets/img/logo/android-icon-144x144.png +0 -0
  40. data/assets/img/logo/android-icon-192x192.png +0 -0
  41. data/assets/img/logo/android-icon-36x36.png +0 -0
  42. data/assets/img/logo/android-icon-48x48.png +0 -0
  43. data/assets/img/logo/android-icon-72x72.png +0 -0
  44. data/assets/img/logo/android-icon-96x96.png +0 -0
  45. data/assets/img/logo/apple-icon-114x114.png +0 -0
  46. data/assets/img/logo/apple-icon-120x120.png +0 -0
  47. data/assets/img/logo/apple-icon-144x144.png +0 -0
  48. data/assets/img/logo/apple-icon-152x152.png +0 -0
  49. data/assets/img/logo/apple-icon-180x180.png +0 -0
  50. data/assets/img/logo/apple-icon-57x57.png +0 -0
  51. data/assets/img/logo/apple-icon-60x60.png +0 -0
  52. data/assets/img/logo/apple-icon-72x72.png +0 -0
  53. data/assets/img/logo/apple-icon-76x76.png +0 -0
  54. data/assets/img/logo/apple-icon-precomposed.png +0 -0
  55. data/assets/img/logo/apple-icon.png +0 -0
  56. data/assets/img/logo/browserconfig.xml +2 -0
  57. data/assets/img/logo/favicon-16x16.png +0 -0
  58. data/assets/img/logo/favicon-32x32.png +0 -0
  59. data/assets/img/logo/favicon-96x96.png +0 -0
  60. data/assets/img/logo/favicon.ico +0 -0
  61. data/assets/img/logo/manifest.json +41 -0
  62. data/assets/img/logo/ms-icon-144x144.png +0 -0
  63. data/assets/img/logo/ms-icon-150x150.png +0 -0
  64. data/assets/img/logo/ms-icon-310x310.png +0 -0
  65. data/assets/img/logo/ms-icon-70x70.png +0 -0
  66. data/assets/imprint.md +19 -0
  67. data/assets/index.md +14 -0
  68. data/bin/octopod +273 -0
  69. data/lib/jekyll-octopod.rb +11 -0
  70. data/lib/jekyll/date_de.rb +54 -0
  71. data/lib/jekyll/flattr_filters.rb +107 -0
  72. data/lib/jekyll/octopod_filters.rb +336 -0
  73. data/lib/jekyll/paged_feed_page.rb +22 -0
  74. data/lib/jekyll/paged_feed_page_generator.rb +20 -0
  75. data/lib/jekyll/podcast_player_page.rb +24 -0
  76. data/lib/jekyll/podcast_player_page_generator.rb +14 -0
  77. data/lib/jekyll/podigee_player_tag.rb +44 -0
  78. data/lib/jekyll/static_file.rb +20 -0
  79. data/lib/jekyll/update_config.rb +14 -0
  80. data/lib/octopod/version.rb +11 -0
  81. metadata +580 -0
@@ -0,0 +1,336 @@
1
+ require 'uri'
2
+ require 'digest/sha1'
3
+
4
+ module Jekyll
5
+ module OctopodFilters
6
+ JSON_ENTITIES = { '&' => '\u0026', '>' => '\u003E', '<' => '\u003C', "'" => '\u0027' }
7
+
8
+ # Escapes some text for CDATA
9
+ def cdata_escape(input)
10
+ input.gsub(/<!\[CDATA\[/, '&lt;![CDATA[').gsub(/\]\]>/, ']]&gt;')
11
+ end
12
+
13
+ # Escapes HTML entities in JSON strings.
14
+ # More or less a copy of the equivalent method in Active Support.
15
+ # https://github.com/rails/rails/tree/master/activesupport
16
+ def j(str)
17
+ str.to_s.gsub(/[&"><']/) { |e| JSON_ENTITIES[e] }
18
+ end
19
+
20
+ # Replaces relative urls with full urls
21
+ #
22
+ # {{ "about.html" | expand_urls }} => "/about.html"
23
+ # {{ "about.html" | expand_urls:site.url }} => "http://example.com/about.html"
24
+ def expand_urls(input, url='')
25
+ url ||= '/'
26
+ input.gsub /(\s+(href|src)\s*=\s*["|']{1})(\/[^\"'>]*)/ do
27
+ $1+url+$3
28
+ end
29
+ end
30
+
31
+ # Removes scripts tag and audio tags in multiline moderator
32
+ def remove_script_and_audio(input)
33
+ input.gsub(/<audio.*audio>/m, '').gsub(/<script.*script>/m, '')
34
+ end
35
+
36
+ # Formats a Time to be RSS compatible like "Wed, 15 Jun 2005 19:00:00 GMT"
37
+ #
38
+ # {{ site.time | time_to_rssschema }}
39
+ def time_to_rssschema(time)
40
+ time.strftime("%a, %d %b %Y %H:%M:%S %z")
41
+ end
42
+
43
+ # Returns the first argument if it's not nil or empty otherwise it returns
44
+ # the second one.
45
+ #
46
+ # {{ post.author | otherwise:site.author }}
47
+ def otherwise(first, second)
48
+ first = first.to_s
49
+ first.empty? ? second : first
50
+ end
51
+
52
+ # Returns the audio file name of a given hash. Is no key as second parameter given, it
53
+ # trys first "mp3", than "m4a" and than it will return a more or less random
54
+ # value.
55
+ #
56
+ # {{ post.audio | audio:"m4a" }} => "my-episode.m4a"
57
+ def audio(hsh, key = nil)
58
+ if key.nil?
59
+ hsh['mp3'] ? hsh['mp3'] : hsh['m4a'] ? hsh['m4a'] : hsh['ogg'] ? hsh['ogg'] : hsh['opus'] ? hsh['opus'] : hsh.values.first
60
+ else
61
+ hsh[key]
62
+ end
63
+ end
64
+
65
+
66
+ # Returns the audio-type of a given hash. Is no key as second parameter given, it
67
+ # trys first "mp3", than "m4a" and than it will return a more or less random
68
+ # value.
69
+ #
70
+ # {{ post.audio | audiotype }} => "my-episode.m4a"
71
+ def audio_type(hsh)
72
+ hsh['mp3'] ? mime_type('mp3') : hsh['m4a'] ? mime_type('m4a') : hsh['ogg'] ? mime_type('ogg') : mime_type('opus')
73
+ end
74
+
75
+
76
+ # Returns the MIME-Type of a given file format.
77
+ #
78
+ # {{ "m4a" | mime_type }} => "audio/mp4a-latm"
79
+ def mime_type(format)
80
+ types = {
81
+ 'mp3' => 'mpeg',
82
+ 'm4a' => 'mp4a-latm',
83
+ 'ogg' => 'ogg; codecs=vorbis',
84
+ 'opus' => 'ogg; codecs=opus'
85
+ }
86
+
87
+ "audio/#{types[format]}"
88
+ end
89
+
90
+ # Returns the size of a given file in bytes. If there is just a filename
91
+ # without a path, this method assumes that the file is an episode audio file
92
+ # which lives in /episodes.
93
+ #
94
+ # {{ "example.m4a" | file_size }} => 4242
95
+ def file_size(path, rel = nil)
96
+ return 0 if path.nil?
97
+ path = path =~ /\// ? path : File.join('episodes', path)
98
+ path = rel + path if rel
99
+ File.size(path)
100
+ end
101
+
102
+ # Returns a slug based on the id of a given page.
103
+ #
104
+ # {{ page | slug }} => '2012_10_02_octopod'
105
+ def slug(page)
106
+ page['id'][1..-1].gsub('/', '_')
107
+ end
108
+
109
+ # Returns the image of the post or the default logo.
110
+ #
111
+ # {{ page | image_with_fallback }} => '/path/to/image.png'
112
+ def image_with_fallback(page)
113
+ if page["image"]
114
+ "/img/" + page["image"]
115
+ else
116
+ "/img/logo-itunes.jpg"
117
+ end
118
+ end
119
+
120
+ # Returns the dowrload url with fallback to the site's episode folder url
121
+ def download_url_with_fallback(site)
122
+ if site["download_url"] == "" or site["download_url"] == nil
123
+ site["url"] + "/episodes"
124
+ else
125
+ site["download_url"]
126
+ end
127
+ end
128
+
129
+
130
+ # Splits a chapter, like it is written to the post YAML front matter into
131
+ # the components 'start' which refers to a single point in time relative to
132
+ # the beginning of the media file nad 'title' which defines the text to be
133
+ # the title of the chapter.
134
+ #
135
+ # {{ '00:00:00.000 Welcome to Octopod!' | split_chapter }}
136
+ # => { 'start' => '00:00:00.000', 'title' => 'Welcome to Octopod!' }
137
+ #
138
+ # {{ '00:00:00.000 Welcome to Octopod!' | split_chapter:'title' }}
139
+ # => 'Welcome to Octopod!'
140
+ #
141
+ # {{ '00:00:00.000 Welcome to Octopod!' | split_chapter:'start' }}
142
+ # => '00:00:00.000'
143
+ def split_chapter(chapter_str, attribute = nil)
144
+ attributes = chapter_str.split(/ /, 2)
145
+ return nil unless attributes.first.match(/\A(\d|:|\.)+\z/)
146
+
147
+ if attribute.nil?
148
+ { 'start' => attributes.first, 'title' => attributes.last }
149
+ else
150
+ attribute == 'start' ? attributes.first : attributes.last
151
+ end
152
+ end
153
+
154
+
155
+ # Gets a number of seconds and returns an human readable duration string of
156
+ # it.
157
+ #
158
+ # {{ 1252251 | string_of_duration }} => "00:03:13"
159
+ def string_of_duration(duration)
160
+ seconds = duration.to_i
161
+ minutes = seconds / 60
162
+ hours = minutes / 60
163
+
164
+ "#{"%02d" % hours}:#{"%02d" % (minutes % 60)}:#{"%02d" % (seconds % 60)}"
165
+ end
166
+
167
+ # Gets a number of bytes and returns an human readable string of it.
168
+ #
169
+ # {{ 1252251 | string_of_size }} => "1.19M"
170
+ def string_of_size(bytes)
171
+ bytes = bytes.to_i.to_f
172
+ out = '0'
173
+ return out if bytes == 0.0
174
+
175
+ jedec = %w[b K M G]
176
+ [3, 2, 1, 0].each { |i|
177
+ if bytes > 1024 ** i
178
+ out = "%.1f#{jedec[i]}" % (bytes / 1024 ** i)
179
+ break
180
+ end
181
+ }
182
+
183
+ return out
184
+ end
185
+
186
+ # Returns the host a given url
187
+ #
188
+ # {{ 'https://github.com/pattex/octopod' | host_from_url }} => "github.com"
189
+ def host_from_url(url)
190
+ URI.parse(url).host
191
+ end
192
+
193
+ # Generates the config for disqus integration
194
+ # If a page object is given, it generates the config variables only for this
195
+ # page. Otherwise it generate only the global config variables.
196
+ #
197
+ # {{ site | disqus_config }}
198
+ # {{ site | disqus_config:page }}
199
+ def disqus_config(site, page = nil)
200
+ if page
201
+ disqus_vars = {
202
+ 'disqus_identifier' => page['url'],
203
+ 'disqus_url' => "#{site['url']}#{page['url']}",
204
+ 'disqus_category_id' => page['disqus_category_id'] || site['disqus_category_id'],
205
+ 'disqus_title' => j(page['title'] || site['site'])
206
+ }
207
+ else
208
+ disqus_vars = {
209
+ 'disqus_developer' => site['disqus_developer'],
210
+ 'disqus_shortname' => site['disqus_shortname']
211
+ }
212
+ end
213
+
214
+ disqus_vars.delete_if { |_, v| v.nil? }
215
+ disqus_vars.map { |k, v| "var #{k} = '#{v}';" }.compact.join("\n")
216
+ end
217
+
218
+ # Returns the hex-encoded hash value of a given string. The optional
219
+ # second argument defines the length of the returned string.
220
+ #
221
+ # {{ "Octopod" | sha1 }} => "8b20a59c"
222
+ # {{ "Octopod" | sha1:23 }} => "8b20a59c8e2dcb5e1f845ba"
223
+ def sha1(str, lenght = 8)
224
+ sha1 = Digest::SHA1.hexdigest(str)
225
+ sha1[0, lenght.to_i]
226
+ end
227
+
228
+ # Returns a, ready to use, navigation list of all pages that have
229
+ # <tt>navigation</tt> set in their YAML front matter. The list is sorted by
230
+ # the value of <tt>navigation</tt>.
231
+ #
232
+ # {{ site | navigation_list:page }}
233
+ def navigation_list(site, page)
234
+ pages = site['pages'].select { |p|
235
+ p.data['navigation'] && p.data['title']
236
+ }.sort_by { |p| p.data['navigation'] }
237
+
238
+ list = []
239
+ list << pages.map { |p|
240
+ active = (p.url == page['url']) || (page.key?('next') && File.join(p.dir, p.basename) == '/index')
241
+ navigation_list_item(File.join(site['url'], p.url), p.data['title'], active)
242
+ }
243
+ list.join("\n")
244
+ end
245
+
246
+ def talk_list(site, page)
247
+ pages = site['pages'].select { |p|
248
+ p.data['talk'] && p.data['title']
249
+ }.sort_by { |p| p.data['talk'] }
250
+
251
+ list = ['<li class="dropdown"><a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> Talks <span class="caret"></span>
252
+ </a><ul class="dropdown-menu">']
253
+ list << pages.map { |p|
254
+ active = (p.url == page['url']) || (page.key?('next') && File.join(p.dir, p.basename) == '/index')
255
+ navigation_list_item(File.join(site['url'], p.url), p.data['title'], active)
256
+ }
257
+ list << ['</ul></li>']
258
+
259
+ list.join("\n")
260
+ end
261
+
262
+ def navigation_list_item(url, title, active = false)
263
+ a_class = active ? ' class="active"' : ''
264
+ %Q{<li#{a_class}><a #{a_class} href="#{url}">#{title}</a></li>}
265
+ end
266
+
267
+ # Returns an array of all episode feeds named by the convetion
268
+ # 'episodes.<episode_file_format>.rss' within the root directory. Also it
269
+ # contains all additional feeds specified by 'additional_feeds' in the
270
+ # '_config.yml'. If an 'episode_file_format' or key of 'additional_feeds'
271
+ # equals the optional parameter 'except', it will be skipped.
272
+ #
273
+ # episode_feeds(site, except = nil) =>
274
+ # [
275
+ # ["m4a Episode RSS-Feed", "/episodes.m4a.rss"],
276
+ # ["mp3 Episode RSS-Feed", "/episodes.mp3.rss"],
277
+ # ["Torrent Feed m4a", "http://bitlove.org/octopod/octopod_m4a/feed"],
278
+ # ["Torrent Feed mp3", "http://bitlove.org/octopod/octopod_mp3/feed"]
279
+ # ]
280
+ def episode_feeds(site, except = nil)
281
+ feeds = []
282
+
283
+ if site['episode_feed_formats']
284
+ site['episode_feed_formats'].map { |f|
285
+ feeds << ["#{f} Episode RSS-Feed", "#{site['url']}/episodes.#{f}.rss"] unless f == except
286
+ }
287
+ end
288
+ if site['additional_feeds']
289
+ site['additional_feeds'].each { |k, v|
290
+ feeds << [k.gsub('_', ' '), v] unless k == except
291
+ }
292
+ end
293
+
294
+ feeds
295
+ end
296
+
297
+ # Returns HTML links to all episode feeds named by the convetion
298
+ # 'episodes.<episode_file_format>.rss' within the root directory. Also it
299
+ # returns all additional feeds specified by 'additional_feeds' in the
300
+ # '_config.yml'. If an 'episode_file_format' or key of 'additional_feeds'
301
+ # equals the optional parameter 'except', it will be skipped.
302
+ #
303
+ # {{ site | episode_feeds_html:'m4a' }} =>
304
+ # <link rel="alternate" type="application/rss+xml" title="mp3 Episode RSS-Feed" href="/episodes.mp3.rss" />
305
+ # <link rel="alternate" type="application/rss+xml" title="Torrent Feed m4a" href="http://bitlove.org/octopod/octopod_m4a/feed" />
306
+ # <link rel="alternate" type="application/rss+xml" title="Torrent Feed mp3" href="http://bitlove.org/octopod/octopod_mp3/feed" />
307
+ def episode_feeds_html(site, except = nil)
308
+ episode_feeds(site, except).map { |f|
309
+ %Q{<link rel="alternate" type="application/rss+xml" title="#{f.first || f.last}" href="#{f.last}" />}
310
+ }.join("\n")
311
+ end
312
+
313
+ # Returns RSS-XML links to all episode feeds named by the convetion
314
+ # 'episodes.<episode_file_format>.rss' within the root directory. Also it
315
+ # returns all additional feeds specified by 'additional_feeds' in the
316
+ # '_config.yml'. If an 'episode_file_format' or key of 'additional_feeds'
317
+ # equals the optional parameter 'except', it will be skipped.
318
+ #
319
+ # {{ site | episode_feeds_rss:'m4a' }} =>
320
+ # <atom:link rel="alternate" href="/episodes.mp3.rss" type="application/rss+xml" title="mp3 Episode RSS-Feed"/>
321
+ # <atom:link rel="alternate" href="http://bitlove.org/octopod/octopod_m4a/feed" type="application/rss+xml" title="Torrent Feed m4a"/>
322
+ # <atom:link rel="alternate" href="http://bitlove.org/octopod/octopod_mp3/feed" type="application/rss+xml" title="Torrent Feed mp3"/>
323
+ def episode_feeds_rss(site, except = nil)
324
+ episode_feeds(site, except).map { |f|
325
+ %Q{<atom:link rel="alternate" href="#{f.last}" type="application/rss+xml" title="#{f.first || f.last}"/>}
326
+ }.join("\n")
327
+ end
328
+
329
+ # Prints out current version
330
+ def version_string(site)
331
+ Jekyll::Octopod::VERSION::STRING
332
+ end
333
+ end
334
+ end
335
+
336
+ Liquid::Template.register_filter(Jekyll::OctopodFilters)
@@ -0,0 +1,22 @@
1
+ module Jekyll
2
+ class PagedFeedPage < Page
3
+ def initialize(site, base, dir, name, page_number, pages_total, format)
4
+ @site = site
5
+ @dir = "/"
6
+ @name = name
7
+
8
+ self.process(@name)
9
+ self.read_yaml(File.join(base, '_layouts'), 'feed.xml')
10
+ self.data['next'] = pages_total > page_number ? (page_number + 1).to_s : nil
11
+ self.data['last'] = pages_total > 1 ? pages_total.to_s : nil
12
+ self.data['prev'] = case page_number
13
+ when 1 then nil
14
+ when 2 then ""
15
+ else (page_number - 1).to_s
16
+ end
17
+ self.data['myself'] = page_number == 1 ? nil : page_number.to_s
18
+ self.data['format'] = format
19
+ self.data['page_number'] = page_number
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ module Jekyll
2
+ class PagedFeedPageGenerator < Generator
3
+ safe true
4
+
5
+ def generate(site)
6
+ pages_total = (site.posts.docs.count.to_f / site.config["episodes_per_feed_page"]).ceil
7
+
8
+ site.config["episode_feed_formats"].each do |page_format|
9
+ name = "episodes." + page_format + ".rss"
10
+ page = PagedFeedPage.new(site, site.source, ".", name, 1, pages_total, page_format)
11
+ site.pages << page
12
+ (1..pages_total).each do |page_number|
13
+ name = "episodes" + page_number.to_s + "." + page_format + ".rss"
14
+ page = PagedFeedPage.new(site, site.source, ".", name, page_number, pages_total, page_format)
15
+ site.pages << page
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ module Jekyll
2
+ class PodcastPlayerPage < Page
3
+ def initialize(site, base, dir, post)
4
+ @site = site
5
+ @base = base
6
+ @dir = dir
7
+ @name = 'index.html'
8
+
9
+ self.process(@name)
10
+ self.read_yaml(File.join(base, '_layouts'), 'player_index.html')
11
+
12
+ self.data['title'] = post.data['title']
13
+ self.data['subtitle'] = post.data['subtitle']
14
+ self.data['datum'] = post.data['datum']
15
+ self.data['author'] = post.data['author']
16
+ self.data['duration'] = post.data['duration']
17
+ self.data['summary'] = post.data['summary']
18
+ self.data['explicit'] = post.data['explicit']
19
+ self.data['audio'] = post.data['audio']
20
+ self.data['chapters'] = post.data['chapters']
21
+ self.data['template'] = 'player_index'
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ module Jekyll
2
+ class PodcastPlayerPageGenerator < Generator
3
+ safe true
4
+
5
+ def generate(site)
6
+ if site.layouts.key? 'player_index'
7
+ dir = site.config['players_dir'] || 'players'
8
+ site.posts.docs.each do |post|
9
+ site.pages << PodcastPlayerPage.new(site, site.source, File.join(dir, post.data['slug']), post)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,44 @@
1
+ module Jekyll
2
+ class PodigeePlayerTag < Liquid::Tag
3
+ def playerconfig(context)
4
+ config = context.registers[:site].config
5
+ page = context.registers[:page]
6
+
7
+ audio = {}
8
+ download_url = config["download_url"] || config["url"] + "/episodes"
9
+ page["audio"].each { |key, value| audio[key] = download_url + "/" + value}
10
+
11
+ { options: { theme: "default",
12
+ startPanel: "ChapterMarks" },
13
+ extensions: { ChapterMarks: {},
14
+ EpisodeInfo: {},
15
+ Playlist: {} },
16
+ title: options['title'],
17
+ episode: { media: audio,
18
+ coverUrl: config['url'] + (page["episode_cover"] || '/img/logo-360x360.png'),
19
+ title: page["title"],
20
+ subtitle: page["subtitle"],
21
+ url: config['url'] + page["url"],
22
+ description: page["description"],
23
+ chaptermarks: page["chapters"].map {|chapter| { start: chapter[0..12], title: chapter[13..255] }}
24
+ }
25
+ }.to_json
26
+ end
27
+
28
+ def render(context)
29
+ config = context.registers[:site].config
30
+ page = context.registers[:page]
31
+ return unless page["audio"]
32
+ return <<~HTML
33
+ <script>
34
+ window.playerConfiguration = #{playerconfig(context)}
35
+ </script>
36
+ <script class="podigee-podcast-player" data-configuration="playerConfiguration"
37
+ src="#{config["url"].split(":").first}://cdn.podigee.com/podcast-player/javascripts/podigee-podcast-player.js">
38
+ </script>
39
+ HTML
40
+ end
41
+ end
42
+ end
43
+
44
+ Liquid::Template.register_tag('podigee_player', Jekyll::PodigeePlayerTag)