summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/extensions/blocks/anchor-fm/anchor-fm.php')
-rw-r--r--plugins/jetpack/extensions/blocks/anchor-fm/anchor-fm.php191
1 files changed, 191 insertions, 0 deletions
diff --git a/plugins/jetpack/extensions/blocks/anchor-fm/anchor-fm.php b/plugins/jetpack/extensions/blocks/anchor-fm/anchor-fm.php
new file mode 100644
index 00000000..f3e0bafe
--- /dev/null
+++ b/plugins/jetpack/extensions/blocks/anchor-fm/anchor-fm.php
@@ -0,0 +1,191 @@
+<?php
+/**
+ * Anchor.fm integration.
+ *
+ * @since 9.3.0
+ *
+ * @package automattic/jetpack
+ */
+
+namespace Automattic\Jetpack\Extensions\AnchorFm;
+
+use Automattic\Jetpack\Assets;
+use Automattic\Jetpack\Blocks;
+use Jetpack_Podcast_Helper;
+
+const FEATURE_NAME = 'anchor-fm';
+const BLOCK_NAME = 'jetpack/' . FEATURE_NAME;
+
+if ( ! class_exists( 'Jetpack_Podcast_Helper' ) ) {
+ \jetpack_require_lib( 'class-jetpack-podcast-helper' );
+}
+
+/**
+ * Registers Anchor.fm integration for the block editor.
+ */
+function register_extension() {
+ Blocks::jetpack_register_block( BLOCK_NAME );
+
+ // Register post_meta for connecting Anchor podcasts with posts.
+ register_post_meta(
+ 'post',
+ 'jetpack_anchor_podcast',
+ array(
+ 'show_in_rest' => true,
+ 'single' => true,
+ 'type' => 'string',
+ )
+ );
+ register_post_meta(
+ 'post',
+ 'jetpack_anchor_episode',
+ array(
+ 'show_in_rest' => true,
+ 'single' => true,
+ 'type' => 'string',
+ )
+ );
+ register_post_meta(
+ 'post',
+ 'jetpack_anchor_spotify_show',
+ array(
+ 'show_in_rest' => true,
+ 'single' => true,
+ 'type' => 'string',
+ )
+ );
+}
+
+/**
+ * Checks URL params to determine the Anchor integration action to perform.
+ */
+function process_anchor_params() {
+ if (
+ ! function_exists( 'get_current_screen' )
+ || is_null( \get_current_screen() )
+ ) {
+ return;
+ }
+
+ // Return early if we are not in the block editor.
+ if ( ! wp_should_load_block_editor_scripts_and_styles() ) {
+ return;
+ }
+
+ $post = get_post();
+ if ( ! $post || ! $post->ID ) {
+ return;
+ }
+
+ // phpcs:disable WordPress.Security.NonceVerification.Recommended
+ $podcast_id = isset( $_GET['anchor_podcast'] ) ? sanitize_text_field( wp_unslash( $_GET['anchor_podcast'] ) ) : null;
+ $episode_id = isset( $_GET['anchor_episode'] ) ? sanitize_text_field( wp_unslash( $_GET['anchor_episode'] ) ) : null;
+ $spotify_url = isset( $_GET['spotify_url'] ) ? wp_unslash( $_GET['spotify_url'] ) : null;
+ // phpcs:enable WordPress.Security.NonceVerification.Recommended
+
+ $data = array(
+ 'actions' => array(),
+ );
+
+ // add / update Spotify Badge URL.
+ $valid_spotify_url = \Jetpack_Gutenberg::validate_block_embed_url( $spotify_url, array( 'open.spotify.com' ) );
+ if ( $valid_spotify_url ) {
+ $data['spotifyShowUrl'] = $valid_spotify_url;
+ if ( get_post_meta( $post->ID, 'jetpack_anchor_spotify_show', true ) !== $valid_spotify_url ) {
+ update_post_meta( $post->ID, 'jetpack_anchor_spotify_show', $valid_spotify_url );
+ }
+ }
+
+ if ( ! empty( $podcast_id ) ) {
+ $feed = 'https://anchor.fm/s/' . $podcast_id . '/podcast/rss';
+ $podcast_helper = new Jetpack_Podcast_Helper( $feed );
+ $rss = $podcast_helper->load_feed();
+ if ( ! \is_wp_error( $rss ) ) {
+ update_post_meta( $post->ID, 'jetpack_anchor_podcast', $podcast_id );
+
+ // If we haven't got an episode ID, try and get the latest episode.
+ if ( empty( $episode_id ) && $rss->get_item_quantity() ) {
+ $latest_episode = $rss->get_item( 0 );
+ if ( $latest_episode ) {
+ $episode_id = $latest_episode->get_id();
+ }
+ }
+
+ if ( ! empty( $episode_id ) ) {
+ $track = $podcast_helper->get_track_data( $episode_id, true );
+ if ( ! \is_wp_error( $track ) ) {
+ update_post_meta( $post->ID, 'jetpack_anchor_episode', $track['guid'] );
+
+ if ( 'post-new.php' === $GLOBALS['pagenow'] ) {
+ $data['actions'][] = array(
+ 'set-episode-title',
+ array(
+ 'title' => $track['title'],
+ ),
+ );
+
+ $self_links = $rss->get_links( 'self' );
+ $cover = $rss->get_image_url();
+
+ // Add insert basic template action.
+ $data['actions'][] = array(
+ 'insert-episode-template',
+ array(
+ 'feedUrl' => ! empty( $self_links ) ? esc_url_raw( $self_links[0] ) : $feed,
+ 'coverImage' => ! empty( $cover ) ? esc_url( $cover ) : null,
+ 'episodeTrack' => $track,
+ 'spotifyImageUrl' => Assets::staticize_subdomain( 'https://wordpress.com/i/spotify-badge.svg' ),
+ 'spotifyShowUrl' => esc_url_raw( $valid_spotify_url ),
+ ),
+ );
+ }
+ } else {
+ $retry_url = add_query_arg(
+ array(
+ 'anchor_episode' => $episode_id,
+ 'anchor_podcast' => $podcast_id,
+ 'spotify_url' => $valid_spotify_url ? rawurlencode( $spotify_url ) : false,
+ ),
+ admin_url( 'post-new.php' )
+ );
+ $data['actions'][] = array(
+ 'create-episode-error-notice',
+ array(
+ 'retry_url' => esc_url_raw( $retry_url ),
+ ),
+ );
+ }
+ }
+ }
+ }
+
+ // Add Spotify Badge template action.
+ if (
+ $valid_spotify_url && (
+ 'post-new.php' !== $GLOBALS['pagenow'] // Delegate badge insertion to podcast template.
+ )
+ ) {
+ $data['actions'][] = array(
+ 'insert-spotify-badge',
+ array(
+ 'spotifyImageUrl' => Assets::staticize_subdomain( 'https://wordpress.com/i/spotify-badge.svg' ),
+ 'spotifyShowUrl' => esc_url_raw( $valid_spotify_url ),
+ ),
+ );
+ }
+
+ // Display an outbound link after publishing a post (only to English-speaking users since Anchor
+ // is English only).
+ if (
+ 'post' === get_post_type() &&
+ ! get_post_meta( $post->ID, 'jetpack_anchor_spotify_show', true ) &&
+ 0 === strpos( get_user_locale(), 'en' )
+ ) {
+ $data['actions'][] = 'show-post-publish-outbound-link';
+ }
+
+ wp_localize_script( 'jetpack-blocks-editor', 'Jetpack_AnchorFm', $data );
+}
+
+add_action( 'init', __NAMESPACE__ . '\register_extension' );
+add_action( 'enqueue_block_assets', __NAMESPACE__ . '\process_anchor_params' );