mirror of
https://github.com/spaam/svtplay-dl.git
synced 2024-11-27 21:54:17 +01:00
baa8d76551
self.get_urldata() is eqivalent to get_http_data(self.url), but also caches the data, so no additional requests are made if it is called multiple times (e.g when grabbing title or downloading thumbnail). Generic().get(url) still causes it to be fetched an extra time.
166 lines
5.9 KiB
Python
166 lines
5.9 KiB
Python
# ex:ts=4:sw=4:sts=4:et
|
|
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
|
from __future__ import absolute_import
|
|
import sys
|
|
import re
|
|
import os
|
|
import logging
|
|
from optparse import OptionParser
|
|
|
|
from svtplay_dl.error import UIException
|
|
from svtplay_dl.log import log
|
|
from svtplay_dl.utils import get_http_data, decode_html_entities, filenamify
|
|
from svtplay_dl.service import service_handler, Generic
|
|
|
|
|
|
__version__ = "0.9.2014.02.15"
|
|
|
|
class Options:
|
|
"""
|
|
Options used when invoking the script from another Python script.
|
|
|
|
Simple container class used when calling get_media() from another Python
|
|
script. The variables corresponds to the command line parameters parsed
|
|
in main() when the script is called directly.
|
|
|
|
When called from a script there are a few more things to consider:
|
|
|
|
* Logging is done to 'log'. main() calls setup_log() which sets the
|
|
logging to either stdout or stderr depending on the silent level.
|
|
A user calling get_media() directly can either also use setup_log()
|
|
or configure the log manually.
|
|
|
|
* Progress information is printed to 'progress_stream' which defaults to
|
|
sys.stderr but can be changed to any stream.
|
|
|
|
* Many errors results in calls to system.exit() so catch 'SystemExit'-
|
|
Exceptions to prevent the entire application from exiting if that happens.
|
|
"""
|
|
|
|
def __init__(self):
|
|
self.output = None
|
|
self.resume = False
|
|
self.live = False
|
|
self.silent = False
|
|
self.force = False
|
|
self.quality = 0
|
|
self.flexibleq = None
|
|
self.hls = False
|
|
self.other = None
|
|
self.subtitle = False
|
|
self.username = None
|
|
self.password = None
|
|
self.thumbnail = False
|
|
|
|
def get_media(url, options):
|
|
|
|
url, stream = Generic().get(url)
|
|
if stream:
|
|
url = url.replace("&", "&")
|
|
if not stream:
|
|
stream = service_handler(url)
|
|
if not stream:
|
|
log.error("That site is not supported. Make a ticket or send a message")
|
|
sys.exit(2)
|
|
|
|
if not options.output or os.path.isdir(options.output):
|
|
data = stream.get_urldata()
|
|
match = re.search(r"(?i)<title[^>]*>\s*(.*?)\s*</title>", data, re.S)
|
|
if match:
|
|
title_tag = decode_html_entities(match.group(1))
|
|
if not options.output:
|
|
options.output = filenamify(title_tag)
|
|
else:
|
|
# output is a directory
|
|
options.output = os.path.join(options.output, filenamify(title_tag))
|
|
|
|
try:
|
|
stream.get(options)
|
|
except UIException as e:
|
|
if options.verbose:
|
|
raise e
|
|
log.error(e.message)
|
|
sys.exit(2)
|
|
|
|
if options.subtitle:
|
|
if options.output != "-":
|
|
stream.get_subtitle(options)
|
|
if options.thumbnail:
|
|
if hasattr(stream, "get_thumbnail"):
|
|
log.info("thumb requested")
|
|
if options.output != "-":
|
|
log.info("getting thumbnail")
|
|
stream.get_thumbnail(options)
|
|
else:
|
|
log.info("no thumb requested")
|
|
|
|
|
|
def setup_log(silent, verbose=False):
|
|
fmt = logging.Formatter('%(levelname)s: %(message)s')
|
|
if silent:
|
|
stream = sys.stderr
|
|
level = logging.WARNING
|
|
elif verbose:
|
|
stream = sys.stderr
|
|
level = logging.DEBUG
|
|
fmt = logging.Formatter('[%(created).3f] %(pathname)s/%(funcName)s: %(levelname)s %(message)s')
|
|
else:
|
|
stream = sys.stdout
|
|
level = logging.INFO
|
|
|
|
hdlr = logging.StreamHandler(stream)
|
|
hdlr.setFormatter(fmt)
|
|
|
|
log.addHandler(hdlr)
|
|
log.setLevel(level)
|
|
|
|
def main():
|
|
""" Main program """
|
|
usage = "usage: %prog [options] url"
|
|
parser = OptionParser(usage=usage, version=__version__)
|
|
parser.add_option("-o", "--output",
|
|
metavar="OUTPUT", help="Outputs to the given filename.")
|
|
parser.add_option("-r", "--resume",
|
|
action="store_true", dest="resume", default=False,
|
|
help="Resume a download")
|
|
parser.add_option("-l", "--live",
|
|
action="store_true", dest="live", default=False,
|
|
help="Enable for live streams")
|
|
parser.add_option("-s", "--silent",
|
|
action="store_true", dest="silent", default=False)
|
|
parser.add_option("-v", "--verbose",
|
|
action="store_true", dest="verbose", default=False)
|
|
parser.add_option("-f", "--force",
|
|
action="store_true", dest="force", default=False)
|
|
parser.add_option("-q", "--quality", default=0,
|
|
metavar="quality", help="Choose what format to download.\nIt will download the best format by default")
|
|
parser.add_option("-Q", "--flexible-quality", default=0,
|
|
metavar="amount", dest="flexibleq", help="Allow given quality (as above) to differ by an amount.")
|
|
parser.add_option("-H", "--hls",
|
|
action="store_true", dest="hls", default=False)
|
|
parser.add_option("-S", "--subtitle",
|
|
action="store_true", dest="subtitle", default=False,
|
|
help="Download subtitle from the site if available.")
|
|
parser.add_option("-u", "--username", default=None,
|
|
help="Username")
|
|
parser.add_option("-p", "--password", default=None,
|
|
help="Password")
|
|
parser.add_option("-t", "--thumbnail",
|
|
action="store_true", dest="thumbnail", default=False,
|
|
help="Download thumbnail from the site if available.")
|
|
(options, args) = parser.parse_args()
|
|
if not args:
|
|
parser.print_help()
|
|
sys.exit(0)
|
|
if len(args) != 1:
|
|
parser.error("incorrect number of arguments")
|
|
|
|
setup_log(options.silent, options.verbose)
|
|
|
|
if options.flexibleq and not options.quality:
|
|
log.error("flexible-quality requires a quality")
|
|
sys.exit(4)
|
|
|
|
url = args[0]
|
|
get_media(url, options)
|