Brauch Hilfe beim Plugin hacken
Verfasst: 23. Dezember 2016 18:03
Hallo
Ich hoffe es kann mir einer dabei helfen ein kleines Plugin anzupassen.
Leider habe ich keine Kenntnisse in Perl konnte aber auf Grundlage eines anderen Plugins mir die Grundfunktion erstellen.
Das Plugin schreibt die Metadaten des Aktuellen Titel eines bestimmten Players in eine Textdatei und informiert dann einen ices Client darüber. So kann dieser dann die Metainformationen über einen normalen MP3 Streaming Server verteilen. Das klappt auch soweit.
Leider ist das Timing nicht gut genug, daher würde ich den Player jetzt gerne bei begin eines neuen Titels jedes mal kurz anhalten.
Ich tu mich jedoch schwer die richtige Funktion dafür zu finden.
Ich habe versucht mit $client->execute([ 'play' ]) und $client->execute([ 'pause' ]) dieses zu erreichen aber dieses macht nicht was ich will.
Ich habe versucht mir mit Data::Dumper mir die passende Funktion heraus zu suchen aber die Ausgabe die ich erhalte ist doch sehr unübersichtlich.
Also falls mir jemand sagen kann wie ich aus einem Plugin einen Player pausieren kann bzw wo mann das nachlesen kann wäre das super.
Anbei das Plugin das ich soweit habe.
Ich hoffe es kann mir einer dabei helfen ein kleines Plugin anzupassen.
Leider habe ich keine Kenntnisse in Perl konnte aber auf Grundlage eines anderen Plugins mir die Grundfunktion erstellen.
Das Plugin schreibt die Metadaten des Aktuellen Titel eines bestimmten Players in eine Textdatei und informiert dann einen ices Client darüber. So kann dieser dann die Metainformationen über einen normalen MP3 Streaming Server verteilen. Das klappt auch soweit.
Leider ist das Timing nicht gut genug, daher würde ich den Player jetzt gerne bei begin eines neuen Titels jedes mal kurz anhalten.
Ich tu mich jedoch schwer die richtige Funktion dafür zu finden.
Ich habe versucht mit $client->execute([ 'play' ]) und $client->execute([ 'pause' ]) dieses zu erreichen aber dieses macht nicht was ich will.
Ich habe versucht mir mit Data::Dumper mir die passende Funktion heraus zu suchen aber die Ausgabe die ich erhalte ist doch sehr unübersichtlich.
Also falls mir jemand sagen kann wie ich aus einem Plugin einen Player pausieren kann bzw wo mann das nachlesen kann wäre das super.
Anbei das Plugin das ich soweit habe.
Code: Alles auswählen
package Slim::Plugin::MyMetadata::Plugin;
use strict;
use warnings;
use base qw(Slim::Plugin::Base);
use Encode qw(encode decode);
use Time::HiRes qw(usleep nanosleep);
use Slim::Player::ProtocolHandlers;
use Slim::Player::Source;
use Slim::Utils::Log;
use Slim::Utils::Strings qw(string);
my $log = Slim::Utils::Log->addLogCategory( {
category => 'plugin.mymetadata',
defaultLevel => 'ERROR',
description => 'PLUGIN_MYMETADATA_MODULE_NAME',
} );
my %functions = ( 'left' => sub { my $client = shift; Slim::Buttons::Common::popModeRight($client); }, # leave this one out and you're blocked
);
sub getDisplayName {
return 'PLUGIN_MYMETADATA_MODULE_NAME';
}
sub initPlugin {
my $class = shift;
$class->SUPER::initPlugin();
# Subscribe to new song events
Slim::Control::Request::subscribe(
\&newsongCallback,
[['playlist'], ['newsong']],
);
}
sub shutdownPlugin {
Slim::Control::Request::unsubscribe( \&newsongCallback );
}ohne Erfolg
sub newsongCallback {
my $request = shift;
my $client = $request->client() || return;
my $url = Slim::Player::Playlist::url($client);
my $track = Slim::Schema->objectForUrl( { url => $url } );
my $duration = $track->secs;
if ( $client->id ne "f4:6d:04:d6:0a:da") {
main::DEBUGLOG && $log->debug( "Player id is not f4:6d:04:d6:0a:da Player id is" . $client->id . ", ignoring" );
return;
}
$client->execute(['pause']);
if ( $track->remote ) {
my $handler = Slim::Player::ProtocolHandlers->handlerForURL($url);
if ( $handler && $handler->can('getMetadataFor') ) {
# this plugin provides track metadata, i.e. Pandora, Rhapsody
my $meta = $handler->getMetadataFor( $client, $url, 'forceCurrent' );
if ( $meta && $meta->{duration} ) {
$duration = $meta->{duration};
}
}
}
my $title = $track->title;
if ( $track->remote ) {
my $handler = Slim::Player::ProtocolHandlers->handlerForURL($url);
if ( $handler && $handler->can('getMetadataFor') ) {
# this plugin provides track metadata, i.e. Pandora, Rhapsody
my $meta = $handler->getMetadataFor( $client, $url, 'forceCurrent' );
$title = $meta->{title};
# Handler must return at least artist and title
unless ( $meta->{artist} && $meta->{title} ) {
main::DEBUGLOG && $log->debug( "Protocol Handler didn't return an artist and title for " . $track->url . ", ignoring" );
$client->execute(['play']);
return;
}
# Save the title in the track object so we can compare it in checkScrobble
$track->stash->{_plugin_title} = $title;
}
else {
main::DEBUGLOG && $log->debug("Ignoring remote URL $url");
$client->execute(['play']);
return;
}
}
writeMetadata($client, $track);
usleep(3000);
$client->execute(['play']);
}
sub writeMetadata {
my ( $client, $track ) = @_;
my $filename = '/tmp/Metadata.txt';
my $meta = _getMetadata($client, $track);
if ( open(my $fh, '>', $filename) ){
binmode $fh, ':encoding(UTF-8)';
print $fh "artist=". $meta->{artist}
. "\ntitle=" . $meta->{title}
. "\nalbum=" . $meta->{album}
. "\n";
close $fh;
system("killall", "-s", "SIGUSR1", "ices");
}
else {
main::DEBUGLOG && $log->debug( "Could not open file '$filename' $!");
return;
}
}
sub _getMetadata {
my ($client, $track, $url) = @_;
$url ||= $track->url;
my $meta = {
artist => $track->artistName || '',
album => ($track->album && $track->album->get_column('title')) || '',
title => $track->title,
tracknum => $track->tracknum || '',
duration => $track->secs,
};
if ( $track->remote ) {
my $handler = Slim::Player::ProtocolHandlers->handlerForURL( $url );
if ( $handler && $handler->can('getMetadataFor') ) {
# this plugin provides track metadata, i.e. Pandora, Rhapsody
my $meta2 = $handler->getMetadataFor( $client, $url, 'forceCurrent' );
# Handler must return at least artist and title
unless ( $meta2->{artist} && $meta2->{title} ) {
return {
msg => "Protocol Handler didn't return an artist and title for $url, ignoring"
};
}
$meta->{artist} = $meta2->{artist};
$meta->{album} = $meta2->{album} || '';
$meta->{title} = $meta2->{title};
$meta->{tracknum} = $meta2->{tracknum} || '';
$meta->{duration} = $meta2->{duration} || $track->secs;
}
else {
main::DEBUGLOG && $log->debug( 'Ignoring remote URL ' . $url );
return;
}
}
return $meta;
}
1;