App-MHFS
view release on metacpan or search on metacpan
lib/MHFS/Plugin/MusicLibrary.pm view on Meta::CPAN
$where //= '';
my $buf = '';
my $name_unencoded = $files->[3];
my $name = ${escape_html_noquote($name_unencoded)};
if($files->[2]) {
my $dir = $files->[0];
$buf .= '<tr>';
$buf .= '<td>';
$buf .= '<table border="1" class="tbl_track">';
$buf .= '<tbody>';
$buf .= '<tr class="track">';
$buf .= '<th>' . $name . '</th>';
$buf .= '<th><a href="#">Play</a></th><th><a href="#">Queue</a></th><th><a href="music_dl?action=dl&name=' . uri_escape_utf8($where.$name_unencoded) . '">DL</a></th>';
$buf .= '</tr>';
$where .= $name_unencoded . '/';
foreach my $file (@{$files->[2]}) {
$buf .= ToHTML($file, $where) ;
}
$buf .= '</tbody></table>';
$buf .= '</td>';
}
else {
if($where eq '') {
$buf .= '<table border="1" class="tbl_track">';
$buf .= '<tbody>';
}
$buf .= '<tr class="track">';
$buf .= '<td>' . $name . '</td>';
$buf .= '<td><a href="#">Play</a></td><td><a href="#">Queue</a></td><td><a href="music_dl?action=dl&name=' . uri_escape_utf8($where.$name_unencoded).'">DL</a></td>';
if($where eq '') {
$buf .= '</tr>';
$buf .= '</tbody></table>';
return $buf;
}
}
$buf .= '</tr>';
return $buf;
}
sub toJSON {
my ($self) = @_;
my $head = {'files' => []};
my @nodestack = ($head);
my @files = (@{$self->{'library'}});
while(@files) {
my $file = shift @files;
if( ! $file) {
pop @nodestack;
next;
}
my $node = $nodestack[@nodestack - 1];
my $newnode = {'name' =>$file->[3]};
if($file->[2]) {
$newnode->{'files'} = [];
push @nodestack, $newnode;
@files = (@{$file->[2]}, undef, @files);
}
push @{$node->{'files'}}, $newnode;
}
# encode json outputs bytes NOT unicode string
return encode_json($head);
}
sub LibraryHTML {
my ($self) = @_;
my $buf = '';
foreach my $file (@{$self->{'library'}}) {
$buf .= ToHTML($file);
$buf .= '<br>';
}
my $legacy_template = HTML::Template->new(filename => 'templates/music_legacy.html', path => $self->{'settings'}{'APPDIR'} );
$legacy_template->param(musicdb => $buf);
$self->{'html'} = encode('UTF-8', $legacy_template->output, Encode::FB_CROAK);
$self->{'musicdbhtml'} = encode('UTF-8', $buf, Encode::FB_CROAK);
$self->{'musicdbjson'} = toJSON($self);
}
sub SendLibrary {
my ($self, $request) = @_;
# maybe not allow everyone to do these commands?
if($request->{'qs'}{'forcerefresh'}) {
say __PACKAGE__.": forcerefresh";
$self->BuildLibraries();
}
elsif($request->{'qs'}{'refresh'}) {
say __PACKAGE__.": refresh";
UpdateLibrariesAsync($self, $request->{'client'}{'server'}{'evp'}, sub {
say __PACKAGE__.": refresh done";
$request->{'qs'}{'refresh'} = 0;
SendLibrary($self, $request);
});
return 1;
}
# deduce the format if not provided
my $fmt = $request->{'qs'}{'fmt'};
if(! $fmt) {
$fmt = 'worklet';
my $fallback = 'musicinc';
if($request->{'header'}{'User-Agent'} =~ /Chrome\/([^\.]+)/) {
my $ver = $1;
# SharedArrayBuffer support with spectre/meltdown fixes was added in 68
# AudioWorklet on linux had awful glitching until somewhere in 92 https://bugs.chromium.org/p/chromium/issues/detail?id=825823
if($ver < 93) {
if(($ver < 68) || ($request->{'header'}{'User-Agent'} =~ /Linux/)) {
$fmt = $fallback;
}
}
}
elsif($request->{'header'}{'User-Agent'} =~ /Firefox\/([^\.]+)/) {
my $ver = $1;
# SharedArrayBuffer support with spectre/meltdown fixes was added in 79
if($ver < 79) {
$fmt = $fallback;
}
}
( run in 0.926 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )