| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | package Plugins::SqueezeESP32::Player;use strict;use base qw(Slim::Player::SqueezePlay);use Digest::MD5 qw(md5);use List::Util qw(min);use Slim::Utils::Log;use Slim::Utils::Prefs;my $prefs = preferences('plugin.squeezeesp32');my $log   = logger('plugin.squeezeesp32');sub model { 'squeezeesp32' }sub modelName { 'SqueezeESP32' }sub hasIR { 0 }sub init {	my $client = shift;	$client->SUPER::init(@_);	$client->config_artwork();}# Allow the player to define it's display width (and probably more)sub playerSettingsFrame {	my $client   = shift;	my $data_ref = shift;	my $value;	my $id = unpack('C', $$data_ref);	# New SETD command 0xfe for display width & height	if ($id == 0xfe) {		$value = (unpack('Cn', $$data_ref))[1];		if ($value > 100 && $value < 400) {			$prefs->client($client)->set('width', $value);			my $height = (unpack('Cnn', $$data_ref))[2];			$prefs->client($client)->set('height', $height || 0);			$client->display->modes($client->display->build_modes);			$client->display->widthOverride(1, $value);			$client->update;			main::INFOLOG && $log->is_info && $log->info("Setting player $value" . "x" . "$height for ", $client->name);		}	}	$client->SUPER::playerSettingsFrame($data_ref);}sub hasScrolling {	return 1;}sub hasIR { 	return 1; }sub update_artwork {	my $client = shift;	my $cprefs = $prefs->client($client);	my $artwork = $cprefs->get('artwork') || return;	return unless $artwork->{'enable'};	my $s = min($cprefs->get('height') - $artwork->{'y'}, $cprefs->get('width') - $artwork->{'x'});	my $params = { force => shift || 0 };	my $path = 'music/current/cover_' . $s . 'x' . $s . '_o.jpg';	my $body = Slim::Web::Graphics::artworkRequest($client, $path, $params, \&send_artwork, undef, HTTP::Response->new);	send_artwork($client, undef, \$body) if $body;}sub send_artwork {	my ($client, $params, $dataref) = @_;	# I'm not sure why we are called so often, so only send when needed	my $md5 = md5($$dataref);	return if $client->pluginData('artwork_md5') eq $md5 && !$params->{'force'};	$client->pluginData('artwork', $dataref);	$client->pluginData('artwork_md5', $md5);	my $artwork = $prefs->client($client)->get('artwork') || {};	my $length = length $$dataref;	my $offset = 0;	$log->info("got resized artwork (length: ", length $$dataref, ")");	my $header = pack('Nnn', $length, $artwork->{'x'}, $artwork->{'y'});	while ($length > 0) {		$length = 1280 if $length > 1280;		$log->info("sending grfa $length");		my $data = $header . pack('N', $offset) . substr( $$dataref, 0, $length, '' );		$client->sendFrame( grfa => \$data );		$offset += $length;		$length = length $$dataref;	}}sub clear_artwork {	my ($client, $request) = @_;	my $artwork = $prefs->client($client)->get('artwork');	if ($artwork && $artwork->{'enable'}) {		main::INFOLOG && $log->is_info && $log->info("artwork stop/clear " . $request->getRequestString());		$client->pluginData('artwork_md5', '');	}}sub config_artwork {	my ($client) = @_;	if ( my $artwork = $prefs->client($client)->get('artwork') ) {		my $header = pack('Nnn', $artwork->{'enable'}, $artwork->{'x'}, $artwork->{'y'});		$client->sendFrame( grfa => \$header );	}}sub reconnect {	my $client = shift;	$client->pluginData('artwork_md5', '');	$client->SUPER::reconnect(@_);}1;
 |