From 64d609cc338ec529671cb66a0a77be9d5f492a02 Mon Sep 17 00:00:00 2001 From: Philippe G Date: Wed, 28 Apr 2021 17:27:50 -0700 Subject: [PATCH] remove plugin from master --- plugin/SqueezeESP32.zip | Bin 14648 -> 0 bytes plugin/SqueezeESP32/FirmwareHelper.pm | 237 ------------ plugin/SqueezeESP32/Graphics.pm | 254 ------------- .../plugins/SqueezeESP32/settings/player.html | 106 ------ plugin/SqueezeESP32/Player.pm | 351 ------------------ plugin/SqueezeESP32/PlayerSettings.pm | 101 ----- plugin/SqueezeESP32/Plugin.pm | 106 ------ plugin/SqueezeESP32/Text.pm | 12 - plugin/SqueezeESP32/install.xml | 15 - plugin/SqueezeESP32/strings.txt | 104 ------ plugin/repo.xml | 8 +- 11 files changed, 4 insertions(+), 1290 deletions(-) delete mode 100644 plugin/SqueezeESP32.zip delete mode 100644 plugin/SqueezeESP32/FirmwareHelper.pm delete mode 100644 plugin/SqueezeESP32/Graphics.pm delete mode 100644 plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html delete mode 100644 plugin/SqueezeESP32/Player.pm delete mode 100644 plugin/SqueezeESP32/PlayerSettings.pm delete mode 100644 plugin/SqueezeESP32/Plugin.pm delete mode 100644 plugin/SqueezeESP32/Text.pm delete mode 100644 plugin/SqueezeESP32/install.xml delete mode 100644 plugin/SqueezeESP32/strings.txt diff --git a/plugin/SqueezeESP32.zip b/plugin/SqueezeESP32.zip deleted file mode 100644 index 9180a8fad19304bc02d40563d0475dc18665a570..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14648 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 3600 * (5 + rand()); -use constant GITHUB_RELEASES_URI => "https://api.github.com/repos/sle118/squeezelite-esp32/releases"; -use constant GITHUB_ASSET_URI => GITHUB_RELEASES_URI . "/assets/"; -use constant GITHUB_DOWNLOAD_URI => "https://github.com/sle118/squeezelite-esp32/releases/download/"; -my $FW_DOWNLOAD_ID_REGEX = qr|plugins/SqueezeESP32/firmware/(-?\d+)|; -my $FW_DOWNLOAD_REGEX = qr|plugins/SqueezeESP32/firmware/([-a-z0-9-/.]+\.bin)$|i; -my $FW_FILENAME_REGEX = qr/^squeezelite-esp32-.*\.bin(\.tmp)?$/; -my $FW_TAG_REGEX = qr/\/(ESP32-A1S|SqueezeAmp|I2S-4MFlash)\.(16|32)\.(\d+)\.(.*)\//; - -my $prefs = preferences('plugin.squeezeesp32'); -my $log = logger('plugin.squeezeesp32'); - -sub init { - Slim::Web::Pages->addRawFunction($FW_DOWNLOAD_ID_REGEX, \&handleFirmwareDownload); - Slim::Web::Pages->addRawFunction($FW_DOWNLOAD_REGEX, \&handleFirmwareDownloadDirect); - - # start checking for firmware updates - Slim::Utils::Timers::setTimer(undef, Time::HiRes::time() + 30 + rand(30), \&prefetchFirmware); -} - -sub prefetchFirmware { - Slim::Utils::Timers::killTimers(undef, \&prefetchFirmware); - my $releaseInfo = $prefs->get('lastReleaseTagUsed'); - - Slim::Networking::SimpleAsyncHTTP->new( - sub { - my $http = shift; - my $content = eval { from_json( $http->content ) }; - - if (!$content || !ref $content) { - $@ && $log->error("Failed to parse response: $@"); - } - - my $regex = $releaseInfo->{model} . '\.' . $releaseInfo->{res} . '\.\d+\.' . $releaseInfo->{branch}; - my $url; - foreach (@$content) { - if ($_->{tag_name} =~ /$regex/ && $_->{assets} && ref $_->{assets}) { - ($url) = grep /\.bin$/, map { - $_->{browser_download_url} - } @{$_->{assets}}; - - last if $url; - } - } - - downloadFirmwareFile(sub { - main::INFOLOG && $log->is_info && $log->info("Pre-cached firmware file: " . $_[0]); - }, sub { - my ($http, $error, $url, $code) = @_; - $error ||= ($http && $http->error) || 'unknown error'; - $url ||= ($http && $http->url) || 'no URL'; - - $log->error(sprintf("Failed to get firmware image from Github: %s (%s)", $error || $http->error, $url)); - }, $url) if $url && $url =~ /^https?/; - - }, - sub { - my ($http, $error) = @_; - $log->error("Failed to get releases from Github: $error"); - }, - { - timeout => 10, - cache => 1, - expires => 3600 - } - )->get(GITHUB_RELEASES_URI) if $releaseInfo; - - Slim::Utils::Timers::setTimer(undef, Time::HiRes::time() + FIRMWARE_POLL_INTERVAL, \&prefetchFirmware); -} - -sub handleFirmwareDownload { - my ($httpClient, $response) = @_; - - my $request = $response->request; - - my $_errorDownloading = sub { - _errorDownloading($httpClient, $response, @_); - }; - - my $id; - if (!defined $request || !(($id) = $request->uri =~ $FW_DOWNLOAD_ID_REGEX)) { - return $_errorDownloading->(undef, 'Invalid request', $request->uri, 400); - } - - # this is the magic number used on the client to figure out whether the plugin does support download proxying - if ($id == -99) { - $response->code(204); - $response->header('Access-Control-Allow-Origin' => '*'); - - $httpClient->send_response($response); - return Slim::Web::HTTP::closeHTTPSocket($httpClient); - } - - Slim::Networking::SimpleAsyncHTTP->new( - sub { - my $http = shift; - my $content = eval { from_json( $http->content ) }; - - if (!$content || !ref $content) { - $@ && $log->error("Failed to parse response: $@"); - return $_errorDownloading->($http); - } - elsif (!$content->{browser_download_url} || !$content->{name}) { - return $_errorDownloading->($http, 'No download URL found'); - } - - downloadFirmwareFile(sub { - my $firmwareFile = shift; - $response->code(200); - Slim::Web::HTTP::sendStreamingFile($httpClient, $response, 'application/octet-stream', $firmwareFile, undef, 1); - }, $_errorDownloading, $content->{browser_download_url}, $content->{name}); - }, - $_errorDownloading, - { - timeout => 10, - cache => 1, - expires => 86400 - } - )->get(GITHUB_ASSET_URI . $id); - - return; -} - -sub handleFirmwareDownloadDirect { - my ($httpClient, $response) = @_; - - my $request = $response->request; - - my $_errorDownloading = sub { - _errorDownloading($httpClient, $response, @_); - }; - - my $path; - if (!defined $request || !(($path) = $request->uri =~ $FW_DOWNLOAD_REGEX)) { - return $_errorDownloading->(undef, 'Invalid request', $request->uri, 400); - } - - main::INFOLOG && $log->is_info && $log->info("Requesting firmware from: $path"); - - downloadFirmwareFile(sub { - my $firmwareFile = shift; - $response->code(200); - Slim::Web::HTTP::sendStreamingFile($httpClient, $response, 'application/octet-stream', $firmwareFile, undef, 1); - }, $_errorDownloading, GITHUB_DOWNLOAD_URI . $path); -} - -sub downloadFirmwareFile { - my ($cb, $ecb, $url, $name) = @_; - - # keep track of the last firmware we requested, to prefetch it in the future - _getFirmwareTag($url); - - $name ||= basename($url); - - if ($name !~ $FW_FILENAME_REGEX) { - return $ecb->(undef, 'Unexpected firmware image name: ' . $name, $url, 400); - } - - my $updatesDir = Slim::Utils::OSDetect::dirsFor('updates'); - my $firmwareFile = catfile($updatesDir, $name); - Slim::Utils::Misc::deleteFiles($updatesDir, $FW_FILENAME_REGEX, $firmwareFile); - - if (-f $firmwareFile) { - main::INFOLOG && $log->is_info && $log->info("Found cached firmware file"); - return $cb->($firmwareFile); - } - - Slim::Networking::SimpleAsyncHTTP->new( - sub { - my $http = shift; - - if ($http->code != 200 || !-e "$firmwareFile.tmp") { - return $ecb->($http, $http->mess); - } - - rename "$firmwareFile.tmp", $firmwareFile or return $ecb->($http, "Unable to rename temporary $firmwareFile file" ); - - return $cb->($firmwareFile); - }, - $ecb, - { - saveAs => "$firmwareFile.tmp", - } - )->get($url); - - return; -} - -sub _getFirmwareTag { - my ($url) = @_; - - if (my ($model, $resolution, $version, $branch) = $url =~ $FW_TAG_REGEX) { - my $releaseInfo = { - model => $model, - res => $resolution, - version => $version, - branch => $branch - }; - - $prefs->set('lastReleaseTagUsed', $releaseInfo); - - return $releaseInfo; - } -} - -sub _errorDownloading { - my ($httpClient, $response, $http, $error, $url, $code) = @_; - - $error ||= ($http && $http->error) || 'unknown error'; - $url ||= ($http && $http->url) || 'no URL'; - $code ||= ($http && $http->code) || 500; - - $log->error(sprintf("Failed to get data from Github: %s (%s)", $error || $http->error, $url)); - - $response->headers->remove_content_headers; - $response->code($code); - $response->content_type('text/plain'); - $response->header('Connection' => 'close'); - $response->content(''); - - $httpClient->send_response($response); - Slim::Web::HTTP::closeHTTPSocket($httpClient); -}; - - -1; \ No newline at end of file diff --git a/plugin/SqueezeESP32/Graphics.pm b/plugin/SqueezeESP32/Graphics.pm deleted file mode 100644 index ce82b9fe..00000000 --- a/plugin/SqueezeESP32/Graphics.pm +++ /dev/null @@ -1,254 +0,0 @@ -package Plugins::SqueezeESP32::Graphics; - -use strict; - -use base qw(Slim::Display::Squeezebox2); - -use Slim::Utils::Prefs; -use Slim::Utils::Log; - -my $prefs = preferences('plugin.squeezeesp32'); -my $log = logger('plugin.squeezeesp32'); - -my $VISUALIZER_NONE = 0; -my $VISUALIZER_VUMETER = 1; -my $VISUALIZER_SPECTRUM_ANALYZER = 2; -my $VISUALIZER_WAVEFORM = 3; -my $VISUALIZER_VUMETER_ESP32 = 0x11; -my $VISUALIZER_SPECTRUM_ANALYZER_ESP32 = 0x12; - -my %SPECTRUM_DEFAULTS = ( - scale => 25, - small => { - size => 25, - band => 5.33 - }, - full => { - band => 8 - }, -); - -{ - #__PACKAGE__->mk_accessor('array', 'modes'); - __PACKAGE__->mk_accessor('rw', 'modes'); - __PACKAGE__->mk_accessor('rw', qw(vfdmodel)); -} - -sub new { - my $class = shift; - my $client = shift; - - my $display = $class->SUPER::new($client); - my $cprefs = $prefs->client($client); - - $cprefs->init( { - width => 128, - small_VU => 15, - spectrum => \%SPECTRUM_DEFAULTS, - } ); - - $prefs->migrateClient(2, sub { - my ($cprefs, $client) = @_; - sanitizeSpectrum($cprefs->get('spectrum')); - 1; - }); - - $display->init_accessor( - modes => $display->build_modes, - # Only seems to matter for screensaver and update to decide font. Not - # any value is acceptable, so use Boom value which seems to be best - # compromise - vfdmodel => 'graphic-160x32', - ); - - return $display; -} - -=comment -sub modes { - return \@modes; -} -=cut - -sub nmodes { - return scalar($#{shift->modes()}); -} - -sub displayWidth { - my $display = shift; - my $client = $display->client; - - # if we're showing the always-on visualizer & the current buttonmode - # hasn't overridden, then use the playing display mode to index - # into the display width, otherwise, it's fullscreen. - my $mode = 0; - - if ( $display->showVisualizer() && !defined($client->modeParam('visu')) ) { - my $cprefs = preferences('server')->client($client); - $mode = $cprefs->get('playingDisplayModes')->[ $cprefs->get('playingDisplayMode') ]; - } - - if ($display->widthOverride) { - my $artwork = $prefs->client($client)->get('artwork'); - if ($artwork->{'enable'} && $artwork->{'y'} < 32 && ($client->isPlaying || $client->isPaused)) { - return ($artwork->{x} || $display->widthOverride) + ($display->modes->[$mode || 0]{_width} || 0); - } else { - return $display->widthOverride + ($display->modes->[$mode || 0]{_width} || 0); - } - } else { - return $display->modes->[$mode || 0]{width}; - } -} - -sub brightnessMap { - return (0 .. 5); -} - -=comment -sub bytesPerColumn { - return 4; -} -=cut - -# I don't think LMS renderer handles properly screens other than 32 pixels. It -# seems that all we get is a 32 pixel-tall data with anything else padded to 0 -# i.e. if we try 64 pixels height, bytes 0..3 and 4..7 will contains the same -# pattern than the 32 pixels version, where one would have expected bytes 4..7 -# to be empty -sub displayHeight { - return 32; -} - -sub sanitizeSpectrum { - my ($spectrum) = shift; - - $spectrum->{small}->{size} ||= $SPECTRUM_DEFAULTS{small}->{size}; - $spectrum->{small}->{band} ||= $SPECTRUM_DEFAULTS{small}->{band}; - $spectrum->{full}->{band} ||= $SPECTRUM_DEFAULTS{full}->{band}; - - return $spectrum; -} - -sub build_modes { - my $client = shift->client; - my $cprefs = $prefs->client($client); - - my $artwork = $cprefs->get('artwork'); - my $disp_width = $cprefs->get('width') || 128; - - # if artwork is in main display, reduce width but when artwork is (0,0) fake it - my $width = ($artwork->{'enable'} && $artwork->{'y'} < 32 && $artwork->{'x'}) ? $artwork->{'x'} : $disp_width; - my $width_low = ($artwork->{'enable'} && $artwork->{'x'} && ($artwork->{'y'} >= 32 || $disp_width - $artwork->{'x'} > 32)) ? $artwork->{'x'} : $disp_width; - - my $small_VU = $cprefs->get('small_VU'); - my $spectrum = sanitizeSpectrum($cprefs->get('spectrum')); - - my $small_spectrum_pos = { x => $width - int ($spectrum->{small}->{size} * $width / 100), - width => int ($spectrum->{small}->{size} * $width / 100), - }; - my $small_VU_pos = { x => $width - int ($small_VU * $width / 100), - width => int ($small_VU * $width / 100), - }; - - my @modes = ( - # mode 0 - { desc => ['BLANK'], - bar => 0, secs => 0, width => $width, - params => [$VISUALIZER_NONE] }, - # mode 1 - { desc => ['PROGRESS_BAR'], - bar => 1, secs => 0, width => $width, - params => [$VISUALIZER_NONE] }, - # mode 2 - { desc => ['ELAPSED'], - bar => 0, secs => 1, width => $width, - params => [$VISUALIZER_NONE] }, - # mode 3 - { desc => ['ELAPSED', 'AND', 'PROGRESS_BAR'], - bar => 1, secs => 1, width => $width, - params => [$VISUALIZER_NONE] }, - # mode 4 - { desc => ['REMAINING'], - bar => 0, secs => -1, width => $width, - params => [$VISUALIZER_NONE] }, - # mode 5 - { desc => ['CLOCK'], - bar => 0, secs => 0, width => $width, clock => 1, - params => [$VISUALIZER_NONE] }, - # mode 6 - { desc => ['SETUP_SHOWBUFFERFULLNESS'], - bar => 0, secs => 0, width => $width, fullness => 1, - params => [$VISUALIZER_NONE] }, - # mode 7 - { desc => ['VISUALIZER_VUMETER_SMALL'], - bar => 0, secs => 0, width => $width, _width => -$small_VU_pos->{'width'}, - # extra parameters (width, height, col (< 0 = from right), row (< 0 = from bottom), left_space) - params => [$VISUALIZER_VUMETER_ESP32, $small_VU_pos->{'width'}, 32, $small_VU_pos->{'x'}, 0, 2] }, - # mode 8 - { desc => ['VISUALIZER_SPECTRUM_ANALYZER_SMALL'], - bar => 0, secs => 0, width => $width, _width => -$small_spectrum_pos->{'width'}, - # extra parameters (width, height, col (< 0 = from right), row (< 0 = from bottom), left_space, #bars, scale) - params => [$VISUALIZER_SPECTRUM_ANALYZER_ESP32, $small_spectrum_pos->{width}, 32, $small_spectrum_pos->{'x'}, 0, 2, $small_spectrum_pos->{'width'} / $spectrum->{small}->{band}, $spectrum->{scale}] }, - # mode 9 - { desc => ['VISUALIZER_VUMETER'], - bar => 0, secs => 0, width => $width, - params => [$VISUALIZER_VUMETER_ESP32, $width_low, 0] }, - # mode 10 - { desc => ['VISUALIZER_ANALOG_VUMETER'], - bar => 0, secs => 0, width => $width, - params => [$VISUALIZER_VUMETER_ESP32, $width_low, 1] }, - # mode 11 - { desc => ['VISUALIZER_SPECTRUM_ANALYZER'], - bar => 0, secs => 0, width => $width, - # extra parameters (bars) - params => [$VISUALIZER_SPECTRUM_ANALYZER_ESP32, $width_low, int ($width/$spectrum->{full}->{band}), $spectrum->{scale}] }, - ); - -my @extra = ( - # mode E1 - { desc => ['VISUALIZER_VUMETER', 'AND', 'ELAPSED'], - bar => 0, secs => 1, width => $width, - params => [$VISUALIZER_VUMETER_ESP32, $width_low, 0] }, - # mode E2 - { desc => ['VISUALIZER_ANALOG_VUMETER', 'AND', 'ELAPSED'], - bar => 0, secs => 1, width => $width, - params => [$VISUALIZER_VUMETER_ESP32, $width_low, 1] }, - # mode E3 - { desc => ['VISUALIZER_SPECTRUM_ANALYZER', 'AND', 'ELAPSED'], - bar => 0, secs => 1, width => $width, - # extra parameters (bars) - params => [$VISUALIZER_SPECTRUM_ANALYZER_ESP32, $width_low, int ($width/$spectrum->{full}->{band}), $spectrum->{scale}] }, - # mode E4 - { desc => ['VISUALIZER_VUMETER', 'AND', 'REMAINING'], - bar => 0, secs => -1, width => $width, - params => [$VISUALIZER_VUMETER_ESP32, $width_low, 0] }, - # mode E5 - { desc => ['VISUALIZER_ANALOG_VUMETER', 'AND', 'REMAINING'], - bar => 0, secs => -1, width => $width, - params => [$VISUALIZER_VUMETER_ESP32, $width_low, 1] }, - # mode E6 - { desc => ['VISUALIZER_SPECTRUM_ANALYZER', 'AND', 'REMAINING'], - bar => 0, secs => -1, width => $width, - # extra parameters (bars) - params => [$VISUALIZER_SPECTRUM_ANALYZER_ESP32, $width_low, int ($width/$spectrum->{full}->{band}), $spectrum->{scale}] }, - # mode E7 - { desc => ['VISUALIZER_VUMETER', 'AND', 'PROGRESS_BAR', 'AND', 'REMAINING'], - bar => 1, secs => -1, width => $width, - params => [$VISUALIZER_VUMETER_ESP32, $width_low, 0] }, - # mode E8 - { desc => ['VISUALIZER_ANALOG_VUMETER', 'AND', 'PROGRESS_BAR', 'AND', 'REMAINING'], - bar => 1, secs => -1, width => $width, - params => [$VISUALIZER_VUMETER_ESP32, $width_low, 1] }, - # mode E9 - { desc => ['VISUALIZER_SPECTRUM_ANALYZER', 'AND', 'PROGRESS_BAR', 'AND', 'REMAINING'], - bar => 1, secs => -1, width => $width, - # extra parameters (bars) - params => [$VISUALIZER_SPECTRUM_ANALYZER_ESP32, $width_low, int ($width/$spectrum->{full}->{band}), $spectrum->{scale}] }, - ); - - @modes = (@modes, @extra) if $cprefs->get('height') > 32; - - return \@modes; -} - -1; \ No newline at end of file diff --git a/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html b/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html deleted file mode 100644 index fd07f991..00000000 --- a/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html +++ /dev/null @@ -1,106 +0,0 @@ -[% PROCESS settings/header.html %] - - [% IF prefs.pref_width %] - [% WRAPPER setting title="PLUGIN_SQUEEZEESP32_WIDTH" desc="PLUGIN_SQUEEZEESP32_WIDTH_DESC" %] - - - [% prefs.pref_width %] - [% END %] - - [% WRAPPER setting title="PLUGIN_SQUEEZEESP32_SMALL_VU" desc="PLUGIN_SQUEEZEESP32_SMALL_VU_DESC" %] - - [% END %] - - [% WRAPPER setting title="PLUGIN_SQUEEZEESP32_SPECTRUM_SCALE" desc="PLUGIN_SQUEEZEESP32_SPECTRUM_SCALE_DESC" %] - - [% END %] - - [% WRAPPER setting title="PLUGIN_SQUEEZEESP32_SMALL_SPECTRUM" desc="PLUGIN_SQUEEZEESP32_SMALL_SPECTRUM_DESC" %] - [% "PLUGIN_SQUEEZEESP32_SMALL_SPECTRUM_SIZE" | string %]  - - [% "PLUGIN_SQUEEZEESP32_SMALL_SPECTRUM_BAND" | string %]  - - [% END %] - - [% WRAPPER setting title="PLUGIN_SQUEEZEESP32_FULL_SPECTRUM_BAND" desc="PLUGIN_SQUEEZEESP32_FULL_SPECTRUM_BAND_DESC" %] - - [% END %] - - [% WRAPPER setting title="PLUGIN_SQUEEZEESP32_ARTWORK" desc="PLUGIN_SQUEEZEESP32_ARTWORK_DESC" %] - [% "PLUGIN_SQUEEZEESP32_ARTWORK_ENABLE" | string %]  -   - [% "PLUGIN_SQUEEZEESP32_ARTWORK_X" | string %]  - - [% "PLUGIN_SQUEEZEESP32_ARTWORK_Y" | string %]  - - [% END %] - -
- [% END %] - - [% IF pref_equalizer %] - [% WRAPPER setting title="PLUGIN_SQUEEZEESP32_EQUALIZER" desc="" %] -
[% "PLUGIN_SQUEEZEESP32_EQUALIZER_SAVE" | string %]
- [% END %] - - - [% WRAPPER settingSection %] - [% WRAPPER settingGroup title='31Hz' desc="" %] - - [% END %] - [% WRAPPER settingGroup title='62Hz' desc="" %] - - [% END %] - [% WRAPPER settingGroup title='125Hz' desc="" %] - - [% END %] - [% WRAPPER settingGroup title='250Hz' desc="" %] - - [% END %] - [% WRAPPER settingGroup title='500Hz' desc="" %] - - [% END %] - [% WRAPPER settingGroup title='1kHz' desc="" %] - - [% END %] - [% WRAPPER settingGroup title='2kHz' desc="" %] - - [% END %] - [% WRAPPER settingGroup title='4kHz' desc="" %] - - [% END %] - [% WRAPPER settingGroup title='8kHz' desc="" %] - - [% END %] - [% WRAPPER settingGroup title='16kHz' desc="" %] - - [% END %] - [% END %] - [% END %] - -[% PROCESS settings/footer.html %] diff --git a/plugin/SqueezeESP32/Player.pm b/plugin/SqueezeESP32/Player.pm deleted file mode 100644 index d82b3b5c..00000000 --- a/plugin/SqueezeESP32/Player.pm +++ /dev/null @@ -1,351 +0,0 @@ -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 $sprefs = preferences('server'); -my $prefs = preferences('plugin.squeezeesp32'); -my $log = logger('plugin.squeezeesp32'); - -{ - __PACKAGE__->mk_accessor('rw', qw(tone_update depth)); -} - -sub new { - my $class = shift; - my $client = $class->SUPER::new(@_); - $client->init_accessor( - tone_update => 0, - ); - return $client; -} - -our $defaultPrefs = { - 'analogOutMode' => 0, - 'bass' => 0, - 'treble' => 0, - 'lineInAlwaysOn' => 0, - 'lineInLevel' => 50, - 'menuItem' => [qw( - NOW_PLAYING - BROWSE_MUSIC - RADIO - PLUGIN_MY_APPS_MODULE_NAME - PLUGIN_APP_GALLERY_MODULE_NAME - FAVORITES - GLOBAL_SEARCH - PLUGIN_LINE_IN - PLUGINS - SETTINGS - SQUEEZENETWORK_CONNECT - )], -}; - -my $handlersAdded; - -sub model { 'squeezeesp32' } -sub modelName { 'SqueezeESP32' } - -sub hasScrolling { 1 } -sub hasIR { 1 } -# TODO: add in settings when ready -sub hasLineIn { 0 } -sub hasHeadSubOut { 1 } -sub maxTreble { 20 } -sub minTreble { -13 } -sub maxBass { 20 } -sub minBass { -13 } - -sub init { - my $client = shift; - my ($id, $caps) = @_; - - my ($depth) = $caps =~ /Depth=(\d+)/; - $client->depth($depth || 16); - - if (!$handlersAdded) { - - # Add a handler for line-in/out status changes - Slim::Networking::Slimproto::addHandler( LIOS => \&lineInOutStatus ); - - # Create a new event for sending LIOS updates - Slim::Control::Request::addDispatch( - ['lios', '_state'], - [1, 0, 0, undef], - ); - - Slim::Control::Request::addDispatch( - ['lios', 'linein', '_state'], - [1, 0, 0, undef], - ); - - Slim::Control::Request::addDispatch( - ['lios', 'lineout', '_state'], - [1, 0, 0, undef], - ); - - $handlersAdded = 1; - - } - - $client->SUPER::init(@_); - main::INFOLOG && $log->is_info && $log->info("SqueezeESP player connected: " . $client->id); -} - -sub initPrefs { - my $client = shift; - - $sprefs->client($client)->init($defaultPrefs); - - $prefs->client($client)->init( { - equalizer => [(0) x 10], - artwork => undef, - } ); - - $client->SUPER::initPrefs; -} - -sub power { - my $client = shift; - my $on = shift; - - my $res = $client->SUPER::power($on, @_); - return $res unless defined $on; - - if ($on) { - $client->update_artwork(1); - } else { - $client->clear_artwork(1); - } - - return $res; -} - -# 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 bass { - my ($client, $new) = @_; - my $value = $client->SUPER::bass($new); - - $client->update_equalizer($value, [2, 1, 3]) if defined $new; - - return $value; -} - -sub treble { - my ($client, $new) = @_; - my $value = $client->SUPER::treble($new); - - $client->update_equalizer($value, [8, 9, 7]) if defined $new; - - return $value; -} - -sub send_equalizer { - my ($client, $equalizer) = @_; - - $equalizer ||= $prefs->client($client)->get('equalizer') || [(0) x 10]; - my $size = @$equalizer; - my $data = pack("c[$size]", @{$equalizer}); - $client->sendFrame( eqlz => \$data ); -} - -sub update_equalizer { - my ($client, $value, $index) = @_; - return if $client->tone_update; - - my $equalizer = $prefs->client($client)->get('equalizer'); - $equalizer->[$index->[0]] = $value; - $equalizer->[$index->[1]] = int($value / 2 + 0.5); - $equalizer->[$index->[2]] = int($value / 4 + 0.5); - $prefs->client($client)->set('equalizer', $equalizer); -} - -sub update_tones { - my ($client, $equalizer) = @_; - - $client->tone_update(1); - $sprefs->client($client)->set('bass', int(($equalizer->[1] * 2 + $equalizer->[2] + $equalizer->[3] * 4) / 7 + 0.5)); - $sprefs->client($client)->set('treble', int(($equalizer->[7] * 4 + $equalizer->[8] + $equalizer->[9] * 2) / 7 + 0.5)); - $client->tone_update(0); -} - -sub update_artwork { - my $client = shift; - my $cprefs = $prefs->client($client); - - my $artwork = $cprefs->get('artwork') || return; - return unless $artwork->{'enable'}; - - my $header = pack('Nnn', $artwork->{'enable'}, $artwork->{'x'}, $artwork->{'y'}); - $client->sendFrame( grfa => \$header ); - $client->display->update; - - 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, $force, $from) = @_; - - my $artwork = $prefs->client($client)->get('artwork'); - - if ($artwork && $artwork->{'enable'}) { - main::INFOLOG && $log->is_info && $log->info("artwork stop/clear " . ($from || "")); - $client->pluginData('artwork_md5', ''); - # refresh screen and disable artwork when artwork was full screen (hack) - if ((!$artwork->{'x'} && !$artwork->{'y'}) || $force) { - $client->sendFrame(grfa => \("\x00"x4)); - $client->display->update; - } - } -} - -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 ); - $client->display->update; - } -} - -sub reconnect { - my $client = shift; - $client->SUPER::reconnect(@_); - - $client->pluginData('artwork_md5', ''); - $client->config_artwork; - $client->send_equalizer; -} - -# Change the analog output mode between headphone and sub-woofer -# If no mode is specified, the value of the client's analogOutMode preference is used. -# Otherwise the mode is temporarily changed to the given value without altering the preference. -sub setAnalogOutMode { - my $client = shift; - # 0 = headphone (internal speakers off), 1 = sub out, - # 2 = always on (internal speakers on), 3 = always off - my $mode = shift; - - if (! defined $mode) { - $mode = $sprefs->client($client)->get('analogOutMode'); - } - - my $data = pack('C', $mode); - $client->sendFrame('audo', \$data); -} - -# LINE_IN 0x01 -# LINE_OUT 0x02 -# HEADPHONE 0x04 - -sub lineInConnected { - my $state = Slim::Networking::Slimproto::voltage(shift) || return 0; - return $state & 0x01 || 0; -} - -sub lineOutConnected { - my $state = Slim::Networking::Slimproto::voltage(shift) || return 0; - return $state & 0x02 || 0; -} - -sub lineInOutStatus { - my ( $client, $data_ref ) = @_; - - my $state = unpack 'n', $$data_ref; - - my $oldState = { - in => $client->lineInConnected(), - out => $client->lineOutConnected(), - }; - - Slim::Networking::Slimproto::voltage( $client, $state ); - - Slim::Control::Request::notifyFromArray( $client, [ 'lios', $state ] ); - - if ($oldState->{in} != $client->lineInConnected()) { - Slim::Control::Request::notifyFromArray( $client, [ 'lios', 'linein', $client->lineInConnected() ] ); - if ( Slim::Utils::PluginManager->isEnabled('Slim::Plugin::LineIn::Plugin')) { - Slim::Plugin::LineIn::Plugin::lineInItem($client, 1); - } - } - - if ($oldState->{out} != $client->lineOutConnected()) { - Slim::Control::Request::notifyFromArray( $client, [ 'lios', 'lineout', $client->lineOutConnected() ] ); - } -} - -sub voltage { - my $voltage = Slim::Networking::Slimproto::voltage(shift) || return 0; - return sprintf("%.2f", ($voltage >> 4) / 128); -} - -1; diff --git a/plugin/SqueezeESP32/PlayerSettings.pm b/plugin/SqueezeESP32/PlayerSettings.pm deleted file mode 100644 index e1619200..00000000 --- a/plugin/SqueezeESP32/PlayerSettings.pm +++ /dev/null @@ -1,101 +0,0 @@ -package Plugins::SqueezeESP32::PlayerSettings; - -use strict; -use base qw(Slim::Web::Settings); -use List::Util qw(first); - -use Slim::Utils::Log; -use Slim::Utils::Prefs; - -my $sprefs = preferences('server'); -my $prefs = preferences('plugin.squeezeesp32'); -my $log = logger('plugin.squeezeesp32'); - -sub name { - return Slim::Web::HTTP::CSRF->protectName('PLUGIN_SQUEEZEESP32_PLAYERSETTINGS'); -} - -sub needsClient { - return 1; -} - -sub validFor { - my ($class, $client) = @_; - return $client->model eq 'squeezeesp32'; -} - -sub page { - return Slim::Web::HTTP::CSRF->protectURI('plugins/SqueezeESP32/settings/player.html'); -} - -sub prefs { - my ($class, $client) = @_; - my @prefs; - push @prefs, qw(width small_VU) if $client->displayWidth; - return ($prefs->client($client), @prefs); -} - -sub handler { - my ($class, $client, $paramRef) = @_; - - my ($cprefs, @prefs) = $class->prefs($client); - - if ($paramRef->{'saveSettings'}) { - if ($client->displayWidth) { - $cprefs->set('small_VU', $paramRef->{'pref_small_VU'} || 15); - - require Plugins::SqueezeESP32::Graphics; - my $spectrum = Plugins::SqueezeESP32::Graphics::sanitizeSpectrum({ - scale => $paramRef->{'pref_spectrum_scale'}, - small => { - size => $paramRef->{'pref_spectrum_small_size'}, - band => $paramRef->{'pref_spectrum_small_band'} - }, - full => { - band => $paramRef->{'pref_spectrum_full_band'} - }, - }); - $cprefs->set('spectrum', $spectrum); - - my $artwork = { - enable => $paramRef->{'pref_artwork_enable'} eq 'on', - x => $paramRef->{'pref_artwork_x'} || 0, - y => $paramRef->{'pref_artwork_y'} || 0, - }; - - $cprefs->set('artwork', $artwork); - $client->display->modes($client->display->build_modes); - # the display update will be done below, after all is completed - - # force update or disable artwork - if ($artwork->{'enable'}) { - $client->update_artwork(1); - } else { - $client->config_artwork(); - } - - } - - if ($client->depth == 16) { - my $equalizer = $cprefs->get('equalizer'); - for my $i (0 .. $#{$equalizer}) { - $equalizer->[$i] = $paramRef->{"pref_equalizer.$i"} || 0; - } - $cprefs->set('equalizer', $equalizer); - $client->update_tones($equalizer); - } - } - - if ($client->displayWidth) { - # the Settings super class can't handle anything but scalar values - # we need to populate the $paramRef for the other prefs manually - $paramRef->{'pref_spectrum'} = $cprefs->get('spectrum'); - $paramRef->{'pref_artwork'} = $cprefs->get('artwork'); - } - - $paramRef->{'pref_equalizer'} = $cprefs->get('equalizer') if $client->depth == 16; - - return $class->SUPER::handler($client, $paramRef); -} - -1; \ No newline at end of file diff --git a/plugin/SqueezeESP32/Plugin.pm b/plugin/SqueezeESP32/Plugin.pm deleted file mode 100644 index 6614c179..00000000 --- a/plugin/SqueezeESP32/Plugin.pm +++ /dev/null @@ -1,106 +0,0 @@ -package Plugins::SqueezeESP32::Plugin; - -use strict; - -use base qw(Slim::Plugin::Base); - -use Slim::Utils::Prefs; -use Slim::Utils::Log; -use Slim::Web::ImageProxy; - -use Plugins::SqueezeESP32::FirmwareHelper; - -my $prefs = preferences('plugin.squeezeesp32'); - -my $log = Slim::Utils::Log->addLogCategory({ - 'category' => 'plugin.squeezeesp32', - 'defaultLevel' => 'INFO', - 'description' => 'PLUGIN_SQUEEZEESP32', -}); - -# migrate 'eq' pref, as that's a reserved word and could cause problems in the future -$prefs->migrateClient(1, sub { - my ($cprefs, $client) = @_; - $cprefs->set('equalizer', $cprefs->get('eq')); - $cprefs->remove('eq'); - 1; -}); - -$prefs->migrateClient(2, sub { - my ($cprefs, $client) = @_; - $cprefs->set('artwork', undef) if $cprefs->get('artwork') && ref $cprefs->get('artwork') ne 'HASH'; - 1; -}); - -$prefs->setChange(sub { - $_[2]->send_equalizer; -}, 'equalizer'); - -sub initPlugin { - my $class = shift; - - if ( main::WEBUI ) { - require Plugins::SqueezeESP32::PlayerSettings; - Plugins::SqueezeESP32::PlayerSettings->new; - - # require Plugins::SqueezeESP32::Settings; - # Plugins::SqueezeESP32::Settings->new; - } - - $class->SUPER::initPlugin(@_); - # no name can be a subset of others due to a bug in addPlayerClass - Slim::Networking::Slimproto::addPlayerClass($class, 100, 'squeezeesp32-basic', { client => 'Plugins::SqueezeESP32::Player', display => 'Plugins::SqueezeESP32::Graphics' }); - Slim::Networking::Slimproto::addPlayerClass($class, 101, 'squeezeesp32-graphic', { client => 'Plugins::SqueezeESP32::Player', display => 'Slim::Display::NoDisplay' }); - main::INFOLOG && $log->is_info && $log->info("Added class 100 and 101 for SqueezeESP32"); - - # register a command to set the EQ - without saving the values! Send params as single comma separated list of values - Slim::Control::Request::addDispatch(['squeezeesp32', 'seteq', '_eq'], [1, 0, 0, \&setEQ]); - - # Note for some forgetful know-it-all: we need to wrap the callback to make it unique. Otherwise subscriptions would overwrite each other. - Slim::Control::Request::subscribe( sub { onNotification(@_) }, [ ['newmetadata'] ] ); - Slim::Control::Request::subscribe( sub { onNotification(@_) }, [ ['playlist'], ['open', 'newsong'] ]); - Slim::Control::Request::subscribe( \&onStopClear, [ ['playlist'], ['stop', 'clear'] ]); - - Plugins::SqueezeESP32::FirmwareHelper->init(); -} - -sub onStopClear { - my $request = shift; - my $client = $request->client || return; - - if ($client->isa('Plugins::SqueezeESP32::Player')) { - $client->clear_artwork(0, $request->getRequestString()); - } -} - -sub onNotification { - my $request = shift; - my $client = $request->client || return; - - foreach my $player ($client->syncGroupActiveMembers) { - next unless $player->isa('Plugins::SqueezeESP32::Player'); - $player->update_artwork; - } -} - -sub setEQ { - my $request = shift; - - # check this is the correct command. - if ($request->isNotCommand([['squeezeesp32'],['seteq']])) { - $request->setStatusBadDispatch(); - return; - } - - # get our parameters - my $client = $request->client(); - my @eqParams = split(/,/, $request->getParam('_eq') || ''); - - for (my $x = 0; $x < 10; $x++) { - $eqParams[$x] ||= 0; - } - - $client->send_equalizer(\@eqParams); -} - -1; diff --git a/plugin/SqueezeESP32/Text.pm b/plugin/SqueezeESP32/Text.pm deleted file mode 100644 index 3048c312..00000000 --- a/plugin/SqueezeESP32/Text.pm +++ /dev/null @@ -1,12 +0,0 @@ -package Plugins::SqueezeESP32::Text; - -use strict; - -use base qw(Slim::Display::Text); - -# we don't want the special Noritake codes -sub vfdmodel { - return 'squeezeslave'; -} - -1; \ No newline at end of file diff --git a/plugin/SqueezeESP32/install.xml b/plugin/SqueezeESP32/install.xml deleted file mode 100644 index 44753dce..00000000 --- a/plugin/SqueezeESP32/install.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - enabled - philippe_44@outlook.com - - 7.9 - * - SlimServer - - PLUGIN_SQUEEZEESP32 - PLUGIN_SQUEEZEESP32_DESC - Plugins::SqueezeESP32::Plugin - 0.310 - Philippe - diff --git a/plugin/SqueezeESP32/strings.txt b/plugin/SqueezeESP32/strings.txt deleted file mode 100644 index 965e67de..00000000 --- a/plugin/SqueezeESP32/strings.txt +++ /dev/null @@ -1,104 +0,0 @@ -WELCOME_TO_SQUEEZEESP32 - DE Willkommen bei SqueezeESP32! - EN Welcome to SqueezeESP32 - -PLUGIN_SQUEEZEESP32 - EN SqueezeESP32 - -PLUGIN_SQUEEZEESP32_BANNER - DE WARNUNG - EN WARNING - -PLUGIN_SQUEEZEESP32_BANNER_TEXT - DE Sie müssen LMS neu starten, damit diese Einstellungen aktiv werden - EN You need to restart LMS for these parameters to be taken into account - -PLUGIN_SQUEEZEESP32_DESC - DE Konfiguriert eine neue Player ID (100), um Displays an SqueezeESP32 zu unterstützen - EN Adds a new player id (100) to enable display with SqueezeESP32 - -PLUGIN_SQUEEZEESP32_PLAYERSETTINGS - DE ESP32 Einstellungen - EN ESP32 settings - -PLUGIN_SQUEEZEESP32_WIDTH - DE Displaybreite - EN Screen width - -PLUGIN_SQUEEZEESP32_WIDTH_DESC - DE Breite des Displays in Pixeln, wie es vom Player angegeben wird - EN Width of the display in pixel as reported by the player - -PLUGIN_SQUEEZEESP32_SMALL_VU - DE Kleine VU Grösse - EN Small VU size - -PLUGIN_SQUEEZEESP32_SMALL_VU_DESC - DE Prozentsatz des Displays, das für den kleinen VU verwendet wird (rechts ausgerichtet) - EN % of the display used for small VU (right-justified) - -PLUGIN_SQUEEZEESP32_SPECTRUM_SCALE - DE Spektrum-Skalierung - EN Spectrum scaling - -PLUGIN_SQUEEZEESP32_SPECTRUM_SCALE_DESC - DE Prozentsatz des Spektrums, das in der ersten Hälfte des Bildschirms angezeigt wird. Z.B. 50 bedeutet 50% des Spektrums wird auf dem halben Bildschirm angezeigt. - DE Aber 25 bedeutet, dass nur 25% des Spektrums auf dem halben Bildschirm angezeigt wird. - EN % of Spectrum displayed in first half of the screen. For example, 50 means that 50% of spectrum is displayed in 1/2 of the screen - EN But 25 means that only 25% of spectrum is displayed in 1/2 of the screen, so it's a sort of log - -PLUGIN_SQUEEZEESP32_SMALL_SPECTRUM - DE Kleines Spektrum - EN Small spectrum options - -PLUGIN_SQUEEZEESP32_SMALL_SPECTRUM_DESC - DE Grösse: Prozentsatz des Displays, das für das kleine Spektrum verwendet wird. - DE
Band-Faktor: die Anzahl Bänder ist die Breite der Spektrumsanzeige dividiert durch diesen Faktor. - EN Size: % of the screen used by small spectrum - EN
Band factor: number of bands is the width of the spectrum screen divided by this factor - -PLUGIN_SQUEEZEESP32_SMALL_SPECTRUM_SIZE - DE Grösse - EN Size - -PLUGIN_SQUEEZEESP32_SMALL_SPECTRUM_BAND - DE Band-Faktor - EN Band factor - -PLUGIN_SQUEEZEESP32_FULL_SPECTRUM_BAND - DE Band-Faktor für ganzes Spektrum - EN Full spectrum band factor - -PLUGIN_SQUEEZEESP32_FULL_SPECTRUM_BAND_DESC - DE Die Anzahl Bänder ist die Breite der Anzeige dividiert durch diesen Faktor. - EN The number of bands is the width of the screen divided by this factor - -PLUGIN_SQUEEZEESP32_ARTWORK - DE Plattenhüllen - EN Artwork - -PLUGIN_SQUEEZEESP32_ARTWORK_DESC - DE Wenn die Y Position kleiner als 32 ist, dann werden Plattenhüllen auf der rechten Seite angezeigt, und x definiert die Startposition. - DE Plattenhüllen werden auf Displays mit weniger als 16 Graustufen in sehr geringer Qualität angezeigt. - EN When Y position is less than 32, then artwork is displayed at the right of the main screen and X defines the starting position - EN
On large screen, it's possible to rotate the VU/Spectrum by setting a small X offset (typically 32). That will push the - EN artwork to the right and make space for a vertical VU to its left. - EN
Note that using artwork on less than 16-levels grayscale display if really poor quality - -PLUGIN_SQUEEZEESP32_ARTWORK_ENABLE - DE Aktivieren - EN Enable - -PLUGIN_SQUEEZEESP32_ARTWORK_X - EN X - -PLUGIN_SQUEEZEESP32_ARTWORK_Y - EN Y - -PLUGIN_SQUEEZEESP32_EQUALIZER - DE Parametrischer Equalizer - EN Parametric equalizer - -PLUGIN_SQUEEZEESP32_EQUALIZER_SAVE - DE Bitte speichern Sie die Equalizer Einstellungen, falls das Gerät diese dauerhaft verwenden soll. Ansonsten werden sie beim nächsten Start zurückgesetzt. - EN Don't forget to save the Equalizer settings if you want them to stick. Otherwise they'll be reset next time you restart the device. \ No newline at end of file diff --git a/plugin/repo.xml b/plugin/repo.xml index 4e6770bd..90b0a5d8 100644 --- a/plugin/repo.xml +++ b/plugin/repo.xml @@ -1,13 +1,13 @@ - + https://github.com/sle118/squeezelite-esp32 Philippe - 39e70a87ce903cc8651e6b3bb2dc86609a8d0541 + 9f495e973ccb573bf671187dc0a49c510124fbcc philippe_44@outlook.com - SqueezeESP32 additional player id (100) - http://github.com/sle118/squeezelite-esp32/raw/master/plugin/SqueezeESP32.zip + SqueezeESP32 additional player id (100/101) + http://github.com/sle118/squeezelite-esp32/raw/master-cmake/plugin/SqueezeESP32.zip SqueezeESP32