PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 12.3
Jetpack – WP Security, Backup, Speed, & Growth v12.3
16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 All 501 releases
jetpack / modules / shortcodes / bandcamp.php
bandcamp.php
247 lines 7.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Shortcode handler for [bandcamp], which inserts a bandcamp.com
4 * music player (iframe, html5)
5 *
6 * [bandcamp album=119385304]
7 * [bandcamp album=3462839126 bgcol=FFFFFF linkcol=4285BB size=venti]
8 * [bandcamp track=2446959313]
9 *
10 * @package automattic/jetpack
11 */
12
13 /**
14 * Display the Bandcamp shortcode.
15 *
16 * @param array $atts Shortcode attributes.
17 */
18 function shortcode_handler_bandcamp( $atts ) {
19 $csswidth = null;
20 $cssheight = null;
21 // there are no default values, but specify here anyway to explicitly list supported atts.
22 $attributes = shortcode_atts(
23 array(
24 'album' => null, // integer album id.
25 'track' => null, // integer track id.
26 'video' => null, // integer track id for video player.
27 'size' => 'venti', // one of the supported sizes.
28 'bgcol' => 'FFFFFF', // hex, no '#' prefix.
29 'linkcol' => null, // hex, no '#' prefix.
30 'layout' => null, // encoded layout url.
31 'width' => null, // integer with optional "%".
32 'height' => null, // integer with optional "%".
33 'notracklist' => null, // may be string "true" (defaults false).
34 'tracklist' => null, // may be string "false" (defaults true).
35 // phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- false positive
36 'artwork' => null, // may be string "false" (alternately: "none") or "small" (default is large).
37 'minimal' => null, // may be string "true" (defaults false).
38 'theme' => null, // may be theme identifier string ("light"|"dark" so far).
39 'package' => null, // integer package id.
40 't' => null, // integer track number.
41 'tracks' => null, // comma separated list of allowed tracks.
42 'esig' => null, // hex, no '#' prefix.
43 ),
44 $atts,
45 'bandcamp'
46 );
47
48 $sizes = array(
49 'venti' => array(
50 'width' => 400,
51 'height' => 100,
52 ),
53 'grande' => array(
54 'width' => 300,
55 'height' => 100,
56 ),
57 'grande2' => array(
58 'width' => 300,
59 'height' => 355,
60 ),
61 'grande3' => array(
62 'width' => 300,
63 'height' => 415,
64 ),
65 'tall_album' => array(
66 'width' => 150,
67 'height' => 295,
68 ),
69 'tall_track' => array(
70 'width' => 150,
71 'height' => 270,
72 ),
73 'tall2' => array(
74 'width' => 150,
75 'height' => 450,
76 ),
77 'short' => array(
78 'width' => 46,
79 'height' => 23,
80 ),
81 'large' => array(
82 'width' => 350,
83 'height' => 470,
84 ),
85 'medium' => array(
86 'width' => 450,
87 'height' => 120,
88 ),
89 'small' => array(
90 'width' => 350,
91 'height' => 42,
92 ),
93 );
94
95 $sizekey = $attributes['size'];
96 $height = null;
97 $width = null;
98
99 $is_video = false;
100
101 /*
102 * Build iframe url. For audio players, args are appended as
103 * extra path segments for historical reasons having to
104 * do with an IE-only flash bug which required this URL
105 * to contain no querystring. Delay the actual joining
106 * of args into a string until after we decide if it's
107 * a video player or an audio player
108 */
109 $argparts = array();
110
111 if ( ! isset( $attributes['album'] ) && ! isset( $attributes['track'] ) && ! isset( $attributes['video'] ) ) {
112 return "[bandcamp: shortcode must include 'track', 'album', or 'video' param]";
113 }
114
115 if ( isset( $attributes['track'] ) && is_numeric( $attributes['track'] ) ) {
116 $track = esc_attr( $attributes['track'] );
117 array_push( $argparts, "track={$track}" );
118 } elseif ( isset( $attributes['video'] ) && is_numeric( $attributes['video'] ) ) {
119 $track = esc_attr( $attributes['video'] ); // videos are referenced by track id.
120 $url = '//bandcamp.com/EmbeddedPlayer/v=2';
121 $is_video = true;
122 array_push( $argparts, "track={$track}" );
123 }
124 if ( isset( $attributes['album'] ) && is_numeric( $attributes['album'] ) ) {
125 $album = esc_attr( $attributes['album'] );
126 array_push( $argparts, "album={$album}" );
127 }
128
129 if ( 'tall' === $sizekey ) {
130 if ( isset( $attributes['album'] ) ) {
131 $sizekey .= '_album';
132 } else {
133 $sizekey .= '_track';
134 }
135 }
136
137 // if size specified that we don't recognize, fall back on venti.
138 if ( empty( $sizes[ $sizekey ] ) ) {
139 $sizekey = 'venti';
140 $attributes['size'] = 'venti';
141 }
142
143 /*
144 * use strict regex for digits + optional % instead of absint for height/width
145 * 'width' and 'height' params in the iframe url get the exact string from the shortcode
146 * args, whereas the inline style attribute must have "px" added to it if it has no "%"
147 */
148 if ( isset( $attributes['width'] ) && preg_match( '|^([0-9]+)(%)?$|', $attributes['width'], $matches ) ) {
149 $width = $attributes['width'];
150 $csswidth = $attributes['width'];
151 if ( count( $matches ) < 3 ) {
152 $csswidth .= 'px';
153 }
154 }
155 if ( isset( $attributes['height'] ) && preg_match( '|^([0-9]+)(%)?$|', $attributes['height'], $matches ) ) {
156 $height = $attributes['height'];
157 $cssheight = $attributes['height'];
158 if ( count( $matches ) < 3 ) {
159 $cssheight .= 'px';
160 }
161 }
162
163 if ( ! $height ) {
164 $height = $sizes[ $sizekey ]['height'];
165 $cssheight = $height . 'px';
166 }
167
168 if ( ! $width ) {
169 $width = $sizes[ $sizekey ]['width'];
170 $csswidth = $width . 'px';
171 }
172
173 if ( isset( $attributes['layout'] ) ) {
174 array_push( $argparts, "layout={$attributes['layout']}" );
175 } elseif ( isset( $attributes['size'] ) && preg_match( '|^[a-zA-Z0-9]+$|', $attributes['size'] ) ) {
176 array_push( $argparts, "size={$attributes['size']}" );
177 }
178
179 if ( isset( $attributes['bgcol'] ) && preg_match( '|^[0-9A-Fa-f]+$|', $attributes['bgcol'] ) ) {
180 array_push( $argparts, "bgcol={$attributes['bgcol']}" );
181 }
182
183 if ( isset( $attributes['linkcol'] ) && preg_match( '|^[0-9A-Fa-f]+$|', $attributes['linkcol'] ) ) {
184 array_push( $argparts, "linkcol={$attributes['linkcol']}" );
185 }
186
187 if ( isset( $attributes['package'] ) && preg_match( '|^[0-9]+$|', $attributes['package'] ) ) {
188 array_push( $argparts, "package={$attributes['package']}" );
189 }
190
191 if ( isset( $attributes['t'] ) && preg_match( '|^[0-9]+$|', $attributes['t'] ) ) {
192 array_push( $argparts, "t={$attributes['t']}" );
193 }
194
195 if ( 'true' === $attributes['notracklist'] ) {
196 array_push( $argparts, 'notracklist=true' );
197 }
198
199 // 'tracklist' arg deprecates 'notracklist=true' to be less weird. note, behavior
200 // if both are specified is undefined
201 switch ( $attributes['tracklist'] ) {
202 case 'false':
203 case 'none':
204 array_push( $argparts, 'tracklist=false' );
205 break;
206 }
207
208 switch ( $attributes['artwork'] ) {
209 case 'false':
210 case 'none':
211 case 'small':
212 array_push( $argparts, 'artwork=' . $attributes['artwork'] );
213 break;
214 }
215
216 if ( 'true' === $attributes['minimal'] ) {
217 array_push( $argparts, 'minimal=true' );
218 }
219
220 if ( isset( $attributes['theme'] ) && preg_match( '|^[a-zA-Z_]+$|', $attributes['theme'] ) ) {
221 array_push( $argparts, "theme={$attributes['theme']}" );
222 }
223
224 // param 'tracks' is signed digest param 'esig'.
225 if ( isset( $attributes['tracks'] ) && preg_match( '|^[0-9\,]+$|', $attributes['tracks'] ) ) {
226 if ( isset( $attributes['esig'] ) && preg_match( '|^[0-9A-Fa-f]+$|', $attributes['esig'] ) ) {
227 array_push( $argparts, "tracks={$attributes['tracks']}" );
228 array_push( $argparts, "esig={$attributes['esig']}" );
229 }
230 }
231
232 if ( $is_video ) {
233 $url = '//bandcamp.com/VideoEmbed?' . implode( '&', $argparts );
234 $extra_attrs = " mozallowfullscreen='1' webkitallowfullscreen='1' allowfullscreen='1'";
235 } else {
236 $url = '//bandcamp.com/EmbeddedPlayer/v=2/' . implode( '/', $argparts ) . '/';
237 $extra_attrs = '';
238 }
239
240 $iframe = '<iframe width="%s" height="%s" style="position: relative; display: block; width: %s; height: %s;" src="%s" allowtransparency="true" frameborder="0"%s></iframe>';
241 $iframe = sprintf( $iframe, esc_attr( $width ), esc_attr( $height ), esc_attr( $csswidth ), esc_attr( $cssheight ), esc_url( $url ), $extra_attrs );
242
243 return $iframe;
244 }
245
246 add_shortcode( 'bandcamp', 'shortcode_handler_bandcamp' );
247