Git Product home page Git Product logo

vincelwt / raspberrycast Goto Github PK

View Code? Open in Web Editor NEW
864.0 864.0 141.0 9.38 MB

:tv: Transform your Raspberry Pi into a streaming device. Videos can be sent from mobile devices or computers (Chrome extension).

License: MIT License

JavaScript 36.24% HTML 10.61% Python 34.40% CSS 2.79% Smarty 9.35% Shell 6.61%
android cast-videos chrome-extension firefox-extension raspberry-pi video vimeo youtube

raspberrycast's Introduction

RaspberryCast 3.0

Transform your Raspberry Pi into a streaming device. Cast videos from mobile devices or computers to your TV.

Android app on Google Play Extension for Chrome Extension for Firefox

Supported services

Works with all youtube-dl supported websites: http://rg3.github.io/youtube-dl/supportedsites.html (YouTube, SoundCloud, Dailymotion, Vimeo, etc...) and also any direct link to mp3, mp4, avi and mkv file.

You can also cast playlists from Youtube or Soundcloud.

How to install (Raspberry Pi side)

wget https://raw.githubusercontent.com/vincelwt/RaspberryCast/master/setup.sh && sudo sh setup.sh

That's it.

The installation script will:

  • Download RaspberryCast and install the necessary dependencies
  • Autostart RaspberryCast at boot (added to /etc/rc.local)
  • Reboot

You can review the install script.

Remote control (mobile devices)

The remote on Android

On any device connected to the same network as you Pi, you can visit the page:

http://raspberrypi.local:2020/remote

Note that you can "Add to homescreen" this link

You can also use the Android application (link to Playstore at the top of the page)

Chrome & Firefox extension

Extension options

alt tag

Right-click options

alt tag

You can configure RaspberryCast settings in the extension option page.

Cast videos from computer

Works on Linux, Mac OS, and Windows (Python needed)

Download

wget https://raw.githubusercontent.com/vincelwt/RaspberryCast/master/rcast.py

Usage

python rcast.py video.mkv <subtitle.srt>

Subtitles can be given as an optional second argument. If no subtitle argument is found, RaspberryCast will attempt to find a subtitle file with the same name as the video. In the case of TV shows and movies, RaspberryCast will attempt to match the video with an appropriate subtitle file. This behaviour can be disabled in the configuration file.

Demos

Demo video with the Chrome extension:

Video 1

Demo video with an Android (also works on iOS):

Video 2

Uninstall

Remove reference to RaspberryCast.sh in /etc/rc.local

Delete the /home/pi/RaspberryCast/ folder.

Contribute

If you enjoyed using RaspberryCast, and/or would like to support the development, please consider making a donation.

Donate

License

Code released under the MIT license.

You are welcome to contribute to the project.

raspberrycast's People

Contributors

adityang avatar ahmad-masood avatar butchhoward avatar fasthall avatar jarondl avatar javidbu avatar johny-c avatar loiclw avatar mheine avatar vincelwt avatar

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

raspberrycast's Issues

Google Home

does this project work with google home?
As in the google home will think this RaspberryCast is a chromecast compatible service and be able to stream video/audio to it through the google home device?

Stop working suddenly.

After cast a video, it works at first. But after a while, the video disappear ( black screen, not return to desktop ). And I have test several video from YouTube , but got same result.

OS: RASPBIAN JESSIE ( latest )
Model: Raspberry pi 3

Play music files in background

Hi
Is there any way with which music from Soundcloud or Spotify can be played in background.
Also can we display the title of the current file.

Open and run in background

Would be lovely to have the option to have it run in the background. The "cast is ready" screen is constantly on top of all other windows, which makes it hard to see the dashboard I've setup for home automation..

low resolution youtube video

i have a 44'' tv and the yt videos are playing like in 360p even if i changed the config of the low connection to off

Youtube Cast didn't work for me

i installed RasberryCast for RasperryPi2 and cast feature didn't work either from web or mobile remote interface.
and i get these logs :

08-15 16:44:00 - DEBUG - Received URL to cast: https://www.youtube.com/watch?v=IIJ30SVJwuQ 08-15 16:44:00 - DEBUG - No subtitles for this stream 08-15 16:44:00 - INFO - Extracting source video URL... 08-15 16:44:00 - DEBUG - Parsing source url for https://www.youtube.com/watch?v=IIJ30SVJwuQ with subs :False 08-15 16:44:00 - ERROR - ERROR: no suitable InfoExtractor for URL https://www.youtube.com/watch?v=IIJ30SVJwuQ 08-15 16:44:00 - ERROR - Result is none, returning none. Cancelling following function. 08-15 16:44:00 - DEBUG - Full video URL fetched. 08-15 16:44:00 - INFO - Starting OMXPlayer now. 08-15 16:44:00 - INFO - Playlist empty, skipping.

General questions and suggestions

Hello @vincelwt ,

