Git Product home page Git Product logo

leapcast's Introduction

leapcast (deprecated)

This project no longer works because Google locked down entire API. There are alternatives like cloning device, casting apk from nexus player etc. Thanks for all contibutors and I hope we all learned something from this project. Meanwhile I'am keeping #130 open if anyone wants to discuss something related to lepacast or 2nd screen paradigm.

I would love to re-implement this as an open source alternative to chromecast someday, but I won't make any promises.

Have fun :)

Authors

The following persons have contributed to leapcast.

  • Janez Troha
  • Tyler Hall
  • Edward Shaw
  • Jan Henrik
  • Martin Polden
  • Thomas Taschauer
  • Zenobius Jiricek
  • Ernes Durakovic
  • Peter Sanford
  • Michel Tu
  • Kaiwen Xu
  • Norman Rasmussen
  • Sven Wischnowsky

and others.

leapcast's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

leapcast's Issues

Missing no apps response code

When no apps are running on the device, HTTP response code 204 is returned on a GET request on the applications ("/apps") uri.

Chromcast not detected

Hello,

I don't get it running. Installing it worked fine, when I start it I get this:

D:\Eigene Dateien\Eigene Downloads\leapcast-master>python leapcast --chrome "C:/Program Files (x86)/
Google/Chrome/Application/chrome.exe" -d
DEBUG:Leapcast:Added ChromeCast app
DEBUG:Leapcast:Added YouTube app
DEBUG:Leapcast:Added PlayMovies app
DEBUG:Leapcast:Added GoogleMusic app
DEBUG:Leapcast:Added GoogleCastSampleApp app
DEBUG:Leapcast:Added GoogleCastPlayer app
DEBUG:Leapcast:Added TicTacToe app
DEBUG:Leapcast:Added Fling app

but nothing happens(not sure if a chrome tab should open or something...)
and I don't get any failure if I change to a wrong chrome path...
And no Chromcast detected in the chrome app, my tablet and smartphone in youtube/play music/play movies

What can I do?

Win7x64 Python2.7.5 Chrome 29 beta

SyntaxError: invalid syntax

For some weird reason, I am seeing the error below,

$ python3 app.py
File "app.py", line 45
print datagram
^
SyntaxError: invalid syntax

indentation problem? Please help!

Leapcast not working

When I try to run leapcast it gives me the error
"no module named requests"

Anyone know what to do?

image

"Address already in use" on Mac after initial run

I bisected this to e4a51b3, before it's fine, and after (all the way to a495e96) I get the following error:

$ /Applications/ChromeCast Sim.app/Contents/MacOS/ChromeCast\ Sim
<works fine>
^C

$ /Applications/ChromeCast Sim.app/Contents/MacOS/ChromeCast\ Sim -d
INFO:root:Starting SSDP server
Traceback (most recent call last):
  File "/Applications/ChromeCast Sim.app/Contents/Resources/__boot__.py", line 340, in <module>
    _run()
  File "/Applications/ChromeCast Sim.app/Contents/Resources/__boot__.py", line 334, in _run
    exec(compile(source, path, 'exec'), globals(), globals())
  File "/Applications/ChromeCast Sim.app/Contents/Resources/leapcast/__main__.py", line 42, in <module>
    main()
  File "/Applications/ChromeCast Sim.app/Contents/Resources/leapcast/__main__.py", line 36, in main
    ssdp_server.start()
  File "/Applications/ChromeCast Sim.app/Contents/Resources/leapcast/services/ssdp.py", line 115, in start
    (self.SSDP_ADDR, self.SSDP_PORT), SSDPHandler)
  File "/Applications/ChromeCast Sim.app/Contents/Resources/leapcast/services/ssdp.py", line 21, in __init__
    bind_and_activate)
  File "/usr/lib/python2.7/SocketServer.py", line 419, in __init__
    self.server_bind()
  File "/usr/lib/python2.7/SocketServer.py", line 430, in server_bind
    self.socket.bind(self.server_address)
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 48] Address already in use
2013-12-03 21:12:51.742 ChromeCast Sim[89083:507] ChromeCast Sim Error

# netstat -an | grep 1900
udp4       0      0  *.1900                 *.*
(one entry added for everytime leapcast is started, reset on reboot)

# lsof -n -P -iUDP:1900 
<blank> (not blank while leapcast is running)

$ /Applications/ChromeCast\ Sim.app/Contents/MacOS/python 
Python 2.7.5 (default, Aug 25 2013, 00:04:04) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> socket.SO_REUSEADDR
4
>>> socket.SO_REUSEPORT
512

ImportError: No module named twisted.internet

On python 2.7.5 I keep getting this error. I tested this on windows Vista en windows 8.

Traceback (most recent call last):
File "C:\Users\USER\Desktop\ChromeCast.py", line 5, in (module)
from twisted.internet import reactor
ImportError: No module named twisted.internet

Any success with this on Fedora 19/20?

Any suggestions on installing this in Fedora? I have installed the following:

yum install python-virtualenvwrapper python-twisted-web python-devel python-pip
and run python setup.py develop which seemed to work ok. (I do notice that there is no mkvirtualenv command available)

I have included output below of python setup.py develop; leapcast --name x1
and then error produced when trying to cast Google Music from device.

Thanks for any suggestions!

