Leitgedanken/msd2/wordpress/wp-content/plugins/amp/includes/embeds/class-amp-soundcloud-embed.php
2023-01-23 11:03:31 +01:00

194 lines
4.6 KiB
PHP

<?php
/**
* Class AMP_SoundCloud_Embed_Handler
*
* @package AMP
*/
/**
* Class AMP_SoundCloud_Embed_Handler
*
* @since 0.5
*/
class AMP_SoundCloud_Embed_Handler extends AMP_Base_Embed_Handler {
/**
* Default height.
*
* @var int
*/
protected $DEFAULT_HEIGHT = 200;
/**
* Register embed.
*/
public function register_embed() {
add_shortcode( 'soundcloud', array( $this, 'shortcode' ) );
add_filter( 'embed_oembed_html', array( $this, 'filter_embed_oembed_html' ), 10, 2 );
}
/**
* Unregister embed.
*/
public function unregister_embed() {
remove_shortcode( 'soundcloud' );
remove_filter( 'embed_oembed_html', array( $this, 'filter_embed_oembed_html' ), 10 );
}
/**
* Render oEmbed.
*
* @see \WP_Embed::shortcode()
*
* @deprecated Core's oEmbed handler is now used instead, with embed_oembed_html filter used to convert to AMP.
* @param array $matches URL pattern matches.
* @param array $attr Shortcode attribues.
* @param string $url URL.
* @return string Rendered oEmbed.
*/
public function oembed( $matches, $attr, $url ) {
_deprecated_function( __METHOD__, '0.6' );
unset( $matches, $attr );
$track_id = $this->get_track_id_from_url( $url );
return $this->render( compact( 'track_id' ) );
}
/**
* Filter oEmbed HTML for SoundCloud to convert to AMP.
*
* @param string $cache Cache for oEmbed.
* @param string $url Embed URL.
* @return string Embed.
*/
public function filter_embed_oembed_html( $cache, $url ) {
$parsed_url = wp_parse_url( $url );
if ( false === strpos( $parsed_url['host'], 'soundcloud.com' ) ) {
return $cache;
}
return $this->parse_amp_component_from_iframe( $cache );
}
/**
* Parse AMP component from iframe.
*
* @param string $html HTML.
* @return string AMP component or empty if unable to determine SoundCloud ID.
*/
private function parse_amp_component_from_iframe( $html ) {
$embed = '';
if ( preg_match( '#<iframe.+?src="(?P<url>.+?)".*>#', $html, $matches ) ) {
$src = html_entity_decode( $matches['url'], ENT_QUOTES );
$query = array();
parse_str( wp_parse_url( $src, PHP_URL_QUERY ), $query );
if ( ! empty( $query['url'] ) ) {
$embed = $this->render(
array(
'track_id' => $this->get_track_id_from_url( $query['url'] ),
)
);
}
}
return $embed;
}
/**
* Render shortcode.
*
* @param array $attr Shortcode attributes.
* @param string $content Shortcode content.
* @return string Rendered shortcode.
*/
public function shortcode( $attr, $content = null ) {
$output = '';
if ( function_exists( 'soundcloud_shortcode' ) ) {
if ( empty( $attr['url'] ) && ! empty( $attr['id'] ) ) {
$attr['url'] = 'https://api.soundcloud.com/tracks/' . intval( $attr['id'] );
}
$output = soundcloud_shortcode( $attr, $content );
$output = $this->parse_amp_component_from_iframe( $output );
} else {
$url = null;
if ( isset( $attr['id'] ) ) {
$url = 'https://w.soundcloud.com/player/?url=https%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F' . intval( $attr['id'] );
}
if ( isset( $attr['url'] ) ) {
$url = $attr['url'];
} elseif ( isset( $attr[0] ) ) {
$url = $attr[0];
} elseif ( function_exists( 'shortcode_new_to_old_params' ) ) {
$url = shortcode_new_to_old_params( $attr );
}
if ( $url ) {
$output = $this->render_embed_fallback( $url );
}
}
return $output;
}
/**
* Render embed.
*
* @param array $args Args.
* @return string Rendered embed.
* @global WP_Embed $wp_embed
*/
public function render( $args ) {
$args = wp_parse_args(
$args,
array(
'track_id' => false,
'url' => null,
)
);
if ( empty( $args['track_id'] ) ) {
return $this->render_embed_fallback( $args['url'] );
}
$this->did_convert_elements = true;
return AMP_HTML_Utils::build_tag(
'amp-soundcloud',
array(
'data-trackid' => $args['track_id'],
'layout' => 'fixed-height',
'height' => $this->args['height'],
)
);
}
/**
* Render embed fallback.
*
* @param string $url URL.
* @returns string
*/
private function render_embed_fallback( $url ) {
return AMP_HTML_Utils::build_tag(
'a',
array(
'href' => esc_url( $url ),
'class' => 'amp-wp-embed-fallback',
),
esc_html( $url )
);
}
/**
* Get track_id from URL.
*
* @param string $url URL.
*
* @return string Track ID or empty string if none matched.
*/
private function get_track_id_from_url( $url ) {
$parsed_url = wp_parse_url( $url );
if ( ! preg_match( '#tracks/(?P<track_id>[^/]+)#', $parsed_url['path'], $matches ) ) {
return '';
}
return $matches['track_id'];
}
}