I'm very interested in using and contributing to this project. However, I think the way the server scripts are organized could use some improvements. I think this project could really shine if you'd organize it differently, here are a few suggestions:

  • Why use a shell wrapper for the server.py? You can processes command line arguments inside python and I believe you can fork processes and make the same script fork it self and kill it self according to CLI arguments.
  • The installation script is probably very NOOB friendly but it's not very distribution / system administrator friendly IMO. I use Arch Linux on my Raspberry Pi and I can't use this script because we don't use /etc/rc.local. We use strictly systemd services. I understand that setup.sh creates a user that the server.py will run under his privileges but IMHO it's not truly necessary. I think this should stay in the documentation only as a recommendation.
  • In addition, as for using /etc/rc.local and especially putting stuff like this in setup.sh, it doesn't make it easy to uninstall RaspberryCast. With a systemd based configuration it will be much easier.
  • If we'll get rid of the shell script wrapper and distribute only a python script that will manage it self, you can distribute a pip package that will have youtube-dl bottle and livestreamer in it's requirements.txt so they will be installed automatically.
  • As for the rest of the dependencies (lsof, python-pip, git, wget, omxplayer, libnss-mdns and fbi) it could be even better to distribute a package that could be installed through https://launchpad.net/ (I can write a PKGBUILD for Arch Linux).

I'll be glad to know your thoughts :)

Local video files on MacOSX?

Hi,

I noticed you had support for local files on Linux. Any idea if its possible to do the same on MacOSX, either as a automater app, through terminal or in browser drag and drop?

Would love to be able to send files from my desktop and play them on the raspberry pi.

Thanks

Chopping sound

Perhaps, I don't understand something. However, via both Android app and Chrome extention I got very slow chopping sound.

Well, I'm trying to cast music only, can it be a reason?

Raspi 2, Latest Raspbian Stretch, casting from Ubuntu 16.04.

Suggestion: cast a playlist

This is not an issue per se, but I was wondering if it might be possible to cast a youtube playlist. Thoughts?

Seeking while casting video from ubuntu using rcast.py results in broken pipe

I am casting a video from my laptop running Ubuntu using rcast.py and it works as expected. From the remote control panel I can use the play/pause, stop, volume buttons correctly. However seeking (either +-30s or +-10 mins) fails with a broken pipe. I am attaching the traceback

Exception happened during processing of request from ('192.168.1.10', 32828)
Traceback (most recent call last):
  File "/home/jishnu/anaconda3/lib/python3.6/socketserver.py", line 317, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/home/jishnu/anaconda3/lib/python3.6/socketserver.py", line 348, in process_request
    self.finish_request(request, client_address)
  File "/home/jishnu/anaconda3/lib/python3.6/socketserver.py", line 361, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/home/jishnu/anaconda3/lib/python3.6/socketserver.py", line 696, in __init__
    self.handle()
  File "/home/jishnu/anaconda3/lib/python3.6/http/server.py", line 418, in handle
    self.handle_one_request()
  File "/home/jishnu/anaconda3/lib/python3.6/http/server.py", line 406, in handle_one_request
    method()
  File "/home/jishnu/anaconda3/lib/python3.6/http/server.py", line 639, in do_GET
    self.copyfile(f, self.wfile)
  File "/home/jishnu/anaconda3/lib/python3.6/http/server.py", line 800, in copyfile
    shutil.copyfileobj(source, outputfile)
  File "/home/jishnu/anaconda3/lib/python3.6/shutil.py", line 82, in copyfileobj
    fdst.write(buf)
  File "/home/jishnu/anaconda3/lib/python3.6/socketserver.py", line 775, in write
    self._sock.sendall(b)
BrokenPipeError: [Errno 32] Broken pipe
----------------------------------------

Seeking fails using both the android app and the remote website http://raspberrypi.local:2020/remote.

I get SyntaxError: invalid syntax when I try to run Raspicast (the server.py script) on Arch Linux ARM

I've been trying to install RaspberryCast on Arch Linux ARM manually. After following the install script and tracking down dependencies needed for RaspberryCast on Arch ARM and after cloning the git(hub) repo, when I try to start RaspberryCast I get the following error:

[alarm@alarmpi RaspberryCast]$ ./RaspberryCast.sh start
Checking for updates.
Already up to date.
Starting RaspberryCast server.
Done.
[alarm@alarmpi RaspberryCast]$ File "./server.py", line 109
except Exception, e:
^
SyntaxError: invalid syntax

Any insight into the error would be much appreciated. Could it be due to the version of python3 being too new or missing some module? I don't know really.
Thank you for your help

windows cast

if i wanted to create a app to connect to the pi from my desktop what do you suggest and what protocol do i need to send it to your app?

this looks great thanks!

All is I see is a RaspberryCast splash screen

Installed on a Pi 3, I can access the Remote via http or the Android app. I'm also able to add videos to the queue via the Chrome extension but all I see on the Pi screen is a screen that says RaspberryCast is ready.

Any suggestions?

Thanks, I really want this to work!

Assumes user PI on installation?

Why would a script automatically specify the user "pi"? I don't have a user "Pi" on my raspbian installation and can't install because this assumes the user pi. there are simple ways to fix this. For example use
echo "FOO"
Read user
cd $user

Errno 98 Fix?