[root@x1 leapcast]# python setup.py develop
running develop
running egg_info
writing requirements to Leapcast.egg-info/requires.txt
writing Leapcast.egg-info/PKG-INFO
writing top-level names to Leapcast.egg-info/top_level.txt
writing dependency_links to Leapcast.egg-info/dependency_links.txt
writing entry points to Leapcast.egg-info/entry_points.txt
reading manifest file 'Leapcast.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'Leapcast.egg-info/SOURCES.txt'
running build_ext
Creating /usr/lib/python2.7/site-packages/Leapcast.egg-link (link to .)
Leapcast 0.0.5 is already the active version in easy-install.pth
Installing leapcast script to /usr/bin

Installed /usr/local/src/leapcast
Processing dependencies for Leapcast==0.0.5
Searching for tornado==3.1.1
Best match: tornado 3.1.1
Adding tornado 3.1.1 to easy-install.pth file

Using /usr/lib/python2.7/site-packages
Searching for setuptools==0.9.6
Best match: setuptools 0.9.6
Adding setuptools 0.9.6 to easy-install.pth file
Installing easy_install script to /usr/bin
Installing easy_install-2.7 script to /usr/bin

Using /usr/lib/python2.7/site-packages
Finished processing dependencies for Leapcast==0.0.5

[root@x1 leapcast]# leapcast --name X1
INFO:root:Starting SSDP server
INFO:root:Starting LEAP server
INFO:root:Added ChromeCast app
INFO:root:Added YouTube app
INFO:root:Added PlayMovies app
INFO:root:Added GoogleMusic app
INFO:root:Added GoogleCastSampleApp app
INFO:root:Added GoogleCastPlayer app
INFO:root:Added Fling app
INFO:root:Added TicTacToe app
INFO:tornado.access:200 GET /ssdp/device-desc.xml (10.2.2.34) 2.32ms
INFO:tornado.access:200 GET /apps/GoogleMusic (10.2.2.34) 2.41ms
INFO:tornado.access:200 GET /ssdp/device-desc.xml (10.2.2.34) 2.05ms
INFO:tornado.access:204 GET /apps (10.2.2.34) 0.51ms
ERROR:tornado.application:Uncaught exception POST /apps/GoogleMusic (10.2.2.34)
HTTPRequest(protocol='http', host='10.2.2.101:8008', method='POST', uri='/apps/GoogleMusic', version='HTTP/1.1', remote_ip='10.2.2.34', headers={'Origin': 'https://www.google.com', 'Content-Length': '22', 'Content-Type': 'text/url', 'Connection': 'Keep-Alive', 'Host': '10.2.2.101:8008', 'User-Agent': 'com.google.android.music/5.2.1301L.891271 (Linux; U; Android 4.1.2; SGH-I747M Build/JZO54K)'})
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/tornado/web.py", line 1115, in _stack_context_handle_exception
raise_exc_info((type, value, traceback))
File "/usr/lib/python2.7/site-packages/tornado/web.py", line 1298, in wrapper
result = method(self, _args, *_kwargs)
File "/usr/local/src/leapcast/leapcast/services/leap_factory.py", line 126, in post
status['browser'] = Browser(appurl)
File "/usr/local/src/leapcast/leapcast/services/leap_factory.py", line 31, in init
self.pid = subprocess.Popen(args)
File "/usr/lib64/python2.7/subprocess.py", line 711, in init
errread, errwrite)
File "/usr/lib64/python2.7/subprocess.py", line 1308, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
ERROR:tornado.access:500 POST /apps/GoogleMusic (10.2.2.34) 14.45ms
ERROR:tornado.application:Uncaught exception POST /apps/GoogleMusic (10.2.2.34)
HTTPRequest(protocol='http', host='10.2.2.101:8008', method='POST', uri='/apps/GoogleMusic', version='HTTP/1.1', remote_ip='10.2.2.34', headers={'Origin': 'https://www.google.com', 'Content-Length': '22', 'Content-Type': 'text/url', 'Connection': 'Keep-Alive', 'Host': '10.2.2.101:8008', 'User-Agent': 'com.google.android.music/5.2.1301L.891271 (Linux; U; Android 4.1.2; SGH-I747M Build/JZO54K)'})
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/tornado/web.py", line 1115, in _stack_context_handle_exception
raise_exc_info((type, value, traceback))
File "/usr/lib/python2.7/site-packages/tornado/web.py", line 1298, in wrapper
result = method(self, _args, *_kwargs)
File "/usr/local/src/leapcast/leapcast/services/leap_factory.py", line 126, in post
status['browser'] = Browser(appurl)
File "/usr/local/src/leapcast/leapcast/services/leap_factory.py", line 31, in init
self.pid = subprocess.Popen(args)
File "/usr/lib64/python2.7/subprocess.py", line 711, in init
errread, errwrite)
File "/usr/lib64/python2.7/subprocess.py", line 1308, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
ERROR:tornado.access:500 POST /apps/GoogleMusic (10.2.2.34) 10.81ms
ERROR:tornado.application:Uncaught exception POST /apps/GoogleMusic (10.2.2.34)
HTTPRequest(protocol='http', host='10.2.2.101:8008', method='POST', uri='/apps/GoogleMusic', version='HTTP/1.1', remote_ip='10.2.2.34', headers={'Origin': 'https://www.google.com', 'Content-Length': '22', 'Content-Type': 'text/url', 'Connection': 'Keep-Alive', 'Host': '10.2.2.101:8008', 'User-Agent': 'com.google.android.music/5.2.1301L.891271 (Linux; U; Android 4.1.2; SGH-I747M Build/JZO54K)'})
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/tornado/web.py", line 1115, in _stack_context_handle_exception
raise_exc_info((type, value, traceback))
File "/usr/lib/python2.7/site-packages/tornado/web.py", line 1298, in wrapper
result = method(self, _args, *_kwargs)
File "/usr/local/src/leapcast/leapcast/services/leap_factory.py", line 126, in post
status['browser'] = Browser(appurl)
File "/usr/local/src/leapcast/leapcast/services/leap_factory.py", line 31, in init
self.pid = subprocess.Popen(args)
File "/usr/lib64/python2.7/subprocess.py", line 711, in init
errread, errwrite)
File "/usr/lib64/python2.7/subprocess.py", line 1308, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
ERROR:tornado.access:500 POST /apps/GoogleMusic (10.2.2.34) 10.56ms
ERROR:tornado.application:Uncaught exception POST /apps/GoogleMusic (10.2.2.34)
HTTPRequest(protocol='http', host='10.2.2.101:8008', method='POST', uri='/apps/GoogleMusic', version='HTTP/1.1', remote_ip='10.2.2.34', headers={'Origin': 'https://www.google.com', 'Content-Length': '22', 'Content-Type': 'text/url', 'Connection': 'Keep-Alive', 'Host': '10.2.2.101:8008', 'User-Agent': 'com.google.android.music/5.2.1301L.891271 (Linux; U; Android 4.1.2; SGH-I747M Build/JZO54K)'})
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/tornado/web.py", line 1115, in _stack_context_handle_exception
raise_exc_info((type, value, traceback))
File "/usr/lib/python2.7/site-packages/tornado/web.py", line 1298, in wrapper
result = method(self, _args, *_kwargs)
File "/usr/local/src/leapcast/leapcast/services/leap_factory.py", line 126, in post
status['browser'] = Browser(appurl)
File "/usr/local/src/leapcast/leapcast/services/leap_factory.py", line 31, in init
self.pid = subprocess.Popen(args)
File "/usr/lib64/python2.7/subprocess.py", line 711, in init
errread, errwrite)
File "/usr/lib64/python2.7/subprocess.py", line 1308, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
ERROR:tornado.access:500 POST /apps/GoogleMusic (10.2.2.34) 9.83ms
ERROR:tornado.application:Uncaught exception POST /apps/GoogleMusic (10.2.2.34)
HTTPRequest(protocol='http', host='10.2.2.101:8008', method='POST', uri='/apps/GoogleMusic', version='HTTP/1.1', remote_ip='10.2.2.34', headers={'Origin': 'https://www.google.com', 'Content-Length': '22', 'Content-Type': 'text/url', 'Connection': 'Keep-Alive', 'Host': '10.2.2.101:8008', 'User-Agent': 'com.google.android.music/5.2.1301L.891271 (Linux; U; Android 4.1.2; SGH-I747M Build/JZO54K)'})
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/tornado/web.py", line 1115, in _stack_context_handle_exception
raise_exc_info((type, value, traceback))
File "/usr/lib/python2.7/site-packages/tornado/web.py", line 1298, in wrapper
result = method(self, _args, *_kwargs)
File "/usr/local/src/leapcast/leapcast/services/leap_factory.py", line 126, in post
status['browser'] = Browser(appurl)
File "/usr/local/src/leapcast/leapcast/services/leap_factory.py", line 31, in init
self.pid = subprocess.Popen(args)
File "/usr/lib64/python2.7/subprocess.py", line 711, in init
errread, errwrite)
File "/usr/lib64/python2.7/subprocess.py", line 1308, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
ERROR:tornado.access:500 POST /apps/GoogleMusic (10.2.2.34) 8.72ms

