A few errors....

Hi! I just ordered the TTGO board and downloaded the code. Followed the instructions in the wiki, but ending up with a few errors..... :
Arduino:1.8.13 (Mac OS X), Kort"ESP32 Dev Module, Disabled, Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS), 240MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 921600, None"
In file included from sketch/MagicImageWand.h:52:0,
from /Users/kolbjorn/Dropbox/Min Mac (Kolbjørns MacBook Pro)/Desktop/MagicImageWand/MagicImageWand.ino:7:
/Users/kolbjorn/Dropbox/Min Mac (Kolbjørns MacBook Pro)/Documents/Arduino/libraries/FastLED/src/FastLED.h:14:21: note: #pragma message: FastLED version 3.004.000
pragma message "FastLED version 3.004.000"
                 ^

In file included from /Users/kolbjorn/Dropbox/Min Mac (Kolbjørns MacBook Pro)/Documents/Arduino/libraries/FastLED/src/FastLED.h:65:0,
from sketch/MagicImageWand.h:52,
from /Users/kolbjorn/Dropbox/Min Mac (Kolbjørns MacBook Pro)/Desktop/MagicImageWand/MagicImageWand.ino:7:
/Users/kolbjorn/Dropbox/Min Mac (Kolbjørns MacBook Pro)/Documents/Arduino/libraries/FastLED/src/fastspi.h:135:23: note: #pragma message: No hardware SPI pins defined.  All SPI access will default to bitbanged output
pragma message "No hardware SPI pins defined.  All SPI access will default to bitbanged output"
                   ^

Traceback (most recent call last):
File "esptool.py", line 57, in
File "/Library/Python/2.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 389, in load_module
File "serial/tools/list_ports.py", line 29, in
File "/Library/Python/2.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 389, in load_module
File "serial/tools/list_ports_posix.py", line 31, in
File "/Library/Python/2.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 389, in load_module
File "serial/tools/list_ports_osx.py", line 32, in
ValueError: dlsym(RTLD_DEFAULT, kIOMasterPortDefault): symbol not found
Failed to execute script esptool
Mange bibliotek ble funnet for "FastLED.h"
I bruk: /Users/kolbjorn/Dropbox/Min Mac (Kolbjørns MacBook Pro)/Documents/Arduino/libraries/FastLED
Ikke i bruk: /Users/kolbjorn/Dropbox/Min Mac (Kolbjørns MacBook Pro)/Documents/Arduino/libraries/FastLED-master
Mange bibliotek ble funnet for "WiFi.h"
I bruk: /Users/kolbjorn/Library/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/WiFi
Ikke i bruk: /Applications/Arduino.app/Contents/Java/libraries/WiFi
exit status 255
/Applications/Arduino.app/Contents/Java/arduino-builder returnerte 255
Feil ved kompilering for kort ESP32 Dev Module.

Have you done all steps as in https://github.com/MartinNohr/MagicImageWand/wiki/9.-Compiling-from-source
?

Yes. I really dont know what the problem is. But i will try a different computer on windows. This i tried on a Mac. This error keeps popping up: enumeration value 'eIfEqual' not handled in switch [-Werror=switch]
Kolbjørn

First, ignore the pragma messages, they do not indicate a problem. They are just information.
I'm not sure what the Mac messages mean, but I can read the norwegian. It appears among other things that it is finding more than one version of the fastled.h library. Interesting. Are you using arduino IDE? Have you set the correct TTGO device?
The 'eIfEqual' is defined as an enum in the .h file. I do not know why that would cause a compile error. It is a constant value used in a switch in the code, but other constants are also used in switch statements. I have a Mac here, but I have never used it to compile Arduino code.

I did the same process on a windows computer. It all works now. So now i need the hardware. Do you sell it or should i get it from Amazon? Kolbjørn

Which hardware? There are lots of parts! The led strips are available from Amazon or banggood. I think I listed them in the docx file.
You can build your own ttgo connections but it you like the PCB version, it is available from me. I have designed a new version of the 3D case, but I haven't uploaded it yet. The PCB has a socket for the TTGO chip and all the components including the rotary switch are soldered on. I can sell the PCB for $20 without the TTGO chip. You'll have to pay some shipping of course.

Here are photos of the PCB.

There is a newer design with some minor changes that you will be able to order directly from PCBWAY.com in China. It is about a month away from being finalized. I'll post the link when I have tested the prototypes.

Is there still a possibility to get an assembled board? If not, is there already news about the new board?

Yes, I have 16 PCB's available. $35 + shipping. This includes a programmed TTGO. I just need an address and I can get the shipping cost.
You will be able to get the board from PCBWAY.com without the TTGO. It will be available soon. I'll send the link when it is ready.

@MartinNohr
Hallo,
die Anschrift lautet:
Achim Hennies
Klappenbergweg 14
37176 Nörten-Hardenberg
Kann ich vielleicht per PayPal Freunde bezahlen?
Schöne Grüße
Achim ahennies-22

<EMAIL_ADDRESS>Let me know when you send an email. I don't want to leave this email public for very long. I'll delete it after you have it.

You can delete it

Yes. I really dont know what the problem is. But i will try a different computer on windows. This i tried on a Mac. This error keeps popping up: enumeration value 'eIfEqual' not handled in switch [-Werror=switch]
Kolbjørn

I think I may have solved this compile problem in the latest version of the code. Some compilers issue a warning/error if all of the enums are not handled in a switch statement. This is perhaps a good idea since it will warn you about missing case statements. Please try compiling it on the system that gave the error and let me know. Thanks.

I am very sorry, but I still get this known error message. For more details
I have put the output of the compilation into a file. I hope it helps.
The compile process stops in line 334.
Achim
Am Do., 29. Apr. 2021 um 16:28 Uhr schrieb MartinNohr <
@.***>:

Yes. I really dont know what the problem is. But i will try a different
computer on windows. This i tried on a Mac. This error keeps popping up:
enumeration value 'eIfEqual' not handled in switch [-Werror=switch]
Kolbjørn
I think I may have solved this compile problem in the latest version of
the code. Some compilers issue a warning/error if all of the enums are not
handled in a switch statement. This is perhaps a good idea since it will
warn you about missing case statements. Please try compiling it on the
system that gave the error and let me know. Thanks.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/MartinNohr/MagicImageWand/issues/36#issuecomment-829285069,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ATVR5EN6EAZUTRG5KGQGGE3TLFUIPANCNFSM4X54KOTQ
.

Arduino: 1.8.13 (Windows 10), Board: "ESP32 Dev Module, Disabled, Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS), 240MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 921600, None"
In file included from C:\Users\hennies\Documents\Arduino\libraries\TFT_eSPI/User_Setup_Select.h:133:0,
             from C:\Users\hennies\Documents\Arduino\libraries\TFT_eSPI/TFT_eSPI.h:39,

             from sketch\MagicImageWand.h:61,

             from D:\Pixelstick\MagicImageWand\MagicImageWand.ino:7:

C:\Users\hennies\Documents\Arduino\libraries\TFT_eSPI/TFT_Drivers/ILI9341_Defines.h:4:0: warning: "TFT_HEIGHT" redefined
#define TFT_HEIGHT 320
^
In file included from C:\Users\hennies\Documents\Arduino\libraries\TFT_eSPI/User_Setup_Select.h:22:0,
             from C:\Users\hennies\Documents\Arduino\libraries\TFT_eSPI/TFT_eSPI.h:39,

             from sketch\MagicImageWand.h:61,

             from D:\Pixelstick\MagicImageWand\MagicImageWand.ino:7:

C:\Users\hennies\Documents\Arduino\libraries\TFT_eSPI/User_Setup.h:83:0: note: this is the location of the previous definition
#define TFT_HEIGHT 240 // GC9A01 240 x 240
^
In file included from C:\Users\hennies\Documents\Arduino\libraries\TFT_eSPI/Processors/TFT_eSPI_ESP32.h:78:0,
             from C:\Users\hennies\Documents\Arduino\libraries\TFT_eSPI/TFT_eSPI.h:52,

             from sketch\MagicImageWand.h:61,

             from D:\Pixelstick\MagicImageWand\MagicImageWand.ino:7:

C:\Users\hennies\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\FS\src/FS.h:30:0: warning: "FILE_READ" redefined
#define FILE_READ       "r"
^
In file included from C:\Users\hennies\Documents\Arduino\libraries\SdFat\src/ExFatLib/ExFatFile.h:797:0,
             from C:\Users\hennies\Documents\Arduino\libraries\SdFat\src/ExFatLib/ExFatVolume.h:28,

             from C:\Users\hennies\Documents\Arduino\libraries\SdFat\src/ExFatLib/ExFatLib.h:27,

             from C:\Users\hennies\Documents\Arduino\libraries\SdFat\src/sdfat.h:33,

             from sketch\MagicImageWand.h:34,

             from D:\Pixelstick\MagicImageWand\MagicImageWand.ino:7:

c:\users\hennies\documents\arduino\libraries\sdfat\src\common\arduinofiles.h:31:0: note: this is the location of the previous definition
#define FILE_READ O_RDONLY
^
In file included from C:\Users\hennies\Documents\Arduino\libraries\TFT_eSPI/Processors/TFT_eSPI_ESP32.h:78:0,
             from C:\Users\hennies\Documents\Arduino\libraries\TFT_eSPI/TFT_eSPI.h:52,

             from sketch\MagicImageWand.h:61,

             from D:\Pixelstick\MagicImageWand\MagicImageWand.ino:7:

C:\Users\hennies\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\FS\src/FS.h:31:0: warning: "FILE_WRITE" redefined
#define FILE_WRITE      "w"
^
In file included from C:\Users\hennies\Documents\Arduino\libraries\SdFat\src/ExFatLib/ExFatFile.h:797:0,
             from C:\Users\hennies\Documents\Arduino\libraries\SdFat\src/ExFatLib/ExFatVolume.h:28,

             from C:\Users\hennies\Documents\Arduino\libraries\SdFat\src/ExFatLib/ExFatLib.h:27,

             from C:\Users\hennies\Documents\Arduino\libraries\SdFat\src/sdfat.h:33,

             from sketch\MagicImageWand.h:34,

             from D:\Pixelstick\MagicImageWand\MagicImageWand.ino:7:

c:\users\hennies\documents\arduino\libraries\sdfat\src\common\arduinofiles.h:35:0: note: this is the location of the previous definition
#define FILE_WRITE (O_RDWR | O_CREAT | O_AT_END)
^
D:\Pixelstick\MagicImageWand\MagicImageWand.ino:3006:11: warning: multi-character character constant [-Wmultichar]
a1[0] = '0x7e';
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:3008:11: warning: multi-character character constant [-Wmultichar]
b1[0] = '0x7e';
       ^

In file included from sketch\MagicImageWand.h:58:0,
             from D:\Pixelstick\MagicImageWand\MagicImageWand.ino:7:

C:\Users\hennies\Documents\Arduino\libraries\FastLED\src/FastLED.h:14:21: note: #pragma message: FastLED version 3.004.000
pragma message "FastLED version 3.004.000"
                 ^

In file included from C:\Users\hennies\Documents\Arduino\libraries\FastLED\src/FastLED.h:65:0,
             from sketch\MagicImageWand.h:58,

             from D:\Pixelstick\MagicImageWand\MagicImageWand.ino:7:

C:\Users\hennies\Documents\Arduino\libraries\FastLED\src/fastspi.h:135:23: note: #pragma message: No hardware SPI pins defined.  All SPI access will default to bitbanged output
pragma message "No hardware SPI pins defined.  All SPI access will default to bitbanged output"
                   ^

In file included from D:\Pixelstick\MagicImageWand\MagicImageWand.ino:7:0:
sketch\MagicImageWand.h:583:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:583:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:594:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:594:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:594:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:594:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:611:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:611:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:618:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:618:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:628:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:628:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:637:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:637:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:645:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:645:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:692:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:692:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:692:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:692:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:692:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:692:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:700:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:700:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:719:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:719:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:719:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:719:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:719:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:719:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:719:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:719:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:719:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:719:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:719:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:719:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:719:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:719:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:749:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:749:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:749:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:749:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:749:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:749:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:749:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:749:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:749:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:749:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:749:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:749:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:749:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:749:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:765:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:765:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:765:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:765:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:800:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:800:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:800:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:800:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:809:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:809:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:825:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:846:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:846:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:873:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:873:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:873:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:873:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
};
^
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sketch\MagicImageWand.h:953:1: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'bool RunMenus(int)':
MagicImageWand:334:11: error: enumeration value 'eIfEqual' not handled in switch [-Werror=switch]
switch (MenuStack.top()->menu[ix].op) {

       ^

MagicImageWand:334:11: error: enumeration value 'eElse' not handled in switch [-Werror=switch]
MagicImageWand:334:11: error: enumeration value 'eEndif' not handled in switch [-Werror=switch]
MagicImageWand:334:11: error: enumeration value 'eTerminate' not handled in switch [-Werror=switch]
MagicImageWand:411:1: error: no return statement in function returning non-void [-Werror=return-type]
}
^
D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'void ShowMenu(MenuItem*)':
D:\Pixelstick\MagicImageWand\MagicImageWand.ino:421:6: warning: unused variable 'x' [-Wunused-variable]
int x = 0;
  ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:422:7: warning: unused variable 'line' [-Wunused-variable]
char line[100];
   ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'void GetIntegerValue(MenuItem*)':
