1
0
Fork 0
mirror of https://github.com/Yetangitu/ampache synced 2025-10-05 02:39:47 +02:00

Add HTML5 ReplayGain Track support

This commit is contained in:
Afterster 2014-11-10 15:02:09 +01:00
parent e911ae8815
commit 33bb01afbf
10 changed files with 160 additions and 42 deletions

BIN
images/icon_replaygain.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -166,6 +166,22 @@ class Song extends database_object implements media, library_item
* @var string $lyrics
*/
public $lyrics;
/**
* @var float $replaygain_track_gain
*/
public $replaygain_track_gain;
/**
* @var float $replaygain_track_peak
*/
public $replaygain_track_peak;
/**
* @var float $replaygain_album_gain
*/
public $replaygain_album_gain;
/**
* @var float $replaygain_album_peak
*/
public $replaygain_album_peak;
/**
* @var string $f_title
*/
@ -338,6 +354,10 @@ class Song extends database_object implements media, library_item
$language = isset($results['language']) ? $results['language'] : null;
$channels = $results['channels'] ?: 0;
$release_type = isset($results['release_type']) ? $results['release_type'] : null;
$replaygain_track_gain = isset($results['replaygain_track_gain']) ? $results['replaygain_track_gain'] : null;
$replaygain_track_peak = isset($results['replaygain_track_peak']) ? $results['replaygain_track_peak'] : null;
$replaygain_album_gain = isset($results['replaygain_album_gain']) ? $results['replaygain_album_gain'] : null;
$replaygain_album_peak = isset($results['replaygain_album_peak']) ? $results['replaygain_album_peak'] : null;
$artist_id = Artist::check($artist, $artist_mbid);
$album_artist_id = null;
@ -376,9 +396,9 @@ class Song extends database_object implements media, library_item
}
}
$sql = 'INSERT INTO `song_data` (`song_id`, `comment`, `lyrics`, `label`, `language`, `catalog_number`) ' .
'VALUES(?, ?, ?, ?, ?, ?)';
Dba::write($sql, array($song_id, $comment, $lyrics, $label, $language, $catalog_number));
$sql = 'INSERT INTO `song_data` (`song_id`, `comment`, `lyrics`, `label`, `language`, `catalog_number`, `replaygain_track_gain`, `replaygain_track_peak`, `replaygain_album_gain`, `replaygain_album_peak`) ' .
'VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
Dba::write($sql, array($song_id, $comment, $lyrics, $label, $language, $catalog_number, $replaygain_track_gain, $replaygain_track_peak, $replaygain_album_gain, $replaygain_album_peak));
return $song_id;
}
@ -888,37 +908,22 @@ class Song extends database_object implements media, library_item
*/
public static function update_song($song_id, Song $new_song)
{
$title = Dba::escape($new_song->title);
$bitrate = Dba::escape($new_song->bitrate);
$rate = Dba::escape($new_song->rate);
$mode = Dba::escape($new_song->mode);
$size = Dba::escape($new_song->size);
$time = Dba::escape($new_song->time);
$track = Dba::escape($new_song->track);
$mbid = Dba::escape($new_song->mbid);
$artist = Dba::escape($new_song->artist);
$album = Dba::escape($new_song->album);
$album_artist = Dba::escape($new_song->album_artist);
$year = Dba::escape($new_song->year);
$song_id = Dba::escape($song_id);
$update_time = time();
$sql = "UPDATE `song` SET `album`='$album', `year`='$year', `artist`='$artist', " .
"`title`='$title', `bitrate`='$bitrate', `rate`='$rate', `mode`='$mode', " .
"`size`='$size', `time`='$time', `track`='$track', " .
"`mbid`='$mbid', " .
"`album_artist`='$album_artist', " .
"`update_time`='$update_time' WHERE `id`='$song_id'";
$sql = "UPDATE `song` SET `album` = ?, `year` = ?, `artist` = ?, " .
"`title` = ?, `bitrate` = ?, `rate` = ?, `mode` = ?, " .
"`size` = ?, `time` = ?, `track` = ?, `mbid` = ?, " .
"`album_artist` = ?, " .
"`update_time` = ? WHERE `id` = ?";
Dba::write($sql);
Dba::write($sql, array($new_song->album, $new_song->year, $new_song->artist, $new_song->title, $new_song->bitrate, $new_song->rate,
$new_song->mode, $new_song->size, $new_song->time, $new_song->track, $new_song->mbid, $new_song->album_artist, $update_time, $song_id));
$comment = Dba::escape($new_song->comment);
$language = Dba::escape($new_song->language);
$lyrics = Dba::escape($new_song->lyrics);
$sql = "UPDATE `song_data` SET `lyrics`='$lyrics', `language`='$language', `comment`='$comment' " .
"WHERE `song_id`='$song_id'";
Dba::write($sql);
$sql = "UPDATE `song_data` SET `lyrics` = ?, `language` = ?, `comment` = ?, `replaygain_track_gain` = ?, `replaygain_track_peak` = ?, " .
"`replaygain_album_gain` = ?, `replaygain_album_peak` = ?" .
"WHERE `song_id` = ?";
Dba::write($sql, array($new_song->lyrics, $new_song->language, $new_song->comment, $new_song->replaygain_track_gain,
$new_song->replaygain_track_peak, $new_song->replaygain_album_gain, $new_song->replaygain_album_peak, $song_id));
} // update_song
@ -1816,6 +1821,10 @@ class Song extends database_object implements media, library_item
$meta['mb_artistid'] = $this->artist_mbid;
$meta['mb_albumartistid'] = $this->albumartist_mbid;
$meta['tracknumber'] = $meta['track'] = $this->track;
$meta['replaygain_track_gain'] = $this->replaygain_track_gain;
$meta['replaygain_track_peak'] = $this->replaygain_track_peak;
$meta['replaygain_album_gain'] = $this->replaygain_album_gain;
$meta['replaygain_album_peak'] = $this->replaygain_album_peak;
$meta['genre'] = array();
if ($this->tags) {
foreach ($this->tags as $tag) {

View file

@ -476,6 +476,9 @@ class Update
$update_string = " - Add state and city fields to user table.<br />";
$version[] = array('version' => '370025','description' => $update_string);
$update_string = " - Add replay gain fields to song_data table.<br />";
$version[] = array('version' => '370026','description' => $update_string);
return $version;
}
@ -3215,4 +3218,20 @@ class Update
return $retval;
}
/**
* update 370026
*
* Add replay gain fields to song_data table
*/
public static function update_370026()
{
$retval = true;
$sql = "ALTER TABLE `song_data` ADD COLUMN `replaygain_track_gain` DECIMAL(10,6) NULL, ADD COLUMN `replaygain_track_peak` DECIMAL(10,6) NULL, " .
"ADD COLUMN `replaygain_album_gain` DECIMAL(10,6) NULL, ADD COLUMN `replaygain_album_peak` DECIMAL(10,6) NULL";
$retval = Dba::write($sql) ? $retval : false;
return $retval;
}
}

View file

@ -378,6 +378,11 @@ class vainfo
'<br />',
strip_tags($tags['lyrics']));
$info['replaygain_track_gain'] = $info['replaygain_track_gain'] ?: floatval($tags['replaygain_track_gain']);
$info['replaygain_track_peak'] = $info['replaygain_track_peak'] ?: floatval($tags['replaygain_track_peak']);
$info['replaygain_album_gain'] = $info['replaygain_album_gain'] ?: floatval($tags['replaygain_album_gain']);
$info['replaygain_album_peak'] = $info['replaygain_album_peak'] ?: floatval($tags['replaygain_album_peak']);
$info['track'] = $info['track'] ?: intval($tags['track']);
$info['resolution_x'] = $info['resolution_x'] ?: intval($tags['resolution_x']);
$info['resolution_y'] = $info['resolution_y'] ?: intval($tags['resolution_y']);
@ -841,6 +846,18 @@ class vainfo
case 'CATALOGNUMBER':
$parsed['catalog_number'] = $this->trimAscii($txxx['data']);
break;
case 'REPLAYGAIN_TRACK_GAIN':
$parsed['replaygain_track_gain'] = floatval($txxx['data']);
break;
case 'REPLAYGAIN_TRACK_PEAK':
$parsed['replaygain_track_peak'] = floatval($txxx['data']);
break;
case 'REPLAYGAIN_ALBUM_GAIN':
$parsed['replaygain_album_gain'] = floatval($txxx['data']);
break;
case 'REPLAYGAIN_ALBUM_PEAK':
$parsed['replaygain_album_peak'] = floatval($txxx['data']);
break;
}
}
}

View file

@ -251,9 +251,14 @@ class WebPlayer
}
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;

View file

@ -1,9 +1,14 @@
function loadContentData(data, status, jqXHR)
{
var $mainContent = $("#content");
var $pageWrap = $("#guts");
var $response = $(data);
if ($response.find("#guts").length === 0) {
$("body").undelegate("a");
$("body").undelegate("form");
$("body").empty().append($response);
} else {
var $mainContent = $("#content");
var $pageWrap = $("#guts");
$mainContent.empty().append($response.find("#guts"));
$mainContent.fadeIn(200, function() {
$pageWrap.animate({
@ -13,6 +18,7 @@ function loadContentData(data, status, jqXHR)
$("a[rel^='prettyPhoto']").prettyPhoto({social_tools:false});
initTabs();
}
}
function loadContentPage(url)
{

View file

@ -10,7 +10,10 @@ jPlayerPlaylist.prototype._createListItem = function(media) {
}
attrClass += '" ';
var listItem = "<li" + attrClass + " name=\"" + $(jplaylist.cssSelector.playlist + " ul li").length + "\" data-poster=\"" + media['poster'] + "\" data-media_id=\"" + media['media_id'] + "\" data-album_id=\"" + media['album_id'] + "\" data-artist_id=\"" + media['artist_id'] + "\"><div>";
var listItem = "<li" + attrClass + " name=\"" + $(jplaylist.cssSelector.playlist + " ul li").length + "\" " +
"data-poster=\"" + media['poster'] + "\" data-media_id=\"" + media['media_id'] + "\" data-album_id=\"" + media['album_id'] + "\" data-artist_id=\"" + media['artist_id'] + "\" " +
"data-replaygain_track_gain=\"" + media['replaygain_track_gain'] + "\" data-replaygain_track_peak=\"" + media['replaygain_track_peak'] + "\" data-replaygain_album_gain=\"" + media['replaygain_album_gain'] + "\" data-replaygain_album_peak=\"" + media['replaygain_album_peak'] + "\"" +
"><div>";
// Create image
// listItem += "<img class=\"cover\" src=\"" + media.cover + "\" alt=\"" + media.title + "\"/>";

View file

@ -121,6 +121,7 @@ if ($isVideo) {
<?php if (AmpConfig::get('browser_notify')) { ?>
NotifyOfNewSong(obj.title, obj.artist, currentjpitem.attr("data-poster"));
<?php } ?>
ApplyReplayGain();
}
if (brkey != '') {
sendBroadcastMessage('SONG', currenti.attr("data-media_id"));
@ -440,6 +441,9 @@ if ($isVideo) {
<div class="action_button">
<a onClick="ShowVisualizerFullScreen();" href="#"><?php echo UI::get_icon('fullscreen', T_('Visualizer Full-Screen')); ?></a>
</div>
<div class="action_button">
<a href="javascript:ToggleReplayGain();"><?php echo UI::get_icon('replaygain', T_('ReplayGain')); ?></a>
</div>
<?php } ?>
<?php } ?>
</div>

View file

@ -52,6 +52,10 @@ function addMedia(media)
jpmedia['artist_id'] = media['artist_id'];
jpmedia['album_id'] = media['album_id'];
jpmedia['media_id'] = media['media_id'];
jpmedia['replaygain_track_gain'] = media['replaygain_track_gain'];
jpmedia['replaygain_track_peak'] = media['replaygain_track_peak'];
jpmedia['replaygain_album_gain'] = media['replaygain_album_gain'];
jpmedia['replaygain_album_peak'] = media['replaygain_album_peak'];
jplaylist.add(jpmedia);
}
@ -200,6 +204,51 @@ function SavePlaylist()
}
handlePlaylistAction(url, 'rb_append_dplaylist_new');
}
var replaygainEnabled = false;
var replaygainNode = null;
function ToggleReplayGain()
{
if (replaygainNode == null) {
var mediaElement = document.getElementById("jp_audio_0");
if (mediaElement) {
var audioContext = null;
if (typeof AudioContext !== 'undefined') {
audioContext = new AudioContext();
} else if (typeof webkitAudioContext !== 'undefined') {
audioContext = new webkitAudioContext();
} else {
audioContext = null;
}
if (audioContext != null) {
var mediaSource = audioContext.createMediaElementSource(mediaElement);
replaygainNode = audioContext.createGain();
replaygainNode.gain.value = 1;
mediaSource.connect(replaygainNode);
replaygainNode.connect(audioContext.destination);
}
}
}
if (replaygainNode != null) {
replaygainEnabled = !replaygainEnabled;
ApplyReplayGain();
}
}
function ApplyReplayGain()
{
if (replaygainNode != null) {
var replaygain = 0;
if (replaygainEnabled && currentjpitem != null) {
var track_gain = currentjpitem.attr("data-replaygain_track_gain");
if (track_gain !== 'null') {
replaygain = parseFloat(track_gain);
}
}
replaygainNode.gain.value = (1 + (replaygain / 100));
}
}
</script>
<?php } ?>
<script type="text/javascript">

View file

@ -112,6 +112,12 @@ $button_flip_state_id = 'button_flip_state_' . $song->id;
$songprops[gettext_noop('Catalog Number')] = scrub_out($song->catalog_number);
$songprops[gettext_noop('Bitrate')] = scrub_out($song->f_bitrate);
$songprops[gettext_noop('Channels')] = scrub_out($song->channels);
if ($song->replaygain_track_gain != 0) {
$songprops[gettext_noop('ReplayGain Track Gain')] = scrub_out($song->replaygain_track_gain);
}
if ($song->replaygain_album_gain != 0) {
$songprops[gettext_noop('ReplayGain Album Gain')] = scrub_out($song->replaygain_album_gain);
}
if (Access::check('interface','75')) {
$songprops[gettext_noop('Filename')] = scrub_out($song->file) . " " . $song->f_size;
}