Brauch Hilfe beim Plugin hacken

Antworten
swer
Beiträge: 1
Registriert: 23. Dezember 2016 17:39
SqueezeBox: Boom
SqueezeBox: SqueezePlay
SqueezeBox Server läuft auf: Gentoo Linux

Brauch Hilfe beim Plugin hacken

Beitrag von swer »

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.

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;
Antworten