Najnovšie na Twitteri
    sledujte môj Twitter
    Moje projekty

    MPD a fyzické mazanie súborov

    Publikované: 05.11.2008 13:43 | Zobrazené: 492x

    Keďže ja mažem hudobné súbory pomerne často, tak mi táto črta chýbala až natoľko, že som sa rozhodol s tým niečo robiť. Vyriešil som to za pár minút, dosť jednoducho a nie práve najbezpečnejšie :). ja si to spúšťam v bezpečnom prostredí a kto si to bude chcieť nejako upraviť a zabezpečiť, tak si môže upraviť kódy.

    Celú funkcionalitu som rozdelil na dve časti: serverová a klientská. Dalo by sa síce všetko riešiť aj ako jedna aplikácia, ale do budúcna si možno napíšem plugin do nejakého MPD klienta a tam sa mi takáto architektúra hodí.

    Serverová časť sa spustí a počúva príkazy na porte 6601. Ak obdrží príkaz delete nasledovaný ID skladby z playlistu, tak túto skladbu odstráni fyzicky z disku aj s playlistu MPD. A potom čaká na ďalšie pripojenia a príkazy.

    Klientská časť je vytvorené priamo pre moje potreby - mazanie aktuálne prehrávanej skladby. Po spustení sa zistí ID skladby v playliste, vzápätí odošle príkaz na zmazanie, počká na odpoveď a ukončí sa.

    Server:

    #!/usr/bin/perl
     
    # vim:set shiftwidth=4 tabstop=4 expandtab foldmethod=marker: #
     
    use strict;
    use warnings;
     
    use IO::Socket;
    use LWP::Socket;
     
    my $PORT        = 6601;
    my $PROTOCOL    = getprotobyname("tcp");
    my $MPD_ROOT    = '/home/perun/Music';
    my $SERVER_ADDR = '192.168.0.4';
    my $MPD_PORT    = 6600;
     
    my $running = 1;
     
    my ($paddr, $cport, $caddr);
       
    if (socket(SERVER, PF_INET, SOCK_STREAM, $PROTOCOL)
    && setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, pack("l", 1))
    && bind(SERVER, sockaddr_in($PORT, INADDR_ANY))
    && listen(SERVER, SOMAXCONN)) {
        while (($running) && ($paddr = accept(CLIENT, SERVER))) {
           my ($cport, $caddr) = sockaddr_in($paddr);
           $caddr = inet_ntoa($caddr);
     
           while (($running) && (my $line = <CLIENT>)) {
               $line =~ s/^s+|s+$//g;
               $line = $line;
               print $caddr, ": ", $line, "
    "; $|++;
     
               send CLIENT, "OK
    ", MSG_EOR;
     
               last if (lc $line eq 'close');
               last if (lc $line eq 'exit');
               last if (lc $line eq 'quit');
               $running = 0 if (lc $line eq 'shutdown');
     
               if ($line =~ /^delete: (.+)$/) {
                   my $id = ;
                   my $buffer;
                   my $socket = new LWP::Socket;
                   $socket->connect ($SERVER_ADDR, $MPD_PORT);
                   $socket->write ("playlistid $id
    ");
                   $socket->read_until("OK
    ", $buffer);
                   
                   my @lines = split /
    /, $buffer;
                   my $filename;
                   foreach my $line (@lines) {
                       my ($key, $value) = split /:/, $line;
        
                       if (lc $key eq 'file') {
                           $value =~ s/^s*|s*$//g;
                           $filename = $value;
                       }
                   }
     
                   if ( -f "$MPD_ROOT/$filename") {
                       $socket->write ("deleteid $id
    ");
                       $socket->read_until("OK
    ", $buffer);
                       unlink "$MPD_ROOT/$filename";
                       print "OK
    ";
                   }
                   else {
                       print "Neexistuje
    ";
                   }
               }
           }
           close CLIENT;
        }
    }
    close SERVER;

    Klient:

    #!/usr/bin/perl
     
    # vim:set shiftwidth=4 tabstop=4 expandtab foldmethod=marker: #
     
    use strict;
    use warnings;
     
    use LWP::Socket;
     
    my $buffer;
     
    my $SERVER_ADDR     = '192.168.0.4';
    my $MPD_PORT        = 6600;
    my $MPD_REMOVE_PORT = 6601;
     
    my $socket = new LWP::Socket;
    $socket->connect ($SERVER_ADDR, $MPD_PORT);
    $socket->write ("currentsong
    ");
    $socket->read_until("OK
    ", $buffer);
     
    my @lines = split /
    /, $buffer;
    my $id = 0;
    my $file = "";
    foreach my $line (@lines) {
        my ($key, $value) = split /:/, $line;
        
        if (lc $key eq 'file') {
            $value =~ s/^s*|s*$//g;
            $file = $value;
        }
        elsif (lc $key eq 'id') {
            $value =~ s/^s*|s*$//g;
            $id = $value;
        }
    }
     
    my $server = new LWP::Socket;
    my $resp;
    $server->connect ($SERVER_ADDR, $MPD_REMOVE_PORT);
    $server->write ("delete: $id
    ");
    $server->read_until ("
    ", $resp);
    $server = undef;
    print "Deleting track: ", $file, "
    ";
    print "Response: ", $resp, "
    ";
     
    $socket = undef;

    Pošli na: Facebook   vybrali.sme.sk
    Komentáre:

    Zatiaľ nie sú žiadne komentáre.

    Pridať komentár