Hardcoded ip address

Current version doesn't work due to this hardcoded ip:

{"URL":"ws://192.168.3.22:8008/session/%s?%s","pingInterval":3}

After stopping and starting a new casting

I can cast fine for the first time whatever, tab, fullscreen or youtube. But then when I disconnect and reconnect again I begin getting this trace:

ERROR:tornado.application:Uncaught exception in /session/ChromeCast
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/tornado/websocket.py", line 303, in wrapper
return callback(_args, *_kwargs)
File "/usr/local/lib/python2.7/dist-packages/leapcast/services/websocket.py", line 236, in on_message
channel.write_message(message)
File "/usr/local/lib/python2.7/dist-packages/tornado/websocket.py", line 165, in write_message
self.ws_connection.write_message(message, binary=binary)
AttributeError: 'NoneType' object has no attribute 'write_message'

Then I am forced to kill chrome and leapcast to make it work again.

My setup is Ubuntu 13.04 and using Chrome 30.0.1599.69 with the latest git clone as todays date (14 october 2013) for the destination host. Source host is OSX Mountain Lion.

Error on disconnect-reconnect using Google music

Hi,
I'm testing leapcast with Google Music Android app. It seems to work well on first run (I can seek, skip, select new songs, ...) but if I disconnect the app from leapcast and try to reconnect I get error on the app the it looks that leapcast is not able to provide any service.

http://pastebin.com/s40zEzX1
A debug log where on a first (very short) session played/skipped few songs and then I tried to disconnect and reconnect with related errors on the log. I hop it is enought to locate the bug.

Leapcast not being detected on devices?

Running Windows 8 Pro, Python 2.7.5.

Installed dependencies, and launch leapcast using:

leapcast --name ComputerCast --chrome "C://Users//Adrian//AppData//Local//Google//Chrome//Application//chrome.exe"

No errors pop up, but the Cast button doesn't show up in YouTube or Google Music on my Android phone.

Terminating leapcast with CTRL+C shows:

INFO:Leapcast:Stopping HTTP server
INFO:Leapcast:Stopping DIAL server

So it appears the servers are starting correctly, but the Cast button isn't showing up.

Help with casting preview

I tried casting to the emulator, and then I opened up chrome on my mac and navigated to http://192.168.7.130:8008/apps/YouTube/run , I got a 404. How can I preview the content that is being casted.

I cannot get the app to work when I sent the chrome path( /Applications/Google\ Chrome.app on my mac) as --chrome flag. So I am manually opening up the chrome app.

Also once I start the server and then stop it , then retry starting , I always get the error - "address already in use" Looks like a bug.

Cast button not appearing in Google Music, cast-android-sample

First, congrats for this program.

I can get the cast button to appear in the Youtube app but not
the 2 mentionned apps.

However, both apps discover leapcast as they fetch the device XML, but the button does not appear.
I suspect the Youtube app to not use the Android Googlecast SDK, while both these app do (at least the sample app does).
I suppose they might not like something in the device XML.

Can't assign requested address

Hi,

Thanks for this, I am trying to run this and I am getting the error below, am I missing something?

$ sudo python app.py --name remo 192.168.4.1 -->(not a part of my lan)
Password:
INFO:root:Listening on 192.168.4.1
Unhandled error in Deferred:
Unhandled Error
Traceback (most recent call last):
Failure: twisted.internet.error.MulticastJoinError: ('\xef\xff\xff\xfa', '\xc0\xa8\x04\x01', 49, "Can't assign requested address")

Path to chrome not working on Windows

Using Windows 8 with python 2.7

Tried passing in the arg --chrome with full path to chrome (C:\Users[.my name here..]\AppData\Local\Google\Chrome\Application\chrome.exe) and it could not find chrome when I played something over chromecast.

Workaround was to put that chrome path into my PATH variable.

Interested in UPnP support?

I'm currently working on adding UPnP-AV support to leapcast. Now I'm wondering if that is beyond the scope of leapcast. Since the project description says: "ChromeCast emulation app for any device".

RAMP error code -4

my chromecast app randomly fails with messages in logcat like this:

E/MediaProtocolMessageStream(10024): error parsing message: {"type":"RESPONSE","cmd_id":2,"status":{"error":{"domain":"ramp","code":-4},"event_sequence":2}} org.json.JSONException: No value for state

leapcast (started in debug mode) prints out the following at the same time:

DEBUG:root:ReceiverChannel: [
  "ramp",
  {
    "cmd_id": 2,
    "status": {
      "error": {
        "code": -4,
        "domain": "ramp"
      },
      "event_sequence": 2
    },
    "type": "RESPONSE"
  }
]

Unfortunately I don't have a real device to test - do you have any idea if it's related to your emulator or not?

YouTube does not support multiple second devices

Right now, leapcast works well with YouTube being controlled by a single Android device. More than one is buggy. Follow the steps:

  1. Run leapcast.
  2. Open YouTube on Android. Press the ChromeCast button, select the leapcast device.
    โ†’ YouTube screen opens in leapcast (as expected), and we can control YouTube through that device.
  3. Repeat step 2 on another Android device.
    โ†’ Broken. The second device cannot control the same YouTube in leapcast.
  4. From the second device (the one that cannot control YouTube), press the ChromeCast button and switch back to the device, freeing up control of leapcast.
    โ†’ This sends a DELETE request, which will then close the main YouTube app on LeapCast, interrupting whatever was being played there by the first device.

AFAIK, the expected behavior is having multiple devices controlling the same ChromeCast flawlessly.

POST Error/Subprocess Error

Windows 7 64bit, Python 2.7.5 32bit

INFO:tornado.access:200 GET /apps/YouTube (192.168.1.144) 2.00ms
ERROR:tornado.application:Uncaught exception POST /apps/YouTube (192.168.1.144)
HTTPRequest(protocol='http', host='192.168.1.131:8008', method='POST', uri='/app
s/YouTube', version='HTTP/1.1', remote_ip='192.168.1.144', headers={'Origin': 'p
ackage:com.google.android.youtube', 'Content-Length': '66', 'Content-Type': 'tex
t/plain; charset="utf-8"', 'Connection': 'Keep-Alive', 'Host': '192.168.1.131:80
08', 'User-Agent': 'com.google.android.youtube/4.5.17(Linux; U; Android 4.0.3; e
n_US; HTCEVOV4G Build/IML74K)'})
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\tornado\web.py", line 1115, in _stack_cont
ext_handle_exception
raise_exc_info((type, value, traceback))
File "C:\Python27\lib\site-packages\tornado\web.py", line 1298, in wrapper
result = method(self, _args, *_kwargs)
File "c:\python27\scripts\leapcast-master\leapcast\services\leap.py", line 115
, in post
status['browser'] = Browser(appurl)
File "c:\python27\scripts\leapcast-master\leapcast\services\leap.py", line 29,
in init
self.pid = subprocess.Popen(args)
File "C:\Python27\lib\subprocess.py", line 711, in init
errread, errwrite)
File "C:\Python27\lib\subprocess.py", line 948, in _execute_child
startupinfo)
WindowsError: [Error 2] The system cannot find the file specified
ERROR:tornado.access:500 POST /apps/YouTube (192.168.1.144) 13.00ms
INFO:tornado.access:200 GET /apps/YouTube (192.168.1.144) 2.00ms
INFO:tornado.access:200 GET /ssdp/device-desc.xml (192.168.1.144) 2.00ms

