This commit is contained in:
Florian Maury 2024-10-26 10:27:11 +02:00
commit 4f148ac9c1
38 changed files with 1603 additions and 0 deletions

90
archetypes/episode.md Normal file
View file

@ -0,0 +1,90 @@
---
title: '{{ replace .File.ContentBaseName "-" " " | title }}' # podcast field: itunes:title ; title of the episode
description: "" # podcast field: description
date: {{ .Date }} # podcast field: pubDate
outputs:
- html
- chapters
- chapterspodlove
- transcriptsrt
- transcriptwebvtt
- transcripthtml
- transcriptjson
- transcriptpodlove
type: episode
params:
enclosure:
resource_file: "" # name of the resource in the episode directory
external_url: "" # absolute external URL if the audio file is hosted somewhere else
length: 0 # byte length of the episode
type: "" # mime type of the enclosed file
alternate_enclosures:
- sources: # one of resource_file or external_url per item
- resource_file: "" # name of the resource in the episode directory
external_url: "" # URL to download that enclosure
type: "" # content type
sri_hash: "" # SRI hash of the file to download
type: "" # MIME type of that enclosure
length: 0 # optional/recommended; byte length of the file to download
bitrate: 0 # optional; bitrate of the file, expressed as bits per second
lang: fr # optional; language tag from IETF BCP 47
title: "" # optional; title of the asset; max 32 chars
codecs: "" # optional; codec string as in RFC 6381
guid: "" # podcast field: guid
# duration: 0 # podcast field: itunes:duration ; expressed in seconds
# image: "" # podcast field: itunes:image ; image for the episode
# explicit: false # podcast field: itunes:explicit
# episode_number: 0 # podcast field: itunes:episode ; the number of the episode in the series/season
# season: # podcast field: itunes:season
# number: 0 # the number of the season
# title: ""
# episode_type: "" # podcast field: itunes:episodeType ; one of "Full", "Trailer" or "Bonus"
# transcript: # podcast field: podcast:transcript
# - content: "" # YAML file containing the transcript
# external_content: # url of the remote content to use as is in different format
# srt: ""
# webvtt: ""
# html: ""
# json: ""
# language: fr # optional; if omitted, language is the same as the podcast language attribute
# rel: "captions" # ; optional ; only valid value is "captions"; indicates that this transcript contains time codes
# funding: # podcast field: podcast:funding
# - url: ""
# - comment: ""
# chapters: # podcast field: podcast:chapters
# - start_time: 0.0
# title: ""
# toc: true # this field needs to be defined and set to true if that chapter must be present in the table of content
# image: ""
# url: ""
# end_time: 0.0
# location:
# name: ""
# geo: ""
# soundbites: # podcast field: podcast:soundbite
# - start_time: 0.0 # expressed in seconds since the start of the episode
# duration: 0.0
# title: ""
# persons: # podcast field: podcast:person ; description and links to a podcast participant
# - name: Florian Maury
# href: https://infosec.exchange/@x_cli
# img: "" # url to avatar
# group: Cast # as listed in https://github.com/Podcastindex-org/podcast-namespace/blob/main/taxonomy.json
# role: Host
# location: # podcast field: podcast:location ; used to associate the podcast or the episode to a specific location
# freeform: "" # Description of the place (128 chars max)
# geo: "" # lattitude and longitude expressed in "geo" notation
# osm: "" # Open Street Map Identifier
# episode: 0 # podcast field: podcast:episode ; number of the episode in the season ; ignored if season is 0
# licence:
# name: CC-BY 4.0
# url: https://creativecommons.org/licenses/by/4.0/
# social_interacts: # podcast field: podcast:socialInteracts ; links to interact on social media with the podcast
# - protocol: activitypub # one of https://github.com/Podcastindex-org/podcast-namespace/blob/main/socialprotocols.txt
# uri: "" # URL of the root post for the channel as a whole
# priority: 10
# recommendations: # poodcast field: podcast:recommandations
# - url: https://pod.broken-by-design.fr/recommendations.fr.json
# language: fr
# comment: Recommandations générales
---

83
archetypes/podcast.md Normal file
View file

@ -0,0 +1,83 @@
---
title: "" # podcast field: title
description: "" # podcast field: description
draft: false
date: "2024-10-11T00:00:01Z"
type: podcast
outputs:
# - html
- rss
params:
guid: "" # podcast field: podcast:guid
lang: "" # podcast field: language ; from ISO 639
# platforms:
# - name: apple # one of https://github.com/Podcastindex-org/podcast-namespace/blob/main/serviceslugs.txt
# url: "" # URL the podcast on that platform
image: # podcast field: itunes:image ; URL to an image representing the podcast
resource_file: ""
external_url: ""
# images: # podcast field: podcast:images ; multiple images with various width
# - resource_file: "" # name of the resource in the podcast directory
# external_url: "" # absolute external URL to the image hosted elsewhere
# width: 0 # width of the image
category: "" # podcast field: itunes:category ; one of https://github.com/Podcastindex-org/podcast-namespace/blob/main/categories.json
explicit: false # podcast field: itunes:explicit
email: "" # used in podcast:locked and itunes:owner => itunes:email
medium: podcast # podcast field: podcast:medium ; one of https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#medium
website_link: "" # podcast field: link ; a link to the podcast website
podcast_type: episodic # podcast field: itunes:type ; either episodic or serial
# copyright: "" # podcast field: copyright
# licence: # podcast field: podcast:licence
# name: CC-BY 4.0
# url: https://creativecommons.org/licenses/by/4.0/
locked: true # podcast field: podcast:locked; control whether the podcast can be imported by platforms
use_op3: true # Whether to use op3 redirection for gathering statistics
# funding: # podcast field: podcast:funding
# - url: "bli" # URL to the funding method
# comment: "bla" # name of the funding method or message to encourage funding; limited to 128 chars
# recommendations: # podcast field: podcast:recommendations
# - url: https://pod.broken-by-design.fr/recommendations.fr.json
# language: fr
# location: # podcast field: podcast:location ; used to associate the podcast or the episode to a specific location
# description: "" # Description of the place (128 chars max)
# geo: "" # lattitude and longitude expressed in "geo" notation
# osm: "" # Open Street Map Identifier
# trailer: # podcast field: podcast:trailer ; used to provider one or more trailers for the podcast or seasons
# - resource_file: "" # resource identifier
# external_url: "" # URL to the audio file
# title: "" # Title of the trailer; max 128 chars
# pubdate: "" # date in RFC 2822 format
# length: 0 # byte length of the file
# type: "" # mime type of the file
# season: 0 # season number if this trailer is for a specific season; 0 means that the trailer is for the podcast as a whole
# social_interacts: # podcast field: podcast:socialInteracts ; links to interact on social media with the podcast
# - protocol: activitypub # one of https://github.com/Podcastindex-org/podcast-namespace/blob/main/socialprotocols.txt
# uri: "" # URL of the root post for the channel as a whole
# priority: 10
# podroll: # podcast field: podcast:podroll
# - feed_guid: "" # guid of the other podcast
# feed_url: "" # URL of the other podcast if guid is not resolvable
# medium: podcast # same indications that the medium parameter
# title: "" # name of the other podcast
# remote_items:
# - feed_guid: "" # guid of the other podcast
# feed_url: "" # URL of the other podcast if guid is not resolvable
# medium: podcast # same indications that the medium parameter
# title: "" # name of the other podcast
# update_frequency:
# rrule: "" # see rule syntax here https://www.rfc-editor.org/rfc/rfc5545#section-3.3.10
# dtstart: "" # date formated as ISO8601 where the reccurrence begins
# complete: false # whether no new episodes are expected
# description: "" # description of the frequency in natural language
cascade:
params:
author: Florian Maury # podcast field: itunes:author and itunes:owner => itunes:name
# persons: # podcast field: podcast:person ; description and links to a podcast participant
# - name: Florian Maury
# href: https://infosec.exchange/@x_cli
# image:
# resource_file: "florian.png" # resource identifier ; resource must be in global assets, not page bundles
# external_url: "" # url to avatar
# group: Cast # as listed in https://github.com/Podcastindex-org/podcast-namespace/blob/main/taxonomy.json
# role: Host
---

12
archetypes/season.md Normal file
View file

@ -0,0 +1,12 @@
---
title: ""
description: ""
date: "2024-10-11T00:00:00Z"
draft: false
type: season
cascade:
params:
season:
number: 0
title: ""
---

452
assets/categories.json Normal file
View file

@ -0,0 +1,452 @@
{
"Categories": [
{
"id": 1,
"name": "Arts"
},
{
"id": 2,
"name": "Books"
},
{
"id": 3,
"name": "Design"
},
{
"id": 4,
"name": "Fashion"
},
{
"id": 5,
"name": "Beauty"
},
{
"id": 6,
"name": "Food"
},
{
"id": 7,
"name": "Performing"
},
{
"id": 8,
"name": "Visual"
},
{
"id": 9,
"name": "Business"
},
{
"id": 10,
"name": "Careers"
},
{
"id": 11,
"name": "Entrepreneurship"
},
{
"id": 12,
"name": "Investing"
},
{
"id": 13,
"name": "Management"
},
{
"id": 14,
"name": "Marketing"
},
{
"id": 15,
"name": "Non-Profit"
},
{
"id": 16,
"name": "Comedy"
},
{
"id": 17,
"name": "Interviews"
},
{
"id": 18,
"name": "Improv"
},
{
"id": 19,
"name": "Stand-Up"
},
{
"id": 20,
"name": "Education"
},
{
"id": 21,
"name": "Courses"
},
{
"id": 22,
"name": "How-To"
},
{
"id": 23,
"name": "Language"
},
{
"id": 24,
"name": "Learning"
},
{
"id": 25,
"name": "Self-Improvement"
},
{
"id": 26,
"name": "Fiction"
},
{
"id": 27,
"name": "Drama"
},
{
"id": 28,
"name": "History"
},
{
"id": 29,
"name": "Health"
},
{
"id": 30,
"name": "Fitness"
},
{
"id": 31,
"name": "Alternative"
},
{
"id": 32,
"name": "Medicine"
},
{
"id": 33,
"name": "Mental"
},
{
"id": 34,
"name": "Nutrition"
},
{
"id": 35,
"name": "Sexuality"
},
{
"id": 36,
"name": "Kids"
},
{
"id": 37,
"name": "Family"
},
{
"id": 38,
"name": "Parenting"
},
{
"id": 39,
"name": "Pets"
},
{
"id": 40,
"name": "Animals"
},
{
"id": 41,
"name": "Stories"
},
{
"id": 42,
"name": "Leisure"
},
{
"id": 43,
"name": "Animation"
},
{
"id": 44,
"name": "Manga"
},
{
"id": 45,
"name": "Automotive"
},
{
"id": 46,
"name": "Aviation"
},
{
"id": 47,
"name": "Crafts"
},
{
"id": 48,
"name": "Games"
},
{
"id": 49,
"name": "Hobbies"
},
{
"id": 50,
"name": "Home"
},
{
"id": 51,
"name": "Garden"
},
{
"id": 52,
"name": "Video-Games"
},
{
"id": 53,
"name": "Music"
},
{
"id": 54,
"name": "Commentary"
},
{
"id": 55,
"name": "News"
},
{
"id": 56,
"name": "Daily"
},
{
"id": 57,
"name": "Entertainment"
},
{
"id": 58,
"name": "Government"
},
{
"id": 59,
"name": "Politics"
},
{
"id": 60,
"name": "Buddhism"
},
{
"id": 61,
"name": "Christianity"
},
{
"id": 62,
"name": "Hinduism"
},
{
"id": 63,
"name": "Islam"
},
{
"id": 64,
"name": "Judaism"
},
{
"id": 65,
"name": "Religion"
},
{
"id": 66,
"name": "Spirituality"
},
{
"id": 67,
"name": "Science"
},
{
"id": 68,
"name": "Astronomy"
},
{
"id": 69,
"name": "Chemistry"
},
{
"id": 70,
"name": "Earth"
},
{
"id": 71,
"name": "Life"
},
{
"id": 72,
"name": "Mathematics"
},
{
"id": 73,
"name": "Natural"
},
{
"id": 74,
"name": "Nature"
},
{
"id": 75,
"name": "Physics"
},
{
"id": 76,
"name": "Social"
},
{
"id": 77,
"name": "Society"
},
{
"id": 78,
"name": "Culture"
},
{
"id": 79,
"name": "Documentary"
},
{
"id": 80,
"name": "Personal"
},
{
"id": 81,
"name": "Journals"
},
{
"id": 82,
"name": "Philosophy"
},
{
"id": 83,
"name": "Places"
},
{
"id": 84,
"name": "Travel"
},
{
"id": 85,
"name": "Relationships"
},
{
"id": 86,
"name": "Sports"
},
{
"id": 87,
"name": "Baseball"
},
{
"id": 88,
"name": "Basketball"
},
{
"id": 89,
"name": "Cricket"
},
{
"id": 90,
"name": "Fantasy"
},
{
"id": 91,
"name": "Football"
},
{
"id": 92,
"name": "Golf"
},
{
"id": 93,
"name": "Hockey"
},
{
"id": 94,
"name": "Rugby"
},
{
"id": 95,
"name": "Running"
},
{
"id": 96,
"name": "Soccer"
},
{
"id": 97,
"name": "Swimming"
},
{
"id": 98,
"name": "Tennis"
},
{
"id": 99,
"name": "Volleyball"
},
{
"id": 100,
"name": "Wilderness"
},
{
"id": 101,
"name": "Wrestling"
},
{
"id": 102,
"name": "Technology"
},
{
"id": 103,
"name": "True Crime"
},
{
"id": 104,
"name": "TV"
},
{
"id": 105,
"name": "Film"
},
{
"id": 106,
"name": "After-Shows"
},
{
"id": 107,
"name": "Reviews"
},
{
"id": 108,
"name": "Climate"
},
{
"id": 109,
"name": "Weather"
},
{
"id": 110,
"name": "Tabletop"
},
{
"id": 111,
"name": "Role-Playing"
},
{
"id": 112,
"name": "Cryptocurrency"
}
]
}

3
go.mod Normal file
View file

@ -0,0 +1,3 @@
module git.broken-by-design.fr/fmaury/podcast-mod
go 1.22.7

6
i18n/en.yaml Normal file
View file

@ -0,0 +1,6 @@
season: season
seasons: seasons
episode: episode
episodes: episodes
welcome: Welcome on the %s podcast!
colon: ":"

6
i18n/fr.yaml Normal file
View file

@ -0,0 +1,6 @@
season: saison
seasons: saisons
episode: épisode
episodes: épisodes
welcome: Bienvenue sur le podcast %s !
colon: " :"

View file

@ -0,0 +1,41 @@
{{- $chapters := slice -}}
{{- with .Params.chapters -}}
{{- range . -}}
{{- $start_time_value := printf "%.3f" .start_time | cast.ToFloat -}}
{{- $entry := dict "startTime" $start_time_value "title" .title -}}
{{- with .image -}}
{{- $entry = collections.Merge $entry (dict "img" .image) -}}
{{- end -}}
{{- with .url -}}
{{- $entry = collections.Merge $entry (dict "url" .url) -}}
{{- end -}}
{{- with .toc -}}
{{- $entry = collections.Merge $entry (dict "toc" .toc) -}}
{{- end -}}
{{- with .end_time -}}
{{- $end_time_value := printf "%.3f" .end_time | cast.ToFloat -}}
{{- $entry = collections.Merge $entry (dict "endTime" $end_time_value) -}}
{{- end -}}
{{- with .location -}}
{{- $name := collections.Index .location "name" -}}
{{- $geo := collections.Index .location "geo" -}}
{{- $entry = collections.Merge $entry (dict "location" (dict "name" $name "geo" $geo)) -}}
{{- end -}}
{{- $chapters = collections.Append $entry $chapters -}}
{{- end -}}
{{- end -}}
{{- $version := "1.2.0" -}}
{{- $document := dict "version" $version "chapters" $chapters "title" .Title "description" .Description -}}
{{- with .Params.author -}}
{{- $document = collections.Merge $document (dict "author" .) -}}
{{- end -}}
{{- $podcast_name := "" -}}
{{- $podcast_page := collections.Where .Ancestors "Type" "podcast" -}}
{{- if eq (len $podcast_page) 1 -}}
{{- $document = collections.Merge $document (dict "podcastName" (collections.Index $podcast_page 0).Title) -}}
{{- end -}}
{{- encoding.Jsonify (dict "noHTMLEscape" true) $document | safe.JS -}}

View file

@ -0,0 +1,18 @@
{{- $chapters := slice -}}
{{- with .Params.chapters -}}
{{- range . -}}
{{ $start_time := collections.Index . "start_time" }}
{{- $start_timecode := partial "ms_to_timecode.tmpl" (dict "start_time" $start_time "long_format" true) -}}
{{- $image := "" -}}
{{- with .image -}}
{{- $image = . -}}
{{- end -}}
{{- $href := "" -}}
{{- with .url -}}
{{- $href = . -}}
{{- end -}}
{{- $entry := dict "start" $start_timecode "title" .title "image" $image "href" $href -}}
{{- $chapters = collections.Append $entry $chapters -}}
{{- end -}}
{{- end -}}
{{- encoding.Jsonify (dict "noHTMLEscape" true) $chapters | safe.JS -}}

View file

@ -0,0 +1 @@
{{- partial "transcript_content/dispatcher.tmpl" (dict "episode" . "format" "html") -}}

View file

@ -0,0 +1 @@
{{- partial "transcript_content/dispatcher.tmpl" (dict "episode" . "format" "json") -}}

View file

@ -0,0 +1 @@
{{- partial "transcript_content/dispatcher.tmpl" (dict "episode" . "format" "podlove") -}}

View file

@ -0,0 +1 @@
{{- partial "transcript_content/dispatcher.tmpl" (dict "episode" . "format" "srt") -}}

View file

@ -0,0 +1 @@
{{- partial "transcript_content/dispatcher.tmpl" (dict "episode" . "format" "webvtt") -}}

View file

@ -0,0 +1,17 @@
{{- $ctx := collections.Index . "context" -}}
{{- $episode_page := collections.Index . "episode_page" -}}
{{- $guid := collections.Index . "guid" -}}
{{- $use_op3 := collections.Index . "use_op3" -}}
{{- $url := partial "external_or_local.rss.xml" (dict "context" $ctx "ref_page" $episode_page) -}}
{{- if $use_op3 -}}
{{- $parsedURL := urls.Parse $url -}}
{{- if eq $parsedURL.Scheme "http" -}}
{{- $url = printf "https://op3.dev/e,pg=%s/http://%s%s" $guid $parsedURL.Host $parsedURL.RequestURI -}}
{{- else -}}
{{- $url = printf "https://op3.dev/e,pg=%s/%s%s" $guid $parsedURL.Host $parsedURL.RequestURI -}}
{{- end -}}
{{- if $parsedURL.Fragment -}}
{{- $url = printf "%s#%s" $url $parsedURL.Fragment -}}
{{- end -}}
{{- end -}}
{{- return $url -}}

View file

@ -0,0 +1,15 @@
{{- $ctx := collections.Index . "context" -}}
{{- $ref_page := collections.Index . "ref_page" -}}
{{- $url := "" -}}
{{- with collections.Index $ctx "external_url" -}}
{{- $url = . -}}
{{- else -}}
{{- $resource_file := collections.Index $ctx "resource_file" -}}
{{- with $ref_page.Resources.Get $resource_file -}}
{{- $url = .Permalink -}}
{{- else -}}
{{- errorf "failed to load resource file %q for page %q" $resource_file $ref_page.Title -}}
{{- end -}}
{{- end -}}
{{- return $url -}}

View file

@ -0,0 +1,9 @@
{{- $indent := collections.Index . "indent" -}}
{{- $ctx := collections.Index . "context" -}}
{{- range $ctx -}}
{{- strings.Repeat $indent " " -}}
<podcast:funding url="{{- .url | transform.XMLEscape -}}">
{{- .comment | transform.XMLEscape -}}
</podcast:funding>
{{- "\n" -}}
{{- end -}}

View file

@ -0,0 +1,16 @@
{{- $indent := collections.Index . "indent" -}}
{{- $ctx := collections.Index . "context" -}}
{{- with $ctx.Params.images -}}
{{- $image_url_list := slice -}}
{{- range . -}}
{{- $entry := . -}}
{{- $url := partial "external_or_local.rss.xml" (dict "context" . "ref_page" $ctx) -}}
{{- $width := collections.Index $entry "width" -}}
{{- $attr := printf "%s %sw" $url $width | transform.XMLEscape -}}
{{- $image_url_list = append $attr $image_url_list -}}
{{- end -}}
{{- strings.Repeat $indent " " -}}
<podcast:images srcset="{{- delimit $image_url_list "," -}}" />
{{- "\n" -}}
{{- end -}}