Every time I activate the Pi, it pops up with the 'Ready To Cast' image and then returns some text, ending with:

socket.error: [Errno 98] Address already in use

I have little programming knowledge, but would it be possible to put a 'Try' in and then use another Port if it doesn't work?

Can't install RaspberryCast

I has been followed guide to install RaspberryCast 3.0, running this command:

wget https://raw.githubusercontent.com/vincelwt/RaspberryCast/master/setup.sh && sudo sh setup.sh

in the terminal, but always fail. I wonder, this script depend on OS, cause i'm using Raspbian.

Cannot configure Firefox extension

I can't change the Firefox extension like I can on Chrome at all. This is mainly a problem because I have two Pis and my Pi with RaspberryCast on is called something other than RASPBERRYPI. This wasn't a problem on Chrome, but it seems to be on Firefox.

can't cast on android

RaspberryCast work fine on my laptop with Chrome extensions
Send to Rpi,pause,stop all work
but on android,only control function works,like play,pause,but can't cast video

I have two android phone,one is 4.4.4,another is 4.1,same result

Installing error

Hello,

if I try to install the RaspberryCast after the reboot nothing happend. The log before the reebot:

`pi@raspberrypi:~ $ wget https://raw.githubusercontent.com/vincelwt/RaspberryCast/master/setup.sh && sudo sh setup.sh
converted 'https://raw.githubusercontent.com/vincelwt/RaspberryCast/master/setup.sh' (ANSI_X3.4-1968) -> 'https://raw.githubusercontent.com/vincelwt/RaspberryCast/master/setup.sh' (UTF-8)
--2016-06-11 11:58:29-- https://raw.githubusercontent.com/vincelwt/RaspberryCast/master/setup.sh
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.31.17.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.31.17.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2308 (2.3K) [text/plain]
Saving to: 'setup.sh'

setup.sh 100%[=====================>] 2.25K --.-KB/s in 0.001s

2016-06-11 11:58:30 (2.42 MB/s) - 'setup.sh' saved [2308/2308]

This script will install RaspberryCast
Do you wish to continue? (y/n)
y

Installing necessary dependencies... (This could take a while)

Reading package lists... Done
Building dependency tree
Reading state information... Done
libnss-mdns is already the newest version.
libnss-mdns set to manually installed.
wget is already the newest version.
The following extra packages will be installed:
fontconfig-config fonts-dejavu-core fonts-droid fonts-freefont-ttf
ghostscript git-man gsfonts libavahi-client3 libcups2 libcupsfilters1
libcupsimage2 libcurl3-gnutls liberror-perl libexif12 libfontconfig1 libgif4
libgs9 libgs9-common libijs-0.35 libjasper1 libjbig0 libjbig2dec0 liblcms2-2
libldb1 libntdb1 libpaper-utils libpaper1 libperl4-corelibs-perl
libsmbclient libssh-4 libtdb1 libtevent0 libtiff5 poppler-data
python-chardet python-colorama python-distlib python-html5lib
python-ndg-httpsclient python-openssl python-pkg-resources python-pyasn1
python-requests python-setuptools python-six python-talloc python-urllib3
python-wheel rsync samba-libs
Suggested packages:
imagemagick ghostscript-x gettext-base git-daemon-run git-daemon-sysvinit
git-doc git-el git-email git-gui gitk gitweb git-arch git-cvs git-mediawiki
git-svn cups-common libjasper-runtime liblcms2-utils x11-xserver-utils
poppler-utils fonts-japanese-mincho fonts-ipafont-mincho
fonts-japanese-gothic fonts-ipafont-gothic fonts-arphic-ukai
fonts-arphic-uming fonts-nanum python-genshi python-lxml python-openssl-doc
python-openssl-dbg python-distribute python-distribute-doc doc-base
Recommended packages:
python-dev-all
The following NEW packages will be installed:
fbi fontconfig-config fonts-dejavu-core fonts-droid fonts-freefont-ttf
ghostscript git git-man gsfonts libavahi-client3 libcups2 libcupsfilters1
libcupsimage2 libcurl3-gnutls liberror-perl libexif12 libfontconfig1 libgif4
libgs9 libgs9-common libijs-0.35 libjasper1 libjbig0 libjbig2dec0 liblcms2-2
libldb1 libntdb1 libpaper-utils libpaper1 libperl4-corelibs-perl
libsmbclient libssh-4 libtdb1 libtevent0 libtiff5 lsof omxplayer
poppler-data python-chardet python-colorama python-distlib python-html5lib
python-ndg-httpsclient python-openssl python-pip python-pkg-resources
python-pyasn1 python-requests python-setuptools python-six python-talloc
python-urllib3 python-wheel rsync samba-libs
0 upgraded, 55 newly installed, 0 to remove and 0 not upgraded.
Need to get 4379 kB/34.5 MB of archives.
After this operation, 123 MB of additional disk space will be used.
Err http://mirrordirector.raspbian.org/raspbian/ jessie/main samba-libs armhf 2:4.2.10+dfsg-0+deb8u2
404 Not Found [IP: 2001:41c9:1:3ce::11 80]
Err http://mirrordirector.raspbian.org/raspbian/ jessie/main libsmbclient armhf 2:4.2.10+dfsg-0+deb8u2
404 Not Found [IP: 2001:41c9:1:3ce::11 80]
E: Failed to fetch http://mirrordirector.raspbian.org/raspbian/pool/main/s/samba/samba-libs_4.2.10+dfsg-0+deb8u2_armhf.deb 404 Not Found [IP: 2001:41c9:1:3ce::11 80]

E: Failed to fetch http://mirrordirector.raspbian.org/raspbian/pool/main/s/samba/libsmbclient_4.2.10+dfsg-0+deb8u2_armhf.deb 404 Not Found [IP: 2001:41c9:1:3ce::11 80]

E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

setup.sh: 37: setup.sh: pip: not found

Cloning project from GitHub..

-su: git: command not found
chmod: cannot access './RaspberryCast/RaspberryCast.sh': No such file or directory

Adding project to startup sequence and custom options

Setup was successful.
Do not delete the 'RaspberryCast' folder as it contains all application data!

Rebooting system now...

Broadcast message from pi@raspberrypi on pts/0 (Sat 2016-06-11 11:58:48 CEST):

The system is going down for reboot NOW!`