Errno 64 Host is down

When I first started using leapcast it ran fine, but now I'm getting the following error:

Exception happened during processing of request from ('192.168.0.104', 59820)
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 582, in process_request_thread
self.finish_request(request, client_address)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 323, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 641, in init
self.finish()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 716, in finish
self.socket.sendto(self.wfile.getvalue(), self.client_address)
error: [Errno 64] Host is down

Any idea why this is happening? Thanks!

error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

Hello,

I have followed your instructions, and at the last step:
(System is Ubuntu x64 from a fresh install)

(leapcast)cve@CVE:~/leapcast$ pip install .
Unpacking /home/cve/leapcast
  Running setup.py egg_info for package from file:///home/cve/leapcast

Requirement already satisfied (use --upgrade to upgrade): distribute in /home/cve/.virtualenvs/leapcast/lib/python2.7/site-packages/distribute-0.6.34-py2.7.egg (from Leapcast==0.0.1)
Downloading/unpacking twisted (from Leapcast==0.0.1)
  Running setup.py egg_info for package twisted

Downloading/unpacking tornado (from Leapcast==0.0.1)
  Running setup.py egg_info for package tornado

    warning: no previously-included files matching '_auto2to3*' found anywhere in distribution
Downloading/unpacking zope.interface>=3.6.0 (from twisted->Leapcast==0.0.1)
  Running setup.py egg_info for package zope.interface

    warning: no previously-included files matching '*.dll' found anywhere in distribution
    warning: no previously-included files matching '*.pyc' found anywhere in distribution
    warning: no previously-included files matching '*.pyo' found anywhere in distribution
    warning: no previously-included files matching '*.so' found anywhere in distribution
Installing collected packages: twisted, tornado, Leapcast, zope.interface
  Running setup.py install for twisted

    x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c conftest.c -o conftest.o
    building 'twisted.runner.portmap' extension
    x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c twisted/runner/portmap.c -o build/temp.linux-x86_64-2.7/twisted/runner/portmap.o
    twisted/runner/portmap.c:10:20: fatal error: Python.h: No such file or directory
    compilation terminated.
    error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
    Complete output from command /home/cve/.virtualenvs/leapcast/bin/python -c "import setuptools;__file__='/home/cve/.virtualenvs/leapcast/build/twisted/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-Xw3x6q-record/install-record.txt --single-version-externally-managed --install-headers /home/cve/.virtualenvs/leapcast/include/site/python2.7:
    running install

running build

running build_py

running egg_info

writing requirements to Twisted.egg-info/requires.txt

writing Twisted.egg-info/PKG-INFO

writing top-level names to Twisted.egg-info/top_level.txt

writing dependency_links to Twisted.egg-info/dependency_links.txt

warning: manifest_maker: standard file '-c' not found



reading manifest file 'Twisted.egg-info/SOURCES.txt'

writing manifest file 'Twisted.egg-info/SOURCES.txt'

running build_ext

x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c conftest.c -o conftest.o

building 'twisted.runner.portmap' extension

x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c twisted/runner/portmap.c -o build/temp.linux-x86_64-2.7/twisted/runner/portmap.o

twisted/runner/portmap.c:10:20: fatal error: Python.h: No such file or directory

compilation terminated.

error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

----------------------------------------
Command /home/cve/.virtualenvs/leapcast/bin/python -c "import setuptools;__file__='/home/cve/.virtualenvs/leapcast/build/twisted/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-Xw3x6q-record/install-record.txt --single-version-externally-managed --install-headers /home/cve/.virtualenvs/leapcast/include/site/python2.7 failed with error code 1 in /home/cve/.virtualenvs/leapcast/build/twisted
Storing complete log in /tmp/tmpKBSTMP

Error when attempting to run leapcast on headless raspberry pi

I'm not sure if this is possible, and didn't find any useful information on the web (so far).

I am able to get leapcast running properly on an old laptop, but not on raspberry pi. When trying to ask the leapcast server to play music, it gives an error "OSError: [Errno 2] No such file or directory" and the full traceback is below. The same error happens when attempting to play youtube videos.

The raspberry pi has no screen attached to it, and it's running chromium instead of google-chrome. I tried to specify xvfb-run in the leapcast's --chrome option, but I wasn't able to see any difference in behavior.

Suggestions would be most welcome. thanks!