View file

@ -0,0 +1,9 @@
{{- $indent := collections.Index . "indent" -}}
{{- $ctx := collections.Index . "context" -}}
{{- with $ctx.Params.licence -}}
{{- strings.Repeat $indent " " -}}
<podcast:licence url="{{- .url | transform.XMLEscape -}}">
{{- .name | transform.XMLEscape -}}
</podcast:licence>
{{- "\n" -}}
{{- end -}}

View file

@ -0,0 +1,7 @@
{{- $indent := collections.Index . "indent" -}}
{{- $ctx := collections.Index . "context" -}}
{{- with $ctx.Params.location -}}
{{- strings.Repeat $indent " " -}}
<podcast:location geo="{{ collections.Index . "geo" | transform.XMLEscape }}" osm="{{ collections.Index . "osm" | transform.XMLEscape }}">{{ collections.Index . "description" | transform.XMLEscape }}</podcast:location>
{{- "\n" -}}
{{- end -}}

View file

@ -0,0 +1,22 @@
{{- $start_time := collections.Index . "start_time" -}}
{{- $long_format := collections.Index . "long_format" -}}
{{- $start_time_ms := math.Floor (math.Mul $start_time 1000) -}}
{{- $time_str := "" -}}
{{- $hour_cnt := math.Div $start_time_ms 3600000 | math.Floor | cast.ToInt -}}
{{- $rem := math.Mod $start_time_ms 3600000 -}}
{{- if or $long_format (compare.Gt $hour_cnt 0) -}}
{{- $time_str = printf "%02d:" $hour_cnt -}}
{{- end -}}
{{- $min_cnt := math.Div $rem 60000 | math.Floor | cast.ToInt -}}
{{- $rem = math.Mod $rem 60000 -}}
{{- if or $long_format $time_str (compare.Gt $min_cnt 0) -}}
{{- $time_str = printf "%s%02d:" $time_str $min_cnt -}}
{{- end -}}
{{- $sec_cnt := math.Div $rem 1000 | math.Floor | cast.ToInt -}}
{{- $time_str = printf "%s%02d" $time_str $sec_cnt -}}
{{- $ms_cnt := math.Mod $rem 1000 -}}
{{- if or $long_format (compare.Gt $ms_cnt 0) -}}
{{- $time_str = printf "%s.%03d" $time_str $ms_cnt -}}
{{- end -}}
{{- return $time_str -}}

View file

@ -0,0 +1,27 @@
{{- $indent := collections.Index . "indent" -}}
{{- $ctx := collections.Index . "context" -}}
{{- range $ctx -}}
{{- strings.Repeat $indent " " -}}
<podcast:person role="
{{- collections.Index . "role" | transform.XMLEscape -}}
" group="
{{- collections.Index . "group" | transform.XMLEscape -}}
" img="
{{- $image := collections.Index . "image" -}}
{{- with collections.Index $image "external_url" -}}
{{- . | transform.XMLEscape -}}
{{- else -}}
{{- $resource_file := collections.Index $image "resource_file" -}}
{{- with resources.Get $resource_file -}}
{{- .Permalink | transform.XMLEscape -}}
{{- else -}}
{{- errorf "failed to get resource %q" $resource_file -}}
{{- end -}}
{{- end -}}
" href="
{{- collections.Index . "href" | transform.XMLEscape -}}
">
{{- collections.Index . "name" | transform.XMLEscape -}}
</podcast:person>
{{- "\n" -}}
{{- end -}}

View file

@ -0,0 +1,10 @@
{{- $ctx := collections.Index . "context" -}}
{{- $indent := collections.Index . "indent" -}}
{{- $start_time := collections.Index $ctx "start_time" -}}
{{- $title := collections.Index $ctx "title" -}}
{{- $time_str := partial "ms_to_timecode.tmpl" (dict "start_time" $start_time "long_format" false) -}}
{{- strings.Repeat $indent " " -}}
<psc:chapter start="{{- $time_str -}}" title="{{- $title -}}" />
{{- "\n" -}}

View file

@ -0,0 +1,11 @@
{{- $indent := collections.Index . "indent" -}}
{{- $ctx := collections.Index . "context" -}}
{{- range $ctx -}}
{{- strings.Repeat $indent " " -}}
<podcast:recommendations url="
{{- collections.Index . "url" | transform.XMLEscape -}}
" type="application/json" language="
{{- collections.Index . "language" | transform.XMLEscape -}}
" />
{{- "\n" -}}
{{- end -}}

View file

@ -0,0 +1,15 @@
{{- $indent := collections.Index . "indent" -}}
{{- $ctx := collections.Index . "context" -}}
{{- range $ctx -}}
{{- strings.Repeat $indent " " -}}
<podcast:remoteItem
{{- " " | safe.HTMLAttr -}}
feedGuid="{{- collections.Index . "feed_guid" -}}"
{{- " " | safe.HTMLAttr -}}
feedUrl="{{- collections.Index . "feed_url" -}}"
{{- " " | safe.HTMLAttr -}}
medium="{{- collections.Index . "medium" -}}"
{{- " " | safe.HTMLAttr -}}
title="{{- collections.Index . "title" -}}" />
{{- "\n" -}}
{{- end -}}

View file

@ -0,0 +1,13 @@
{{- $indent := collections.Index . "indent" -}}
{{- $ctx := collections.Index . "context" -}}
{{- range $ctx -}}
{{- strings.Repeat $indent " " -}}
<podcast:socialInteract protocol="
{{- collections.Index . "protocol" | transform.XMLEscape -}}
" uri="
{{- collections.Index . "uri" | transform.XMLEscape -}}
" priority="
{{- collections.Index . "priority" | transform.XMLEscape -}}
" />
{{- "\n" -}}
{{- end -}}

View file

@ -0,0 +1,13 @@
{{- $retvalue := 0 -}}
{{- $parts := strings.Split . ":" -}}
{{- if ne (len $parts) 3 -}}
{{- errorf "invalid timestamp %q" . -}}
{{- else -}}
{{- $hours := collections.Index $parts 0 | cast.ToInt -}}
{{- $minutes := collections.Index $parts 1 | cast.ToInt -}}
{{- $parts2 := strings.Split (collections.Index $parts 2) "," -}}
{{- $seconds := collections.Index $parts2 0 | cast.ToInt -}}
{{- $milliseconds := collections.Index $parts2 1 | cast.ToInt -}}
{{- $retvalue = math.Add $retvalue (math.Mul $hours 3600 1000) (math.Mul $minutes 60 1000) (math.Mul $seconds 1000) $milliseconds -}}
{{- end -}}
{{- return $retvalue -}}

View file

@ -0,0 +1,23 @@
{{- $url := collections.Index . "resource" -}}
{{- $type := collections.Index . "type" -}}
{{- $lang := collections.Index . "lang" -}}
{{- $rel := collections.Index . "rel" -}}
{{- $episode_page := collections.Index . "episode_page" -}}
{{- $indent := collections.Index . "indent" -}}
{{- strings.Repeat $indent " " -}}
<podcast:transcript url="{{- $url | transform.XMLEscape -}}" type="{{- $type | transform.XMLEscape -}}"
{{- with $lang -}}
{{- " " | safe.HTMLAttr -}}
language="{{- . | transform.XMLEscape -}}"
{{- end -}}
{{- with collections.Index . "rel" -}}
{{- " " | safe.HTMLAttr -}}
rel="{{- . | transform.XMLEscape -}}"
{{- end -}}
{{- " " | safe.HTMLAttr -}}
/>
{{- "\n" -}}

View file

@ -0,0 +1,18 @@
{{- $ctx := . -}}
{{- if reflect.IsMap $ctx -}}
{{- with $ctx.episode.Params.transcript -}}
{{- range . -}}
{{- if reflect.IsMap . -}}
{{- if eq .language $ctx.episode.Lang -}}
{{- $resource_name := .content -}}
{{- with $ctx.episode.Resources.Get $resource_name -}}
{{- $transcript := . | transform.Unmarshal -}}
{{- partial (printf "transcript_content/%s.tmpl" $ctx.format) $transcript -}}
{{- else -}}
{{- errorf "failed to get resource %q for episode %q" $resource_name $ctx.episode.Title -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}

View file

@ -0,0 +1,20 @@
{{- range . -}}
{{- if reflect.IsMap . -}}
{{- with .speaker -}}
<cite>{{- . | transform.HTMLEscape -}}</cite>
{{- "\n" -}}
{{- end -}}
{{- with .start -}}
<time>{{- strings.Replace . "," "." | transform.HTMLEscape -}}</time>
{{- "\n" -}}
{{- end -}}
<p>
{{- .line | transform.HTMLEscape -}}
{{- with .line2 -}}
{{- " " | transform.HTMLEscape -}}
{{- . | transform.HTMLEscape -}}
{{- end -}}
</p>
{{- "\n" -}}
{{- end -}}
{{- end -}}

View file

@ -0,0 +1,25 @@
{{- $segments := slice -}}
{{- range . -}}
{{- if reflect.IsMap . -}}
{{- $start_ms := partial "timecode_to_ms.tmpl" .start -}}
{{- $end_ms := partial "timecode_to_ms.tmpl" .end -}}
{{- $start_secs := math.Div $start_ms 1000.0 -}}
{{- $end_secs := math.Div $end_ms 1000.0 -}}
{{- $concat := true -}}
{{- if and .speaker2 (ne .speaker .speaker2) -}}
{{- $entry := dict "startTime" $start_secs "endTime" $end_secs "speaker" .speaker "body" .line -}}
{{- $entry2 := dict "startTime" $start_secs "endTime" $end_secs "speaker" .speaker2 "body" .line2 -}}
{{- $segments = collections.Append $entry $entry2 $segments -}}
{{- $concat = false -}}
{{- end -}}
{{- if $concat -}}
{{- $body := .line -}}
{{- if .line2 -}}
{{- $body = printf "%s %s" $body .line2 -}}
{{- end -}}
{{- $entry := dict "startTime" $start_secs "endTime" $end_secs "speaker" .speaker "body" $body -}}
{{- $segments = collections.Append $entry $segments -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- dict "version" "1.0.0" "segments" $segments | encoding.Jsonify (dict "indent" " ") -}}

View file

@ -0,0 +1,25 @@
{{- $segments := slice -}}
{{- range . -}}
{{- if reflect.IsMap . -}}
{{- $start_dot := strings.Replace .start "," "." -}}
{{- $end_dot := strings.Replace .end "," "." -}}
{{- $start_ms := partial "timecode_to_ms.tmpl" .start -}}
{{- $end_ms := partial "timecode_to_ms.tmpl" .end -}}
{{- $concat := true -}}
{{- if and .speaker2 (ne .speaker .speaker2) -}}
{{- $entry := dict "start" $start_dot "start_ms" $start_ms "end" $end_dot "end_ms" $end_ms "speaker" "" "voice" .speaker "text" .line -}}
{{- $entry2 := dict "start" $start_dot "start_ms" $start_ms "end" $end_dot "end_ms" $end_ms "speaker" "" "voice" .speaker2 "text" .line2 -}}
{{- $segments = collections.Append $entry $entry2 $segments -}}
{{- $concat = false -}}
{{- end -}}
{{- if $concat -}}
{{- $text := .line -}}
{{- if .line2 -}}
{{- $text = printf "%s %s" $text .line2 -}}
{{- end -}}
{{- $entry := dict "start" $start_dot "start_ms" $start_ms "end" $end_dot "end_ms" $end_ms "speaker" "" "voice" .speaker "text" $text -}}
{{- $segments = collections.Append $entry $segments -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- $segments | encoding.Jsonify (dict "indent" " ") -}}

View file

@ -0,0 +1,13 @@
{{- $counter := 1 -}}
{{- range . -}}
{{- if reflect.IsMap . -}}
{{- printf "%d\n" $counter -}}
{{- printf "%s --> %s\n" .start .end | safe.HTML -}}
{{- printf "%s\n" .line | safe.HTML -}}
{{- with .line2 -}}
{{- printf "%s\n" . | safe.HTML -}}
{{- end -}}
{{- "\n" -}}
{{- end -}}
{{- $counter = add $counter 1 -}}
{{- end -}}

View file

@ -0,0 +1,24 @@
WEBVTT
{{- "\n\n" -}}
{{- range . -}}
{{- if reflect.IsMap . -}}
{{- printf "%s --> %s\n" .start .end | safe.HTML -}}
{{- with .speaker -}}
{{- printf "<v %s>" (. | transform.HTMLEscape) | safe.HTML -}}
{{- end -}}
{{- printf "%s" .line | safe.HTML -}}
{{- if .line2 -}}
{{- $to_print := true -}}
{{- if .speaker2 -}}
{{- if ne .speaker .speaker2 -}}
{{- printf "</v><v %s>%s</v>" (.speaker2 | transform.HTMLEscape) .line | safe.HTML -}}
{{- $to_print = false -}}
{{- end -}}
{{- end -}}
{{- if $to_print -}}
{{- printf " %s" .line2 -}}
{{- end -}}
{{- end -}}
{{- "\n\n" -}}
{{- end -}}
{{- end -}}

View file

@ -0,0 +1,39 @@
<header><h1>{{ printf (T "welcome") .Title }}</h1></header>
<nav>
{{- $season_cnt := 0 -}}
{{- $season_lst := slice -}}
{{- range .Sections -}}
{{- if eq .Type "season" -}}
{{- $season_cnt = add $season_cnt 1 -}}
{{- $season_lst = collections.Append (dict "number" .Params.season.number "title" .Params.season.title "object" .) $season_lst -}}
{{- end -}}
{{- end -}}
{{- if gt $season_cnt 0 -}}
<section>
<h2>
{{- printf "%s%s" (T "seasons" | strings.FirstUpper) (T "colon") -}}
</h2>
{{- $season_lst = collections.Sort $season_lst "number" "asc" -}}
{{- end -}}
{{- range $season_lst -}}
<article>
<p><a href="{{- (collections.Index . "object").RelPermalink -}}">{{- printf "%s %d%s %s" (T "season" | strings.FirstUpper) (collections.Index . "number") (T "colon") (collections.Index . "title") -}}</a></p>
</article>
{{- end -}}
</section>
<section>
<h2>
{{- printf "%s%s" (T "episodes" | strings.FirstUpper ) (T "colon") -}}
</h2>
{{ range .RegularPagesRecursive }}
<article>
<p><a href="{{- .RelPermalink -}}">
{{- if .Params.season -}}
{{- printf "%s %d%s " (T "season" | strings.FirstUpper) (collections.Index .Params.season "number") (T "colon") -}}
{{- end -}}
{{- .Title -}}
</a></p>
</article>
{{ end }}
</section>
</nav>

View file

@ -0,0 +1,507 @@
{{- $use_op3 := .Params.use_op3 -}}
{{- $guid := .Params.guid -}}
{{- $podcast_type := "" -}}
{{- /* Either external_url or resource_file must be defined; use external_url if it is defined. If not, get the resource designated by the resource_file parameter. The resource identifier must be relative to the podcast directory */ -}}
{{- $image := "" -}}
{{- if collections.Index .Params.image "external_url" -}}
{{- collections.Index .Params.image "external_url" | transform.XMLEscape -}}
{{- else if collections.Index .Params.image "resource_file" -}}
{{- with collections.Index .Params.image "resource_file" | .Resources.Get -}}
{{- $image = .Permalink -}}
{{- else -}}
{{- errorf "failed to fetch resource %q" (collections.Index .Params.image "resource_file") -}}
{{- end -}}
{{- else -}}
{{- errorf "empty image parameter on the podcast %q definition" .Title -}}
{{- end -}}
{{- $indent := 2 -}}
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:podcast="https://podcastindex.org/namespace/1.0" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<title>
{{- .Title | transform.XMLEscape -}}
</title>
<description>
{{- .Description | transform.XMLEscape -}}
</description>
<generator>Hugo (with git.broken-by-design.fr/fmaury/podcast-mod)</generator>
<lastBuildDate>
{{- time.Now.Format "Mon, 02 Jan 2006 15:04:05 MST" -}}
</lastBuildDate>
<language>
{{- .Language.Lang -}}
</language>
<itunes:image>
{{- $image -}}
</itunes:image>
<atom:link href="{{ .Permalink }}" rel="self" type="application/rss+xml" />
<itunes:explicit>{{ .Params.explicit | transform.XMLEscape }}</itunes:explicit>
<podcast:guid>{{ .Params.guid | transform.XMLEscape }}</podcast:guid>
{{- "\n" -}}
{{- with .Params.copyright -}}
{{- strings.Repeat $indent " " -}}
<copyright>
{{- . | transform.XMLEscape -}}
</copyright>
{{- "\n" -}}
{{- end -}}
{{- /* Categories are restricted to a set of values. The acceptable values are listed here: https://github.com/Podcastindex-org/podcast-namespace/blob/main/categories.json */ -}}
{{- /* The following code ensures the attribute is set (Apple requires it) and validates the value against the list of acceptable values */ -}}
{{- with .Params.category }}
{{- $category := "" -}}
{{- $categories := resources.Get "categories.json" | transform.Unmarshal -}}
{{- $categoryFound := 0 -}}
{{- range ( collections.Index $categories "Categories") -}}
{{- if collections.Index . "name" | compare.Eq $.Params.category -}}
{{- $categoryFound = 1 -}}
{{- end -}}
{{- end -}}
{{- if $categoryFound -}}
{{- strings.Repeat $indent " " -}}
<itunes:category>
{{- . | transform.XMLEscape -}}
</itunes:category>
{{- "\n" -}}
{{- else -}}
{{- errorf "could not find %q in known categories" . -}}
{{- end -}}
{{- else -}}
{{- errorf "missing category definition for podcast %q" .Title -}}
{{- end -}}
{{- with .Params.website_link }}
{{- strings.Repeat $indent " " -}}
<link>
{{- . | transform.XMLEscape -}}
</link>
{{- "\n" -}}
{{- end -}}
{{- with .Params.author -}}
{{- strings.Repeat $indent " " -}}
<itunes:author>
{{- . | transform.XMLEscape -}}
</itunes:author>
{{- "\n" -}}
{{- end -}}
{{- with .Params.podcast_type -}}
{{- $podcast_type = . -}}
{{- strings.Repeat $indent " " -}}
<itunes:type>
{{- . | transform.XMLEscape -}}
</itunes:type>
{{- "\n" -}}
{{- end -}}
{{- if and .Params.author .Params.email -}}
{{- strings.Repeat $indent " " -}}
<itunes:owner>
{{- "\n" -}}
{{- strings.Repeat (add $indent 1) " " -}}
<itunes:name>
{{- .Params.author | transform.XMLEscape -}}
</itunes:name>
{{- "\n" -}}
{{- strings.Repeat (add $indent 1) " " -}}
<itunes:email>
{{- .Params.email | transform.XMLEscape -}}
</itunes:email>
{{- "\n" -}}
{{- strings.Repeat $indent " " -}}
</itunes:owner>
{{- "\n" -}}
{{- end -}}
{{- if and .Params.email .Params.locked -}}
{{- strings.Repeat $indent " " -}}
<podcast:locked owner="{{ .Params.email | transform.XMLEscape }}">
{{- .Params.locked | transform.XMLEscape -}}
</podcast:locked>
{{- "\n" -}}
{{- end -}}
{{- with .Params.medium -}}
{{- strings.Repeat $indent " " -}}
<podcast:medium>
{{- . | transform.XMLEscape -}}
</podcast:medium>
{{- "\n" -}}
{{- end -}}
{{- partial "licence.rss.xml" (dict "context" . "indent" $indent) -}}
{{- partial "images.rss.xml" (dict "context" . "indent" $indent) -}}
{{- with .Params.funding -}}
{{- partial "funding.rss.xml" (dict "context" . "indent" $indent) -}}
{{- end -}}
{{- partial "location.rss.xml" (dict "context" . "indent" $indent) -}}
{{- with .Params.trailer -}}
{{- range . -}}
{{- $season_attr := "" -}}
{{- $url := "" -}}
{{- with collections.Index . "resource_file" | $.Resources.Get -}}
{{- $url = .Permalink -}}
{{- else -}}
{{- $url = collections.Index . "external_url" -}}
{{- end -}}
{{- strings.Repeat $indent " " -}}
<podcast:trailer
{{- " " -}}
pubdate="{{- collections.Index . "pubdate" | transform.XMLEscape -}}"
{{- " " -}}
url="{{- $url -}}"
{{- " " -}}
length="{{- collections.Index . "length" | transform.XMLEscape -}}"
{{- " " -}}
type="{{- collections.Index . "type" | transform.XMLEscape -}}"
{{- if collections.Index . "season" -}}
{{- " " -}}
season="{{- collections.Index . "season" | transform.XMLEscape -}}"
{{- end -}}
>
{{- collections.Index . "title" | transform.XMLEscape -}}
</podcast:trailer>
{{- "\n" -}}
{{- end -}}
{{- end -}}
{{- with .Params.social_interacts -}}
{{- partial "socialInteracts.rss.xml" (dict "context" . "indent" $indent) -}}
{{- end -}}
{{- with .Params.podroll -}}
{{- strings.Repeat $indent " " -}}
<podcast:podroll>
{{- partial "remoteItems.rss.xml" (dict "context" . "indent" (add $indent 1)) -}}
</podcast:podroll>
{{- "\n" -}}
{{- end -}}
{{- with .Params.remote_items -}}
{{- partial "remoteItems.rss.xml" (dict "context" . "indent" $indent) -}}
{{- end -}}
{{- with .Params.update_frequency -}}
{{- strings.Repeat $indent " " -}}
<podcast:updateFrequency
{{- if collections.Index . "complete" -}}
{{- " " -}}
complete="true"
{{- else -}}
{{- $dtstart := collections.Index . "dtstart" -}}
{{- " " | safe.HTMLAttr -}}
rrule="{{- collections.Index . "rrule" | transform.XMLEscape -}}"
{{- if $dtstart -}}
{{- " " | safe.HTMLAttr -}}
dtstart="{{- $dtstart | transform.XMLEscape -}}"
{{- end -}}
{{- end -}}
>
{{- collections.Index . "description" | transform.XMLEscape -}}
</podcast:updateFrequency>
{{- "\n" -}}
{{- end -}}
{{- with .Params.recommendations -}}
{{- partial "recommendations.rss.xml" (dict "context" . "indent" $indent) -}}
{{- end -}}
{{- with .Params.persons -}}
{{- partial "persons.rss.xml" (dict "context" . "indent" $indent) -}}
{{- end -}}
{{- range .RegularPagesRecursive.ByDate.Reverse -}}
{{- $episode_page := . -}}
{{- $episode_title := .Title -}}
{{- strings.Repeat $indent " " -}}
<item>
{{- "\n" -}}
{{- $indent = add $indent 1 -}}
{{- strings.Repeat $indent " " -}}
<title>
{{- .Title | transform.XMLEscape -}}
</title>
{{- "\n" -}}
{{- strings.Repeat $indent " " -}}
<guid>
{{- with .Params.guid -}}
{{- . | transform.XMLEscape -}}
{{- else -}}
{{- errorf "missing required guid parameter for episode %q" $episode_title -}}
{{- end -}}
</guid>
{{- "\n" -}}
{{- with .Params.enclosure -}}
{{- $url := partial "enclosure_url.rss.xml" (dict "context" . "episode_page" $episode_page "guid" $guid "use_op3" $use_op3) -}}
{{- strings.Repeat $indent " " -}}
<enclosure
{{- " " | safe.HTMLAttr -}}
url="{{- $url | transform.XMLEscape -}}"
{{- " " | safe.HTMLAttr -}}
type="{{- collections.Index . "type" | transform.XMLEscape -}}"
{{- " " | safe.HTMLAttr -}}
length="{{- collections.Index . "length" | transform.XMLEscape -}}"
{{- " " | safe.HTMLAttr -}}
/>
{{- "\n" -}}
{{- else -}}
{{- errorf "missing required enclosure parameter for episode %q" $episode_title -}}
{{- end -}}
{{- strings.Repeat $indent " " -}}
<pubDate>
{{- .Date.Format "Mon, 02 Jan 2006 15:04:05 MST" | transform.XMLEscape -}}
</pubDate>
{{- "\n" -}}
{{- strings.Repeat $indent " " -}}
<description>
{{- .Description | transform.XMLEscape -}}
</description>
{{- "\n" -}}
{{- with .Params.duration -}}
{{- strings.Repeat $indent " " -}}
<itunes:duration>
{{- . | transform.XMLEscape -}}
</itunes:duration>
{{- "\n" -}}
{{- end -}}
{{- strings.Repeat $indent " " -}}
<link>
{{- .Permalink | transform.XMLEscape -}}
</link>
{{- "\n" -}}
{{- with .Params.image -}}
{{ $url := ""}}
{{- with collections.Index . "external_url" -}}
{{- $url = . -}}
{{- else -}}
{{- $resource_file := collections.Index . "resource_file" -}}
{{- with $episode_page.Resources.Get $resource_file -}}
{{- $url = .Permalink -}}
{{- else -}}
{{- errorf "failed to get resource %q for episode %q" $resource_file $episode_title -}}
{{- end -}}
{{- end -}}
{{- strings.Repeat $indent " " -}}
<itunes:image>
{{- $url | transform.XMLEscape -}}
</itunes:image>
{{- "\n" -}}
{{- end -}}
{{- with .Params.explicit -}}
{{- strings.Repeat $indent " " -}}
<itunes:explicit>
{{- . | transform.XMLEscape -}}
</itunes:explicit>
{{- "\n" -}}
{{- end -}}
{{- with .Params.episode_number -}}
{{- strings.Repeat $indent " " -}}
<itunes:episode>
{{- . | transform.XMLEscape -}}
</itunes:episode>
{{- "\n" -}}
{{- else -}}
{{- if eq $podcast_type "serial" -}}
{{- errorf "missing episode number for episode %q while podcast type is serial" $episode_title -}}
{{- end -}}
{{- end -}}
{{- with .Params.season -}}
{{- strings.Repeat $indent " " -}}
<itunes:season>
{{- collections.Index . "number" | transform.XMLEscape -}}
</itunes:season>
{{- "\n" -}}
{{- strings.Repeat $indent " " -}}
<podcast:season
{{- with collections.Index . "title" -}}
{{- " " | safe.HTMLAttr -}}
season="{{- . | transform.XMLEscape -}}"
{{- end -}}
>
{{- collections.Index . "number" | transform.XMLEscape -}}
</podcast:season>
{{- "\n" -}}
{{- end -}}
{{- with .Params.episode_type -}}
{{- strings.Repeat $indent " " -}}
<itunes:episodeType>
{{- . | transform.XMLEscape -}}
</itunes:episodeType>
{{- "\n" -}}
{{- end -}}
{{- with .Params.alternate_enclosures -}}
{{- range . -}}
{{- strings.Repeat $indent " " -}}
<podcast:alternateEnclosure
{{- with collections.Index . "type" -}}
{{- " " | safe.HTMLAttr -}}
type="{{- . | transform.XMLEscape -}}"
{{- else -}}
{{- errorf "alternate enclosure missing required attribute type for episode %q: %q" $episode_title . -}}
{{- end -}}
{{- with collections.Index . "length" -}}
{{- " " | safe.HTMLAttr -}}
length="{{- . | transform.XMLEscape -}}"
{{- end -}}
{{- with collections.Index . "bitrate" -}}
{{- " " | safe.HTMLAttr -}}
bitrate="{{- . | transform.XMLEscape -}}"
{{- end -}}
{{- with collections.Index . "lang" -}}
{{- " " | safe.HTMLAttr -}}
lang="{{- . | transform.XMLEscape -}}"
{{- end -}}
{{- with collections.Index . "title" -}}
{{- " " | safe.HTMLAttr -}}
title="{{- . | transform.XMLEscape -}}"
{{- end -}}
{{- with collections.Index . "codecs" -}}
{{- " " | safe.HTMLAttr -}}
codecs="{{- . | transform.XMLEscape -}}"
{{- end -}}
>
{{- "\n" -}}
{{- with collections.Index . "sri_hash" -}}
{{- strings.Repeat (add $indent 1) " " -}}
<podcast:integrity type="sri" value="{{- . | transform.XMLEscape -}}" />
{{- "\n" -}}
{{- end -}}
{{- range collections.Index . "sources" -}}
{{- $url := partial "enclosure_url.rss.xml" (dict "context" . "episode_page" $episode_page "guid" $guid "use_op3" $use_op3) -}}
{{- strings.Repeat (add $indent 1) " " -}}
<podcast:source uri="{{- $url | transform.XMLEscape -}}"
{{- with collections.Index . "type" -}}
{{- " " | safe.HTMLAttr -}}
contentType="{{- . | transform.XMLEscape -}}"
{{- end -}}
{{- " " | safe.HTMLAttr -}}
/>
{{- end -}}
{{- "\n" -}}
{{- strings.Repeat $indent " " -}}
</podcast:alternateEnclosure>
{{- "\n" -}}
{{- end -}}
{{- end -}}
{{- with .Params.transcript -}}
{{- range . -}}
{{- $rel := collections.Index . "rel" -}}
{{- $lang := collections.Index . "language" -}}
{{- $srt_url := "" -}}
{{- $webvtt_url := "" -}}
{{- $html_url := "" -}}
{{- $json_url := "" -}}
{{- with collections.Index . "content" -}}
{{- /* if content is defined, it means we are generating the transcripts ourselves */ -}}
{{- with $episode_page.OutputFormats.Get "transcriptsrt" -}}
{{- $srt_url = .Permalink -}}
{{- end -}}
{{- with $episode_page.OutputFormats.Get "transcriptwebvtt" -}}
{{- $webvtt_url = .Permalink -}}
{{- end -}}
{{- with $episode_page.OutputFormats.Get "transcripthtml" -}}
{{- $html_url = .Permalink -}}
{{- end -}}
{{- with $episode_page.OutputFormats.Get "transcriptjson" -}}
{{- $json_url = .Permalink -}}
{{- end -}}
{{- else -}}
{{- $external_content := collections.Index . "external_content" -}}
{{- $srt_url = collections.Index $external_content "srt" -}}
{{- $webvtt_url = collections.Index $external_content "webvtt" -}}
{{- $html_url = collections.Index $external_content "html" -}}
{{- $json_url = collections.Index $external_content "json" -}}
{{- end -}}
{{- with $srt_url -}}
{{- partial "transcript.rss.xml" (dict "resource" . "type" "application/x-subrip" "lang" $lang "rel" $rel "episode_page" $episode_page "indent" $indent) -}}
{{- end -}}
{{- with $webvtt_url -}}
{{- partial "transcript.rss.xml" (dict "resource" . "type" "text/webvtt" "lang" $lang "rel" $rel "episode_page" $episode_page "indent" $indent) -}}
{{- end -}}
{{- with $html_url -}}
{{- partial "transcript.rss.xml" (dict "resource" . "type" "text/html" "lang" $lang "rel" $rel "episode_page" $episode_page "indent" $indent) -}}
{{- end -}}
{{- with $json_url -}}
{{- partial "transcript.rss.xml" (dict "resource" . "type" "application/json" "lang" $lang "rel" $rel "episode_page" $episode_page "indent" $indent) -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- with .Params.funding -}}
{{- partial "funding.rss.xml" (dict "context" . "indent" $indent) -}}
{{- end -}}
{{- with .Params.persons -}}
{{- partial "persons.rss.xml" (dict "context" . "indent" $indent) -}}
{{- end -}}
{{- with .Params.social_interacts -}}
{{- partial "socialInteracts.rss.xml" (dict "context" . "indent" $indent) -}}
{{- end -}}
{{- with .Params.recommendations -}}
{{- partial "recommendations.rss.xml" (dict "context" . "indent" $indent) -}}
{{- end -}}
{{- partial "images.rss.xml" (dict "context" . "indent" $indent) -}}
{{- partial "licence.rss.xml" (dict "context" . "indent" $indent) -}}
{{- partial "location.rss.xml" (dict "context" . "indent" $indent) -}}
{{- with .Params.soundbites -}}
{{- range . -}}
{{- strings.Repeat $indent " " -}}
<podcast:soundbite startTime="{{- collections.Index . "start_time" | transform.XMLEscape -}}" duration="{{- collections.Index . "duration" -}}"
{{- with collections.Index . "title" -}}
>{{- . | transform.XMLEscape -}}</podcast:soundbite>
{{- else -}}
{{- " " | safe.HTMLAttr -}}
/>
{{- end -}}
{{- "\n" -}}
{{- end -}}
{{- end -}}
{{- with .Params.chapters -}}
{{- with $episode_page.OutputFormats.Get "chapters" -}}
{{- strings.Repeat $indent " " -}}
<podcast:chapters url="{{ .Permalink }}" type="application/json+chapters" />
{{- "\n" -}}
{{- end -}}
{{- strings.Repeat $indent " " -}}
<psc:chapters version="1.2" xmlns:psc="http://podlove.org/simple-chapters">
{{- "\n" -}}
{{- range . -}}
{{- partial "podlove_chapters.rss.xml" (dict "context" . "indent" (add $indent 1)) -}}
{{- end -}}
{{- strings.Repeat $indent " " -}}
</psc:chapters>
{{- "\n" -}}
{{- end -}}
{{- $indent = sub $indent 1 -}}
{{- strings.Repeat $indent " " -}}
</item>
{{- "\n" -}}
{{- end -}}
</channel>
</rss>

View file

@ -0,0 +1,5 @@
<p>{{ .Title }}</p>
{{ $subSections := .Sections }}
{{ range $subSections }}
<p><a href="{{ .RelPermalink }}">{{ .Title }}</a></p>
{{ end }}

View file

@ -0,0 +1,4 @@
Episodes :
{{ range .RegularPages }}
<p>{{ .Title }}</p>
{{ end }}