Yes, thats it. I hope you can help me.

Eric :)

youtube-dl error

How can I solve that problem?

Traceback (most recent call last):
File "./server.py", line 25, in
from process import *
File "/home/pi/RaspberryCast/process.py", line 1, in
import youtube_dl, os, threading, logging, json
ImportError: No module named youtube_dl
^C

Cannot exit from splash screen

Hi,

After the boot process I see briefly my Raspbian Desktop and then I get the splash screen "RaspberryCast is ready". In this state I can cast videos and they work great, but after a video is finished it gets back to the "RaspberryCast is ready" screen. I would like to go back to my Raspbian Desktop instead.

Is there any way to start RaspberryCast server in the background so it still listens to cast requests but I can meanwhile use my Raspbian Desktop?

Thanks!

setup.sh raises an exception

Exception:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 215, in main
status = self.run(options, args)
File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 353, in run
wb.build(autobuilding=True)
File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 749, in build
self.requirement_set.prepare_files(self.finder)
File "/usr/lib/python2.7/dist-packages/pip/req/req_set.py", line 380, in prepa re_files
ignore_dependencies=self.ignore_dependencies))
File "/usr/lib/python2.7/dist-packages/pip/req/req_set.py", line 554, in _prep are_file
require_hashes
File "/usr/lib/python2.7/dist-packages/pip/req/req_install.py", line 278, in p opulate_link
self.link = finder.find_requirement(self, upgrade)
File "/usr/lib/python2.7/dist-packages/pip/index.py", line 465, in find_requir ement
all_candidates = self.find_all_candidates(req.name)
File "/usr/lib/python2.7/dist-packages/pip/index.py", line 423, in find_all_ca ndidates
for page in self._get_pages(url_locations, project_name):
File "/usr/lib/python2.7/dist-packages/pip/index.py", line 568, in _get_pages
page = self._get_page(location)
File "/usr/lib/python2.7/dist-packages/pip/index.py", line 683, in _get_page
return HTMLPage.get_page(link, session=self.session)
File "/usr/lib/python2.7/dist-packages/pip/index.py", line 792, in get_page
"Cache-Control": "max-age=600",
File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/s essions.py", line 501, in get
return self.request('GET', url, **kwargs)
File "/usr/lib/python2.7/dist-packages/pip/download.py", line 386, in request
return super(PipSession, self).request(method, url, *args, **kwargs)
File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/s essions.py", line 488, in request
resp = self.send(prep, **send_kwargs)
File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/s essions.py", line 609, in send
r = adapter.send(request, **kwargs)
File "/usr/share/python-wheels/CacheControl-0.11.7-py2.py3-none-any.whl/cachec ontrol/adapter.py", line 47, in send
resp = super(CacheControlAdapter, self).send(request, **kw)
File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/a dapters.py", line 423, in send
timeout=timeout
File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/con nectionpool.py", line 643, in urlopen
_stacktrace=sys.exc_info()[2])
File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/uti l/retry.py", line 315, in increment
total -= 1
TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'

Playing music on two devices

I was wondering if you could implement a feature that starts the video on your pc to the same time as it starts on the Raspberry, i think that would be handy when listening to music, thanks alot, love the project! ;)

Unable to play any kind of content

Hello everyone,

I've come across a weird issue, when I submit a YouTube URL or any kind of URL as a matter of fact, the splash screen changes from "is ready" to "processing".

However, it never plays a clip, just goes back to "is ready". Here's the log...

