fornoth / spotify-connect-web Goto Github PK
View Code? Open in Web Editor NEWLicense: MIT License
License: MIT License
Hi,
I would like to install spotify-connect-web on a RaspberryPi and then use VLC to stream the output to my Logitech Media Server.
I can stream with VLC any sound from PulseAudio but not with ALSA.
Do you know a way I can achieve this?
Thanks
Is it possible to have normalization between songs?
Hi,
I have RPI2 running latest RuneAudio beta. All working good, if I stream music using RuneAudio, its play from my Sabre A9023 DAC. But if I try Spotify connect its play from onboard RPI2 audio card and DAC is silent. Dont know how to fix it, pls help me and sorry for my really bad english. Thx.
Kemo
Running main.py results in missing spotify_embedded_shared.so library. Exact output:
python main.py
Traceback (most recent call last):
File "main.py", line 8, in
from connect_ffi import ffi, lib
File "/home/pi/spotify/spotify-connect-web/connect_ffi.py", line 19, in
libraries=[str('spotify_embedded_shared')])
File "/usr/local/lib/python2.7/dist-packages/cffi/api.py", line 405, in verify
lib = self.verifier.load_library()
File "/usr/local/lib/python2.7/dist-packages/cffi/verifier.py", line 101, in load_library
return self._load_library()
File "/usr/local/lib/python2.7/dist-packages/cffi/verifier.py", line 211, in _load_library
return self._vengine.load_library()
File "/usr/local/lib/python2.7/dist-packages/cffi/vengine_cpy.py", line 155, in load_library
raise ffiplatform.VerificationError(error)
cffi.ffiplatform.VerificationError: importing '/home/pi/spotify/spotify-connect-web/_cffi__x8b237976x2c265354.so': libspotify_embedded_shared.so: cannot open shared object file: No such file or directory
I can confirm that library is in the same directory as main.py and I also tried symlinking to /usr/lib and /usr/local/lib which didn't change anything.
I am running on Raspberry Pi2, and strange enough given docker image works as it's supposed. On the docker image libspotify_embedded_shared.so is placed in /usr/lib directory which I already tried without any luck.
Any suggestions how to get it working without docker?
Hello,
first, I love it!
second, not so much as it completely blocks my sound card. I am using a hifiberry on my RPi B - with raspbian and kodi. While spotify-connect is running kodi will not play any sound even though playback is stopped.
Would it be possible to free the device on stopped playback?
Thanks
I tried to run the app on a x86_64 docker install.
When I ran into errors I did the following:
It still won't work and is throwing this error:
bash-3.2$ docker run spotify-connect-web
Traceback (most recent call last):
File "main.py", line 8, in <module>
from connect_ffi import ffi, lib
File "/usr/src/app/connect_ffi.py", line 8, in <module>
ffi.cdef(header)
File "/usr/local/lib/python2.7/dist-packages/cffi/api.py", line 107, in cdef
self._parser.parse(csource, override=override, packed=packed)
File "/usr/local/lib/python2.7/dist-packages/cffi/cparser.py", line 171, in parse
self._internal_parse(csource)
File "/usr/local/lib/python2.7/dist-packages/cffi/cparser.py", line 177, in _internal_parse
ast, macros, csource = self._parse(csource)
File "/usr/local/lib/python2.7/dist-packages/cffi/cparser.py", line 134, in _parse
self.convert_pycparser_error(e, csource)
File "/usr/local/lib/python2.7/dist-packages/cffi/cparser.py", line 163, in convert_pycparser_error
raise api.CDefError(msg)
cffi.api.CDefError: parse error
/usr/include/stdint.h:29:26: before: int_least8_t
Are you thinking about supporting x86 anytime soon?
Hello everybody,
I really need your help. I am unable to output audio to my Denon DA 300 USB DAC. Previously while running Volumio 1.55 based on Wheezy I was able to edit alsa-base.conf file and rearrange indexes to that usb sound card would get priority over HDMI and Analog.
Currently running newest OSMC (Jarvis 16.1) I am unable to force my DAC to be set as output (tried on Volumio 2 as well, same results). According to aplay -l
output my DAC is card number 1. I have tried:
/etc/asound.conf
and ~/.asoundrc
with following:pcm.!default {
type hw
card 1
}
ctl.!default {
type hw
card 1
}
/usr/share/alsa/alsa.conf
setting default pcm and ctl as my card 1Those solution do not work. In OSMC I can select DAC and it runs perfectly fine. For the rest it does not work.
Please advise. I am really stuck and have searched a lot, can't really find solution. Thanks! Wiktor
hello all,
./spotify-connect-web.sh --username [email protected] --password password --bitrate 320 -d
while running this ^ line im getting the following error:
ESDK: SpCallbackError (at 0xb6f29ee0): error = 8, context = 0xb62e0c86 (underlying Spotify error = -112, underlying OS error = 0
im trying to run spotify-connect-web on raspberry pi 2.
hope you can help.
thank you
David
Hey,
is it possible to get better quality with rasp2 sound card? I triend my h2n usb microphone with output (it has soundcard) and the quality was even worse, where can be a problem?
https://www.dropbox.com/s/xb40ikg260f293y/Rasp.m4a?dl=0
Thanks
First of all I want to join those saying how fantastic it is to be able to Spotify-Connect on the Raspi. Thanks!
Went back to the 2016-01-19 version because of the problems mentioned here, also had to do the mixer_volume = 65535 # int(mixer.getvolume()[0] * 655.35)
change in connect.py because I'd get a can't convert negative number to unsigned
otherwise.
So now it runs. Sound comes out of my Hifiberry DAC+, no problems there. Only thing is I can't control volume, neither from Spotify on my PC nor from the webinterface on :4000. I do see messages like playback_volume: 51773
when I try to adjust volume so the remote-control part works o.k.
aplay -l:
**** List of PLAYBACK Hardware Devices ****
card 0: sndrpihifiberry [snd_rpi_hifiberry_dacplus], device 0: HiFiBerry DAC+ HiFi pcm512x-hifi-0 []
Subdevices: 0/1
Subdevice #0: subdevice #0
/etc/asound.conf:
pcm.!default {
type hw card 0
}
ctl.!default {
type hw card 0
}
Any idea what I should try next?
Is it possible to monitor the status of Spotify connect, by using for example Monit? And if the service is down, restart the service.
Any idea if at least first one of the following is feasible:
1: launch script from apotofy connect web when playback starts. when play command is received from some spotify client to device running spotify connect web, one could launch script of their choosing. I'd like to automatically either turn on (with right input) my receiver and speakers or my correct Logitech Harmony activity. This could be done for example via script.
2: using script / http post,put / to send stop playback. I'd like to run this command, for example when my receiver or harmony is asked to change input or activity to non-spotify one.
Firstly just let me say a big thanks for getting so far with this project, it took me a few days to find it but I am pretty happy to get it running on the RPI1.
I have only played with it for a minute, but I did notice that the volume control scale (using the PCM mixer) is off - i.e. it's inaudible/very quiet for most of the range and all the useful variability is in the top 20% or so of the Spotify slider. I can see this reflected in alsamixer when controlling the volume from Spotify. alsamixer itself works correctly.
I believe this is likely related to a similar issue that affected mopidy, to do with the way amixer reports volume:
mopidy/mopidy-alsamixer#3
In shairport-sync a different volume algorithm has been applied that works quite well:
https://github.com/mikebrady/shairport-sync
Not sure what volume is like on other platforms or other versions of amixer, it might be that the latter is what is important in which case the lib could be updated to do something different in each case. Or, maybe apply a configurable filter in the python layer? Has anyone played about with this yet?
I set up spotify Family plan for my family members.
It seems only one account can see device with spotify-connect-web - the one which generated a key
In contrast, my Marantz receiver is visible for any spotify premium user in the same network
I cloned my original installation of the pi and i get the error "Illegal instruction" on the new pi. everything is set up accordingly. just don't know why its not running. doesn't give me any output at all
Hello! Is there any way to get this to work with Raspberry Pi 1 Model B?
I used this tutorial and then it works, but just for one user.
First of all. Amazing work!
This is the first solution that works flawlessly or even at all that fully incorporates with Spotify Connect that I am yet to found (hours spent researching and testing the solutions). Volumio works, but I wasn't looking for a complete OS this time.
How do I run Spotify Connect Web as a daemon automatically on boot?
After a while the command ./spotify-connect-web.sh install fails with the error message:
rl: (56) Recv failure: Connection reset by peer
gzip: stdin: unexpected end of file
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
Solved. It was a problem with my internet provider.
Is it possible to redirect the Sound output to a fifo so spotify-connect-web could be used with https://github.com/badaix/snapcast for multiroom audio ?
I plan on adding the MIT license, given that all contributors agree (Just comment on this issue whether you agree or not)
@djmaze
@chukysoria
@plietar
@diogocp
@sashahilton00
@Alex131089
@JozoVilcek
root@volumio:~/spotify-connect-web-chroot# ./spotify-connect-web.sh --username a --password b
chroot: failed to run command `bash': No such file or directory
Hey,
on my Cubox spoti connect runs fine for weeks. But on both of my 2 Pi's (Pi 2) when I run it without debug (-d) I get a segfault. For now I can use it in debug mode but I'm interested to know where this comes from. Have also tried to run it with unchanged github code (only needs to change card to device in cons_cb.py) because of pyalsa > 0.8
I think the fault only triggers when accessing webpage.
Trying to launch with:
sudo LD_LIBRARY_PATH=$PWD python main.py -d
Gives me:
Traceback (most recent call last):
File "main.py", line 9, in <module>
from connect import Connect
File "/spotify-connect-web/connect.py", line 8, in <module>
from console_callbacks import audio_arg_parser, mixer, error_callback, connection_callbacks, debug_callbacks, playback_callbacks, playback_setup
File "/spotify-connect-web/console_callbacks.py", line 16, in <module>
audio_arg_parser.add_argument('--mixer', '-m', help='alsa mixer name for volume control', default=alsa.mixers()[0])
IndexError: list index out of range
My audio configuration is:
cat /proc/asound/cards
0 [ODROIDHDMI ]: SOC-Audio - ODROID-HDMI
ODROID-HDMI
1 [UD501 ]: USB-Audio - TEAC UD-501
TEAC Corporation TEAC UD-501 at usb-lm0-1, high speed
2 [Set ]: USB-Audio - C-Media USB Headphone Set
C-Media USB Headphone Set at usb-lm1-1.1, full speed
or with python
import alsaaudio
alsaaudio.cards()
return
[u'ODROIDHDMI', u'UD501', u'Set']
I precise that i don't know python.
Is there any way to get a bigger AlbumCover Image Size?
i found in utils.py the line
lib.SpGetMetadataImageURL(uri, lib.kSpImageSizeSmall, image_url, ffi.sizeof(image_url))
but even if i change it to lib.kSpImageSizeLarge
there is no change in the size of the resulting Album Cover File. What did i wrong?
Hello
i set up a Spotify-Connect-Web on my RaspberryPi 1. When i tried to set it up via Zeroconf i saw nothing in my Spotify Client. When starting Spotify-Connect-Web with -d Flag i get a 500 Internel server Error when asking for the Route login/_zeorconf?action=getInfo the Traceback is showing up to this error
rv = self.dispatch_request() File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "main.py", line 39, in wrapped_function resp = make_response(f(*args, **kwargs)) File "main.py", line 223, in login_zeroconf return get_info() File "main.py", line 243, in get_info 'brandDisplayName': ffi.string(connect_app.init_vars['brandName']), AttributeError: Connect instance has no attribute 'init_vars'
the i tried to set all ffi. strings ind getInfo() on a static value. So it get past the 500 Error but also trigger an error for login/_zeroconf POST addUser
rv = self.dispatch_request() File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "main.py", line 39, in wrapped_function resp = make_response(f(*args, **kwargs)) File "main.py", line 229, in login_zeroconf return add_user() File "main.py", line 269, in add_user connect_app.login(username, zeroconf=(blob,clientKey)) NameError: global name 'username' is not defined
normal Login is working on the Connect-Web and playing and control spotify also works just zeroconf is throwing errors
hope someone can help me
First off - thanks for this project, it's awesome.
I am using the current chroot version as of today, on a raspberry PI 2 with a HiFiBerry DAC and OSMC (similar to raspbian).
I had to do a tweak in connect.py to get this to work, described here:
https://support.hifiberry.com/hc/en-us/community/posts/201863051-hifiberry-digi-spotify-connect
The problem is that this works fantastic for a few minutes of playback. After anywhere from 5 to 20 minutes, playback suddenly stops and the raspberry is no longer seen by the spotify clients (android, IOS etc), spotify-connect-web needs to be killed and restarted, it's kind of annoying.
I tried building this app locally (finally I succeeded) and 3 different versions of the library, but they all behave in the same way, same problem.
In debug mode I see similar patterns every time:
....
Requesting Bytes: 3658k => 3790k +132k (used: 495k, buf: 627k, thres: 499k, rate: 320k)
Requesting Bytes: 3790k => 3930k +140k (used: 487k, buf: 627k, thres: 499k, rate: 320k)
WARNING: Underrun in download buffer!
WARNING: Underrun in download buffer!
ESDK: SpPumpEvents()
ESDK: SpPumpEvents [returned value: 0]
ESDK: SpPumpEvents()
ESDK: SpPumpEvents [returned value: 0]
ESDK: SpPumpEvents()
ESDK: SpPumpEvents [returned value: 0]
Sometimes there is no "underrun buffer" message shown. Also, I monitor the raspberry connectivity continously and there are ZERO connectivity problems. I do streaming with other apps as well, including DLNA, for hours at a time, with no issues.
Any hint?
Any idea as to a solution to below issue?
root@raspberrypi:~/spotify-connect-web# LD_LIBRARY_PATH=$PWD python main.py -d
Loading Spotify library...
Traceback (most recent call last):
File "main.py", line 10, in
from connect_ffi import ffi, lib
File "/root/spotify-connect-web/connect_ffi.py", line 24, in
libraries=[str('spotify_embedded_shared')])
File "/usr/local/lib/python2.7/dist-packages/cffi/api.py", line 433, in verify
lib = self.verifier.load_library()
File "/usr/local/lib/python2.7/dist-packages/cffi/verifier.py", line 111, in load_library
return self._load_library()
File "/usr/local/lib/python2.7/dist-packages/cffi/verifier.py", line 222, in _load_library
return self._vengine.load_library()
File "/usr/local/lib/python2.7/dist-packages/cffi/vengine_cpy.py", line 155, in load_library
raise ffiplatform.VerificationError(error)
cffi.ffiplatform.VerificationError: importing '/root/spotify-connect-web/pycache/_cffi__x4c785defx96dcd04b.arm-linux-gnueabihf.so': libspotify_embedded_shared.so: cannot open shared object file: No such file or directory
root@raspberrypi:~/spotify-connect-web# ls -las spotify
180 -rw-r--r-- 1 root root 183260 Jan 27 09:23 libspotify_embedded_shared.so
4 -rw-r----- 1 root root 321 Jan 27 09:25 spotify_appkey.key
8 -rw-r--r-- 1 root root 5529 Jan 27 09:05 spotify.h
8 -rw-r--r-- 1 root root 8161 Jan 27 09:05 spotify.processed.h
I am trying to get this working on raspberry pi where I have RuneAudio already installed and running. Following Quickstart using a pre-built chroot
I am able to get it up and running, meaning, I can see device in android Spotify app, send music to it and see actions logged in console.
However, I can not hear any sound. I can play audio from RuneAudio but can not hear Spotify. Can I get those guys to play nicely with each other and take turns on audio ouptut?
this is more of a question. will software side volume be used in future releases? Just asking. My current DAC doesn't support alsamixer's gui. so this would be dope if you could
I installed spotify-web-connect on two differen RPi2, but only one if them shows up in the devices list of the spotify app. Did I something wrong? Or is that by design?
I'm using the same app-key and the same premium account.
Any hint is very much appreciated.
In addition I experience the problem with the strange volume scaling, i.e. using the HW buttons of my phone/tablet controls the volume not smoothly, but starts at very low volume and increases towards the end of the scale exponentially. Is there any solution for that?
BR
André
If you play only a single song or reach the end of your queue, no event will be triggered.
That's why the audio device isn't released with the pull request from @JozoVilcek and I use the events to power off some things.
I think it hangs because it's waiting for new data, but there is no. In log you will get a "buffer underrun" warning for this.
I'm trying to get this to run on one of those new fancy C.H.I.P. computers . And I am getting an error when running the chroot version
File "main.py", line 27, in
connect_app = Connect(web_error_callback)
File "/usr/src/app/connect.py", line 75, in init
lib.SpPlaybackUpdateVolume(mixer_volume)
OverflowError: can't convert negative number to unsigned
I can play audio files using aplayer specifying device hw:0,0 without issues. For some reason, the mixer.getvolume() call is returning a negative value. alsamixer allows me to toggle the volume without issue. Any help would be appreciated.
Hi,
In some cases the spotify connect service disappears from my network, so I can't find it on other devices in Spotify. The spotify connect web service is still running. I've to manually restart the service to make the service available again.
Is there any possibility to monitor the connection, instead of the service?
With the commit setting offets to 0x41 for zeroconf in spotify.h, those names are truncated :
remote name: drus
account req: MIUM
device type: NOWN
It is affecting the name displayed by Spotify (and I guess it's doesn't like the other things too). Reverting to 0x40 is ok :
char deviceId[0x40];
char activeUser[0x40];
char remoteName[0x40];
By the way, you say "spotify.h was taken from from https://github.com/plietar/spotify-connect" but I couldn't find it, can you tell me more ?
Could you please add a license declaration? I'd love to use some of your code for a hobby project I plan to do during the summer (kind of a party jukebox), but I'm not sure if I'm allowed to. Cheers!
Hallo,
I would like to be able to start and play Spotify songs on this with a program. Is that possibale?
HI, I hope this is the right place for a problem like this. I tried the installation following the intructions but I get a Segmantation fault message when trying to execute ./spotify-connect-web
maybe I can give a little more information: I am using a raspberry pi wih volumio 1.55
Hi
On Raspberry Pi 2 (OSMC) I can't access any web page because it gives Segmentation Fault.
Regards
Vit3c
In console_callbacks.py, line 87 a new mixer instance is created. If the desired mixer, as set by the "--mixer" option is not on found on the default card with cardindex=0, this will critically fail.
If the user chooses a different card via the "--device" option this should be respected here and the mixer should be sought after on the card given by "--device" using the "cardindex" parameter.
Or give the user a mean of selecting the card on which the given mixer is to be found.
Hi,
first of thanks for the great software!
I set it up such that I don't have my credentials as command line arguments (as every user on my raspberry pi could easily read my credentials using service spotify-connect status
or htop
). Instead I started it without any and logged in via the web GUI, which worked fine the first time.
But after some time (and restarts) I noticed that I am no longer logged in and trying to do so would fails without any feedback.
The GUI was just stuck at loading the checking the login status. Only after I removed the credentials.json
from inside the chroot, I could log in again. I compared the old an new json and noticed that the blob changed.
I guess that the credentials were somehow invalidated and that Spotify connect would ignore my new login whenever there was already a credentials.json
existent.
I set up spotify connect web using the chroot technique on my raspberry pi (B+). When I stop playing songs around mignight, and play something the day after, it usually won't work. The track seems to buffer forever (on the app you hit play, the timer starts, but if you hit pause then play, it starts back to 0).
I activated the logs to check what was going on and it seems that there sometime is an error with ALSA.
Fri, 02 Oct 2015 07:38:45 +0000 ESDException in thread Thread-1:
Fri, 02 Oct 2015 07:38:45 +0000 Traceback (most recent call last):
Fri, 02 Oct 2015 07:38:45 +0000 File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
Fri, 02 Oct 2015 07:38:45 +0000 self.run()
Fri, 02 Oct 2015 07:38:45 +0000 File "/usr/lib/python2.7/threading.py", line 763, in run
Fri, 02 Oct 2015 07:38:45 +0000 self.__target(*self.__args, **self.__kwargs)
Fri, 02 Oct 2015 07:38:45 +0000 File "/usr/src/app/console_callbacks.py", line 110, in playback_thread
Fri, 02 Oct 2015 07:38:45 +0000 device.write(data)
Fri, 02 Oct 2015 07:38:45 +0000 ALSAAudioError: Input/output error
Not sure where this would come from. here is a full detailed log of over 2 days of my raspberry pi running and the problem is shown on line 3434.
Hi,
it would be nice if you implement the Access Control Allow Origin Header for the internal Webserver.
I pull the META information from the API via jQuery for my Magic Mirror and had to implement this Workaorund into main.py:
http://flask.pocoo.org/snippets/56/
Without the workaround I got the following error message when I tired to access the API via jQuery:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost' is therefore not allowed access
ps:
Your Software work much better than Spotify Connect Clients from Spotify on FireTV or Chromecast !
Thank you very muche !
First, THANK YOU for this amazing piece of software. It made my RPi exactly what i needed it to be 👍
My title is vague because i don't really know what i'm asking for.
I'm fiddling around with connecting a 20x4 i2c display to my RPi, i use the Python smbus library to write to it. So what i'm after is a way to write song name/artist, play/pause status, volume and other info to it.
I don't know where to begin.
Hi,
do you thought about adding Zeroconf / the avahi publish into the main.py maybe trigger by and option "--avahi true" that would be nice for households with more than one Spotify Account
Cheers and also thanks for the great Work
When playing with an USB audio carte (USB-Audio - Combo384 Amanero) i get the following traceback :
kSpPlaybackNotifyPlay
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/src/app/console_callbacks.py", line 107, in playback_thread
device.write(data)
ALSAAudioError: Data size must be a multiple of framesize
Any idea ?
RPI2 Archlinux. (in chroot instalation, runing OK)
This version:
https://github.com/sashahilton00/spotify-connect-resources/blob/master/armhf%20version/libspotify_embedded_shared.so
All requeriments.txt install.
This error to launch:
Traceback (most recent call last):
File "main.py", line 10, in
from connect_ffi import ffi, lib
File "/root/spotify-connect-web-master/connect_ffi.py", line 4
print "Loading Spotify library..."
^
SyntaxError: Missing parentheses in call to 'print'
I'm getting the following error when trying to run the chroot package.
SpInit: 0
Traceback (most recent call last):
File "main.py", line 27, in
connect_app = Connect(web_error_callback)
File "/usr/src/app/connect.py", line 75, in init
lib.SpPlaybackUpdateVolume(mixer_volume)
OverflowError: can't convert negative number to unsigned
On my raspberry pi 2 the display name which you can set in the web gui is used in all clients and this works good. But after one reboot of my raspberry pi the name is not set again and all clients are using "TestConnect" as the name.
The chosen name should be used also after a reboot.
hey,
I have a shairpoint script running as well. Output is working with that. with spotify connect running the output is no longer working.
Any Ideas?
Setup:
alpay -l output:
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
Subdevices: 7/8
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
Subdevice #2: subdevice #2
Subdevice #3: subdevice #3
Subdevice #4: subdevice #4
Subdevice #5: subdevice #5
Subdevice #6: subdevice #6
Subdevice #7: subdevice #7
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: Set [C-Media USB Headphone Set], device 0: USB Audio [USB Audio]
Subdevices: 0/1
Subdevice #0: subdevice #0
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.