--- Remote.pm 2011-10-02 22:48:13.000000000 +0100 +++ Remote.pm.new 2011-10-02 20:36:41.000000000 +0100 @@ -460,6 +460,16 @@ passthrough => [ $track, $args ], } ); } + elsif ( !main::SLIM_SERVICE && $type eq 'mp4' ) { + + main::DEBUGLOG && $log->is_debug && $log->debug('Reading MP4 header'); + + $http->read_body( { + readLimit => 4 * 1024, + onBody => \&parseMP4Header, + passthrough => [ $track, $args ], + } ); + } else { # If URL was mms but content-type is not wma, change URL if ( $track->url =~ /^mms/i ) { @@ -718,6 +728,46 @@ $cb->( $track, undef, @{$pt} ); } +sub parseMP4Header { + my ( $http, $track, $args ) = @_; + + my $client = $args->{client}; + my $cb = $args->{cb} || sub {}; + my $pt = $args->{pt} || []; + + my $header = $http->response->content; + + my $fh = File::Temp->new(); + $fh->write( $header, length($header) ); + $fh->seek(0, 0); + + my $mp4 = Audio::Scan->scan_fh( mp4 => $fh ); + + if ( my $samplerate = $mp4->{info}->{samplerate} ) { + if ( $samplerate <= 24000 ) { # XXX remove when Audio::Scan is updated to 0.84 + $samplerate *= 2; + } + $track->samplerate($samplerate); + } + + if ( my $bitrate = $mp4->{info}->{avg_bitrate} ) { + $track->bitrate($bitrate); + } + # Set duration if available (this is not a broadcast stream) + if ( my $ms = $mp4->{info}->{song_length_ms} ) { + Slim::Music::Info::setDuration( $track, int($ms / 1000) ); + } + + + if ( main::DEBUGLOG && $log->is_debug ) { + $log->debug( 'MP4 header data for ' . $track->url . ': ' . Data::Dump::dump($mp4) ); + } + # All done + $cb->( $track, undef, @{$pt} ); +} + + + sub streamAudioData { my ( $http, $dataref, $track, $args, $url ) = @_;