Last active
March 10, 2019 18:02
-
-
Save Natata/6599c5e634525ab2a90afd74a3cae2b7 to your computer and use it in GitHub Desktop.
python script for recording showroom live streaming. run `python3 showroom.sh -h` for help message
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
# __author__ = "Natata" | |
# __copyright__ = "Copyright 2019, Natata" | |
# __credits__ = ["Natata"] | |
# __license__ = "MIT" | |
# __version__ = "0.0.1" | |
# __maintainer__ = "Natata" | |
# __email__ = "ph2.71828@gmail.com" | |
# __status__ = "dev" | |
import json | |
import sys | |
import os.path | |
from datetime import datetime | |
from urllib.parse import urlparse #python3 | |
from argparse import ArgumentParser | |
from pyquery import PyQuery as pq | |
import requests | |
from livestreamer import Livestreamer | |
headers = {'user-agent': 'Mozilla/5.0 (Macintosh Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'} | |
quality = 'best' | |
bufferSize = 20*(1024**2) | |
class Args(object): | |
def __init__(self, url, fn): | |
self.url = url #url ParseResult | |
if not fn: | |
self.fn = self.getFileNameFromURL() | |
else: | |
self.fn = fn | |
def getFileNameFromURL(self): | |
path = self.url.path.strip('/') | |
d = datetime.now().strftime('_%Y_%m_%d_%H_%M_%S') | |
return path+d+'.ts' | |
def newSession(): # add cfg as parameter | |
session = Livestreamer() | |
session.set_option('hls-timeout', 5) | |
session.set_option('http-timeout', 5) | |
session.set_option('hls-segment-threads', 3) | |
return session | |
def record(args): | |
try: | |
f = open(args.fn, 'wb', buffering=bufferSize) | |
except IOError: | |
sys.exit(1) | |
hlsurl = getHLS(args.url.geturl()) | |
session = newSession() | |
streams = session.streams(hlsurl) | |
best = streams[quality].open() | |
print('recording streaming data, file name: '+ args.fn) | |
try: | |
for d in best: | |
f.write(d) | |
except IOError: | |
print('record stopped') | |
best.close() | |
f.flush() | |
f.close() | |
def getHLS(url): | |
r = requests.get(url, headers=headers) | |
html = pq(r.text) | |
data = json.loads(html('#js-live-data').attr('data-json')) | |
u = '' | |
maxQuality = 0 | |
for hls in data['streaming_url_list']: | |
if hls['quality'] > maxQuality: | |
maxQuality = hls['quality'] | |
u = hls['url'] | |
return 'hlsvariant://'+u | |
def getArgs(): | |
parser = ArgumentParser() | |
parser.add_argument("url", help="url of a room, e.g.: https://www.showroom-live.com/teba_sen") | |
parser.add_argument("-o", help='name of file for saving streaming data', dest='filename') | |
args = parser.parse_args() | |
url = parseURL(args.url) | |
return Args(url=url, fn=args.filename) | |
def parseURL(x): | |
try: | |
result = urlparse(x) | |
return result | |
except: | |
print('uri is invalid') | |
sys.exit(0) | |
if __name__ == "__main__": | |
args = getArgs() | |
record(args) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment