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