mirror of
https://github.com/Yetangitu/ampache
synced 2025-10-03 09:49:30 +02:00
269 lines
9.4 KiB
PHP
269 lines
9.4 KiB
PHP
<?php
|
|
/* vim:set softtabstop=4 shiftwidth=4 expandtab: */
|
|
/**
|
|
*
|
|
* LICENSE: GNU General Public License, version 2 (GPLv2)
|
|
* Copyright 2001 - 2015 Ampache.org
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License v2
|
|
* as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*
|
|
*/
|
|
|
|
class WebPlayer
|
|
{
|
|
/**
|
|
* Check if the playlist is a radio playlist.
|
|
* @param \Playlist $playlist
|
|
* @return boolean
|
|
*/
|
|
public static function is_playlist_radio($playlist)
|
|
{
|
|
$radios = array();
|
|
|
|
foreach ($playlist->urls as $item) {
|
|
if ($item->type == "radio") {
|
|
$radios[] = $item;
|
|
}
|
|
}
|
|
|
|
return (count($playlist->urls) == 1 && count($radios) > 0 && AmpConfig::get('webplayer_flash'));
|
|
}
|
|
|
|
/**
|
|
* Check if the playlist is a video playlist.
|
|
* @param \Playlist $playlist
|
|
* @return boolean
|
|
*/
|
|
public static function is_playlist_video($playlist)
|
|
{
|
|
return (count($playlist->urls) > 0 && $playlist->urls[0]->type == "video");
|
|
}
|
|
|
|
/**
|
|
* Get types information for an item.
|
|
* @param \playable_item $item
|
|
* @param string $force_type
|
|
* @return array
|
|
*/
|
|
protected static function get_types($item, $force_type='')
|
|
{
|
|
$types = array('real' => 'mp3', 'player' => '');
|
|
|
|
$media = null;
|
|
$urlinfo = Stream_URL::parse($item->url);
|
|
if ($urlinfo['id'] && Core::is_media($urlinfo['type'])) {
|
|
$media = new $urlinfo['type']($urlinfo['id']);
|
|
} else if ($urlinfo['id'] && $urlinfo['type'] == 'song_preview') {
|
|
$media = new Song_Preview($urlinfo['id']);
|
|
} else if (isset($urlinfo['demo_id'])) {
|
|
$democratic = new Democratic($urlinfo['demo_id']);
|
|
if ($democratic->id) {
|
|
$song_id = $democratic->get_next_object();
|
|
if ($song_id) {
|
|
$media = new Song($song_id);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($media != null) {
|
|
$ftype = $media->type;
|
|
|
|
$transcode = false;
|
|
$transcode_cfg = AmpConfig::get('transcode');
|
|
// Check transcode is required
|
|
$valid_types = Song::get_stream_types_for_type($ftype, 'webplayer');
|
|
if ($transcode_cfg == 'always' || !empty($force_type) || !in_array('native', $valid_types) || ($types['real'] != $ftype && (!AmpConfig::get('webplayer_flash') || $urlinfo['type'] != 'song'))) {
|
|
if ($transcode_cfg == 'always' || ($transcode_cfg != 'never' && in_array('transcode', $valid_types))) {
|
|
// Transcode forced from client side
|
|
if (!empty($force_type) && AmpConfig::get('transcode_player_customize')) {
|
|
debug_event("webplayer.class.php", "Forcing type to {".$force_type."}", 5);
|
|
// Transcode only if excepted type available
|
|
$transcode_settings = $media->get_transcode_settings($force_type, 'webplayer');
|
|
if ($transcode_settings) {
|
|
$types['real'] = $transcode_settings['format'];
|
|
$transcode = true;
|
|
}
|
|
}
|
|
|
|
// Transcode is not forced, transcode only if required
|
|
if (!$transcode) {
|
|
if (!in_array('native', $valid_types)) {
|
|
$transcode_settings = $media->get_transcode_settings(null, 'webplayer');
|
|
if ($transcode_settings) {
|
|
$types['real'] = $transcode_settings['format'];
|
|
$transcode = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!$transcode) {
|
|
$types['real'] = $ftype;
|
|
}
|
|
|
|
if ($urlinfo['type'] == 'song') {
|
|
if ($types['real'] == "ogg") $types['player'] = "oga";
|
|
else if ($types['real'] == "mp4") $types['player'] = "m4a";
|
|
} else if ($urlinfo['type'] == 'video') {
|
|
if ($types['real'] == "ogg") $types['player'] = "ogv";
|
|
else if ($types['real'] == "webm") $types['player'] = "webmv";
|
|
else if ($types['real'] == "mp4") $types['player'] = "m4v";
|
|
}
|
|
} else if ($item->type == 'live_stream') {
|
|
$types['real'] = $item->codec;
|
|
if ($types['real'] == "ogg") $types['player'] = "oga";
|
|
} else {
|
|
$ext = pathinfo($item->url, PATHINFO_EXTENSION);
|
|
if (!empty($ext)) $types['real'] = $ext;
|
|
}
|
|
|
|
if (empty($types['player'])) $types['player'] = $types['real'];
|
|
|
|
debug_event("webplayer.class.php", "Types {".json_encode($types)."}", 5);
|
|
return $types;
|
|
}
|
|
|
|
/**
|
|
* Get all supplied types for a playlist.
|
|
* @param \Playlist $playlist
|
|
* @return array
|
|
*/
|
|
public static function get_supplied_types($playlist)
|
|
{
|
|
$jptypes = array();
|
|
foreach ($playlist->urls as $item) {
|
|
$force_type = '';
|
|
if ($item->type == 'broadcast') {
|
|
$force_type = 'mp3';
|
|
}
|
|
$types = self::get_types($item, $force_type);
|
|
if (!in_array($types['player'], $jptypes)) {
|
|
$jptypes[] = $types['player'];
|
|
}
|
|
}
|
|
|
|
return $jptypes;
|
|
}
|
|
|
|
/**
|
|
* Get add_media javascript.
|
|
* @param \Playlist $playlist
|
|
* @param string $callback_container
|
|
* @return string
|
|
*/
|
|
public static function add_media_js($playlist, $callback_container='')
|
|
{
|
|
$addjs = "";
|
|
foreach ($playlist->urls as $item) {
|
|
if ($item->type == 'broadcast') {
|
|
$addjs .= $callback_container . "startBroadcastListening('" . $item->url . "');";
|
|
break;
|
|
} else {
|
|
$addjs .= $callback_container . "addMedia(" . self::get_media_js_param($item) . ");";
|
|
}
|
|
}
|
|
|
|
return $addjs;
|
|
}
|
|
|
|
/**
|
|
* Get play_next javascript.
|
|
* @param \Playlist $playlist
|
|
* @param string $callback_container
|
|
* @return string
|
|
*/
|
|
public static function play_next_js($playlist, $callback_container='')
|
|
{
|
|
$addjs = "";
|
|
foreach ($playlist->urls as $item) {
|
|
if ($item->type == 'broadcast') {
|
|
$addjs .= $callback_container . "startBroadcastListening('" . $item->url . "');";
|
|
break;
|
|
} else {
|
|
$addjs .= $callback_container . "playNext(" . self::get_media_js_param($item) . ");";
|
|
}
|
|
}
|
|
|
|
return $addjs;
|
|
}
|
|
|
|
/**
|
|
* Get media javascript parameters.
|
|
* @param \playable_item $item
|
|
* @param string $force_type
|
|
* @return string
|
|
*/
|
|
public static function get_media_js_param($item, $force_type='')
|
|
{
|
|
$js = array();
|
|
foreach (array('title', 'author') as $member) {
|
|
if ($member == "author")
|
|
$kmember = "artist";
|
|
else
|
|
$kmember = $member;
|
|
|
|
$js[$kmember] = $item->$member;
|
|
}
|
|
$url = $item->url;
|
|
|
|
$types = self::get_types($item, $force_type);
|
|
|
|
$media = null;
|
|
$urlinfo = Stream_URL::parse($url);
|
|
$url = $urlinfo['base_url'];
|
|
|
|
if ($urlinfo['id'] && Core::is_media($urlinfo['type'])) {
|
|
$media = new $urlinfo['type']($urlinfo['id']);
|
|
} else if ($urlinfo['id'] && $urlinfo['type'] == 'song_preview') {
|
|
$media = new Song_Preview($urlinfo['id']);
|
|
} else if (isset($urlinfo['demo_id'])) {
|
|
$democratic = new Democratic($urlinfo['demo_id']);
|
|
if ($democratic->id) {
|
|
$song_id = $democratic->get_next_object();
|
|
if ($song_id) {
|
|
$media = new Song($song_id);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($media != null) {
|
|
$media->format();
|
|
if ($urlinfo['type'] == 'song') {
|
|
$js['artist_id'] = $media->artist;
|
|
$js['album_id'] = $media->album;
|
|
$js['replaygain_track_gain'] = $media->replaygain_track_gain;
|
|
$js['replaygain_track_peak'] = $media->replaygain_track_peak;
|
|
$js['replaygain_album_gain'] = $media->replaygain_album_gain;
|
|
$js['replaygain_album_peak'] = $media->replaygain_album_peak;
|
|
}
|
|
$js['media_id'] = $media->id;
|
|
|
|
if ($media->type != $types['real']) {
|
|
$url .= '&transcode_to=' . $types['real'];
|
|
}
|
|
//$url .= "&content_length=required";
|
|
}
|
|
|
|
$js['filetype'] = $types['player'];
|
|
$js['url'] = $url;
|
|
if ($urlinfo['type'] == 'song') {
|
|
$js['poster'] = $item->image_url . (!AmpConfig::get('ajax_load') ? '&thumb=4' : '&thumb=3');
|
|
}
|
|
|
|
debug_event("webplayer.class.php", "Return get_media_js_param {".json_encode($js)."}", 5);
|
|
|
|
return json_encode($js);
|
|
}
|
|
}
|