/** * Verifies an s2Member-generated signature; in a full URL, a partial URI, or in just a query string. * * @package s2Member\Utilities * @since 111106 * * @param str $url_uri_query A full URL, a partial URI, or just a query string. Must have an s2Member-generated signature to validate. * @param bool $check_time Optional. Defaults to false. If true, s2Member will also check if the signature has expired, based on ``$exp_secs``. * @param str|int $exp_secs Optional. Defaults to (int)10. If ``$check_time`` is true, s2Member will check if the signature has expired, based on ``$exp_secs``. * @param str $sig_var Optional. The name of the s2Member-generated signature variable. Defaults to `_s2member_sig`. * @return bool True if the s2Member-generated signature is OK, else false. */ public static function s2member_sig_ok($url_uri_query = FALSE, $check_time = FALSE, $exp_secs = FALSE, $sig_var = FALSE) { $url_uri_query = $query = c_ws_plugin__s2member_utils_strings::trim((string) $url_uri_query, false, "?&="); if (preg_match("/^(?:[a-z]+\\:\\/\\/|\\/)/i", $url_uri_query)) { $query = trim(c_ws_plugin__s2member_utils_urls::parse_url($url_uri_query, PHP_URL_QUERY), "?&="); } /**/ $check_time = $check_time ? true : false; $exp_secs = is_numeric($exp_secs) ? (int) $exp_secs : 10; $sig_var = $sig_var && is_string($sig_var) ? $sig_var : "_s2member_sig"; /**/ $key = c_ws_plugin__s2member_utils_encryption::key(); /**/ if (preg_match_all("/" . preg_quote($sig_var, "/") . "\\=([0-9]+)-([^&\$]+)/", $query, $sigs)) { $query = c_ws_plugin__s2member_utils_urls::remove_s2member_sigs($query, $sig_var); /**/ wp_parse_str($query, $vars); $vars = c_ws_plugin__s2member_utils_arrays::remove_0b_strings(c_ws_plugin__s2member_utils_strings::trim_deep($vars)); $vars = serialize(c_ws_plugin__s2member_utils_arrays::ksort_deep($vars)); /**/ ($time = $sigs[1][$i = count($sigs[1]) - 1]) . ($sig = $sigs[2][$i]) . ($valid_sig = md5($key . $time . $vars)); /**/ if ($check_time) { return $sig === $valid_sig && $time >= strtotime("-" . $exp_secs . " seconds"); } else { /* Ignoring time? Just need to compare signatures in this case. */ return $sig === $valid_sig; } } else { /* Return false. No ``$query``, or no ``$sigs``. */ return false; } }
/** * Generates all Custom Fields. * * @package s2Member\Custom_Reg_Fields * @since 3.5 * * @param string $_function Function calling upon this routine. * @param array $_field The Field array of configuration options. * @param string $_name_prefix The `name=""` attribute prefix. * @param string $_id_prefix The `id=""` attribute prefix. * @param string $_classes Optional. String of space separated classes that will go inside the Field's `class=""` attribute. * @param string $_styles Optional. String of CSS styles that will go inside the Field's `style=""` attribute. * @param string|int $_tabindex. Optional numeric tabindex for the `tabindex=""` attribute. * @param string $_attrs Optional. Some additional Field attributes and values. * @param array $_submission Optional. But should be passed in with any submission data related to this Field. For instance, you might pass in ``$_POST``. * @param string|array $_value Optional. The value of this Field, either by default, or from the ``$_submission`` array. * @param string $_editable_context Optional. One of `profile|profile-view|registration`. * @return string The resulting Custom Field, in HTML format. */ public static function custom_field_gen($_function = FALSE, $_field = FALSE, $_name_prefix = FALSE, $_id_prefix = FALSE, $_classes = FALSE, $_styles = FALSE, $_tabindex = FALSE, $_attrs = FALSE, $_submission = FALSE, $_value = FALSE, $_editable_context = FALSE) { foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } do_action("ws_plugin__s2member_before_custom_field_gen", get_defined_vars()); unset($__refs, $__v); if (!($gen = "") && $_function && is_array($field = $_field) && !empty($field["type"]) && !empty($field["id"]) && $_name_prefix && $_id_prefix) { foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } do_action("ws_plugin__s2member_during_custom_field_gen_before", get_defined_vars()); unset($__refs, $__v); $field_var = preg_replace("/[^a-z0-9]/i", "_", strtolower($field["id"])); $field_id_class = preg_replace("/_/", "-", $field_var); $name_suffix = preg_match("/\\[\$/", $_name_prefix) ? ']' : ''; $field_name = trim($_name_prefix . $field_var . $name_suffix); if (in_array($field["type"], array("text", "textarea", "select"), TRUE)) { $_classes = trim($_classes . " form-control"); } // Bootstrap. $common = ''; $common .= ' name="' . esc_attr($field_name) . '"'; $common .= ' id="' . esc_attr($_id_prefix . $field_id_class) . '"'; $common .= !empty($field["required"]) && $field["required"] === "yes" ? ' aria-required="true"' : ''; $common .= strlen($_tabindex) ? ' tabindex="' . esc_attr($_tabindex) . '"' : ''; $common .= !empty($field["expected"]) ? ' data-expected="' . esc_attr($field["expected"]) . '"' : ''; $common .= $_editable_context === "profile-view" || $_editable_context === "profile" && !empty($field["editable"]) && strpos($field["editable"], "no") === 0 ? ' disabled="disabled"' : ''; $common .= $_classes || !empty($field["classes"]) ? ' class="' . esc_attr(trim($_classes . (!empty($field["classes"]) ? ' ' . $field["classes"] : ''))) . '"' : ''; $common .= $_styles || !empty($field["styles"]) ? ' style="' . esc_attr(trim($_styles . (!empty($field["styles"]) ? ' ' . $field["styles"] : ''))) . '"' : ''; $common .= $_attrs || !empty($field["attrs"]) ? ' ' . trim($_attrs . (!empty($field["attrs"]) ? ' ' . $field["attrs"] : '')) : ''; if ($field["type"] === "text") { if ($_editable_context === "profile-view") { $gen = esc_html((string) $_value); } else { $gen = '<input type="text" maxlength="100" autocomplete="off"'; $gen .= ' value="' . format_to_edit(!$_submission && isset($field["deflt"]) && strlen((string) $field["deflt"]) ? (string) $field["deflt"] : (string) $_value) . '"'; $gen .= $common . ' />'; } } else { if ($field["type"] === "textarea") { if ($_editable_context === "profile-view") { $gen = nl2br(esc_html((string) $_value)); } else { $gen = '<textarea rows="3"' . $common . '>'; $gen .= format_to_edit(!$_submission && isset($field["deflt"]) && strlen((string) $field["deflt"]) ? (string) $field["deflt"] : (string) $_value); $gen .= '</textarea>'; } } else { if ($field["type"] === "select" && !empty($field["options"])) { if ($_editable_context === "profile-view") { foreach (preg_split("/[\r\n\t]+/", $field["options"]) as $option_line) { $option_value = $option_label = $option_default = ""; @(list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\\|/", trim($option_line)))); if ($option_value === (string) $_value) { $gen = $option_label; break; } } } else { $gen = '<select' . $common . '>'; $selected_default_option = false; foreach (preg_split("/[\r\n\t]+/", $field["options"]) as $option_line) { $option_value = $option_label = $option_default = ""; @(list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\\|/", trim($option_line)))); $gen .= '<option value="' . esc_attr($option_value) . '"' . (($option_default && !$_submission || $option_value === (string) $_value && !$selected_default_option) && ($selected_default_option = true) ? ' selected="selected"' : '') . '>' . $option_label . '</option>'; } $gen .= '</select>'; } } else { if ($field["type"] === "selects" && !empty($field["options"])) { if ($_editable_context === "profile-view") { foreach (preg_split("/[\r\n\t]+/", $field["options"]) as $option_line) { $option_value = $option_label = $option_default = ""; @(list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\\|/", trim($option_line)))); if (in_array($option_value, (array) $_value)) { $gen .= $option_label . ", "; } } $gen = c_ws_plugin__s2member_utils_strings::trim($gen, 0, ","); } else { $common = preg_replace('/ name\\="(.+?)"/', ' name="$1[]"', $common); $common = preg_replace('/ style\\="(.+?)"/', ' style="height:auto; $1"', $common); $gen = '<select multiple="multiple" size="3"' . $common . '>'; foreach (preg_split("/[\r\n\t]+/", $field["options"]) as $option_line) { $option_value = $option_label = $option_default = ""; @(list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\\|/", trim($option_line)))); $gen .= '<option value="' . esc_attr($option_value) . '"' . ($option_default && !$_submission || in_array($option_value, (array) $_value) ? ' selected="selected"' : '') . '>' . $option_label . '</option>'; } $gen .= '</select>'; } } else { if ($field["type"] === "checkbox" && !empty($field["label"])) { if ($_editable_context === "profile-view") { $gen = (string) $_value ? "yes" : "no"; } else { $gen = '<input type="checkbox" value="1"'; $gen .= (string) $_value ? ' checked="checked"' : ''; $gen .= $common . ' /> <label for="' . esc_attr($_id_prefix . $field_id_class) . '" style="display:inline !important; margin:0 !important;">' . $field["label"] . '</label>'; } } else { if ($field["type"] === "pre_checkbox" && !empty($field["label"])) { if ($_editable_context === "profile-view") { $gen = (string) $_value ? "yes" : "no"; } else { $gen = '<input type="checkbox" value="1"'; $gen .= !$_submission || (string) $_value ? ' checked="checked"' : ''; $gen .= $common . ' /> <label for="' . esc_attr($_id_prefix . $field_id_class) . '" style="display:inline !important; margin:0 !important;">' . $field["label"] . '</label>'; } } else { if ($field["type"] === "checkboxes" && !empty($field["options"])) { if ($_editable_context === "profile-view") { foreach (preg_split("/[\r\n\t]+/", $field["options"]) as $i => $option_line) { $option_value = $option_label = $option_default = ""; @(list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\\|/", trim($option_line)))); if (in_array($option_value, (array) $_value)) { $gen .= $option_label . ", "; } } $gen = c_ws_plugin__s2member_utils_strings::trim($gen, 0, ","); } else { $common = preg_replace('/ name\\="(.+?)"/', ' name="$1[]"', $common); $sep = apply_filters("ws_plugin__s2member_custom_field_gen_checkboxes_sep", " ", get_defined_vars()); $opl = apply_filters("ws_plugin__s2member_custom_field_gen_checkboxes_opl", "ws-plugin--s2member-custom-reg-field-op-l", get_defined_vars()); foreach (preg_split("/[\r\n\t]+/", $field["options"]) as $i => $option_line) { $common_i = preg_replace('/ id\\="(.+?)"/', ' id="$1---' . $i . '"', $common); $option_value = $option_label = $option_default = ""; @(list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\\|/", trim($option_line)))); $gen .= $i > 0 ? $sep : ''; // Separators can be filtered above. $gen .= '<input type="checkbox" value="' . esc_attr($option_value) . '"'; $gen .= $option_default && !$_submission || in_array($option_value, (array) $_value) ? ' checked="checked"' : ''; $gen .= $common_i . ' /> <label for="' . esc_attr($_id_prefix . $field_id_class . "-" . $i) . '" class="' . esc_attr($opl) . '" style="display:inline !important; margin:0 !important;">' . $option_label . '</label>'; } } } else { if ($field["type"] === "radios" && !empty($field["options"])) { if ($_editable_context === "profile-view") { foreach (preg_split("/[\r\n\t]+/", $field["options"]) as $i => $option_line) { $option_value = $option_label = $option_default = ""; @(list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\\|/", trim($option_line)))); if ($option_value === (string) $_value) { $gen = $option_label; break; } } } else { $sep = apply_filters("ws_plugin__s2member_custom_field_gen_radios_sep", " ", get_defined_vars()); $opl = apply_filters("ws_plugin__s2member_custom_field_gen_radios_opl", "ws-plugin--s2member-custom-reg-field-op-l", get_defined_vars()); foreach (preg_split("/[\r\n\t]+/", $field["options"]) as $i => $option_line) { $common_i = preg_replace('/ id\\="(.+?)"/', ' id="$1---' . $i . '"', $common); $option_value = $option_label = $option_default = ""; @(list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\\|/", trim($option_line)))); $gen .= $i > 0 ? $sep : ''; // Separators can be filtered above. $gen .= '<input type="radio" value="' . esc_attr($option_value) . '"'; $gen .= $option_default && !$_submission || $option_value === (string) $_value ? ' checked="checked"' : ''; $gen .= $common_i . ' /> <label for="' . esc_attr($_id_prefix . $field_id_class . "-" . $i) . '" class="' . esc_attr($opl) . '" style="display:inline !important; margin:0 !important;">' . $option_label . '</label>'; } } } else { if ($_editable_context === "profile-view") { $gen = esc_html((string) $_value); } else { $gen = '<input type="text" maxlength="100" autocomplete="off"'; $gen .= ' value="' . format_to_edit(!$_submission && isset($field["deflt"]) && strlen((string) $field["deflt"]) ? (string) $field["deflt"] : (string) $_value) . '"'; $gen .= $common . ' />'; } } } } } } } } } foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } do_action("ws_plugin__s2member_during_custom_field_gen_after", get_defined_vars()); unset($__refs, $__v); } return apply_filters("ws_plugin__s2member_custom_field_gen", $gen, get_defined_vars()); }
/** * Verifies an s2Member-generated signature; in a full URL, a partial URI, or in just a query string. * * @package s2Member\Utilities * @since 111106 * * @param string $url_uri_query A full URL, a partial URI, or just a query string. Must have an s2Member-generated signature to validate. * @param bool $check_time Optional. Defaults to false. If true, s2Member will also check if the signature has expired, based on ``$exp_secs``. * @param string|int $exp_secs Optional. Defaults to (int)10. If ``$check_time`` is true, s2Member will check if the signature has expired, based on ``$exp_secs``. * @param string $sig_var Optional. The name of the s2Member-generated signature variable. Defaults to `_s2member_sig`. * @return bool True if the s2Member-generated signature is OK, else false. */ public static function s2member_sig_ok($url_uri_query = FALSE, $check_time = FALSE, $exp_secs = FALSE, $sig_var = FALSE) { $url_uri_query = $query = c_ws_plugin__s2member_utils_strings::trim((string) $url_uri_query, false, '?&='); if (preg_match('/^(?:[a-z]+\\:\\/\\/|\\/)/i', $url_uri_query)) { // Is this a full URL or a partial URI? $query = trim(c_ws_plugin__s2member_utils_urls::parse_url($url_uri_query, PHP_URL_QUERY), '?&='); } $check_time = (bool) $check_time; // Check time? $exp_secs = is_numeric($exp_secs) ? (int) $exp_secs : 10; $sig_var = $sig_var && is_string($sig_var) ? $sig_var : '_s2member_sig'; $key = c_ws_plugin__s2member_utils_encryption::key(); // Obtain key. if (preg_match_all('/' . preg_quote($sig_var, '/') . '\\=([0-9]+)-([^&$]+)/', $query, $sigs)) { $query = c_ws_plugin__s2member_utils_urls::remove_s2member_sigs($query, $sig_var); wp_parse_str($query, $vars); // Parse the query string into an array of ``$vars``. $vars = c_ws_plugin__s2member_utils_arrays::remove_0b_strings(c_ws_plugin__s2member_utils_strings::trim_deep($vars)); $vars = serialize(c_ws_plugin__s2member_utils_arrays::ksort_deep($vars)); $i = count($sigs[1]) - 1; // Last one. $time = $sigs[1][$i]; // Timestamp. $sig = $sigs[2][$i]; // Signature. $valid_sig = md5($key . $time . $vars); if ($check_time) { // This must NOT be older than ``$exp_secs`` seconds ago. return $sig === $valid_sig && $time >= strtotime('-' . $exp_secs . ' seconds'); } return $sig === $valid_sig; } return false; // False, it's NOT ok. }
/** * Handles the Shortcode for: `[s2Stream /]`. * * @package s2Member\s2File * @since 130119 * * @attaches-to ``add_shortcode('s2Stream');`` * * @param array $attr An array of Attributes. * @param string $content Content inside the Shortcode. * @param string $shortcode The actual Shortcode name itself. * * @return string HTML markup that produces an audio/video stream for a specific player. */ public static function sc_get_stream($attr = array(), $content = '', $shortcode = '') { foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } do_action('ws_plugin__s2member_before_sc_get_stream', get_defined_vars()); unset($__refs, $__v); // Housekeeping. $attr = c_ws_plugin__s2member_utils_strings::trim_qts_deep((array) $attr); $attr = shortcode_atts(array('download' => '', 'file_download' => '', 'download_key' => '', 'stream' => 'yes', 'inline' => 'yes', 'storage' => '', 'remote' => '', 'ssl' => '', 'rewrite' => 'yes', 'rewrite_base' => '', 'skip_confirmation' => '', 'url_to_storage_source' => 'yes', 'count_against_user' => 'yes', 'check_user' => 'yes', 'player' => 'jwplayer-v6-rtmp', 'player_id' => 's2-stream-' . md5(uniqid('', TRUE)), 'player_path' => '/jwplayer/jwplayer.js', 'player_key' => '', 'player_title' => '', 'player_image' => '', 'player_mediaid' => '', 'player_description' => '', 'player_captions' => '', 'player_resolutions' => '', 'player_controls' => 'yes', 'player_skin' => '', 'player_stretching' => 'uniform', 'player_width' => '480', 'player_height' => '270', 'player_aspectratio' => '', 'player_autostart' => 'no', 'player_fallback' => 'yes', 'player_mute' => 'no', 'player_primary' => $attr['player'] === 'jw-player-v6' ? 'html5' : 'flash', 'player_repeat' => 'no', 'player_startparam' => '', 'player_option_blocks' => ''), $attr); $attr['download'] = !empty($attr['file_download']) ? $attr['file_download'] : $attr['download']; foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } do_action('ws_plugin__s2member_before_sc_get_stream_after_shortcode_atts', get_defined_vars()); unset($__refs, $__v); // Housekeeping. foreach ($attr as $key => $value) { // Now we need to go through and a `file_` prefix to certain Attribute keys, for compatibility. if (strlen($value) && in_array($key, array('download', 'download_key', 'stream', 'inline', 'storage', 'remote', 'ssl', 'rewrite', 'rewrite_base'))) { $config['file_' . $key] = $value; } else { if (strlen($value) && !in_array($key, array('file_download', 'player')) && strpos($key, 'player_') !== 0) { $config[$key] = $value; } } } unset($key, $value); // Ditch these now. We don't want these bleeding into Hooks/Filters anyway. if (!empty($config) && isset($config['file_download'])) { if ($attr['player_resolutions'] && c_ws_plugin__s2member_utils_conds::pro_is_installed()) { $file_download_extension = strtolower(ltrim((string) strrchr(basename($config['file_download']), '.'), '.')); $file_download_resolution_wo_extension = substr($config['file_download'], 0, -(strlen($file_download_extension) + 1)); $file_download_wo_resolution_extension = preg_replace('/\\-r[0-9]+([^.]*)$/i', '', $file_download_resolution_wo_extension); // e.g., `r720p-HD` is removed here. $file_download_resolutions = array(); // Initialize the array of resolutions. foreach (preg_split('/[,;\\s]+/', $attr['player_resolutions'], NULL, PREG_SPLIT_NO_EMPTY) as $_player_resolution) { $_player_resolution = ltrim($_player_resolution, 'Rr'); // Remove R|r prefix. $file_download_resolutions[$_player_resolution] = $file_download_wo_resolution_extension . '-r' . $_player_resolution . '.' . $file_download_extension; } unset($_player_resolution); // Housekeeping. $file_download_urls = array(); // Initialize array of all file download urls. foreach ($file_download_resolutions as $_player_resolution => $_file_download_resolution) { $_file_download_config = array_merge($config, array('file_download' => $_file_download_resolution)); if ($file_download_urls) { // If this is a ANOTHER resolution, don't count it against the user. $_file_download_config = array_merge($_file_download_config, array('check_user' => FALSE, 'count_against_user' => FALSE)); } if (!($file_download_urls[str_replace(array('_', '-'), ' ', $_player_resolution)] = c_ws_plugin__s2member_files::create_file_download_url($_file_download_config, TRUE))) { return apply_filters('ws_plugin__s2member_sc_get_stream', NULL, get_defined_vars()); } // Failure. } unset($_player_resolution, $_file_download_resolution, $_file_download_config); // Housekeeping. } else { $file_download_urls = array(c_ws_plugin__s2member_files::create_file_download_url($config, TRUE)); } // Default behavior. if ($file_download_urls && $attr['player'] && is_file($template = dirname(dirname(__FILE__)) . '/templates/players/' . $attr['player'] . '.php') && $attr['player_id'] && $attr['player_path']) { $template = is_file(TEMPLATEPATH . '/' . basename($template)) ? TEMPLATEPATH . '/' . basename($template) : $template; $template = is_file(get_stylesheet_directory() . '/' . basename($template)) ? get_stylesheet_directory() . '/' . basename($template) : $template; $template = is_file(WP_CONTENT_DIR . '/' . basename($template)) ? WP_CONTENT_DIR . '/' . basename($template) : $template; if (strpos($attr['player'], 'jwplayer-v6') === 0) { $player = trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($template))); $_first_file_download_url = array(); // Holds the first one. $_last_file_download_url = array(); // Holds the last one. $_uses_rtmp_streamers = FALSE; // Streamers use RTMP? $_total_player_sources = count($file_download_urls); // Total sources. $_player_sources_counter = 1; // Player sources counter; needed by the loop below. $player_resolution_aspect_ratio_w = 16; // Default aspect ratio width. $player_resolution_aspect_ratio_h = 9; // Default aspect ratio in height. if ($attr['player_aspectratio'] && preg_match('/^[0-9]+\\:[0-9]+$/', $attr['player_aspectratio'])) { list($player_resolution_aspect_ratio_w, $player_resolution_aspect_ratio_h) = explode(':', $attr['player_aspectratio']); } $player_resolution_aspect_ratio_w = (int) $player_resolution_aspect_ratio_w; // Force integer value. $player_resolution_aspect_ratio_h = (int) $player_resolution_aspect_ratio_h; // Force integer value. // See: <http://wsharks.com/1yzjAl6> and <http://wsharks.com/1yzkhea> regarging the SMIL bitrate hints given here. $player_resolution_bitrates = array(2160 => '35000000', 1440 => '10000000', 1080 => '8000000', 720 => '5000000', 640 => '2500001', 480 => '2500000', 360 => '1000000', 320 => '999999', 240 => '500000', 180 => '300000'); $player_resolution_bitrates = apply_filters('ws_plugin__s2member_sc_get_stream_resolution_bitrates', $player_resolution_bitrates, get_defined_vars()); $player_resolution_sources_smil_file_id = md5(serialize($attr) . $_SERVER['REMOTE_ADDR']); // Initialize SMIL ID. $player_resolution_sources_smil_file_url = home_url('/s2member-rsf-file.smil?s2member_rsf_file=' . urlencode($player_resolution_sources_smil_file_id) . '&s2member_rsf_file_ip=' . urlencode($_SERVER['REMOTE_ADDR'])); $player_resolution_sources_smil_file_url = c_ws_plugin__s2member_utils_urls::add_s2member_sig($player_resolution_sources_smil_file_url); $player_resolution_sources_smil_file_contents = ''; // Initialize player sources SMIL file contents. $player_sources = ''; // Initialize player sources; empty string. foreach ($file_download_urls as $_file_download_url_label => $_file_download_url) { $_is_first_file_download_url = $_player_sources_counter <= 1; $_is_last_file_download_url = $_player_sources_counter >= $_total_player_sources; if ($_is_first_file_download_url) { // We base this conditional on the first streamer. $_uses_rtmp_streamers = stripos($_file_download_url['streamer'], 'rtmp') === 0; } switch ($attr['player']) { case 'jwplayer-v6': // Default w/ a direct URL (very simple). $player_sources .= ',{'; // Open this source; JSON object properties. $player_sources .= "'file': '" . c_ws_plugin__s2member_utils_strings::esc_js_sq($_file_download_url['url']) . "'"; if (is_string($_file_download_url_label)) { $player_sources .= ",'label': '" . c_ws_plugin__s2member_utils_strings::esc_js_sq($_file_download_url_label) . "'"; } if ($_is_first_file_download_url) { $player_sources .= ",'default': 'true'"; } $player_sources .= '}'; // Close this source. break; // Break switch loop. // Break switch loop. case 'jwplayer-v6-rtmp': // RTMP w/ downloadable fallback (mobile compatibility). // RTMP w/ downloadable fallback (mobile compatibility). case 'jwplayer-v6-rtmp-only': // RTMP streaming only (flash player only). if ($attr['player_resolutions'] && $_total_player_sources > 1 && $_uses_rtmp_streamers) { if ($_is_first_file_download_url) { $player_sources .= ',{'; // Open this source; JSON object properties. $player_sources .= "'file': '" . c_ws_plugin__s2member_utils_strings::esc_js_sq($player_resolution_sources_smil_file_url) . "'"; if ($_is_first_file_download_url) { $player_sources .= ",'default': 'true'"; } $player_sources .= '}'; // Close this source. } $_file_download_url['smil']['height'] = (int) $_file_download_url_label; // e.g., `720p-HD` becomes `720`. if (!$_file_download_url['smil']['height']) { $_file_download_url['smil']['height'] = 720; } // Use a default height if invalid. $_file_download_url['smil']['width'] = ceil($_file_download_url['smil']['height'] / $player_resolution_aspect_ratio_h * $player_resolution_aspect_ratio_w); $_file_download_url['smil']['system-bitrate'] = '1'; // Default value. if (!empty($player_resolution_bitrates[$_file_download_url['smil']['height']])) { $_file_download_url['smil']['system-bitrate'] = $player_resolution_bitrates[$_file_download_url['smil']['height']]; } $player_resolution_sources_smil_file_contents .= '<video src="' . esc_attr($_file_download_url['file']) . '"' . ' width="' . esc_attr($_file_download_url['smil']['width']) . '"' . ' height="' . esc_attr($_file_download_url['smil']['height']) . '"' . ' system-bitrate="' . esc_attr($_file_download_url['smil']['system-bitrate']) . '" />'; } else { $player_sources .= ',{'; // Open this source; JSON object properties. $player_sources .= "'file': '" . c_ws_plugin__s2member_utils_strings::esc_js_sq($_file_download_url['streamer'] . '/' . $_file_download_url['prefix'] . $_file_download_url['file']) . "'"; if (is_string($_file_download_url_label)) { $player_sources .= ",'label': '" . c_ws_plugin__s2member_utils_strings::esc_js_sq($_file_download_url_label) . "'"; } if ($_is_first_file_download_url) { $player_sources .= ",'default': 'true'"; } $player_sources .= '}'; // Close this source. } if ($_is_last_file_download_url && $attr['player'] === 'jwplayer-v6-rtmp') { $player_sources .= ',{'; // Open this source; JSON object properties. $player_sources .= "'file': '" . c_ws_plugin__s2member_utils_strings::esc_js_sq($_file_download_url['url']) . "'"; $player_sources .= '}'; // Close this source. } break; // Break switch loop. } if ($_is_first_file_download_url) { $_first_file_download_url = $_file_download_url; // Record for use later. $player = preg_replace('/%%streamer%%/', $_file_download_url['streamer'], $player); $player = preg_replace('/%%prefix%%/', $_file_download_url['prefix'], $player); $player = preg_replace('/%%file%%/', $_file_download_url['file'], $player); $player = preg_replace('/%%url%%/', $_file_download_url['url'], $player); } if ($_is_last_file_download_url) { $_last_file_download_url = $_file_download_url; // Record for use later. } $_player_sources_counter++; // Increment the counter. } $player_sources = '[' . trim($player_sources, ',') . ']'; // Build array. if ($player_resolution_sources_smil_file_contents && $_first_file_download_url) { $player_resolution_sources_smil_file_contents = '<smil>' . ' <head><meta base="' . esc_attr($_first_file_download_url['streamer']) . '" /></head>' . ' <body><switch>' . $player_resolution_sources_smil_file_contents . '</switch></body>' . '</smil>'; set_transient('s2m_rsf_' . $player_resolution_sources_smil_file_id, $player_resolution_sources_smil_file_contents, 86400); } unset($_first_file_download_url, $_last_file_download_url, $_uses_rtmp_streamers, $_total_player_sources, $_player_sources_counter, $_is_first_file_download_url, $_is_last_file_download_url, $_file_download_url_label, $_file_download_url); $player = preg_replace('/%%player_id%%/', $attr['player_id'], $player); $player = preg_replace('/%%player_path%%/', $attr['player_path'], $player); $player = preg_replace('/%%player_key%%/', $attr['player_key'], $player); $player = preg_replace('/%%player_title%%/', $attr['player_title'], $player); $player = preg_replace('/%%player_image%%/', $attr['player_image'], $player); $player = preg_replace('/%%player_mediaid%%/', $attr['player_mediaid'], $player); $player = preg_replace('/%%player_description%%/', $attr['player_description'], $player); if ($attr['player_captions'] = c_ws_plugin__s2member_utils_strings::trim($attr['player_captions'], NULL, '[]')) { $player = preg_replace('/%%player_captions%%/', '[' . (strpos($attr['player_captions'], ':') !== FALSE ? $attr['player_captions'] : base64_decode($attr['player_captions'])) . ']', $player); } else { $player = preg_replace('/%%player_captions%%/', '[]', $player); } $player = preg_replace('/%%player_sources%%/', $player_sources, $player); // Sources are constructed dynamically. $player = preg_replace('/%%player_controls%%/', filter_var($attr['player_controls'], FILTER_VALIDATE_BOOLEAN) ? 'true' : 'false', $player); $player = preg_replace('/%%player_width%%/', strpos($attr['player_width'], '%') !== FALSE ? "'" . $attr['player_width'] . "'" : (int) $attr['player_width'], $player); $player = preg_replace('/%%player_height%%/', $attr['player_aspectratio'] ? "''" : (strpos($attr['player_height'], '%') !== FALSE ? "'" . $attr['player_height'] . "'" : (int) $attr['player_height']), $player); $player = preg_replace('/%%player_aspectratio%%/', $attr['player_aspectratio'], $player); $player = preg_replace('/%%player_stretching%%/', $attr['player_stretching'], $player); $player = preg_replace('/%%player_skin%%/', $attr['player_skin'], $player); $player = preg_replace('/%%player_autostart%%/', filter_var($attr['player_autostart'], FILTER_VALIDATE_BOOLEAN) ? 'true' : 'false', $player); $player = preg_replace('/%%player_fallback%%/', filter_var($attr['player_fallback'], FILTER_VALIDATE_BOOLEAN) ? 'true' : 'false', $player); $player = preg_replace('/%%player_mute%%/', filter_var($attr['player_mute'], FILTER_VALIDATE_BOOLEAN) ? 'true' : 'false', $player); $player = preg_replace('/%%player_repeat%%/', filter_var($attr['player_repeat'], FILTER_VALIDATE_BOOLEAN) ? 'true' : 'false', $player); $player = preg_replace('/%%player_startparam%%/', $attr['player_startparam'], $player); $player = preg_replace('/%%player_primary%%/', $attr['player_primary'], $player); $player = preg_replace('/%%player_option_blocks%%/', strpos($attr['player_option_blocks'], ':') !== FALSE ? $attr['player_option_blocks'] : base64_decode($attr['player_option_blocks']), $player); } } } return apply_filters('ws_plugin__s2member_sc_get_stream', isset($player) ? $player : NULL, get_defined_vars()); }
/** * Handles the Shortcode for: `[s2Stream /]`. * * @package s2Member\s2File * @since 130119 * * @attaches-to ``add_shortcode("s2Stream");`` * * @param array $attr An array of Attributes. * @param str $content Content inside the Shortcode. * @param str $shortcode The actual Shortcode name itself. * @return str HTML markup that produces an audio/video stream for a specific player. */ public static function sc_get_stream($attr = FALSE, $content = FALSE, $shortcode = FALSE) { foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } do_action("ws_plugin__s2member_before_sc_get_stream", get_defined_vars()); unset($__refs, $__v); $attr = c_ws_plugin__s2member_utils_strings::trim_qts_deep((array) $attr); $attr = shortcode_atts(array("download" => "", "download_key" => "", "stream" => "yes", "inline" => "yes", "storage" => "", "remote" => "", "ssl" => "", "rewrite" => "yes", "rewrite_base" => "", "skip_confirmation" => "", "url_to_storage_source" => "yes", "count_against_user" => "yes", "check_user" => "yes", "file_download" => "", "player" => "jwplayer-v6-rtmp", "player_id" => "s2-stream-" . md5(uniqid("", TRUE)), "player_path" => "/jwplayer/jwplayer.js", "player_key" => "", "player_title" => "", "player_image" => "", "player_mediaid" => "", "player_description" => "", "player_captions" => "", "player_controls" => "yes", "player_skin" => "", "player_stretching" => "uniform", "player_width" => "480", "player_height" => "270", "player_aspectratio" => "", "player_autostart" => "no", "player_fallback" => "yes", "player_mute" => "no", "player_primary" => $attr["player"] === "jw-player-v6" ? "html5" : "flash", "player_repeat" => "no", "player_startparam" => "", "player_option_blocks" => ""), $attr); $attr["download"] = !empty($attr["file_download"]) ? $attr["file_download"] : $attr["download"]; foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } do_action("ws_plugin__s2member_before_sc_get_stream_after_shortcode_atts", get_defined_vars()); unset($__refs, $__v); foreach ($attr as $key => $value) { if (strlen($value) && in_array($key, array("download", "download_key", "stream", "inline", "storage", "remote", "ssl", "rewrite", "rewrite_base"))) { $config["file_" . $key] = $value; } else { if (strlen($value) && !in_array($key, array("file_download", "player")) && strpos($key, "player_") !== 0) { $config[$key] = $value; } } } unset($key, $value); if (!empty($config) && isset($config["file_download"])) { $_get = c_ws_plugin__s2member_files::create_file_download_url($config, TRUE); if (is_array($_get) && !empty($_get) && $attr["player"] && file_exists($template = dirname(dirname(__FILE__)) . "/templates/players/" . $attr["player"] . ".php") && $attr["player_id"] && $attr["player_path"]) { $template = file_exists(TEMPLATEPATH . "/" . basename($template)) ? TEMPLATEPATH . "/" . basename($template) : $template; $template = file_exists(WP_CONTENT_DIR . "/" . basename($template)) ? WP_CONTENT_DIR . "/" . basename($template) : $template; if (strpos($attr["player"], "jwplayer-v6") === 0) { $get = trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($template))); $get = preg_replace("/%%streamer%%/", $_get["streamer"], $get); $get = preg_replace("/%%prefix%%/", $_get["prefix"], $get); $get = preg_replace("/%%file%%/", $_get["file"], $get); $get = preg_replace("/%%url%%/", $_get["url"], $get); $get = preg_replace("/%%player_id%%/", $attr["player_id"], $get); $get = preg_replace("/%%player_path%%/", $attr["player_path"], $get); $get = preg_replace("/%%player_key%%/", $attr["player_key"], $get); $get = preg_replace("/%%player_title%%/", $attr["player_title"], $get); $get = preg_replace("/%%player_image%%/", $attr["player_image"], $get); $get = preg_replace("/%%player_mediaid%%/", $attr["player_mediaid"], $get); $get = preg_replace("/%%player_description%%/", $attr["player_description"], $get); if ($attr["player_captions"] = c_ws_plugin__s2member_utils_strings::trim($attr["player_captions"], null, "[]")) { $get = preg_replace("/%%player_captions%%/", "[" . (strpos($attr["player_captions"], ":") !== false ? $attr["player_captions"] : base64_decode($attr["player_captions"])) . "]", $get); } else { $get = preg_replace("/%%player_captions%%/", "[]", $get); } $get = preg_replace("/%%player_controls%%/", filter_var($attr["player_controls"], FILTER_VALIDATE_BOOLEAN) ? "true" : "false", $get); $get = preg_replace("/%%player_width%%/", strpos($attr["player_width"], "%") !== FALSE ? "'" . $attr["player_width"] . "'" : (int) $attr["player_width"], $get); $get = preg_replace("/%%player_height%%/", $attr["player_aspectratio"] ? "''" : (strpos($attr["player_height"], "%") !== FALSE ? "'" . $attr["player_height"] . "'" : (int) $attr["player_height"]), $get); $get = preg_replace("/%%player_aspectratio%%/", $attr["player_aspectratio"], $get); $get = preg_replace("/%%player_skin%%/", $attr["player_skin"], $get); $get = preg_replace("/%%player_stretching%%/", $attr["player_stretching"], $get); $get = preg_replace("/%%player_autostart%%/", filter_var($attr["player_autostart"], FILTER_VALIDATE_BOOLEAN) ? "true" : "false", $get); $get = preg_replace("/%%player_fallback%%/", filter_var($attr["player_fallback"], FILTER_VALIDATE_BOOLEAN) ? "true" : "false", $get); $get = preg_replace("/%%player_mute%%/", filter_var($attr["player_mute"], FILTER_VALIDATE_BOOLEAN) ? "true" : "false", $get); $get = preg_replace("/%%player_primary%%/", $attr["player_primary"], $get); $get = preg_replace("/%%player_repeat%%/", filter_var($attr["player_repeat"], FILTER_VALIDATE_BOOLEAN) ? "true" : "false", $get); $get = preg_replace("/%%player_startparam%%/", $attr["player_startparam"], $get); $get = preg_replace("/%%player_option_blocks%%/", strpos($attr["player_option_blocks"], ":") !== false ? $attr["player_option_blocks"] : base64_decode($attr["player_option_blocks"]), $get); } } } return apply_filters("ws_plugin__s2member_sc_get_stream", isset($get) ? $get : null, get_defined_vars()); }