except ImportError:
pass
-CACHE_DIR = os.path.expanduser("~/.cache/webdl")
+CACHE_DIR = os.path.join(os.environ.get("XDG_CACHE_HOME", os.path.expanduser("~/.cache")), "webdl")
USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:21.0) Gecko/20100101 Firefox/21.0"
class Node(object):
import sbs
sbs.fill_nodes(root_node)
- import plus7
- plus7.fill_nodes(root_node)
+### import plus7
+### plus7.fill_nodes(root_node)
import brightcove
brightcove.fill_nodes(root_node)
return open(filename)
src = _urlopen(url)
- dst = open(filename, "w")
+ dst = open(filename, "wb")
try:
shutil.copyfileobj(src, dst)
except Exception, e:
return False
-def convert_flv_mp4(orig_filename):
- basename = os.path.splitext(orig_filename)[0]
- flv_filename = basename + ".flv"
- mp4_filename = basename + ".mp4"
- if orig_filename != flv_filename:
- os.rename(orig_filename, flv_filename)
- print "Converting %s to mp4" % flv_filename
- cmd = [
- "avconv",
- "-i", flv_filename,
- "-acodec", "copy",
- "-vcodec", "copy",
- mp4_filename,
- ]
+def check_command_exists(cmd):
+ try:
+ subprocess.check_output(cmd)
+ return True
+ except Exception:
+ return False
+
+def generate_remux_cmd(infile, outfile):
+ if check_command_exists(["avconv", "--help"]):
+ return [
+ "avconv",
+ "-i", infile,
+ "-bsf:a", "aac_adtstoasc",
+ "-acodec", "copy",
+ "-vcodec", "copy",
+ outfile,
+ ]
+
+ if check_command_exists(["ffmpeg", "--help"]):
+ return [
+ "ffmpeg",
+ "-i", infile,
+ "-bsf:a", "aac_adtstoasc",
+ "-acodec", "copy",
+ "-vcodec", "copy",
+ outfile,
+ ]
+
+ raise Exception("You must install ffmpeg or libav-tools")
+
+def remux(infile, outfile):
+ print "Converting %s to mp4" % infile
+ cmd = generate_remux_cmd(infile, outfile)
if not exec_subprocess(cmd):
- return
+ # failed, error has already been logged
+ return False
try:
- flv_size = os.stat(flv_filename).st_size
- mp4_size = os.stat(mp4_filename).st_size
- if abs(flv_size - mp4_size) < 0.05 * flv_size:
- os.unlink(flv_filename)
+ flv_size = os.stat(infile).st_size
+ mp4_size = os.stat(outfile).st_size
+ if abs(flv_size - mp4_size) < 0.1 * flv_size:
+ os.unlink(infile)
+ return True
else:
- print >>sys.stderr, "The size of", mp4_filename, "is suspicious, did avconv fail?"
+ print >>sys.stderr, "The size of", outfile, "is suspicious, did avconv fail?"
+ return False
except Exception, e:
- print "Conversion failed", e
+ print >>sys.stderr, "Conversion failed", e
+ return False
-def convert_filename(filename):
- if os.path.splitext(filename.lower())[1] in (".mp4", ".flv"):
- f = open(filename)
+def convert_to_mp4(filename):
+ with open(filename) as f:
fourcc = f.read(4)
- f.close()
- if fourcc == "FLV\x01":
- convert_flv_mp4(filename)
+ basename, ext = os.path.splitext(filename)
+
+ if ext == ".mp4" and fourcc == "FLV\x01":
+ os.rename(filename, basename + ".flv")
+ ext = ".flv"
+ filename = basename + ext
+
+ if ext in (".flv", ".ts"):
+ filename_mp4 = basename + ".mp4"
+ return remux(filename, filename_mp4)
+
+ return ext == ".mp4"
+
+
+def download_hds(filename, video_url, pvswf=None):
+ filename = sanify_filename(filename)
+ video_url = video_url.replace("http://", "hds://")
+ print "Downloading: %s" % filename
+ cmd = [
+ "livestreamer",
+ "-o", filename,
+ "%s pvswf=%s" % (video_url, pvswf),
+ "best",
+ ]
+ if exec_subprocess(cmd):
+ return convert_to_mp4(filename)
+ else:
+ return False
+
+def download_hls(filename, video_url):
+ filename = sanify_filename(filename)
+ video_url = video_url.replace("http://", "hlsvariant://")
+ print "Downloading: %s" % filename
+ cmd = [
+ "livestreamer",
+ "-o", filename,
+ video_url,
+ "best",
+ ]
+ if exec_subprocess(cmd):
+ return convert_to_mp4(filename)
+ else:
+ return False
def download_rtmp(filename, vbase, vpath, hash_url=None):
filename = sanify_filename(filename)
if hash_url is not None:
cmd += ["--swfVfy", hash_url]
if exec_subprocess(cmd):
- convert_filename(filename)
- return True
+ return convert_to_mp4(filename)
else:
return False
-def download_urllib(filename, url, referrer=None):
- filename = sanify_filename(filename)
- print "Downloading: %s" % filename
- try:
- src = _urlopen(url, referrer)
- dst = open(filename, "w")
- while True:
- buf = src.read(1024*1024)
- if not buf:
- break
- dst.write(buf)
- sys.stdout.write(".")
- sys.stdout.flush()
- print
- except KeyboardInterrupt:
- print "\nCancelled", url
- return False
- finally:
- try:
- src.close()
- except:
- pass
- try:
- dst.close()
- except:
- pass
-
- convert_filename(filename)
- return True
-
def natural_sort(l, key=None):
ignore_list = ["a", "the"]
def key_func(k):