Skip to content

Instantly share code, notes, and snippets.

@Natata
Last active March 10, 2019 18:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Natata/6599c5e634525ab2a90afd74a3cae2b7 to your computer and use it in GitHub Desktop.
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
# -*- 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