Gå til innhold

Anbefalte innlegg

Jeg trenger et irssi skript som kommuniserer med en telnet server.

 

Her er skjellettkode som dere kan bruke.

 

#!/usr/bin/perl
use strict;
use warnings;
use lib '/usr/local/lib/perl5/site_perl/5.6.2/';
use Irssi;
use IO::Socket;
use Data::Dumper;

sub fb2k {

# Kode for å kommunisere med server skal være her
#
# Bruk følgende for å sende en beskjed til kanalen
# Irssi::server_find_tag('nettverk')->command("/msg #kanal np: $song");
# $song må fylles med sangtittel.

}

fb2k;

 

Det skal styre en serverplugin til FooBar2000 som lar deg hente ut hvilken sang som spilles og styre avspillingen med play, pause, stop, next, prev kommandoer.

 

Et eksempel på ting som vises når du bruker telnet kommandoen mot serveren er:

999|Connected to foobar2000 Control Server v0.8.5 beta 9|
999|Accepted client from 127.0.0.1|
999|There are currently 1/4 clients connected|
999|Type '?' or 'help' for command information|
111|0|128|38.22|MP3|192|226.63||Andrea T Mendoza & Tibet||2005|Dance||Could It Be Magic|

 

Du ser at du får en statuskode først, så data etter. Alt er adskilt med | tegnet (pipe) og det er linjeskift mellom hver linje (\n).

 

Jeg har fått til velfungerende kode i PHP som ser slik ut:

$fs = fsockopen($host, $port, $errno, $errstr, 10);
if (!$fs) die('Error #'.$errno.': '.$errstr);
while (!feof($fs)) {
 // Les alt til vi treffer en \n
 fscanf($fs, '%[ -~]\n', $line);
               // Del opp i array. | er skilletegn
 $data = preg_split('/\|/', $line);
               // Sjekk om vi har statuskode 111, 112 eller 113 som tilsier
               // playing, paused eller stopped respektivt.
               // Statuskoden er i $data[0] (første element i array)
 if ( preg_match('/^111|112|113$/', $data[0]) ) {
 	// Ta vare på denne statuslinja siden den inneholder info om sangen som spilles
 	$songinfo = $data;
 	break;
 }
}
       fclose($fs);

 

Så hele greia går ut på å skrive om det til Perl.

 

Videre for å diskutere protokollen så kan så skrive "help" til serveren når du er tilkoblet og trykke ENTER. Da får du:

http://pastebin.ca/107667

(Link til tekst, blir for mye å legge her på forumet)

 

Ganske kjekt ikke sant?

 

FooBar2000 komponenten heter forresten foo_controlserver

Link til den her: http://www.hydrogenaudio.org/forums/index....showtopic=38114

Endret av saivert
Lenke til kommentar
Videoannonse
Annonse

Vet ikke hva "irssi skript" er for noe Saivert, men her har du litt socket kode i perl som du kan tilpasse.

 

PS!

Til Saivert og Torbjørn : Hvorfor gidder dere å bruke PHP, egentlig?

 

   use IO::Socket;
   use Carp;
   
   my $RemoteAdr   = q(www.vg.no);
   my $RemotePort  = q(80);
   
   my $Client = IO::Socket::INET->new (PeerAddr  => $RemoteAdr,
                                       PeerPort  => $RemotePort,
                                       Proto     => 'tcp',
                                       Type      => SOCK_STREAM
                                        )
                                       or croak "Problems creating client..";
       #Send forespørsel
   print $Client "GET /index.html HTTP/1.1\n\n";
       #Dump ut svar
   my @g = <$Client>;
   print "\nGot:", @g;

Lenke til kommentar

PHP er noe jeg bruker for en webside som styrer foobar2000. Der har jeg fått til koden som kommuniserer med serveren.

 

Jeg har også tatt en titt på foo_http_writer som fungerer greit. Har allerede Perl skript som jeg kan kjøre i irssi (som er en konsollbasert IRC klient, trodde dere Perl-freks kjente til denne IRC klienten da).

 

Men foo_controlserver er mer avansert og støtter flere kommandoer, samt at man har en persistent tilkobling mot server og kan motta events (ny trackinfo linje hver gang det skifter sang i FooBar2000).

 

Jeg prøvde meg med IO::Sockets, men fikk det ikke helt til med å lese fra socket direkte. Men skal prøve igjen med den koden som jeg fikk her nå.

 

Jeg vil såklart poste ferdig skript når jeg får det til så dere ser resultatet til slutt.

Det er jo litt av poenget her ikke sant?

Lenke til kommentar

Hei Saivert, sett litt på koden din for winamp plugin'en din (skrevet i visual c++, sant?). Har du laget denne fra scratch selv, eller har du modifisert ekisterende kode? Uansett imponerende greier.

 

Tror tilsvarende greier skulle være mulig å lage kjapt i perl ved hjelp av "httpQ winamp-plugin" samt perltray (for generering av "popup" på enklest mulig måte).

 

Er ikke personlig så fascinert av slike plugins, egentlig, men er klart man lærer masse av slike prosjekt som man kan ta med seg videre. Og ha litt c i baklomma er jo kjekt om man en vakker dag skulle ha bruk for å lage noe i XS, samt du får vel mye gratis i perl dersom du er stabil i c, vil jeg tro?

Lenke til kommentar

Jeg bestemte meg for å fortsette å bruke foo_write_http komponenten til FooBar2000. Har skrevet ferdig koden som ser slik ut:

 

#!/usr/bin/perl
#
# FooBar2000 Now playing script
# Requires foo_write_http component installed in FooBar2000
#

use strict;
use warnings;
use lib '/usr/local/lib/perl5/site_perl/5.6.2/';
use Irssi;
use Irssi::Irc;
use LWP::UserAgent;
#use Data::Dumper;

sub fb2k_cursong{

my ($data, $server, $witem) = @_;

 my $ua = new LWP::UserAgent;
 $ua->timeout(10);
 $ua->agent("Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.0.5) Irssi/0.8.10 Saivert-parser/1.0");
 my $res = $ua->get("http://home.saivert.com:4800/?cmd=" . $data);

 if ($res->is_success) {
 	my $content = $res->content;
 	if (!($data eq "")) {
   Irssi::print($content);
 	} else {
   if ($witem && ($witem->{type} eq "CHANNEL" || $witem->{type} eq "QUERY")) {
   	$witem->command("SAY $content");
   }
 	}
 } else {
 	Irssi::print("fb2k.pl: Could not get songinfo");
 }


}

Irssi::command_bind('np', 'fb2k_cursong');


 

/np dumper bare ut gjeldende sang i den kanalen du befinner deg i.

/np <kommando> utfører kommandoen.

kommandoer er start, stop, next, previous

Endret av saivert
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...