App-MHFS
view release on metacpan or search on metacpan
lib/MHFS/Plugin/Playlist.pm view on Meta::CPAN
package MHFS::Plugin::Playlist v0.7.0;
use 5.014;
use strict; use warnings;
use feature 'say';
use Data::Dumper;
use URI::Escape qw(uri_escape);
use Encode qw(decode);
sub video_get_m3u8 {
my ($video, $urlstart) = @_;
my $buf;
my $m3u8 = <<'M3U8END';
#EXTM3U
#EXTVLCOPT:network-caching=40000'
M3U8END
my @files;
if(! -d $video->{'src_file'}{'filepath'}) {
push @files, $video->{'src_file'}{'fullname'};
}
else {
output_dir_versatile($video->{'src_file'}{'filepath'}, {
'root' => $video->{'src_file'}{'root'},
'on_file' => sub {
my ($path, $shortpath) = @_;
push @files, $shortpath;
}
});
}
foreach my $file (@files) {
$m3u8 .= '#EXTINF:0, ' . decode('UTF-8', $file, Encode::LEAVE_SRC) . "\n";
$m3u8 .= $urlstart . uri_escape($file) . "\n";
#$m3u8 .= $urlstart . small_url_encode($file) . "\n";
}
return \$m3u8;
}
sub new {
my ($class, $settings, $server) = @_;
my $self = {};
bless $self, $class;
my @subsystems = ('video');
$self->{'routes'} = [
[
'/playlist/*', sub {
my ($request) = @_;
my $qs = $request->{'qs'};
my @pathcomponents = split('/', $request->{'path'}{'unsafepath'});
if(scalar(@pathcomponents) >= 3) {
if($pathcomponents[2] eq 'video') {
if(scalar(@pathcomponents) >= 5) {
my %video = ('out_fmt' => ($request->{'qs'}{'vfmt'} // 'noconv'));
my $sid = $pathcomponents[3];
splice(@pathcomponents, 0, 4);
my $nametolookup = join('/', @pathcomponents);
$video{'src_file'} = $server->{'fs'}->lookup($nametolookup, $sid);
if( ! $video{'src_file'} ) {
$request->Send404;
return undef;
}
$video{'out_base'} = $video{'src_file'}{'name'};
my $fmt = $request->{'qs'}{'fmt'} // 'm3u8';
if($fmt eq 'm3u8') {
my $absurl = $request->getAbsoluteURL;
if(! $absurl) {
say 'unable to $request->getAbsoluteURL';
$request->Send404;
return undef;
}
my $m3u8 = video_get_m3u8(\%video, $absurl . '/get_video?sid='. $sid . '&name=');
$video{'src_file'}{'ext'} = $video{'src_file'}{'ext'} ? '.'. $video{'src_file'}{'ext'} : '';
$request->{'responseopt'}{'cd_file'} = 'inline';
$request->SendText('application/x-mpegURL', $$m3u8, {'filename' => $video{'src_file'}{'name'} . $video{'src_file'}{'ext'} . '.m3u8'});
return 1;
}
}
}
}
$request->Send404;
}
],
];
return $self;
}
1;
( run in 0.978 second using v1.01-cache-2.11-cpan-39bf76dae61 )