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 )