MPD a fyzické mazanie súborov
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;
Zatiaľ nie sú žiadne komentáre.