summaryrefslogtreecommitdiffstats
path: root/tpl/tplimpl/embedded/templates/shortcodes/youtube.html
blob: a9533b95ec49d93067d966db89ed18509ade0b46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
{{- /*
Renders an embedded YouTube video.

@param {bool} [allowFullScreen=true] Whether the iframe element can activate full screen mode.
@param {bool} [autoplay=false] Whether to automatically play the video. Forces mute to be true.
@param {string} [class] The class attribute of the wrapping div element. When specified, removes the style attributes from the iframe element and its wrapping div element.
@param {bool} [controls=true] Whether to display the video controls.
@param {int} [end] The time, measured in seconds from the start of the video, when the player should stop playing the video.
@param {string} [id] The video id. Optional if the id is provided as first positional argument.
@param {string} [loading=eager] The loading attribute of the iframe element.
@param {bool} [loop=false] Whether to indefinitely repeat the video.
@param {bool} [mute=false] Whether to mute the video. Always true when autoplay is true.
@param {int} [start] The time, measured in seconds from the start of the video, when the player should start playing the video.
@param {string} [title] The title attribute of the iframe element. Defaults to the title returned by YouTube oEmbed API.

@returns {template.HTML}

@reference https://developers.google.com/youtube/player_parameters

@example {{< youtube 0RKpf3rK57I >}}
@example {{< youtube id=0RKpf3rK57I loading=lazy start=30 >}}
*/}}

{{- $pc := .Page.Site.Config.Privacy.YouTube }}
{{- if not $pc.Disable }}
  {{- with $id := or (.Get "id") (.Get 0) }}

    {{- /* Get data from the YouTube oEmbed API. */}}
    {{- $q := querify "url" (printf "https://www.youtube.com/watch?v=%s" $id) "format" "json" }}
    {{- $url := printf "https://www.youtube.com/oembed?%s" $q }}
    {{- $data := dict }}
    {{- with resources.GetRemote $url }}
      {{- with .Err }}
        {{- errorf "The %q shortcode was unable to get remote resource %q. %s. See %s" $.Name $url . $.Position }}
      {{- else }}
        {{- $data = .Content | transform.Unmarshal }}
      {{- end }}
    {{- else }}
      {{- errorf "The %q shortcode was unable to get remote resource %q. See %s" $.Name $url $.Position }}
    {{- end }}

    {{/* Set defaults. */}}
    {{- $allowFullScreen := "allowfullscreen" }}
    {{- $autoplay := 0 }}
    {{- $class := "" }}
    {{- $controls := 1 }}
    {{- $end := 0 }}
    {{- $loading := "eager" }}
    {{- $loop := 0 }}
    {{- $mute := 0 }}
    {{- $start := 0 }}
    {{- $title := $data.title }}

    {{- /* Get arguments. */}}
    {{- if in (slice "false" false 0) ($.Get "allowFullScreen") }}
      {{- $allowFullScreen = "" }}
    {{- else if in (slice "true" true 1) ($.Get "allowFullScreen") }}
      {{- $allowFullScreen = "allowfullscreen" }}
    {{- end }}
    {{- if in (slice "false" false 0) ($.Get "autoplay") }}
      {{- $autoplay = 0 }}
    {{- else if in (slice "true" true 1) ($.Get "autoplay") }}
      {{- $autoplay = 1 }}
    {{- end }}
    {{- if in (slice "false" false 0) ($.Get "controls") }}
      {{- $controls = 0 }}
    {{- else if in (slice "true" true 1) ($.Get "controls") }}
      {{- $controls = 1 }}
    {{- end }}
    {{- if in (slice "false" false 0) ($.Get "loop") }}
      {{- $loop = 0 }}
    {{- else if in (slice "true" true 1) ($.Get "loop") }}
      {{- $loop = 1 }}
    {{- end }}
    {{- if in (slice "false" false 0) ($.Get "mute") }}
      {{- $mute = 0 }}
    {{- else if or (in (slice "true" true 1) ($.Get "mute")) $autoplay }}
      {{- $mute = 1 }}
    {{- end }}
    {{- $class := or ($.Get "class") $class }}
    {{- $end := or ($.Get "end") $end }}
    {{- $loading := or ($.Get "loading") $loading }}
    {{- $start := or ($.Get "start") $start }}
    {{- $title := or ($.Get "title") $title }}

    {{- /* Determine host. */}}
    {{- $host := cond $pc.PrivacyEnhanced "www.youtube-nocookie.com" "www.youtube.com" }}

    {{- /* Set styles. */}}
    {{- $divStyle := "position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;" }}
    {{- $iframeStyle := "position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" }}
    {{- if $class }}
      {{- $iframeStyle = "" }}
    {{- end }}

    {{- /* Set class or style of wrapping div element. */}}
    {{- $divClassOrStyle := printf "style=%q" $divStyle }}
    {{- with $class }}
      {{- $divClassOrStyle = printf "class=%q" $class }}
    {{- end }}

    {{- /* Define src attribute. */}}
    {{- $src := printf "https://%s/embed/%s" $host $id }}
    {{- $params := dict
      "autoplay" $autoplay
      "controls" $controls
      "end" $end
      "mute" $mute
      "start" $start
      "loop" $loop
    }}
    {{- if $loop }}
      {{- $params = merge $params (dict "playlist" $id) }}
    {{- end }}
    {{- $s := slice }}
    {{- range $k, $v := $params }}
      {{- $s = $s | append $k }}
      {{- $s = $s | append $v }}
    {{- end }}
    {{- with querify $s }}
      {{- $src = printf "%s?%s" $src . }}
    {{- end }}

    {{- /* Set iframe attributes. */}}
    {{- $iframeAttributes := dict
      "allow" "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
      "allowfullscreen" $allowFullScreen
      "loading" $loading
      "referrerpolicy" "strict-origin-when-cross-origin"
      "src" $src
      "style" $iframeStyle
      "title" $title
    }}

    {{- /* Render. */}}
    <div {{ $divClassOrStyle | safeHTMLAttr }}>
      <iframe
        {{- range $k, $v := $iframeAttributes }}
          {{- if $v }}
            {{- printf " %s=%q" $k $v | safeHTMLAttr }}
          {{- end }}
        {{- end }}
      ></iframe>
    </div>
  {{- else }}
    {{- errorf "The %q shortcode requires an id argument. See %s" .Name .Position }}
  {{- end }}
{{- end }}