INFO:tornado.access:200 GET /ssdp/device-desc.xml (192.168.1.21) 23.30ms
INFO:tornado.access:200 GET /apps/GoogleMusic (192.168.1.21) 38.37ms
ERROR:tornado.application:Uncaught exception POST /apps/GoogleMusic (192.168.1.21)
HTTPRequest(protocol='http', host='192.168.1.17:8008', method='POST', uri='/apps/GoogleMusic', version='HTTP/1.1', remote_ip='192.168.1.21', headers
={'Origin': 'https://www.google.com', 'Content-Length': '22', 'Content-Type': 'text/url', 'Connection': 'Keep-Alive', 'Host': '192.168.1.17:8008', '
User-Agent': 'com.google.android.music/5.1.1109K.772337 (Linux; U; Android 2.3.6; Nexus One Build/GRK39F)'})
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1115, in _stack_context_handle_exception
raise_exc_info((type, value, traceback))
File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1298, in wrapper
result = method(self, _args, *_kwargs)
File "/usr/local/lib/python2.7/dist-packages/leapcast/services/leap_factory.py", line 126, in post
status['browser'] = Browser(appurl)
File "/usr/local/lib/python2.7/dist-packages/leapcast/services/leap_factory.py", line 31, in init
self.pid = subprocess.Popen(args)
File "/usr/lib/python2.7/subprocess.py", line 679, in init
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1259, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
ERROR:tornado.access:500 POST /apps/GoogleMusic (192.168.1.21) 93.80ms

how does ramp protocol work

Dear dz0ny:
Hi, I recently study leapcast project, yet there are some parts of it i don't understand.
When websocket server receives POST request , it will open the browser. The browser will not start to play (say youtube) video until ReceiverChannel. on_message receives RAMP protocol command.
However, as I trace on_message function, I haven't found out which part of the function actually parse RAMP command to the browser. From my understanding, this function only write the message back to the client according to the tornado.web api.
I would like to know how the RAMP command communicate with the chrome browser in the leapcast program.

    Any feedback is highly appreciated. Thank you very much.

Best Regards
stevensyy 8/26

Getting error in set_status too many arguments

Traceback (most recent call last):
File "/usr/lib/python2.6/site-packages/tornado/web.py", line 987, in _execute
getattr(self, self.request.method.lower())(_args, *_kwargs)
File "app.py", line 149, in post
super(YouTube, self).post()
File "app.py", line 74, in post
self.set_status(201, "Created")
TypeError: set_status() takes exactly 2 arguments (3 given)
ERROR:root:500 POST /apps/YouTube (192.168.1.212) 1.25ms

Development with LeapCast

Is there a way to register my receiver app on LeapCast?
I'm outside of US, but i want to start developing apps for ChromeCast. While i'm waiting for my device to come here from US, is there a way to start developing with LeapCast?

Don't use shlex.split on Windows

It seems like shlex.split causes args to become

['C:Program', 'Files', '(x86)GoogleChromeApplicationchrome.exe','--app=https://www.gstatic.com/cv/receiver.html?v=release-9e8c585405ea9a5cecd82885e8e35d28a16609c6&id=local%3A1&idle=windowclose','--user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) CrKey/30.0.1573.2 Safari/537.36']

SSDP Server conflicts with minissdpd UPnP daemon on Debian Wheezy

When you start leapcast on Debian Wheezy, you'll get the error: "socket.error: [Errno 98] Address already in use"

INFO:root:Starting SSDP server
Traceback (most recent call last):
File "/home/aogulla/.virtualenvs/leapcast/bin/leapcast", line 9, in
load_entry_point('Leapcast==0.0.2', 'console_scripts', 'leapcast')()
File "/home/aogulla/.virtualenvs/leapcast/local/lib/python2.7/site-packages/leapcast/main.py", line 36, in main
ssdp_server.start()
File "/home/aogulla/.virtualenvs/leapcast/local/lib/python2.7/site-packages/leapcast/services/ssdp.py", line 105, in start
(self.SSDP_ADDR, self.SSDP_PORT), SSDPHandler)
File "/home/aogulla/.virtualenvs/leapcast/local/lib/python2.7/site-packages/leapcast/services/ssdp.py", line 19, in init
bind_and_activate)
File "/usr/lib/python2.7/SocketServer.py", line 419, in init
self.server_bind()
File "/usr/lib/python2.7/SocketServer.py", line 430, in server_bind
self.socket.bind(self.server_address)
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use

This is because minissdpd UPnP daemon is started automatically before any other SSDP (UPnP) program on Debian Wheezy and other Debian derivative machines.

A workaround is to locate the /usr/sbin/minissdpd PID and killing it before starting leapcast. i.e.

find the PID of running ssdp UPnP program

$ ps -ef | grep ssdp

The output will be something similar to the line below.

root 5413 1 0 09:36 ? 00:00:00 /usr/sbin/minissdpd -i 0.0.0.0

Stop the minissdpd SSDP UPnP daemon

$ sudo kill -9 5413

where 5413 in this case is the PID of /usr/sbin/minissdpd

Leapcast will then be able to run on the computer.

Support for Pandora

I'm trying to run Pandora on Leapcast.
I did a few changes in leapcast/apps/default.py, but that was not enough to make it work.
Should I explicitly mention the protocol used? (and implement it?)

Is there anything that would prevent Pandora from working on Leapcast?

Can someone provide a few hints on what to change to make it work before I start digging deeper in the code?

Exception: Cannot redirect after headers have been written

I don't know the exact steps to reproduce, but you may try something like this:

  1. Open YouTube on leapcast.
  2. Open a different app (like ChromeCast from Chrome, or Play Movies).
  3. Eventually, this exception will be thrown.

Sorry I couldn't provide precise steps to reproduce it.