07-28 13:48:11 - DEBUG - Received URL to cast: https://www.youtube.com/watch?v=TUC2b-OSZ00
07-28 13:48:11 - DEBUG - No subtitles for this stream
07-28 13:48:11 - INFO - Extracting source video URL...
07-28 13:48:11 - DEBUG - Parsing source url for https://www.youtube.com/watch?v=TUC2b-OSZ00 with subs :False
07-28 13:48:11 - WARNING - Assuming --restrict-filenames since file system encoding cannot encode all characters. Set the LC_ALL environment variable to fix this.
07-28 13:48:12 - DEBUG - [youtube:playlist] playlist Serviio: Downloading 107 videos
07-28 13:48:12 - DEBUG - [download] Downloading video 1 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 2 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 3 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 4 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 5 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 6 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 7 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 8 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 9 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 10 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 11 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 12 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 13 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 14 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 15 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 16 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 17 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 18 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 19 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 20 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 21 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 22 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 23 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 24 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 25 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 26 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 27 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 28 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 29 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 30 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 31 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 32 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 33 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 34 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 35 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 36 of 107
07-28 13:48:12 - DEBUG - [download] Downloading video 37 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 38 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 39 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 40 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 41 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 42 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 43 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 44 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 45 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 46 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 47 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 48 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 49 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 50 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 51 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 52 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 53 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 54 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 55 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 56 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 57 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 58 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 59 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 60 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 61 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 62 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 63 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 64 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 65 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 66 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 67 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 68 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 69 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 70 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 71 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 72 of 107
07-28 13:48:13 - DEBUG - [youtube] TUC2b-OSZ00: Downloading webpage
07-28 13:48:13 - DEBUG - [download] Downloading video 73 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 74 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 75 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 76 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 77 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 78 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 79 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 80 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 81 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 82 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 83 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 84 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 85 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 86 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 87 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 88 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 89 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 90 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 91 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 92 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 93 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 94 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 95 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 96 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 97 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 98 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 99 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 100 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 101 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 102 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 103 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 104 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 105 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 106 of 107
07-28 13:48:13 - DEBUG - [download] Downloading video 107 of 107
07-28 13:48:13 - DEBUG - [download] Finished downloading playlist: Serviio
07-28 13:48:13 - INFO - queuing video
07-28 13:48:13 - INFO - queuing video
07-28 13:48:13 - INFO - Extracting source video URL, before adding to queue...
07-28 13:48:13 - DEBUG - Parsing source url for 1IdEhvuNxV8 with subs :False
07-28 13:48:13 - WARNING - Assuming --restrict-filenames since file system encoding cannot encode all characters. Set the LC_ALL environment variable to fix this.
07-28 13:48:13 - DEBUG - [youtube] 1IdEhvuNxV8: Downloading webpage
07-28 13:48:19 - DEBUG - [youtube] TUC2b-OSZ00: Downloading video info webpage
07-28 13:48:19 - DEBUG - [youtube] 1IdEhvuNxV8: Downloading video info webpage
07-28 13:48:24 - DEBUG - [youtube] TUC2b-OSZ00: Extracting video information
07-28 13:48:25 - DEBUG - [youtube] 1IdEhvuNxV8: Extracting video information
07-28 13:48:27 - DEBUG - [youtube] TUC2b-OSZ00: Downloading js player vflrwQIQw
07-28 13:48:27 - DEBUG - [youtube] 1IdEhvuNxV8: Downloading MPD manifest
07-28 13:48:34 - DEBUG - Video not from Youtube or Vimeo. Extracting url in maximal quality.
07-28 13:48:35 - DEBUG - [youtube] TUC2b-OSZ00: Downloading MPD manifest
07-28 13:48:40 - WARNING - "id" field is not a string - forcing string conversion, there is an error in extractor
07-28 13:48:40 - DEBUG - Youtube link detected, extracting url in 360p
07-28 13:48:40 - DEBUG - Full video URL fetched.
07-28 13:48:40 - INFO - Starting OMXPlayer now.
07-28 13:48:41 - INFO - Playlist empty, skipping.
07-28 13:48:49 - DEBUG - Received URL to cast: https://www.youtube.com/watch?v=TUC2b-OSZ00
07-28 13:48:49 - DEBUG - No subtitles for this stream
07-28 13:48:49 - INFO - Extracting source video URL...
07-28 13:48:49 - DEBUG - Parsing source url for https://www.youtube.com/watch?v=TUC2b-OSZ00 with subs :False
07-28 13:48:49 - WARNING - Assuming --restrict-filenames since file system encoding cannot encode all characters. Set the LC_ALL environment variable to fix this.
07-28 13:48:50 - DEBUG - [youtube] TUC2b-OSZ00: Downloading webpage
07-28 13:48:56 - DEBUG - [youtube] TUC2b-OSZ00: Downloading video info webpage
07-28 13:49:01 - DEBUG - [youtube] TUC2b-OSZ00: Extracting video information
07-28 13:49:03 - DEBUG - [youtube] TUC2b-OSZ00: Downloading MPD manifest
07-28 13:49:09 - WARNING - "id" field is not a string - forcing string conversion, there is an error in extractor
07-28 13:49:09 - DEBUG - Youtube link detected, extracting url in 360p
07-28 13:49:09 - DEBUG - Full video URL fetched.
07-28 13:49:09 - INFO - Starting OMXPlayer now.
07-28 13:49:09 - INFO - Playlist empty, skipping.
07-28 13:51:47 - DEBUG - Received URL to cast: https://www.youtube.com/watch?v=TUC2b-OSZ00
07-28 13:51:47 - DEBUG - No subtitles for this stream
07-28 13:51:47 - INFO - Extracting source video URL...
07-28 13:51:47 - DEBUG - Parsing source url for https://www.youtube.com/watch?v=TUC2b-OSZ00 with subs :False
07-28 13:51:47 - WARNING - Assuming --restrict-filenames since file system encoding cannot encode all characters. Set the LC_ALL environment variable to fix this.
07-28 13:51:48 - DEBUG - [youtube] TUC2b-OSZ00: Downloading webpage
07-28 13:51:55 - DEBUG - [youtube] TUC2b-OSZ00: Downloading video info webpage
07-28 13:52:01 - DEBUG - [youtube] TUC2b-OSZ00: Extracting video information
07-28 13:52:01 - DEBUG - [youtube] TUC2b-OSZ00: Downloading MPD manifest
07-28 13:52:07 - WARNING - "id" field is not a string - forcing string conversion, there is an error in extractor
07-28 13:52:08 - DEBUG - Youtube link detected, extracting url in 360p
07-28 13:52:08 - DEBUG - Full video URL fetched.
07-28 13:52:08 - INFO - Starting OMXPlayer now.
07-28 13:52:08 - INFO - Playlist empty, skipping.
07-28 13:53:09 - DEBUG - Received URL to cast: http://techslides.com/demos/sample-videos/small.webm
07-28 13:53:09 - DEBUG - No subtitles for this stream
07-28 13:53:09 - INFO - Extracting source video URL...
07-28 13:53:09 - DEBUG - Parsing source url for http://techslides.com/demos/sample-videos/small.webm with subs :False
07-28 13:53:09 - WARNING - Assuming --restrict-filenames since file system encoding cannot encode all characters. Set the LC_ALL environment variable to fix this.
07-28 13:53:15 - DEBUG - [generic] small: Requesting header
07-28 13:53:22 - WARNING - "url" field is missing or empty - skipping format, there is an error in extractor
07-28 13:53:22 - ERROR - ERROR: list index out of range
07-28 13:53:22 - ERROR - Result is none, returning none. Cancelling following function.
07-28 13:53:22 - DEBUG - Full video URL fetched.
07-28 13:53:22 - INFO - Starting OMXPlayer now.
07-28 13:53:22 - INFO - Playlist empty, skipping.
07-28 14:01:03 - DEBUG - Received URL to cast: http://techslides.com/demos/sample-videos/small.mp4
07-28 14:01:03 - DEBUG - No subtitles for this stream
07-28 14:01:03 - INFO - Extracting source video URL...
07-28 14:01:03 - DEBUG - Parsing source url for http://techslides.com/demos/sample-videos/small.mp4 with subs :False
07-28 14:01:03 - DEBUG - Direct video URL, no need to use youtube-dl.
07-28 14:01:03 - DEBUG - Full video URL fetched.
07-28 14:01:03 - INFO - Starting OMXPlayer now.
07-28 14:01:04 - INFO - Playlist empty, skipping.

