oont-contents/plugins/jetpack/modules/videopress/class-videopress-attachment-metadata.php
2025-02-08 15:10:23 +01:00

204 lines
6.3 KiB
PHP

<?php
/**
* Handle the VideoPress metadata properties.
*
* @package Jetpack
*/
use Automattic\Jetpack\Connection\Client;
/**
* Class Videopress_Attachment_Metadata
*/
class Videopress_Attachment_Metadata {
/**
* Persist the VideoPress metadata information, including rating and display_embed.
*
* @param string|int $post_id The post id.
* @param string $guid VideoPress Guid.
* @param string $post_title The post title.
* @param string $caption Video caption.
* @param string $post_excerpt The post excerpt.
* @param string $rating The rating.
* @param int $display_embed The display_embed.
* @param int $allow_download Allow video downloads.
* @param int $privacy_setting The video privacy setting.
*
* @return bool|\WP_Error
*/
public static function persist_metadata( $post_id, $guid, $post_title, $caption, $post_excerpt, $rating, $display_embed, $allow_download, $privacy_setting ) {
$post_id = absint( $post_id );
$args = array(
'method' => 'POST',
'headers' => array( 'content-type' => 'application/json' ),
);
// Keep null values to avoid accidental unset.
$display_embed = null === $display_embed ? null : (int) $display_embed;
$allow_download = null === $allow_download ? null : (int) $allow_download;
$privacy_setting = null === $privacy_setting ? null : (int) $privacy_setting;
$values = self::build_wpcom_api_request_values( $post_title, $caption, $post_excerpt, $rating, $display_embed, $allow_download, $privacy_setting );
$endpoint = 'videos';
$values['guid'] = $guid;
$result = Client::wpcom_json_api_request_as_blog( $endpoint, '2', $args, wp_json_encode( $values ), 'wpcom' );
$validated_result = self::validate_result( $result );
if ( true !== $validated_result ) {
return $validated_result;
}
// If we are in WPCOM, then we don't need to make anything else since we've already updated the video information.
if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
return true;
}
$meta = wp_get_attachment_metadata( $post_id );
if ( isset( $values['display_embed'] ) ) {
$meta['videopress']['display_embed'] = (bool) $values['display_embed']; // convert it to bool since that's how we store it on wp-admin side.
}
if ( isset( $values['allow_download'] ) ) {
$meta['videopress']['allow_download'] = (bool) $values['allow_download'];
}
if ( isset( $values['rating'] ) ) {
$meta['videopress']['rating'] = $values['rating'];
}
if ( isset( $values['privacy_setting'] ) ) {
$meta['videopress']['privacy_setting'] = $values['privacy_setting'];
}
wp_update_attachment_metadata( $post_id, $meta );
return true;
}
/**
* Check if the given media item is a VideoPress file.
*
* @param stdClass $item The media item.
*
* @return bool
*/
public static function is_videopress_media( $item ) {
if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
return str_starts_with( $item->mime_type, 'video/' );
}
// Else, we are in Jetpack and we need to check if the video is video/videopress.
return 'video/videopress' === $item->mime_type;
}
/**
* Check if display_embed has valid values.
*
* @param mixed $display_embed The input display embed.
*
* @return bool
*/
private static function is_display_embed_valid( $display_embed ) {
return in_array( $display_embed, array( 0, 1 ), true );
}
/**
* Check if allow_download has valid values
*
* @param mixed $allow_download The value to test.
* @return bool
*/
private static function is_allow_download_valid( $allow_download ) {
return in_array( $allow_download, array( 0, 1 ), true );
}
/**
* Check if privacy_setting has valid values
*
* @param mixed $privacy_setting The value to test.
* @return bool
*/
private static function is_privacy_setting_valid( $privacy_setting ) {
return in_array( $privacy_setting, array( VIDEOPRESS_PRIVACY::IS_PUBLIC, VIDEOPRESS_PRIVACY::IS_PRIVATE, VIDEOPRESS_PRIVACY::SITE_DEFAULT ), true );
}
/**
* Validate the response received from WPCOM.
*
* @param array|\WP_Error $result The result returned by the client.
*/
private static function validate_result( $result ) {
$response_code = isset( $result['response']['code'] ) ? $result['response']['code'] : 500;
// When Client::wpcom_json_api_request_as_blog is called in WPCOM, bad response codes are not converted to WP_Error.
// Because of this, we need to manually check the response code to check if the direct API call is 200 (OK).
if ( 200 === $response_code && ! is_wp_error( $result ) ) {
return true;
}
$error_message = __(
'There was an issue saving your updates to the VideoPress service. Please try again later.',
'jetpack'
);
$error_code = $response_code;
if ( is_wp_error( $result ) ) {
$error_code = $result->get_error_code();
}
return new \WP_Error( $error_code, $error_message );
}
/**
* Build the request values that will be passed to the WPCOM API.
*
* @param string $post_title The video title.
* @param string $caption The video caption.
* @param string $post_excerpt The except.
* @param string $rating The video rating.
* @param string $display_embed The video display_embed.
* @param int $allow_download The video allow_download.
* @param int $privacy_setting The video privacy setting.
*
* @return array
*/
private static function build_wpcom_api_request_values( $post_title, $caption, $post_excerpt, $rating, $display_embed, $allow_download, $privacy_setting ) {
$values = array();
// Add the video title & description in, so that we save it properly.
if ( isset( $post_title ) ) {
$values['title'] = trim( wp_strip_all_tags( $post_title ) );
}
if ( isset( $caption ) ) {
$values['caption'] = trim( wp_strip_all_tags( $caption ) );
}
if ( isset( $post_excerpt ) ) {
$values['description'] = trim( wp_strip_all_tags( $post_excerpt ) );
}
if ( isset( $rating ) ) {
$values['rating'] = $rating;
}
if ( self::is_display_embed_valid( $display_embed ) ) {
$values['display_embed'] = $display_embed;
}
if ( self::is_allow_download_valid( $allow_download ) ) {
$values['allow_download'] = $allow_download;
}
if ( self::is_privacy_setting_valid( $privacy_setting ) ) {
$values['privacy_setting'] = $privacy_setting;
}
return $values;
}
}