INFO:root:302 GET /apps (192.168.1.10) 0.44ms
ERROR:root:Uncaught exception GET /apps (192.168.1.10)
HTTPRequest(protocol='http', host='192.168.1.11:8008', method='GET', uri='/apps', version='HTTP/1.1', remote_ip='192.168.1.10', body='', headers={'Origin': 'https://www.google.com', 'Host': '192.168.1.11:8008', 'Connection': 'Keep-Alive', 'User-Agent': 'com.google.android.videos/2.6.9 (Linux; U; Android 4.2.1; NookTablet Build/JOP40G)'})
Traceback (most recent call last):
  File "/usr/lib64/python2.7/site-packages/tornado/web.py", line 1042, in _execute
    getattr(self, self.request.method.lower())(*args, **kwargs)
  File "/home/denilson/programas/leapcast/leapcast/services/rest.py", line 44, in get
    self.redirect("/apps/%s" % app)
  File "/usr/lib64/python2.7/site-packages/tornado/web.py", line 461, in redirect
    raise Exception("Cannot redirect after headers have been written")
Exception: Cannot redirect after headers have been written
ERROR:root:Cannot send error response after headers written

Leapcast not working: Is this command line wrong or what is the name-of-device supposed to be?

Hi,

My Desktop PC is running on Windows 7. I have done everything according to: https://plus.google.com/+NicandrosNicolaou/posts/8RjWfMXxje8.

When I copied every character into the cmd prompt as outlined in the last step, which is #16:

  1. Run with (type in cmd)

leapcast --name VAIO --chrome "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" โ€“-fullscreen

The screen does not display what is said in the follow step:

  1. This should be displayed

INFO:root:Starting SSDP server
INFO:root:Starting LEAP server

After I entered the following into cmd (I made sure I was in the folder where leapcast is, too ----> c:\leapcast-master> ):

leapcast --name VAIO --chrome "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" โ€“-fullscreen

I get the following display from the computer:

Traceback (most recent call last):
File "C:\Python27\Scripts\leapcast-script.py", line 9, in
load_entry_point('Leapcast==0.0.6', 'console_scripts', 'leapcast')()
File "build\bdist.win32\egg\pkg_resources.py", line 357, in load_entry_point
File "build\bdist.win32\egg\pkg_resources.py", line 2394, in load_entry_point
File "build\bdist.win32\egg\pkg_resources.py", line 2108, in load
File "C:\Python27\lib\site-packages\leapcast__main__.py", line 13, in
from leapcast.services.leap import LEAPserver
File "C:\Python27\lib\site-packages\leapcast\services\leap.py", line 8, in
import requests
ImportError: No module named requests

[END]

Will someone please tell me what I've done wrong? Do I need to change something out in step #16? What is the name-of-device mean exactly. Name of my PC? Or model name of my PC? Or do I need to remove (x86) from the path name? I have tried doing that, too, and still getting this traceback data.

Please help me, I thank you in advance.
Bari

cast-android-sample crashes when reopened

The cast android sample App (https://github.com/googlecast/cast-android-sample)
crashes when used with leapcast and reopened once it has been closed.
I'm not sure if this is a problem with leapcast or with the cast sdk as I have no real chromecast device yet.

It can be reproduced like this:

  • install sample app on android / register with leapcast
  • start leapcast
  • start sample app on android and cast something
  • use task-manager to close sample app on android
  • (re-)start sample app on android

The first time leapcast responds to /apps with status-code 200:

INFO:tornado.access:200

The second time with 302 (redirects to app):

INFO:tornado.access:302 GET /apps 

The following stacktrace is produced by the sample app on android:

30580-30608/com.example.castsample E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
    java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:299)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
    at java.util.concurrent.FutureTask.run(FutureTask.java:239)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
    at java.lang.Thread.run(Thread.java:841)
    Caused by: java.lang.IllegalStateException: Target host must not be null, or set in parameters. scheme=null, host=null, path=/apps/VGet
    at org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.java:591)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:293)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    at android.net.http.AndroidHttpClient.execute(AndroidHttpClient.java:257)
    at com.google.cast.k.a(SourceFile:166)
    at com.google.cast.k.performGet(SourceFile:83)
    at com.google.cast.NetworkRequest.performHttpGet(SourceFile:147)
    at com.google.cast.f.execute(SourceFile:175)
    at com.google.cast.NetworkTask.doInBackground(SourceFile:120)
    at com.google.cast.NetworkTask.doInBackground(SourceFile:20)
    at android.os.AsyncTask$2.call(AsyncTask.java:287)
    at java.util.concurrent.FutureTask.run(FutureTask.java:234)

The same problem can also be observed using Google Music on Android. It does not crash when opened the second time, but it refuses to show the cast button, even when leapcast is restarted. It only shows up again when the Music App is restarted.

Uninstalling

I see no way to uninstall the program, am I missing something, can I please get some direction?

Exception when starting a media item

I'm running leapcast under Win7 X64 and everything works fine (cast icon is shown in android/chrome) and I can select it as target. But when I play a video, I'm getting a "The system cannot find the file specified" exception.

I'm using the following command to start leapcast:

python app.py --name "MyCast" --chrome "C:\Users\DieBagger\AppData\Local\Google\Chrome\Application\chrome.exe"

Here's the full exception:

ERROR:tornado.application:Uncaught exception POST /apps/YouTube (192.168.1.105)
HTTPRequest(protocol='http', host='192.168.1.102:8008', method='POST', uri='/app
s/YouTube', version='HTTP/1.1', remote_ip='192.168.1.105', headers={'Origin': 'c
hrome-extension://boadgeojelhgndaghljhdicfkmllpafd', 'Content-Length': '66', 'Ac
cept-Language': 'de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4', 'Accept-Encoding': 'gzip,
deflate,sdch', 'Host': '192.168.1.102:8008', 'Accept': '/', 'User-Agent': 'Moz
illa/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/2
8.0.1500.72 Safari/537.36', 'Connection': 'keep-alive', 'Content-Type': 'applica
tion/x-www-form-urlencoded;charset=UTF-8'})
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\tornado\web.py", line 1115, in _stack_cont
ext_handle_exception
raise_exc_info((type, value, traceback))
File "C:\Python27\lib\site-packages\tornado\web.py", line 1298, in wrapper
result = method(self, _args, *_kwargs)
File "app.py", line 135, in post
status["pid"] = self.launch(self.request.body)
File "app.py", line 182, in launch
return subprocess.Popen(args)
File "C:\Python27\lib\subprocess.py", line 711, in init
errread, errwrite)
File "C:\Python27\lib\subprocess.py", line 948, in _execute_child
startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

Hardware acceleration with vdpau or vaapi

I have an old htpc with a very slow cpu, but an nvidia ion gpu that can play play full hd, bluray quality video. Video players that support vdpau or vaapi acceleration run very well on this thing. I tried out leapcast, the slow framerate makes me think it's not hardware accelerated. Is this true? If so, is it possible to add acceleration?

Mouse cursor remains on screen

When casting to Leapcast, the cursor remains on screen in front of the video.

Ideally it would be removed from the screen automatically.

Win7x64 Python2.7 Chrome 28

Changes in leapcast not affecting

Hello,
I made some changes in leapcast codes, in code, but when I try to executes the program (leapcast or main.py) it just executes the current code, and not the changed code.
Any reason for that? Anyway to make changes in my dir and executes it?

Chrome not fullscreen doesn't close on completion

On linux (mint14) and finding your code fun to play with. From youtube app on my android smartphone I get the chromecast button and it opens google-chrome. However there is a title bar at the top and the cinnamon panel at the bottom. If I press F11 it goes fullscreen, but won't come back.

Also when the video stops playing, chrome stays open with a screen inviting me to play another video. Can I close it some way?

Thanks.

unable to cast from chrome to leapcast

I am not able to cast from a tab of chrome to leapcast. I have tried running leapcast in root as well.
The error on chrome is :
"Unable to cast to HAD.
An unexpected error occurred. Please try the following:
Try to cast again
Verify your network connectivity"

And the output of leapcast is the following :
"$ leapcast --name HAD --chrome /usr/bin/google-chrome
INFO:tornado.access:204 GET /apps (10.0.7.211) 0.52ms
INFO:tornado.access:200 GET /apps/ChromeCast (10.0.7.211) 0.53ms
INFO:tornado.access:201 POST /apps/ChromeCast (10.0.7.211) 2.59ms
INFO:tornado.access:302 GET /apps (10.0.7.211) 0.35ms
INFO:tornado.access:200 GET /apps/ChromeCast (10.0.7.211) 0.66ms
INFO:tornado.access:200 POST /connection/ChromeCast (10.0.7.211) 0.49ms
INFO:root:ApplicationChannel opened /session/ChromeCast?0
INFO:root:Channel for app <leapcast.services.websocket.ServiceChannel object at 0x8aedccc> set
INFO:root:New CHANNELREQUEST for app ChromeCast
INFO:root:ReceiverChannel opened /receiver/ChromeCast
INFO:root:ApplicationChannel closed /session/ChromeCast?0
INFO:root:ReceiverChannel closed /receiver/ChromeCast"

I am running leapcast on ubuntu 13.04 .

Windows setup

I constantly receive this error when i try to initiate leapcast.

Any ideas where i'm going wrong

Windows 7, Python 2.7.5

untitled

404 error when attempting to connect

When I try to connect from the Chromecast app it fails and leapcast has this 404 errors:

WARNING:tornado.access:404 GET /setup/eureka_info?options=detail (192.168.0.9) 0.50ms
WARNING:tornado.access:404 GET /setup/eureka_info?options=detail,sign (192.168.0.9) 0.50ms
WARNING:tornado.access:404 GET /setup/eureka_info?options=detail,sign (192.168.0.9) 0.49ms
WARNING:tornado.access:404 GET /setup/eureka_info?options=detail,sign (192.168.0.9) 0.48ms

I grepped the source and there seems to be a eureka URL but not eureka_info so I guess Google must have changed the API.

Syntax Error With Running Leapcast

Let me preface this by saying that, in general, I don't know what the hell I'm doing... I wrestled with python on Windows 7 to get it to do what I want, and after lots of googling and trial-and-error, I think I got leapcast installed correctly.

So anyway, I go to my windows command prompt, type in:

python

import leapcast

leapcast --name Chromecast --chrome "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"

But I get a syntax error. The final step looks like this:

leapcast --name Chromecast --chrome "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
  File "<stdin>", line 1
    leapcast --name Chromecast --chrome "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
                             ^
SyntaxError: invalid syntax

And if I enter just "leapcast," I get this:

leapcast
<module 'leapcast' from 'c:\users\matthew\documents\github\leapcast\leapcast\__init__.pyc'>

So maybe someone knows what's up, but I get the feeling it's user error. =/

Crash after standby

Hi,

after returning from standby on windows 7 the program stops working. Logging says "WARNING:root:App already closed in destroy()" from def stop_app(self): at leap_factory.py line 169

No idea yet why this happens...

best regards
Bio

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.