Not sure what's happening, this is on a Raspberry Pi 1 and I have it connected to an HDMI Monitor.

Any help would be greatly appreciated.

Bug - Remote does not control between devices

Hey
On a Raspbian Jessie Lite

  1. When I tested the web control on an ipad and android device, playing from one and stopping from another does not work.
  2. What is the shutdown for? The cast or the Pi? I tried entering 1 min and after that I suppose it just went blank. Is that the correct behaviour? I cant get it back to the command line after that.
  3. Is there a way to display a custom html page to the HDMI instead of the images using node and webkit? That would allow to show more settings and controls and possibly serve as a mini media center.

[enhancement] Add streamlink as a alternative to youtube-dl

streamlink is similar to youtube-dl in many different ways.

Although the video sources they supported are mostly the same, there are still some plugins available in streamlink that is missing in youtube-dl (live stream from douyu.com or 1080p from youtube for example). Also it's always a good thing to add a duplicate extractor in case youtube-dl is broken in any way.

On Raspberry Pi, I can simply pipe streamlink and omxplayer to make it work
# streamlink -p "omxplayer --timeout 20" https://www.youtube.com/watch?v=QMDf5MSE0LQ best

[console][info] Found matching plugin youtube for URL https://www.youtube.com/watch?v=QMDf5MSE0LQ
[console][info] Available streams: audio_mp4, audio_webm, 144p (worst), 180p, 360p, 720p, 1080p (best)
[console][info] Opening stream: 1080p (muxed-stream)
[console][info] Creating pipe streamlinkpipe-23988
[console][info] Starting player: omxplayer --timeout 20
....(omxplayer plays it as expected)

Interested in exploring how to add streamlink as a secondary extractor as well as a general framework to integrate other extractors in the future.

Hints and guidelines are always appreciated.

Exit After Playback