MagicImageWand:635:10: error: enumeration value 'BTN_NONE' not handled in switch [-Werror=switch]
switch (button) {
      ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'void SetMenuColor(MenuItem*)':
MagicImageWand:869:29: error: operation on 'colorIndex' may be undefined [-Werror=sequence-point]
colorIndex = ++colorIndex;

                         ^

MagicImageWand:873:29: error: operation on 'colorIndex' may be undefined [-Werror=sequence-point]
colorIndex = --colorIndex;

                         ^

MagicImageWand:863:10: error: enumeration value 'BTN_NONE' not handled in switch [-Werror=switch]
switch (CRotaryDialButton::dequeue()) {
      ^

MagicImageWand:863:10: error: enumeration value 'BTN_CLICK' not handled in switch [-Werror=switch]
D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'bool HandleMenus()':
D:\Pixelstick\MagicImageWand\MagicImageWand.ino:892:6: warning: unused variable 'lastMenuCount' [-Wunused-variable]
int lastMenuCount = MenuStack.top()->menucount;
  ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'void BouncingColoredBalls(int, CRGB*)':
D:\Pixelstick\MagicImageWand\MagicImageWand.ino:1137:9: warning: unused variable 'startsec' [-Wunused-variable]
time_t startsec = time(NULL);
     ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:1158:7: warning: unused variable 'percent' [-Wunused-variable]
long percent;
   ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'void BarberPole()':
MagicImageWand:1215:1: error: label 'CRGB' defined but not used [-Werror=unused-label]
CRGB:CRGB red, white, blue;
^
D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'void ShowRandomBars(bool)':
D:\Pixelstick\MagicImageWand\MagicImageWand.ino:1299:9: warning: unused variable 'start' [-Wunused-variable]
time_t start = time(NULL);
     ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:1302:7: warning: unused variable 'line' [-Wunused-variable]
char line[40];
   ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'void RunningDot()':
D:\Pixelstick\MagicImageWand\MagicImageWand.ino:1358:8: warning: unused variable 'line' [-Wunused-variable]
char line[10];
    ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'void DisplayLedLightBar()':
MagicImageWand:1569:21: error: operation on 'what' may be undefined [-Werror=sequence-point]
what = ++what % 6;

                 ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'void TwinkleRandom(int, boolean)':
D:\Pixelstick\MagicImageWand\MagicImageWand.ino:1641:9: warning: unused variable 'start' [-Wunused-variable]
time_t start = time(NULL);
     ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'void TestConfetti()':
D:\Pixelstick\MagicImageWand\MagicImageWand.ino:1727:9: warning: unused variable 'start' [-Wunused-variable]
time_t start = time(NULL);
     ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'void ProcessFileOrTest()':
MagicImageWand:2142:19: error: suggest parentheses around '&&' within '||' [-Werror=parentheses]
if (repeatDelay && (nRepeatsLeft > 1) || chainRepeatCount >= 1) {
               ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'void ReadAndDisplayFile(bool)':
MagicImageWand:2293:48: error: format '%d' expects argument of type 'int', but argument 3 has type 'long int' [-Werror=format=]
sprintf(num, "File Seconds: %d", secondsLeft);

                                            ^

MagicImageWand:2293:48: error: format '%d' expects argument of type 'int', but argument 3 has type 'long int' [-Werror=format=]
D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2306:7: warning: unused variable 'bufpos' [-Wunused-variable]
int bufpos = 0;
   ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2212:11: warning: unused variable 'bmpSize' [-Wunused-variable]
uint32_t bmpSize = readLong();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2213:11: warning: unused variable 'bmpReserved1' [-Wunused-variable]
uint16_t bmpReserved1 = readInt();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2214:11: warning: unused variable 'bmpReserved2' [-Wunused-variable]
uint16_t bmpReserved2 = readInt();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2225:11: warning: unused variable 'imgSize' [-Wunused-variable]
uint32_t imgSize = readLong();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2232:11: warning: unused variable 'imgXPelsPerMeter' [-Wunused-variable]
uint32_t imgXPelsPerMeter = readLong();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2233:11: warning: unused variable 'imgYPelsPerMeter' [-Wunused-variable]
uint32_t imgYPelsPerMeter = readLong();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2234:11: warning: unused variable 'imgClrUsed' [-Wunused-variable]
uint32_t imgClrUsed = readLong();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2235:11: warning: unused variable 'imgClrImportant' [-Wunused-variable]
uint32_t imgClrImportant = readLong();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'void ShowBmp(MenuItem*)':
D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2493:9: warning: unused variable 'bufpos' [-Wunused-variable]
 int bufpos = 0;

     ^

MagicImageWand:2527:10: error: enumeration value 'BTN_NONE' not handled in switch [-Werror=switch]
switch (ReadButton()) {
      ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2434:11: warning: unused variable 'bmpSize' [-Wunused-variable]
uint32_t bmpSize = readLong();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2435:11: warning: unused variable 'bmpReserved1' [-Wunused-variable]
uint16_t bmpReserved1 = readInt();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2436:11: warning: unused variable 'bmpReserved2' [-Wunused-variable]
uint16_t bmpReserved2 = readInt();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2447:11: warning: unused variable 'imgSize' [-Wunused-variable]
uint32_t imgSize = readLong();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2454:11: warning: unused variable 'imgXPelsPerMeter' [-Wunused-variable]
uint32_t imgXPelsPerMeter = readLong();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2455:11: warning: unused variable 'imgYPelsPerMeter' [-Wunused-variable]
uint32_t imgYPelsPerMeter = readLong();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2456:11: warning: unused variable 'imgClrUsed' [-Wunused-variable]
uint32_t imgClrUsed = readLong();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:2457:11: warning: unused variable 'imgClrImportant' [-Wunused-variable]
uint32_t imgClrImportant = readLong();
       ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'bool CompareNames(const String&, const String&)':
D:\Pixelstick\MagicImageWand\MagicImageWand.ino:3006:9: warning: large integer implicitly truncated to unsigned type [-Woverflow]
a1[0] = '0x7e';
     ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino:3008:9: warning: large integer implicitly truncated to unsigned type [-Woverflow]
b1[0] = '0x7e';
     ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'bool SaveSettings(bool, bool, bool, bool)':
D:\Pixelstick\MagicImageWand\MagicImageWand.ino:3193:12: warning: unused variable 'bytesread' [-Wunused-variable]
 size_t bytesread = EEPROM.readBytes(0, svalue, sizeof(signature));

        ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'uint16_t readInt()':
MagicImageWand:2631:44: error: 'retValue' is used uninitialized in this function [-Werror=uninitialized]
retValue += (uint16_t)((byte)incomingbyte);
                                        ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'void SetPixel(int, CRGB, int, int)':
D:\Pixelstick\MagicImageWand\MagicImageWand.ino:3430:20: warning: 'ix2' may be used uninitialized in this function [-Wmaybe-uninitialized]
leds[ix2] = pixel;
                ^

D:\Pixelstick\MagicImageWand\MagicImageWand.ino: In function 'void MacroLoadRun(MenuItem*, bool)':
D:\Pixelstick\MagicImageWand\MagicImageWand.ino:3303:3: warning: 'oldShowBuiltins' may be used uninitialized in this function [-Wmaybe-uninitialized]
if (oldShowBuiltins != bShowBuiltInTests) {
^
cc1plus.exe: some warnings being treated as errors
Mehrere Bibliotheken wurden für "WiFi.h" gefunden
Benutzt: C:\Users\hennies\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\WiFi
Nicht benutzt: C:\Program Files (x86)\Arduino\libraries\WiFi
exit status 1
enumeration value 'eIfEqual' not handled in switch [-Werror=switch]

I apologize for getting back to you so late. Unfortunately I was very busy
and had no time to test the new version. Now I have tested it, but
unfortunately the error still comes again.
I will reinstall my computer (I wanted to do that anyway) and then test it
again. But that will probably not happen until next week. I still think
that it is not your code, but my computer. I have had this computer for a
long time and I have installed and uninstalled many things. So, Windows
doesn't like that very much.
When I'm done, I'll get back to you.
Translated with www.DeepL.com/Translator (free version)
Am Mo., 10. Mai 2021 um 17:12 Uhr schrieb MartinNohr <
@.***>:

I fixed the compile errors about the "eIfEqual" giving an error. It should
also work correctly on the Mac version now.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/MartinNohr/MagicImageWand/issues/36#issuecomment-836820613,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ATVR5ENAXDZZMP52WQFCLPTTM7ZVTANCNFSM4X54KOTQ
.

Hi, I have now tested the code on a newly installed Windows 10 computer and
it compiles without problems. Then I tried another test on a windows 10
laptop and it works fine too.
I'm glad that it works now and I'll be sure to keep checking github to see
how this really fantastic project develops.
Thanks a lot for the great support.
All the best
Am Mo., 17. Mai 2021 um 19:37 Uhr schrieb Achim Hennies <
@.***>:

I apologize for getting back to you so late. Unfortunately I was very busy
and had no time to test the new version. Now I have tested it, but
unfortunately the error still comes again.
I will reinstall my computer (I wanted to do that anyway) and then test it
again. But that will probably not happen until next week. I still think
that it is not your code, but my computer. I have had this computer for a
long time and I have installed and uninstalled many things. So, Windows
doesn't like that very much.
When I'm done, I'll get back to you.
Translated with www.DeepL.com/Translator (free version)
Am Mo., 10. Mai 2021 um 17:12 Uhr schrieb MartinNohr <
@.***>:

I fixed the compile errors about the "eIfEqual" giving an error. It
should also work correctly on the Mac version now.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/MartinNohr/MagicImageWand/issues/36#issuecomment-836820613,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ATVR5ENAXDZZMP52WQFCLPTTM7ZVTANCNFSM4X54KOTQ
.

I have a new design of the PCB that is much better. The signals are now stronger and reliable to the LED's so you can have longer lines without any problems. To anybody that has my original board I can ship you a new one for the cost of shipping. It is the same size.

I fixed the original errors in the code, it was caused by the compiler being set to check that all enums were used in a switch. Some of them weren't in the switch, not a problem, but the compiler wasn't happy.


Possible False Positive: too-many-arguments (PLR0913) considers self and cls

List of keywords you searched for before creating this issue. Write them down here so that others can find this issue more easily and help provide feedback.

"PRL0913"
"too-many-arguments"
"self"
"cls"
"false positve"

A minimal code snippet that reproduces the bug.
class DemoClass:
    def __init__(self, one, two, three, four, five):
        pass

    @classmethod
    def bar(cls, one, two, three, four, five):
        pass

    @staticmethod
    def foo(one, two, three, four, five):
        pass

The command you invoked (e.g., ruff /path/to/file.py --fix), ideally including the --isolated flag.
ruff check foo.py --isolated --select PLR0913

This produles the following output:
(.venv) ~\PycharmProjects\test git:[dev]
ruff check foo.py --isolated --select PLR0913
foo.py:2:9: PLR0913 Too many arguments in function definition (6 > 5)
  |
1 | class DemoClass:
2 |     def __init__(self, one, two, three, four, five):
  |         ^^^^^^^^ PLR0913
3 |         pass
  |

foo.py:6:9: PLR0913 Too many arguments in function definition (6 > 5)
  |
5 |     @classmethod
6 |     def bar(cls, one, two, three, four, five):
  |         ^^^ PLR0913
7 |         pass
  |

Found 2 errors.

Apparently, ruff considers self and cls when computing the number of arguments. However, these arguments are mandatory anyway, are not visible to the consumer of these methods and don't introduce any maintenance overhead. I propose that ruff ignores them.

~The current Ruff settings (any relevant sections from your pyproject.toml).~ used --isolated flag above

The current Ruff version (ruff --version): ruff 0.5.1

I'm not arguing whether the behavior is correct. But what I understand from Pylint's source code is that it also counts self and cls
https://github.com/pylint-dev/pylint/blob/a48cd4c6a872b6565bc58030b74585812f327f36/pylint/checkers/design_analysis.py#L536-L553
One important difference is that pylint supports a configuration (Regex) to ignore arguments.

FWIW, Pylint considers this as false-positive in https://github.com/pylint-dev/pylint/issues/8675 and I think that makes sense. The implementation should also consider decorators like @staticmethod and @classmethod when determining whether to count self / cls.

That was lightning fast. Awesome, thanks :)


Email+ does not have Base Seq Url property

We get all emails fromt he app with localhost event url. Another apps like Slack notification app, have the Seq base url setting, which works great. Suggestion is to implement the same in Email+.

Hi Alexy, thanks very much for the note.
The email app should use the first URL listed in the listenUris section of Seq.json. The apps with a base URL setting generally pre-date the existence of the first-class property handed through from Seq.
There are some details on the JSON configuration format here: http://docs.getseq.net/docs/json-config - please let me know if you need further help with it.


Universal Music services code

Continuing the discussion from #247 , with a PR!
This implements the MusicService class for access to all the music services known to Sonos.
It does not (yet) translate the data returned by the various services to DIDL.
Please test with the various services you have access to, and let me know what you think.
Lawrence
Examples:
Print all the services Sonos knows about
>>> from soco.music_services import MusicService
>>> from pprint import pprint
>>> print (MusicService.get_all_music_services())
['Spotify',
 'The Hype Machine',
 'Saavn',
 'Bandcamp',
 'Stitcher SmartRadio',
 'Concert Vault',
 ...
     ]

Or just those those to which you are subscribed (and the relevant usernames)
>>> pprint (MusicService.get_subscribed_music_services())
[('Spotify', u'XXXXXX'), ('radioPup', u''), ('Spreaker', u'')]

Interact with TuneIn

>>> tunein = MusicService('TuneIn')
>>> print tunein
<MusicService 'TuneIn' at 0x10ad84e10>
>>> pprint (tunein.get_metadata(item_id='root'))
{'count': 5,
 'index': 0,
 'mediaCollection': ({'albumArtURI': u'http://spotify-...',
                      'canEnumerate': True,
                      'canPlay': False,
                      'canScroll': False,
                      'id': u'playlists',
                      'itemType': u'favorites',
                      'title': u'Playlists'},
                     {'albumArtURI': u'http://spotify-...',
                      'canEnumerate': True,
                      'canPlay': True,
                      'canScroll': False,
                      'id': u'starred',
                      'itemType': u'favorites',
                      'title': u'Starred'},
                    ...),
 'total': 5}
# Get some metadata about a track
>>> response =  spotify.get_media_metadata(
... item_id='spotify:track:6NmXV4o6bmp704aPGyTVVG')
>>> print (response)
{'mediaMetadata': [{'id': u'spotify:track:6NmXV4o6bmp704aPGyTVVG'},
                   {'itemType': u'track'},
                   {'title': u'B?n Fra Helvete (Live)'},
                   {'mimeType': u'audio/x-spotify'},
                   {'trackMetadata': {'album': u'Mann Mot Mann (Ep)',
                                      'albumArtURI': u'http://o.s...9',
                                      'albumId': u'spotify:album:...',
                                      'artist': u'Kaizers Orchestra',
                                      'artistId': u'spotify:artist...',
                                      'canAddToFavorites': True,
                                      'canPlay': True,
                                      'canSkip': True,
                                      'duration': 317}}]}

or even a playlist

>>> response =  spotify.get_metadata(
...    item_id='spotify:user:spotify:playlist:0FQk6BADgIIYd3yTLCThjg')

or a URI

>>> response =  spotify.get_media_URI(
...    item_id='spotify:track:6NmXV4o6bmp704aPGyTVVG')

Find the available search categories, and use them

>>> pprint (spotify.available_search_categories)
['albums', 'tracks', 'artists']
>>> result =  spotify.search(category='artists', term='miles')

Test Result Table

Music Service
Instantiate
avail. search cats
search
metadata
media meta
media uri

Deezer
OK
OK
OK
OK
OK
OK

WiMP
OK
OK
OK
OK
OK
OK

YouSee Play
OK
OK
OK
OK
OK
OK

Google Play Music
OK
OK
OK
OK
OK
MIXED

Hi @lawrenceakka
I was planning to do some test on this, but I afraid I'm stopped before I even got started. The get_subscribed_music_services method does not work for me, and since that is also used in __init__, I cannot instantiate music services. I tracked the issue down to my speakers not reporting the relevant information on the 'http://{Player_IP}:1400/status/securesettings' page. If I wget that page, from any one of the speakers, I just get:
 <?xml version="1.0" ?>
 <?xml-stylesheet type="text/xsl" href="/xml/review.xsl"?><ZPSupportInfo type="User"></ZPSupportInfo>

which has no content in the 'ZPSupportInfo' tag, (so in line 269 we try to run XML.fromstring on None). Maybe this was changed with a recent update or it is somehow settings dependent. I think I could work around it in init, but I wanted to get your input on it first.

Coverage decreased (-3.8%) when pulling cac93a1e52aa305e905b4329cbd74f10ccee7cd7 on lawrenceakka:music_service into 9dc84e3beb02b3efd9c30855245bf83081d5ae57 on SoCo:master.

@KennethNielsen It looks as though this was changed in the most recent firmware update, probably to accommodate multiple user accounts for each service. I have rebased and updated, so it should work now.

I've taken this out of Milestone 0.11.  There is still some work to do on it. For example, the recent firmware update means that there can be multiple accounts for the same music service on the system.
There are a few other changes I want to make as well.

Hallo @lawrenceakka
I tested the music services I have available to me and I created a results table in you initial PR post (after fighting with github over tables). As you can see most of it went fine.
The only thing I have to note I am really unsure of whether it is an error.
YouSee Play and Deezer fails on get_metadata when the item_id points to a track. But I think I have observed this before, that the dehaviour when trying to browse the end points of the content tree differs.
YouSee Play fails with the traceback:
Traceback (most recent call last):
  File "test_ms.py", line 93, in test_music_service
    musicservice.get_metadata(item_id=item['id'])
  File "/home/kenneth/code/virt_env/soco/SoCo/soco/music_services/music_service.py", line 393, in get_metadata
    headers=self.headers
  File "/media/deepspace9/code/virt_env/soco/local/lib/python2.7/site-packages/pysimplesoap/client.py", line 264, in call
    raise SoapFault(unicode(response.faultcode), unicode(response.faultstring))
SoapFault: s:Server.ServiceUnknownError: An unknown service error occurred.

and Deezer with the traceback:
Traceback (most recent call last):
  File "test_ms.py", line 93, in test_music_service
    musicservice.get_metadata(item_id=item['id'])
  File "/home/kenneth/code/virt_env/soco/SoCo/soco/music_services/music_service.py", line 393, in get_metadata
    headers=self.headers
  File "/media/deepspace9/code/virt_env/soco/local/lib/python2.7/site-packages/pysimplesoap/client.py", line 264, in call
    raise SoapFault(unicode(response.faultcode), unicode(response.faultstring))
SoapFault: s:Client: Node does not support browsing

the only question is what we should do about it, if anything. I don't think it is customary for libraries to allow exceptions from 3rd party libraries to pass though, so it should probably be handled. The question then is whether to raise a custom SoCo exception or simply return an empty search result. But since the error messages we get are not the same, nor do both of them contain enough information, I would say that the only real choice is to raise a custom SoCo exception.
Let me know of there is anything else that I can do.

For everyone else, I have created a quick and dirty test script with this gist: https://gist.github.com/KennethNielsen/d28e635b77e2370e6a19
With that you should essentially be able to just check out this branch and run the script to be able to fill out the test table for your music services.

Actually, probably as expected, the get_media_metadata and get_media_url also fails when trying to call them on ids that belong to containers. They also raise pysimplesoaps SoapFault, which we should probably also catch and replace.

I have done a fair bit of work on this, and the API has changed slightly, so I'm afraid I broke @KennethNielsen's script.  We now cater for multiple accounts per service (introduced by firmware 5.2)
I have wrapped the SoapFaults so that a MusicServicesException is raised instead, which is a bit more friendly.

I tried the updated script from  lawrenceakka but I am stuck. First of all discovery() returns an empty set most of time so I "fixed it up" like this:
diff --git a/soco/music_services/music_service.py b/soco/music_services/music_service.py
index afbba90..ebdb3d4 100644
--- a/soco/music_services/music_service.py
+++ b/soco/music_services/music_service.py
@@ -91,7 +91,8 @@ class MusicAccount(object):
# via a call to
# systemProperties.GetStringX([('VariableName','R_SvcAccounts')]))
# This returns an encrypted string, and, so far, we cannot decrypt it

   device = soco or SoCo.any_soco()

   #device = soco or SoCo.any_soco()

   device = SoCo("<IP_ADDRESS>")
   log.debug("Fetching account data from %s", device)
   settings_url = "http://{0}:1400/status/accounts".format(
       device.ip_address)

@@ -472,7 +473,8 @@ class MusicService(object):
credentials_header = result.add_child("credentials")
credentials_header['xmlns'] = "http://www.sonos.com/Services/1.1"

   device = SoCo.any_soco()

   #device = SoCo.any_soco()

   device = SoCo("<IP_ADDRESS>")
   device_id = device.systemProperties.GetString(
       [('VariableName', 'R_TrialZPSerial')])['StringValue']
   credentials_header.marshall('deviceId', device_id)

Now I can run the script but I am unable to instantiate a service:
all_services OK
get_subscribed_music_services OK
Instantiate Amazon Music FAILED
Instantiate Google Play Music FAILED
Instantiate Spotify FAILED
SUMMARY
all_services................................................:OK
get_subscribed_music_services...............................:OK
Instantiate Amazon Music....................................:FAILED
Instantiate Google Play Music...............................:FAILED
Instantiate Spotify.........................................:FAILED
Any idea?

@zapp42
Please can you try something simpler, and report what happens

>>> from soco.music_services import MusicService
>>> from pprint import pprint
>>> pprint (MusicService.get_all_music_services_names())
>>> spotify = MusicService('Spotify')
>>> pprint (spotify.get_metadata())

@lawrenceakka
Here you go:

from soco.music_services import MusicService
from pprint import pprint
pprint (MusicService.get_all_music_services_names())
['7digital',
'Calm Radio',
'Bandcamp',
'simfy',
'hotelradio.fm',
'Spreaker',
'Hearts of Space',
'Rdio',
'Deezer',
'Shuffler.fm',
'Tribe of Noise',
'RUSC',
'SoundCloud',
'radioPup',
'Saavn',
'Concert Vault',
'MTV Music powered by Napster',
'Live365',
'Daytrotter',
'DAR.fm Record Radio',
'Murfie',
'The Hype Machine',
'Stitcher SmartRadio',
'Qobuz',
'Radionomy',
'WiMP',
'Juke',
'MLB.com Gameday Audio',
'Amazon Music',
'Google Play Music',
'Spotify',
'TuneIn',
'MixRadio',
'8tracks']
spotify = MusicService('Spotify')
Traceback (most recent call last):
File "", line 1, in
File "soco/music_services/music_service.py", line 340, in init
self.headers = self._get_headers()
File "soco/music_services/music_service.py", line 485, in _get_headers
('Username', self.account.username)
File "soco/services.py", line 159, in _dispatcher
return self.send_command(action, *args, **kwargs)
File "soco/services.py", line 352, in send_command
self.handle_upnp_error(response.text)
File "soco/services.py", line 412, in handle_upnp_error
error_xml=xml_error
soco.exceptions.SoCoUPnPException: UPnP Error 1000 received:  from <IP_ADDRESS>

Coverage increased (+1.61%) to 55.53% when pulling c80a47a04bb990e7b05b9857b15e3486b3b29fd7 on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Hmmm ... tests are currently failing on Python 2.6 (only). No idea why

For completeness, this is what I get w/o any modifications from my side:

spotify = MusicService('Spotify')
Traceback (most recent call last):
File "", line 1, in
File "soco/music_services/music_service.py", line 319, in init
for acct in MusicAccount.get_all_accounts():
File "soco/music_services/music_service.py", line 169, in get_all_accounts
a for a in cls.get_account_data().values() if not a.deleted
File "soco/music_services/music_service.py", line 118, in get_account_data
root = XML.fromstring(cls._get_account_xml())
File "soco/music_services/music_service.py", line 95, in _get_account_xml
device = soco or SoCo.any_soco()
File "soco/core.py", line 227, in any_soco
device = discover().pop()
KeyError: 'pop from an empty set'

@zapp42

soco.exceptions.SoCoUPnPException: UPnP Error 1000 received: from <IP_ADDRESS>

UPnP Error 1000 is a network timeout, indicating routing or communication problems on your network:  see e.g. http://forums.sonos.com/showthread.php?p=93764
This is also why discovery is not working.
Do you have a firewall on your computer? What happens if you turn it off.
Please can you open a new issue on Github for this (cross refer to this one), as we are getting a bit off-topic now!
Lawrence

Coverage increased (+0.66%) to 54.57% when pulling 106e87a8c49bc260833507c5f0720f7a5f0daa4c on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage increased (+0.66%) to 54.57% when pulling 106e87a8c49bc260833507c5f0720f7a5f0daa4c on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage increased (+0.66%) to 54.57% when pulling 106e87a8c49bc260833507c5f0720f7a5f0daa4c on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

I tried out Google Play Music with your code and I get error 8009.  I've search high and low but can't find a reference to that error number.

gm = MusicService('Google Play Music')
Traceback (most recent call last):
File "", line 1, in
File "soco/music_services/music_service.py", line 340, in init
self.headers = self._get_headers()
File "soco/music_services/music_service.py", line 489, in _get_headers
('Username', self.account.username)
File "soco/services.py", line 155, in _dispatcher
return self.send_command(action, *args, **kwargs)
File "soco/services.py", line 356, in send_command
self.handle_upnp_error(response.text)
File "soco/services.py", line 416, in handle_upnp_error
error_xml=xml_error
soco.exceptions.SoCoUPnPException: UPnP Error 8009 received:  from <IP_ADDRESS>

Coverage increased (+0.7%) to 54.62% when pulling 0421c256b1ff10cbb2b37023afa301eca4774760 on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage increased (+0.7%) to 54.62% when pulling 0421c256b1ff10cbb2b37023afa301eca4774760 on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage increased (+0.7%) to 54.62% when pulling 0421c256b1ff10cbb2b37023afa301eca4774760 on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

@deekue

I tried out Google Play Music with your code and I get error 8009. I've search high and low but can't find a reference to that error number.

It looks like Google Play is using different authentication, which I have not implemented. I will fix it, probably tomorrow - I have some code mostly working

Coverage increased (+0.56%) to 54.48% when pulling e8149531cd829ede236cf66cd251bb813b44d080 on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage decreased (-4.84%) to 49.08% when pulling 9ef1b0b7c9a3871a37d4ba5a58647b38b1997a67 on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage decreased (-4.84%) to 49.08% when pulling 9ef1b0b7c9a3871a37d4ba5a58647b38b1997a67 on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage increased (+0.71%) to 54.63% when pulling 5cbfd18ef0b873346a0eb1fd2c0a855a019c4091 on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage increased (+0.71%) to 54.63% when pulling 5cbfd18ef0b873346a0eb1fd2c0a855a019c4091 on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage increased (+1.38%) to 55.3% when pulling 21e58522975143c34bdd368803ea2d1ec9998efc on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage increased (+1.38%) to 55.3% when pulling 21e58522975143c34bdd368803ea2d1ec9998efc on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage increased (+1.34%) to 55.26% when pulling 6dd85df2b942b3c994ac28ad2fec9b44c694d590 on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage increased (+1.34%) to 55.26% when pulling 6dd85df2b942b3c994ac28ad2fec9b44c694d590 on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage increased (+1.14%) to 55.06% when pulling e0741202d08ab649a1e847b5f0bba0db96369f13 on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage increased (+1.34%) to 55.26% when pulling 09e46c5a5d5d89684744b317ffd182cf9f74f47a on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage increased (+1.34%) to 55.26% when pulling 09e46c5a5d5d89684744b317ffd182cf9f74f47a on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

I have done some fairly major refactoring (again), and some detailed wiresharking and proxying. Google Play now works. I hate Python 2.6 just at the moment.
You need to ensure that you have the very latest pysimplesoap, direct from github.
pip install --upgrade --no-cache-dir -r requirements.txt should do it.

there doesn't seem to be a version 1.17 for pysimplesoap.  the zip file the URL points to in requirements.txt returns version 1.16

@deekue,
Don't worry about it.  There is no such thing as v1.17. The zip file should actually contain the latest development code, but the author has not updated the version strings.  Install it and you should be fine

ok, installed.
I now get this
>>> from soco.music_services import MusicService
>>> gm = MusicService('Google Play Music')
>>> gm.search(category='artists', term='miles')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "soco/music_services/music_service.py", line 448, in search
    ('count', count))
  File "soco/music_services/soap_transport.py", line 79, in call
    method, *args, headers=headers, **kwargs
  File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/client.py", line 268, in call
    operation = self.get_operation(method)
  File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/client.py", line 325, in get_operation
    for service_name, service in self.services.items():
AttributeError: 'NoneType' object has no attribute 'items'

@deekue
You're now hitting a bug in pysimplesoap that I discovered a few days ago.  See here: https://github.com/pysimplesoap/pysimplesoap/pull/38
Until that is fixed, are you able to apply that patch manually to your installed copy?  Or alternatively, uninstall pysimplesoap again (!) and install it instead from my fork at
https://github.com/lawrenceakka/pysimplesoap/archive/fault-no-wsdl.zip
pip install --upgrade https://github.com/lawrenceakka/pysimplesoap/archive/fault-no-wsdl.zip#egg=PySimpleSOAP-1.17
should do it.

Coverage increased (+1.44%) to 55.36% when pulling 2fd01f43ef8d11cfbed35cd47d28a5a8967290a0 on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage increased (+1.44%) to 55.36% when pulling 2fd01f43ef8d11cfbed35cd47d28a5a8967290a0 on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

Coverage increased (+1.44%) to 55.36% when pulling 2fd01f43ef8d11cfbed35cd47d28a5a8967290a0 on lawrenceakka:music_service into 69ff0481625bc1ca835f9ac42cf53467cc91be75 on SoCo:master.

installed your fork and now I'm getting results.  anything you'd like me to test?

Thanks @deekue
At the moment, try running @KennethNielsen 's test code (revised) at https://gist.github.com/lawrenceakka/4264c59da463fff0bc93/ and let us know how you get on.
Lawrence

$ python gistfile1.py
all_services OK
get_subscribed_music_services OK
<MusicService 'Google Play Music' at 0x7f98a7e4edd0>
Instantiate Google Play Music OK
Google Play Music get_metadata root OK
Google Play Music get_metadata on items in root OK
Google Play Music available_search_categories OK
Google Play Music === search(albums) OK
Google Play Music results in search OK
Google Play Music get_metadata on albums OK
Google Play Music === search(tracks) OK
Google Play Music results in search OK
Google Play Music get_metadata on tracks FAILED
Traceback (most recent call last):
File "gistfile1.py", line 93, in test_music_service
musicservice.get_metadata(item_id=item['id'])
File "/home/apathy/src/
github.com/lawrenceakka/SoCo/soco/music_services/music_service.py", line
416, in get_metadata
('count', count), ('recursive', recursive)
File "/home/apathy/src/
github.com/lawrenceakka/SoCo/soco/music_services/soap_transport.py", line
106, in call
raise MusicServiceException(exc.faultstring, exc.faultcode)
MusicServiceException: (u'Invalid metadata ID in request.', u'soap:Client')
Google Play Music get_media_metadata on tracks OK
Google Play Music get_media_uri on tracks FAILED
Google Play Music === search(artists) OK
Google Play Music results in search OK
Google Play Music get_metadata on artists OK
SUMMARY
all_services................................................:OK
get_subscribed_music_services...............................:OK
Instantiate Google Play Music...............................:OK
Google Play Music get_metadata root.........................:OK
Google Play Music get_metadata on items in root.............:OK
Google Play Music available_search_categories...............:OK
Google Play Music === search(albums)........................:OK
Google Play Music results in search.........................:OK
Google Play Music get_metadata on albums....................:OK
Google Play Music === search(tracks)........................:OK
Google Play Music results in search.........................:OK
Google Play Music get_metadata on tracks....................:FAILED
Google Play Music get_media_metadata on tracks..............:OK
Google Play Music get_media_uri on tracks...................:FAILED
Google Play Music === search(artists).......................:OK
Google Play Music results in search.........................:OK
Google Play Music get_metadata on artists...................:OK
On Mon, Feb 9, 2015 at 9:28 AM, Lawrence Akka<EMAIL_ADDRESS>wrote:

Thanks @deekue https://github.com/deekue
At the moment, try running @KennethNielsen
https://github.com/KennethNielsen 's test code (revised) at
https://gist.github.com/lawrenceakka/4264c59da463fff0bc93/ and let us
know how you get on.
Lawrence
—
Reply to this email directly or view it on GitHub
https://github.com/SoCo/SoCo/pull/262#issuecomment-73551009.

--
regards,
Daniel Quinlan

@lawrenceakka Great work with this. I installed the patched pysimplysoap, changed the test script (from your version, small change around line 96) to assume that it is ok to raise MusicServiceException when getting metadata for tracks and its all flying.
First of, I'm now only getting the exception with YouMusic and the test script now marks it as an acceptable exception and the other two services test all fine. I've update my results in the table:
SUMMARY
all_services................................................:OK
get_subscribed_music_services...............................:OK
Instantiate YouSee Play Musik...............................:OK
YouSee Play Musik get_metadata root.........................:OK
YouSee Play Musik get_metadata on items in root.............:OK
YouSee Play Musik available_search_categories...............:OK
YouSee Play Musik === search(albums)........................:OK
YouSee Play Musik results in search.........................:OK
YouSee Play Musik get_metadata on albums....................:OK
YouSee Play Musik === search(playlists).....................:OK
YouSee Play Musik results in search.........................:OK
YouSee Play Musik get_metadata on playlists.................:OK
YouSee Play Musik === search(tracks)........................:OK
YouSee Play Musik results in search.........................:OK
YouSee Play Musik get_metadata on tracks....................:ACCEPTABLE EXCEPTION
YouSee Play Musik get_media_metadata on tracks..............:OK
YouSee Play Musik get_media_uri on tracks...................:OK
YouSee Play Musik === search(artists).......................:OK
YouSee Play Musik results in search.........................:OK
YouSee Play Musik get_metadata on artists...................:OK
Instantiate WiMP............................................:OK
WiMP get_metadata root......................................:OK
WiMP get_metadata on items in root..........................:OK
WiMP available_search_categories............................:OK
WiMP === search(albums).....................................:OK
WiMP results in search......................................:OK
WiMP get_metadata on albums.................................:OK
WiMP === search(playlists)..................................:OK
WiMP results in search......................................:OK
WiMP get_metadata on playlists..............................:OK
WiMP === search(tracks).....................................:OK
WiMP results in search......................................:OK
WiMP get_metadata on tracks.................................:OK
WiMP get_media_metadata on tracks...........................:OK
WiMP get_media_uri on tracks................................:OK
WiMP === search(artists)....................................:OK
WiMP results in search......................................:OK
WiMP get_metadata on artists................................:OK
Instantiate Deezer..........................................:OK
Deezer get_metadata root....................................:OK
Deezer get_metadata on items in root........................:OK
Deezer available_search_categories..........................:OK
Deezer === search(albums)...................................:OK
Deezer results in search....................................:OK
Deezer get_metadata on albums...............................:OK
Deezer === search(playlists)................................:OK
Deezer results in search....................................:OK
Deezer get_metadata on playlists............................:OK
Deezer === search(tracks)...................................:OK
Deezer results in search....................................:OK
Deezer get_metadata on tracks...............................:OK
Deezer get_media_metadata on tracks.........................:OK
Deezer get_media_uri on tracks..............................:OK
Deezer === search(artists)..................................:OK
Deezer results in search....................................:OK
Deezer get_metadata on artists..............................:OK

I updated the results table to include @deekue results. The failed metadata should be ok, since it is for a track and it raises MusicServiceException, but the failed result on get URI will have to be looked into.

Hi All. I have updated the music_services to the latest version (incl. the patched simplesoap stuff), but I still get upnp error 1000 for Amazon and Spotify and 8009 for Rdio in the GetSessionId call.
My Sonos works w/o problems otherwise, so I really wonder why it works for you but not for me.
Can anybody tell me, how to trigger the music service related messages in the Sonos Controller app, so I can capture them with WS?

Update:
I have reauthorized all my services in the Sonos Controller App and now I do not get upnp errors anymore. Instead I get the following (after a small change to the test script (adding try/except around the test_music_service() call):
rolf@NAS1701:~/git/SoCo$ python cba1a14b8a83f44cab3e/test_ms.py
all_services OK
get_subscribed_music_services OK
<MusicService 'Amazon Music' at 0xa728b0>
Instantiate Amazon Music OK
Amazon Music get_metadata root OK
Amazon Music get_metadata on items in root FAILED
Amazon Music available_search_categories OK
Amazon Music === search(albums) FAILED
Amazon Music === search(tracks) FAILED
Amazon Music === search(artists) FAILED
<MusicService 'Google Play Music' at 0xa8aef0>
Instantiate Google Play Music OK
Traceback (most recent call last):
File "cba1a14b8a83f44cab3e/test_ms.py", line 136, in
test_music_service(service)
File "cba1a14b8a83f44cab3e/test_ms.py", line 42, in test_music_service
root = musicservice.get_metadata(item_id='root')
File "/home/rolf/git/SoCo/soco/music_services/music_service.py", line 416, in get_metadata
('count', count), ('recursive', recursive)
File "/home/rolf/git/SoCo/soco/music_services/soap_transport.py", line 79, in call
method, *args, headers=headers, **kwargs
File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/client.py", line 268, in call
operation = self.get_operation(method)
File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/client.py", line 325, in get_operation
for service_name, service in self.services.items():
AttributeError: 'NoneType' object has no attribute 'items'
<MusicService 'Spotify' at 0xa82bf0>
Instantiate Spotify OK
Traceback (most recent call last):
File "cba1a14b8a83f44cab3e/test_ms.py", line 136, in
test_music_service(service)
File "cba1a14b8a83f44cab3e/test_ms.py", line 42, in test_music_service
root = musicservice.get_metadata(item_id='root')
File "/home/rolf/git/SoCo/soco/music_services/music_service.py", line 416, in get_metadata
('count', count), ('recursive', recursive)
File "/home/rolf/git/SoCo/soco/music_services/soap_transport.py", line 79, in call
method, *args, headers=headers, **kwargs
File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/client.py", line 268, in call
operation = self.get_operation(method)
File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/client.py", line 325, in get_operation
for service_name, service in self.services.items():
AttributeError: 'NoneType' object has no attribute 'items'
SUMMARY
all_services................................................:OK
get_subscribed_music_services...............................:OK
Instantiate Amazon Music....................................:OK
Amazon Music get_metadata root..............................:OK
Amazon Music get_metadata on items in root..................:FAILED
Amazon Music available_search_categories....................:OK
Amazon Music === search(albums).............................:FAILED
Amazon Music === search(tracks).............................:FAILED
Amazon Music === search(artists)............................:FAILED
Instantiate Google Play Music...............................:OK
Instantiate Spotify.........................................:OK
Note: I now have OADevIds in http://playerip/status/accounts. This field was empty before reauthorizing all services. Still, the services worked fine.

Update2:
Results after really using the patched pysimplesoap library:
rolf@NAS1701:~/git/SoCo$ python cba1a14b8a83f44cab3e/test_ms.py
all_services OK
get_subscribed_music_services OK
<MusicService 'Amazon Music' at 0x1134a90>
Instantiate Amazon Music OK
Amazon Music get_metadata root OK
Amazon Music get_metadata on items in root FAILED
Amazon Music available_search_categories OK
Amazon Music === search(albums) FAILED
Amazon Music === search(tracks) FAILED
Amazon Music === search(artists) FAILED
<MusicService 'Google Play Music' at 0x112bf50>
Instantiate Google Play Music OK
Google Play Music get_metadata root OK
Google Play Music get_metadata on items in root OK
Google Play Music available_search_categories OK
Google Play Music === search(albums) OK
Google Play Music results in search OK
Google Play Music get_metadata on albums OK
Google Play Music === search(tracks) OK
Google Play Music results in search OK
Google Play Music get_metadata on tracks ACCEPTABLE EXCEPTION
Google Play Music get_media_metadata on tracks OK
Google Play Music get_media_uri on tracks FAILED
Google Play Music === search(artists) OK
Google Play Music results in search OK
Google Play Music get_metadata on artists OK
<MusicService 'Spotify' at 0x114cf70>
Instantiate Spotify OK
Spotify get_metadata root OK
Spotify get_metadata on items in root FAILED
Spotify available_search_categories OK
Spotify === search(albums) OK
Spotify results in search OK
Spotify get_metadata on albums OK
Spotify === search(tracks) OK
Spotify results in search OK
Spotify get_metadata on tracks ACCEPTABLE EXCEPTION
Spotify get_media_metadata on tracks OK
Spotify get_media_uri on tracks OK
Spotify === search(artists) OK
Spotify results in search OK
Spotify get_metadata on artists OK
SUMMARY
all_services................................................:OK
get_subscribed_music_services...............................:OK
Instantiate Amazon Music....................................:OK
Amazon Music get_metadata root..............................:OK
Amazon Music get_metadata on items in root..................:FAILED
Amazon Music available_search_categories....................:OK
Amazon Music === search(albums).............................:FAILED
Amazon Music === search(tracks).............................:FAILED
Amazon Music === search(artists)............................:FAILED
Instantiate Google Play Music...............................:OK
Google Play Music get_metadata root.........................:OK
Google Play Music get_metadata on items in root.............:OK
Google Play Music available_search_categories...............:OK
Google Play Music === search(albums)........................:OK
Google Play Music results in search.........................:OK
Google Play Music get_metadata on albums....................:OK
Google Play Music === search(tracks)........................:OK
Google Play Music results in search.........................:OK
Google Play Music get_metadata on tracks....................:ACCEPTABLE EXCEPTION
Google Play Music get_media_metadata on tracks..............:OK
Google Play Music get_media_uri on tracks...................:FAILED
Google Play Music === search(artists).......................:OK
Google Play Music results in search.........................:OK
Google Play Music get_metadata on artists...................:OK
Instantiate Spotify.........................................:OK
Spotify get_metadata root...................................:OK
Spotify get_metadata on items in root.......................:FAILED
Spotify available_search_categories.........................:OK
Spotify === search(albums)..................................:OK
Spotify results in search...................................:OK
Spotify get_metadata on albums..............................:OK
Spotify === search(tracks)..................................:OK
Spotify results in search...................................:OK
Spotify get_metadata on tracks..............................:ACCEPTABLE EXCEPTION
Spotify get_media_metadata on tracks........................:OK
Spotify get_media_uri on tracks.............................:OK
Spotify === search(artists).................................:OK
Spotify results in search...................................:OK
Spotify get_metadata on artists.............................:OK

OK, I think is ready to be committed (at long last). pysimplesoap is no longer a dependency, because it had bugs which caused serious problems (and were not being fixed). All metadata is now returned in nested OrderedDicts (a backport for py2.6 is available).
I think we are now at the stage where this should be rolled into the master branch, and we can then fix any bugs as they arise.
Please leave any comments, and I will commit in a day or so.
Lawrence

@lawrenceakka We had some problems with it not working on all service earlier. But even if that is still the case, I agree that we should get it pulled and then we can sort out support for all services later. I will try to put some of the testing from this thread, along with some random walks down through the content tree, into a more organized dev tool.
In any case, like to see it go in, but I would like an opportunity to have another look at it, especially with adding a soap client and everything, but I don't have time today. Can you hold of on pulling for a day or so?

@KennethNielsen , yes of course. Just say if you have any problems, and I'll take a look
Lawrence

Ok. I have left some in-line comment. This is all minor things. Generally I think this looks great. In my comment earlier, I didn't mean that I wanted to test it more, but just review it. I think this thread is already long enough, so even IF there are still problems, let's get it in and sort them out later.
I was wondering, do you have any thoughts about data structure support for this. As I remember, the type that the items report are all over the place for the different music services, which would make it difficult to create a static hierarchy. I was thinking about making just a base class and then a subclass factory that would return a new sub-class for each music service & type combincation. The baseclass would then:

Contain a reference to its service, so that it can fetch metadata lazily
Do some gettattr_ magic to get metadata as needed, type cast when we are certain that we can (e.g. is_playable) and cache the properties
Be able to create its own metadata for use in add_to_queue and the likes

What is your thinking on this?
While talking about data services. I guess we definitely want to add those later, so maybe importing the music services should give a warning stating that this is a preliminary implementation and that the interface WILL change.

@KennethNielsen
Thanks very much for your comments. I think I have dealt with them all (but let me know if not). I will commit shortly and then we can deal with the inevitable problems!
There is some sense to the structure of the data returned, but it is really quite complex:  see http://musicpartners.sonos.com/node/83 for examples.  You suggestion sounds like it might work, but on the other had it might add even more complication.  For the moment, lets get the code in and play with it, before deciding.
Lawrence

@lawrenceakka about data structures. I see your point, but I wasn't really thinking anything as ambitious as fully mirroring the internal datastructure, but merely to to have search and browse return object that can again be browsed and can produce their own metadata so they can be added to the queue (which I guess I would sort of expect given how we have implemented the rest.
In any case, I agree, let's get it in and start playing with it and then see.

Coverage increased (+2.4%) to 57.31% when pulling 7e54c996ca784a85e4906f0f844491589d64ce29 on lawrenceakka:music_service into c9e1b84cbb2996948d0c160a2ecb7803690522ff on SoCo:master.


Undefined variable: quitIfModified

Hi,
I've got a PHP notice while running Apnsd Worker
: PHP Notice:  Undefined variable: quitIfModified in .../backq/src/Worker/Apnsd.php on line 141
It seems that:
if ($quitIfModified) {
    // ...
}

is causing an issue.
Did you meant:
$this->quitIfModified

?

thanks, yes, i do have opcache w/o invalidation so it is never triggered anyway;
disabled by default (changed to false) and fixed notice.
The idea was to keep workers up to date and that they would die if changed, then restarted by supervisor.
But since then in production there is no need for such thing, plus opcache prevents it at all to happen.


Revise PT scholastic standing consequences - skip directly to PTSSR

User Story
As a ministry user I want the PTWTHD to be applied when a withdrawal is reported  on PT and show on the ministry portal. I also want PTSSR to be shown in the accordion list under the activity page for students when they have the restriction. This is important so that they understand what is happening to them in terms of restrictions and why they are blocked from funding.
Acceptance Criteria:

[ ] When a withdrawal is reported the PTWTHD restriction should be applied along with the PTSSR. The PTWTHD should not have an impact and should only show to the ministry user. It should be viewable by a ministry user for record keeping purposes. (see image below for the ministry view post reporting a withdraw.)

Business context

Technical

[ ] Ensure the creation of the PTWTHD at the same time and under the same condition of the PTSSR.
[ ] Create at least one E2E test to validate its creation.

Based on Lather - going to receive most recent table of restriction information and compare to the table in the ticket.
Todo:
Identify areas that have NO change required btw file attached and new table
Only highlight the cells (not the whole line) that requires updates
Verify Federal/Provincial if they should be inconsistent between restriction_type and restriction_category
If we receive a federal restriction that SIMS doesn't list as federal it could create blocks/unnecessary new restrictions added
Re: BCLM and "Stop full time BC funding" vs This should be BCSL only and allow BC Grants - should have a conversation about current functionality to ensure same page of current/expected functionality

The PTWTHD will have its behavior updated as this ticket requires on #3512.
The tickets can be developed in parallel with the understanding of the goal of generating the PTWTHD only.

@CarlyCotton can we do the below AC alongside the development of #3634 since they will change the same page and are now in the same sprint?
"Add a new accordion to the student Account Activity Page provincial restriction list with PTSSR code under the provincial restrictions."

@andrewsignori-aot Yes. As long as the work gets done, it doesn't matter to me which ticket it comes in on.

Removing the two ACs that dealt with the new accordion content on the restrictions page and adding them to #3634:

[ ] Add a new accordion to the student Account Activity Page provincial restriction list with PTSSR code under the provincial restrictions.
[ ] Add text to the accordion drop down that reads:

"Your account is restricted from future part-time funding due to poor scholastic standing. You are no longer eligible to receive student financial assistance. If you need more information or have concerns, please contact StudentAid BC."


Unable to trigger hook by disconnecting client via HTTP API

Environment

VerneMQ Version: <IP_ADDRESS>
OS: alpine
Cluster size/standalone: standalone

Expected behaviour
We are using webhooks and a PostgreSQL data-provider in order to execute sql statements after a client gets disconnected.
Sometimes, we want to disconnect a client via the VerneMQ HTTP API. Therefore we send the /api/v1/session/disconnect?client-id=myclient&--cleanup to trigger the on_client_offline/on_client_gone hook, which we defined in our connectivity script.
Actual behaviour
After the request hast been sent, we receive the warning session stopped abnormally due to '{error,{queue_down,<0.607.0>,normal}}' but the hook doesn't get triggered by VerneMQ to update our database
Configuration
From our logs
13:52:57.142 [info] enable script for "/etc/vm-diversity-extension/connectivity_update.lua"
13:52:57.210 [info] enable auth script for postgres "./share/lua/auth/postgres.lua"
13:52:59.990 [debug] transition from offline --> online because of add_session
13:53:00.874 [info] Client ED3934546fe37d412996b588d7b035349e woke up.
13:53:00.874 [info] Client ED3934546fe37d412996b588d7b035349e connected.
13:53:00.973 [warning] session stopped abnormally due to '{error,{queue_down,<0.607.0>,normal}}'

@denselmann thanks.
The queue has a force_disconnect which is used by the administrative action:
https://github.com/vernemq/vernemq/blob/eb1a262035af47e90d9edf07f36c1b1503557c1f/apps/vmq_server/src/vmq_queue.erl#L547
This will then send a DOWN message to the session. Apparently it doesn'n trigger the on_client hooks. The expectation is probably that we should do that (although there might be a point in having a separation between what is triggered behaviour vs administrative actions).
I don't have a useful answer right now.

:point_right: Thank you for supporting VerneMQ: https://github.com/sponsors/vernemq
:point_right: Using the binary VerneMQ packages (.deb/.rpm/Docker) requires a subscription.


default to text/html instead of application/json for generated routes

Currently JSON has been the primary use case for API Gateway and as such it makes sense the default content type is application/json. This is all fine and good but if there is any error you'll see a fugly JSON error and need to view source to see the real error (in some browsers not all). The fix would be to default content type to text/html so errors show up in a modest easier to see format. Think this is a good change but will leave this issue open for a while to get the community temp.

Per Brian, going to close this!


Weird export since 2.x

Hey,
I've updated to 2.0.2 and noticed that it exports differently.
I'm using Babel + CommonJS Module Plugin.
Since 2.0.2 I have to do the following:
import Notify from 'notifyjs';
if (Notify.default.needsPermission) {
  Notify.default.requestPermission();
}

Notice the default. - apparently it exports a Object that has a default member as default.

Yeah this is expected when the babel transpiles. You can just reference default when importing rather than need to define it explicitly every time.

Fwiw, the source is now writen in ES6 topic you want to import directly.

Actually it shouldn't.
Notifyjs has 2 defaults. It should only have 1.
Thats probably a problem with jspm though.
JSPM exports an object like this:
{
   default: NotifyJS
}

ES6 expects this though:
{
    default: NotifyJS,
    __esModule: true
}

If the __esModule is not set babel will wrap it into a default. So we need the __esModule property.

Hmm interesting, I will take a look into this to see if it's something doable in jspm. Thanks

This is what babel adds to a export
Object.defineProperty(exports, "__esModule", {
  value: true
});

This may also be relevent: http://stackoverflow.com/questions/33704714/cant-require-default-export-value-in-babel-6-x

That applies only to "normal" requires though, not to ES6 import.
The import handles the default thing.

Yeah, right now I'm unclear if this is something that jspm can fix, but will continue looking.
Does import { default as Notify } from 'notifyjs work?

It does. It's a workaround.

Well, apparently according to the ES6 spec, a default export is no different to a named one. But I agree the old way was nicer. I'll see what I can work out. Thanks for filing.

The import { default as Notify } from 'notifyjs'; workaround does not work for me when I install notifyjs via npm. The final Notify reference has two levels of objects with default properties as @marudor mentioned.

I'm going to look at removing the dependency on jspm in the future. I may look at rollup as an option.

Sounds good. I may take a stab at the rollup build unless you get there first.

Pull requests always welcome :)

This should hopefully be fixed shortly by #73

Fixed by #73


feat: oauth2 clientId && clientSecret

Signed-off-by: RobotHuang<EMAIL_ADDRESS>

@RobotHuang plz discuss with the project owner first before making a big PR. I don't think this "OAuth App" you added is anything different with the existing Application concept. Closed for now.


Blacklist some coins

Hi mate,
Is it possible to blacklist some coins from being processed by the bot?

Hi,
Feature developed. Found it interesting to use ;).
Use blacklist.csv to add coins to ignore trading. 1 coin per row.
example
ADA
AVAX


Show year select page on show event

Hi,
When click to show the datetimepicker, i want to show the year select page by the first show. is that possible? please help me...
Best Regards,
Sam

use viewMode: 'years'

Thanks a lot for your support!


Compulsory timeout argument to query

query is a somewhat dangerous operation. It can cause a system to lock up if the timeout defaults to what is for most intents and purposes is an infinite duration. The solution is to throw if a timeout is not provided, as this will prevent errors and unexpected behaviour.

Fixed in v3.1.1


cargo doc generated files contain references to absolute pathes

<meta name="description" content="Source to the Rust file `src/lib.rs`.">
<meta name="description" content="Source to the Rust file `/home/user/…/src/lib.rs`.">

The first description as generated by invoking rustdoc directly. The second one, generated by invoking cargo doc, contains full path to the file on the developer machine.

I think this will be fixed by https://github.com/rust-lang/cargo/pull/1164, but please feel free to reopen if it still happens afterwards!


tf.function doesn't see methods of class

System information

Have I written custom code: Yes
OS Platform and Distribution: Linux Ubuntu 16.04
TensorFlow installed from binary
TensorFlow version: 2.0beta
Python version: 3.6
CUDA/cuDNN version: 10.0

Describe the current behavior
I am working with GAN. I have Trainer class which has the following methods:  pass_one_step_gan, __pass_critic and __pass_generator. It looks like around that:
@tf.function
def pass_one_step_gan(self, inputs, target_imgs, it, stage, training):
        with tf.GradientTape() as g_tape, tf.GradientTape() as c_tape:
            new_imgs = self.model(inputs, training=training)

            if training:
                c_loss, c_loss_with_gp = self.__pass_critic(target_imgs, new_imgs)
                g_loss = self.__pass_generator(new_imgs, it)

I got the following error:
.../trainer.py:254 __pass_one_step_gan  *
    c_loss, c_loss_with_gp = self.__pass_critic(
    .../tensorflow/python/autograph/impl/api.py:329 converted_call
            f = getattr(owner, f)
    AttributeError: 'Trainer' object has no attribute '__pass_critic'

I tried to wrap __pass_critic in tf.function, but it didn't help.
Describe the expected behavior
It should work, but doesn't.
Code to reproduce the issue
See above.
Other info / logs
I don't know why but it seems that python doesn't see my method and, thus, tf.function can't track it.

@Oktai15
In order to expedite the trouble-shooting process, please provide a complete code snippet to reproduce the issue reported here. Thanks!

Automatically closing due to lack of recent activity. Please update the issue when new information becomes available, and we will reopen the issue. Thanks!


Unmaintained?

Hi there,
I'm interested in the concept of writing pandas-like API to generate SQL to talk to relational databases. I was wondering if this project is current no longer maintained.
Thanks!

Yeah, very interesting concept. Really hope it is still maintained


EDSR_baseline_x4 model

Thank you for sharing.
I have a question: Is the provided EDSR_baseline_x4.pt trained from scratch, or it is fine-tuned from x2 model.

Hello.
Actually, I trained the model from scratch.
I am planning to upload all models from paper, but not sure when it will be.
Thank you.

Thank you. It would be very helpful if we have the model. Btw, did the model in pytorch reach the performance in the torch repo?

Sorry for the delayed comment.
PyTorch models perform better than Torch model, but there was some bug when saving result images.
There was a slight performance drop because of this issue (~0.1dB), but I fixed this problem.
I will commit the new code soon.
Thank you.


flutter run error

Launching lib/main.dart on SM N910H in debug mode...
Initializing gradle...                                                 ⢿
Oops; flutter has exited unexpectedly.
Sending crash report to Google.
Crash report sent (report ID: ************************)
Initializing gradle...
Crash report written to /home/nima/project/flutter/after/flutter_01.log;
please let us know at https://github.com/flutter/flutter/issues.

Please, post flutter_01.log file here

flutter_01.log

Hi @bestheroforever
are you still experiencing this issue with the latest version of Flutter?
If so can you please provide your flutter doctor -v?
Also, to better address the issue, would be helpful
if you could post a self contained app on github
or the steps to reproduce it.
Thank you

Without additional information, we are unfortunately not sure how to resolve this issue. We are therefore reluctantly going to close this bug for now. Please don't hesitate to comment on the bug if you have any more information for us; we will reopen it right away!
Thanks for your contribution.


Updating the pull image path in README file

/verified

New container for quay.io/redhat_msi/openshift-cli-installer:latest published


Implement some declarative gestures + animation demo

Some crazy idea:
<Flick settings={...}>
  {velocityDelta =>
    <Spring
      currentVelocity={currentVelocity => velocityDelta === 0 ? currentVelocity :
        increase(currentVelocity, velocityDelta)
      }
      endValue={...}>
      {currentValues => <div />}
    </Spring>
  }
</Flick>

(Totally unrelated food for thought: what does declarative multitouch gestures look like in idiomatic React?)

I have an idea around this.
a gesture recognizer is a reducer on some state over time, + change events. just like a flux store! for example, a swipe recognizer requires access to some accumulated time, and the movements made by the finger over that period of time. we can represent this like a flux store
let position = (state, event) => (/* accumulated velocity > threshold */) ?
  { position: state.position + 1, events: [event, ...state.events] } /* or -1 if swiped left */ :
  {...state, events: [event, ...state.events]}
}

You can then make a 'tracker' that accepts inputs (much like a flux dispatcher)
<Tracker stores={{position}}>{
  (addMovement, state) => <div onTouchMove={e => addMovement(e)}>
    <Slideshow position={state.position}>
      <Slide/>
      <Slide/>
      <Slide/>
    </Slideshow>
  </div>
}
</Tracker>

then react-motion kicks in and actually animates the slides (with the fun unmounting remounting stuff etc)
(For velocity measuremements, you could assume a js version of https://developer.android.com/reference/android/view/VelocityTracker.html in the background)

This is the idea, yeah. My version exposed a velocity, which you can plug into the upcoming currVelocity={currVelocity => changeItOrReturnIt} from Spring.
But we can take it up a notch. Return an array of velocities, one for each finger. Order it by time pressed, and pass an accumulated average. We can have generic helpers that takes the list of presses and return something relevant, e.g. zoomFactor, which also returns a velocity, etc.
Up a notch's up a notch: I'm thinking whether we can encode react's responder system in this paradigm. I'll leave that for the future.

I'd suggest that this sounds like something to be kept as a separate module. It should still compose well, e.g.:
const horizontalFlick = flickRecognizer({
  dx: 40,
  velocity: ...,
});

<Gesture recognizers={horizontalFlick} handle={this.setVelocityToState}>
  <Spring
    currentVelocity={this.state.currentVelocity}
    endValue={...}>
    {currentValues => <div />}
  </Spring>
</Gesture>

Or potentially using the “function as child”-pattern used in react-motion instead of polluting the component's state.
Fundamentally, using onTouchMove at the component level is problematic because gestures will cancel once the user moves outside of the div. Fingers can also be added and removed at any point so it's important that we keep track of which pointers we're interested in. There also needs to be some way to normalize mouse and touch events or optionally specify which of them we're interested in.
I certainly won't mind if someone solves all these problems within react-motion and I'm more than willing to help. But it seems like an entirely separate issue from the one it's trying to solve right now.
(This is based on very rough ideas I've jotted down over the weekend for a gesture recognizer library we need internally. Slightly more at https://github.com/HMILogic/react-gesture-recognizers but it's just a public notepad at this point. Of course I'm still open for input, if someone is interested.)

It seems the PanResponder would be something quite interesting for building that on top of.
It does the math (compensated distance, velocity, ...) and is built around the EventResponderPlugin which seems like a very nice abstraction for event handling.
It is very simple to port for web touch events. It requires a bit of thinking to get it working with mouse events, though maybe that's not something that's wanted?

woah :D any chance the PanResponder can be ported to just an imperative api/object? We can then wrap it with a component and do the same as above.

@sphire yeah check my initial snippet. It's children functions. No dirty state injection (yet) please.
And this'll be a separate repo once we finish iterating on it, don't worry. We're not trying to build a monolithic animation framework here.
Regarding PanResponder: I'll leave that to you folks to experiment. I'm afraid of diving into the responder system because it'll constrain my way of thinking about these things =)

Initial work on velocity tracking - https://github.com/threepointone/disto/blob/redux/examples/velocity/app.js
The internals are a hack; I'm calculating delta/period, and using a Spring to smooth over it(!). You could imagine using a velocity tracker object or whatnot.
next up - flings.


Add --copy-source option (.flow)

This PR adds a -c, --copy-source options to Copy typed source with .flow extension to output which Only applies when --out-file or --out-dir options are used.
Using this option will copy src/file.ext to dest/file.ext.flow (where ext is any extension supported by flow-remove-types) anytime there is an output file.

This is very helpful and a nice way to author flow packages.

@leebyron, any chance you could take a look at this PR?

While it's nice from a performance standpoint not to have to read the source files twice, I don't know that this is strictly necessary given that https://github.com/Macil/flow-copy-source exists, and the fact that we have plans to resurrect gen-flow-files as the official solution for generating .js.flow files.

All good!


Does the package support Jax model for Fine Tuning? Any instructions?

Thanks

Hello, currently the support is only for the PyTorch with no plans at present to support JAX.

@pacman100 hoped to follow up, if it is possible to import the Jax Model weights and FT in Pytorch from that?


Doctrine Provider

Hi
We've developed a custom provider to use the doctrine ORM to store messages.  It's been very useful for our project.  I've seen some interest in it from others.  If I recast it as a new native provider, is it something that you would like to pull into the project?  Just want to check before doing the small rewrite required.
Regards
Steven Brookes

@talisman-innovations - Yeah, I'd love to look at what an implementation would look like and if doctrine DBAL makes more sense over the ORM (maybe that was implied?).
I think the only other consideration would be issue #101 - if we were to split the providers out into separate libraries.

I've finally got around to submitting this in pull request #110
Let me know what you think.