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