I guess this may be more considered a feature request, but I would like RaspberryCast to "exit" after playback finishes.
To give my own usecase as an example: I have a setup where most of the time my Pi is displaying "digital signage", which is essentially just Chromium running in fullscreen kiosk mode. If I trigger omxplayer from command line, the video plays fullscreen, and when it is done the player closes, and my pi returns to displaying my digital sign.
Currently, when I use RaspberryCast to send a video to my Pi, it correctly plays fullscreen in front of Chromium, but when it finishes, instead of closing out so that the digital sign is displayed again, it displays the RaspberryCast ready screen.

RetroPie/EmulationStation handoff after RaspberryCast done streaming

Great project! thanks for sharing it!...

Any tips for allowing emulationstation to take control of the system over after RaspberryCast has stopped streaming? I'm using RetroPie and RaspberryCast together and everything works pretty well except RaspberryCast doesn't give control of the screen back to emulationstation so a reboot is needed in order to start playing games again. emulationstation does this hand off back and forth between retroarch and itself all the time so there should be an easy way to accomplish this.

thanks again!

Jitter in audio

While playing some videos i experience some jitter in Audio. Does any one else is facing this issue?

Startup Temporary Bricks pi 3

At first, I had to chmod 777 everything in the folder to allow Raspberry Cast to have permission to read it however, when I did that Update still fails with "Permission Denied" and I get a slash screen and It completely bricks my pi until reboot. When I try to access the log file, there is nothing in it.

Casting webpages

Can I alter something a little to open a web browser on Pi and display a webpage, as opposed to just a YouTube video? Also, is there a way to disable the splash screen?

Stuck on "RaspberryCast is ready" screen; unsupported URL in log

I'm trying to stream a webpage with the RaspberryCast Chrome extension, and I get the notifications saying it is processing, and that it should appear in a few seconds on the screen, but all that happens is I get the 'RaspberryCast is ready' screen and it doesn't change.

Looking at the log, I get:

(05-29 17:16:59 - INFO - Server successfully started!
05-29 17:18:10 - DEBUG - Running state as been asked : 0
05-29 17:18:12 - DEBUG - Received URL to cast: https://github.com/lanceseidman/PiCAST
05-29 17:18:12 - DEBUG - No subtitles for this stream
05-29 17:18:12 - INFO - Extracting source video URL...
05-29 17:18:12 - DEBUG - Parsing source url for https://github.com/lanceseidman/PiCAST with subs :False
05-29 17:18:28 - DEBUG - [generic] PiCAST: Requesting header
05-29 17:18:29 - WARNING - Falling back on generic information extractor.
05-29 17:18:29 - DEBUG - [generic] PiCAST: Downloading webpage
05-29 17:18:30 - DEBUG - [generic] PiCAST: Extracting information
05-29 17:18:33 - ERROR - ^[[0;31mERROR:^[[0m Unsupported URL: https://github.com/lanceseidman/PiCAST
05-29 17:18:33 - ERROR - Result is none, returning none. Cancelling following function.
05-29 17:18:33 - DEBUG - Full video URL fetched.
05-29 17:18:33 - INFO - Starting OMXPlayer now.
05-29 17:18:33 - INFO - Playlist empty, skipping.)

Why is it unsupported? The same happens for any other URL I try... Are there any specific URLs that are supported?

I'd be happy to provide more logs or anything to help fix this! :)

for android

hi , thank you for your work , it's possible to make android apk ?
because my RPI is with android
thank you

[question] how can I view the videos in the playlist?

Hi,

First of all, thanks for this project, is it great!

I added some videos from youtube to the playlist, it works, but is it possible to view the videos that are currently in the play list? Also, if is it possible to manipulate the playlist (delete some videos, clean the list)

Thanks

android apk

hi

is it possible to get the source code of the apk ?

cdt
patrick

RaspberryCast block window manager

Dear all,

Since yesterday (but I restart my PI at this time), I have a bug with RapsberryCast and vnc.

Config:

  • PI 3 / Raspbian 9.3
  • Kodi 17.6
  • LXDE
  • RaspberryCast

When PI start, automatically, it launchesRaspberryCast (I tried with rc.local and cron), them kodi (through autostart in lxsession).
On the main screen, Kodi is working fine
On VNC: blackscreen

After testing all options, if I disable RaspberryCast, I'm able to access the PI through VNC.

I tested also another option: disabled kodi and let RaspberryCast only.
I see the splashscreen on my main screen, but no possibility to access vnc. If vnc start quickly, I see the screen, but all my inputs are disabled (no possibility to launch something through the vnc gui). With a keyboard directly attached to the PI3, I found the problem: if I click 2 or 3 times on the enter button, the splash screen disappear and VNC is working well.

So I disabled the RaspberryCast autostart.
Everything is working well until I launch manually the RaspberryCast.

As soon as I launch the command, I lose the "VNC input" (meaning no more keyboard or mouse interaction). I'm able to retreive them by using the attached keyboard on PI (and if kodi is launched, I have first to stop kodi, them click 2 or 3 times on enter to disable the RaspberryCast splash screen.

So what is the problem?
How can I solve that?

Thanks for your feedback

RaspberryCast not working

Hi!

I have installed RaspberryCast as it is stated in the guide and I am trying to make it run in the raspberry. I cannot make it to appear the splash image or anything. I have tried to run the RaspberryCast.sh file and it gives me the following error.

RaspberryCast.sh: 3: [: =: unexpected operator
RaspberryCast.sh: 17: [: =: unexpected operator
Error, wrong argument. Try with 'stop', 'start'.

I am not sure if I'm doing the correct thing or there is something that I am missing...

hi,can I cast video on ftp server?

it works great,thx ur job,I can wireless cast some online video to TV,it's great
but I have some questions
I have some video files(in MP4 format) on my ftp server
and wanna use the RaspberryCast cast on TV
the Chrome extensions pop up says: success
but the screen,which is connect with RPI was no response

Unable to play video from Bilibili.com

RaspberryCast version: c2873f7
youtube-dl version: 2018.06.18

I am able to download video via youtube-dl from bilibili,
example:

# youtube-dl "https://www.bilibili.com/video/av12168252"
[BiliBili] 12168252: Downloading webpage
[BiliBili] 12168252: Downloading video info page
[download] Downloading playlist: 【纪录片/空难】空中浩劫(共116集/中文字幕)
[BiliBili] playlist 【纪录片/空难】空中浩劫(共116集/中文字幕): Collected 11 video ids (downloading 11 of them)
[download] Downloading video 1 of 11
[download] Destination: 【纪录片_空难】空中浩劫(共116集_中文字幕)-12168252_part1.flv
[download] 17.8% of 22.46MiB at 2.63MiB/s ETA 00:07

However I am unable to play the same link in raspberryCast.
Logs:

06-19 21:21:28 - DEBUG - Received URL to cast: https://www.bilibili.com/video/av12168252
06-19 21:21:28 - DEBUG - Received URL to cast: https://www.bilibili.com/video/av12168252
06-19 21:21:28 - DEBUG - No subtitles for this stream
06-19 21:21:28 - INFO - Extracting source video URL...
06-19 21:21:28 - DEBUG - Parsing source url for https://www.bilibili.com/video/av12168252 with subs :False
06-19 21:21:28 - DEBUG - [BiliBili] 12168252: Downloading webpage
06-19 21:21:29 - DEBUG - [BiliBili] 12168252: Downloading video info page
06-19 21:21:29 - DEBUG - [download] Downloading playlist: 【纪录片/空难】空中浩劫(共116集/中文字幕)
06-19 21:21:29 - DEBUG - [BiliBili] playlist 【纪录片/空难】空中浩劫(共116集/中文字幕): Collected 11 video ids (downloading 11 of them)
06-19 21:21:29 - DEBUG - [download] Downloading video 1 of 11
06-19 21:21:29 - DEBUG - [download] Downloading video 2 of 11
06-19 21:21:29 - DEBUG - [download] Downloading video 3 of 11
06-19 21:21:29 - DEBUG - [download] Downloading video 4 of 11
06-19 21:21:29 - DEBUG - [download] Downloading video 5 of 11
06-19 21:21:29 - DEBUG - [download] Downloading video 6 of 11
06-19 21:21:29 - DEBUG - [download] Downloading video 7 of 11
06-19 21:21:29 - DEBUG - [download] Downloading video 8 of 11
06-19 21:21:29 - DEBUG - [download] Downloading video 9 of 11
06-19 21:21:29 - DEBUG - [download] Downloading video 10 of 11
06-19 21:21:29 - DEBUG - [download] Downloading video 11 of 11
06-19 21:21:29 - DEBUG - [download] Finished downloading playlist: 【纪录片/空难】空中浩劫(共116集/中文字幕)
06-19 21:21:29 - DEBUG - Video not from Youtube or Vimeo.
Extracting url in maximal quality.
06-19 21:21:29 - DEBUG - Full video URL fetched.
06-19 21:21:29 - INFO - Starting OMXPlayer now.
06-19 21:21:29 - INFO - Attempting to read resolution from configuration file.
06-19 21:21:30 - INFO - Playlist empty, skipping.

After that OMXPlayer just exits with message "have a nice day".

I did some debugging and find the full URL youtube-dl provided was
http://upos-hz-mirrorcos.acgvideo.com/upgcxcode/10/16/20061610/20061610-1-80.flv?um_deadline=1529475687&platform=pc&rate=221000&oi=1134627469&um_sign=261c9b3eb981eea6ea4ad952b6e39ef0&gen=playurl&os=cos&trid=b88d82ee9ec44b138374ebe0dac25b7e

And if I run wget for that url, it returns HTTP ERROR 453 (no description),

I believe there might be some trick youtube-dl uses to download the real video.

I am pretty familiar with python but quite a rookie on how youtube-dl and all these video streaming works.

Is there any insight or guideline you could kindly provide?

*Edit: typo

Audio card

Is there any way to change the audio output besides embedded on the HDMI?

Licensing

RaspberryCast ought to have a license, even if it seems unnecessary. I would suggest a broad license in order to not limit anyone, and I would choose the MIT License. Any thoughts @vincelwt ?

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.