Skip to content

Commit

Permalink
Cast mp4 media to chromecast
Browse files Browse the repository at this point in the history
  • Loading branch information
palaviv committed Oct 17, 2016
1 parent bbd7888 commit 3854951
Showing 1 changed file with 78 additions and 0 deletions.
78 changes: 78 additions & 0 deletions caster.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import argparse
try:
from http.server import BaseHTTPRequestHandler, HTTPServer
except ImportError:
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import threading
import socket
from six import b

import pychromecast


def get_internal_ip(dst_ip):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((dst_ip, 0))
return s.getsockname()[0]


class RequestHandler(BaseHTTPRequestHandler):
content_type = "video/mp4"

""" Handle HTTP requests for files which do not need transcoding """

def do_GET(self):
self.protocol_version = "HTTP/1.1"
self.send_response(200)
self.send_header("Content-type", self.content_type)
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header("Transfer-Encoding", "chunked")
self.end_headers()

with open(self.path, "rb") as f:
while True:
data = f.read(1024)
if len(data) == 0:
break

chunk_size = "%0.2X" % len(data)
self.wfile.write(b(chunk_size))
self.wfile.write(b("\r\n"))
self.wfile.write(data)
self.wfile.write(b("\r\n"))

self.wfile.write(b("0"))
self.wfile.write(b("\r\n\r\n"))


def get_args():
parser = argparse.ArgumentParser(description='Caster - cast media to chromecast')
parser.add_argument('file', help='The file to play')
return parser.parse_args()


def main():
args = get_args()

file_path = args.file

name, dev = pychromecast.get_chromecasts_as_dict().popitem()

dev.wait()

server_ip = get_internal_ip(dev.host)

server = HTTPServer((server_ip, 0), RequestHandler)
server_thread = threading.Thread(target=server.handle_request)
server_thread.start()

mc = dev.media_controller

media_url = "http://{IP}:{PORT}/{URI}".format(IP=server_ip, PORT=server.server_port, URI=file_path)
mc.play_media(media_url, 'video/mp4')

server_thread.join()
server.server_close()

if __name__ == "__main__":
main()

0 comments on commit 3854951

Please sign in to comment.