Beispiel #1
0
def upload_video(youtube, options, video_path, total_videos, index):
    """Upload video with index (for split videos)."""
    title = to_utf8(options.title)
    description = to_utf8(options.description or "").decode("string-escape")
    namespace = dict(title=title, n=index + 1, total=total_videos)
    complete_title = (string.Template(options.title_template).substitute(
        **namespace) if total_videos > 1 else title)
    args = [
        video_path, complete_title, description, options.category,
        options.keywords
    ]
    kwargs = {
        "private": options.private,
        "location": parse_location(options.location),
        "unlisted": options.unlisted,
        "recorded": options.recorded,
        "nocomments": options.nocomments,
        "noratings": options.noratings,
    }
    if options.get_upload_form_data:
        data = youtube.get_upload_form_data(*args, **kwargs)
        return "\n".join([video_path, data["token"], data["post_url"]])
    elif options.api_upload or not pycurl:
        if not options.api_upload:
            debug("Install pycurl to upload the video using HTTP")
        debug("Start upload using basic gdata API: %s" % video_path)
        entry = youtube.upload_video(*args, **kwargs)
        url, video_id = get_entry_info(entry)
    else:  # upload with curl
        data = youtube.get_upload_form_data(*args, **kwargs)
        entry = data["entry"]
        debug("Start upload using a HTTP post: %s -> %s" %
              (video_path, data["post_url"]))
        http_code, headers, body = post(
            data["post_url"], {"file": video_path}, {"token": data["token"]},
            show_progressbar=not (options.hide_progressbar))
        if http_code != 302:
            raise UnsuccessfulHTTPResponseCode(
                "HTTP code on upload: %d (expected 302)" % http_code)
        params = dict(
            s.split("=", 1)
            for s in headers["Location"].split("?", 1)[1].split("&"))
        if params["status"] != "200":
            raise UnsuccessfulHTTPResponseCode(
                "HTTP status on upload link: %s (expected 200)" %
                params["status"])
        video_id = params["id"]
        url = "http://www.youtube.com/watch?v=%s" % video_id
    if options.wait_processing:
        wait_processing(youtube, video_id)
    return url
Beispiel #2
0
def upload_video(youtube, options, video_path, total_videos, index):
    """Upload video with index (for split videos)."""
    title = to_utf8(options.title)
    description = to_utf8(options.description or "").decode("string-escape")
    namespace = dict(title=title, n=index+1, total=total_videos)
    complete_title = (string.Template(options.title_template).substitute(**namespace)
      if total_videos > 1 else title)
    args = [video_path, complete_title, description,
            options.category, options.keywords]
    kwargs = {
      "private": options.private,
      "location": parse_location(options.location),
      "unlisted": options.unlisted,
      "recorded": options.recorded,
      "nocomments": options.nocomments,
      "noratings": options.noratings,
    }
    if options.get_upload_form_data:
        data = youtube.get_upload_form_data(*args, **kwargs)
        return "\n".join([video_path, data["token"], data["post_url"]])
    elif options.api_upload or not pycurl:
        if not options.api_upload:
            debug("Install pycurl to upload the video using HTTP")
        debug("Start upload using basic gdata API: %s" % video_path)
        entry = youtube.upload_video(*args, **kwargs)
        url, video_id = get_entry_info(entry)
    else: # upload with curl
        data = youtube.get_upload_form_data(*args, **kwargs)
        entry = data["entry"]
        debug("Start upload using a HTTP post: %s -> %s" % (video_path, data["post_url"]))
        http_code, headers, body = post(data["post_url"], 
            {"file": video_path}, {"token": data["token"]}, 
            show_progressbar=not(options.hide_progressbar))
        if http_code != 302:
            raise UnsuccessfulHTTPResponseCode(
                "HTTP code on upload: %d (expected 302)" % http_code)
        params = dict(s.split("=", 1) for s in headers["Location"].split("?", 1)[1].split("&"))
        if params["status"] !=  "200":
            raise UnsuccessfulHTTPResponseCode(
                "HTTP status on upload link: %s (expected 200)" % params["status"])
        video_id = params["id"]
        url = "http://www.youtube.com/watch?v=%s" % video_id
    if options.wait_processing:
        wait_processing(youtube, video_id)
    return url
Beispiel #3
0
def upload_video(youtube, options, video_path):
    """Upload video with index (for split videos)."""
    title = to_utf8(options['title'])
    description = to_utf8(options['description'] or "").decode("string-escape")
    args = [
        video_path, title, description, options['category'],
        options['keywords']
    ]
    kwargs = {
        "private": options['private'],
        "location": parse_location(options['location']),
        "unlisted": options['unlisted'],
    }

    # upload with curl
    video_id = None
    try:
        data = youtube.get_upload_form_data(*args, **kwargs)
        entry = data["entry"]
        #debug("Start upload using a HTTP post: %s -> %s" % (video_path, \
        #data["post_url"]))
        http_code, headers, body = post(data["post_url"], {"file": video_path},
                                        {"token": data["token"]},
                                        show_progressbar=True)
        if http_code != 302:
            raise UnsuccessfulHTTPResponseCode(
                "HTTP code on upload: %d (expected 302)" % http_code)
        params = dict(s.split("=", 1) for s in headers["Location"]\
            .split("?", 1)[1].split("&"))
        if params["status"] != "200":
            raise UnsuccessfulHTTPResponseCode(
                "HTTP status on upload link: %s (expected 200)" %
                params["status"])
        video_id = params["id"]
        #url = "http://www.youtube.com/watch?v=%s" % video_id
        """if options.wait_processing:
            wait_processing(youtube, video_id)"""
    except Exception as e:
        print(e)
        pass
    return video_id
def upload_video(youtube, options, video_path):
    """Upload video with index (for split videos)."""
    title = to_utf8(options['title'])
    description = to_utf8(options['description'] or "").decode("string-escape")
    args = [video_path, title, description,
            options['category'], options['keywords']]
    kwargs = {
      "private": options['private'],
      "location": parse_location(options['location']),
      "unlisted": options['unlisted'],
    }

    # upload with curl
    video_id = None
    try:
        data = youtube.get_upload_form_data(*args, **kwargs)
        entry = data["entry"]
        #debug("Start upload using a HTTP post: %s -> %s" % (video_path, \
            #data["post_url"]))
        http_code, headers, body = post(data["post_url"], 
            {"file": video_path}, {"token": data["token"]}, 
            show_progressbar = True)
        if http_code != 302:
            raise UnsuccessfulHTTPResponseCode(
                "HTTP code on upload: %d (expected 302)" % http_code)
        params = dict(s.split("=", 1) for s in headers["Location"]\
            .split("?", 1)[1].split("&"))
        if params["status"] !=  "200":
            raise UnsuccessfulHTTPResponseCode(
                "HTTP status on upload link: %s (expected 200)" % params["status"])
        video_id = params["id"]
        #url = "http://www.youtube.com/watch?v=%s" % video_id
        """if options.wait_processing:
            wait_processing(youtube, video_id)"""
    except Exception, e:
        print e
        pass
Beispiel #5
0
def main_upload(arguments, output=sys.stdout):
    """Upload video to Youtube."""
    usage = """Usage: %prog [OPTIONS] VIDEO_PATH ...

    Upload videos to youtube."""    
    parser = optparse.OptionParser(usage, version=VERSION)

    # Required options
    parser.add_option('-m', '--email', dest='email', type="string", 
        help='Authentication user email')
    parser.add_option('-p', '--password', dest='password', type="string", 
        help='Authentication user password')
    parser.add_option('-t', '--title', dest='title', type="string", 
        help='Video(s) title')
    parser.add_option('-c', '--category', dest='category', type="string", 
        help='Video(s) category')

    # Side commands
    parser.add_option('', '--get-categories', dest='get_categories',
        action="store_true", default=False, help='Show video categories')
    parser.add_option('', '--create-playlist', dest='create_playlist', type="string", 
        default=None, metavar="TITLE|DESCRIPTION|PRIVATE (0=no, 1=yes)", 
        help='Create new playlist and add uploaded video(s) to it')

    # Optional options
    parser.add_option('-d', '--description', dest='description', type="string", 
        help='Video(s) description')
    parser.add_option('', '--keywords', dest='keywords', type="string", 
        help='Video(s) keywords (separated by commas: tag1,tag2,...)')
    parser.add_option('', '--title-template', dest='title_template', type="string",
        default="$title [$n/$total]", metavar="STRING", 
        help='Title template to use on multiple videos (default: $title [$n/$total])')
    parser.add_option('', '--private', dest='private',
        action="store_true", default=False, help='Set uploaded video(s) as private')
    parser.add_option('', '--location', dest='location', type="string", default=None,
        metavar="LAT,LON", help='Video(s) location (lat, lon). example: "43.3,5.42"')
    
    # Upload options
    parser.add_option('', '--api-upload', dest='api_upload',
        action="store_true", default=False, help="Use the API upload instead of pycurl")
    parser.add_option('', '--get-upload-form-info', dest='get_upload_form_data',
        action="store_true", default=False, help="Don't upload, get the form info (PATH, TOKEN, URL)")
        
    # Playlist options
    parser.add_option('', '--add-to-playlist', dest='add_to_playlist', type="string", default=None,
        metavar="URI", help='Add video(s) to an existing playlist')
    parser.add_option('', '--wait-processing', dest='wait_processing', action="store_true", 
        default=False, help='Wait until the video(s) has been processed')

    # Captcha options
    parser.add_option('', '--captcha-token', dest='captcha_token', type="string", 
      metavar="STRING", help='Captcha token')
    parser.add_option('', '--captcha-response', dest='captcha_response', type="string", 
      metavar="STRING", help='Captcha response')

    options, args = parser.parse_args(arguments)
    
    if options.get_categories:
        output.write(" ".join(Youtube.get_categories().keys()) + "\n")
        return
    elif options.create_playlist or options.add_to_playlist:
        required_options = ["email", "password"]
    else:
        if not args:
            parser.print_usage()
            raise VideoArgumentMissing("Specify a video file to upload")    
        required_options = ["email", "title", "category"]
                
    missing = [opt for opt in required_options if not getattr(options, opt)]
    if missing:
        parser.print_usage()
        raise OptionsMissing("Some required option are missing: %s" % ", ".join(missing)) 
        
    if options.password is None:
        password = getpass.getpass("Password for account <%s>: " % options.email)    
    elif options.password == "-":
        password = sys.stdin.readline().strip()
    else:
        password = options.password
    youtube = Youtube(DEVELOPER_KEY)    
    debug("Login to Youtube API: email='%s', password='******'" % 
          (options.email, "*" * len(password)))
    try:
        youtube.login(options.email, password, captcha_token=options.captcha_token,
                      captcha_response=options.captcha_response)
    except gdata.service.BadAuthentication:
        raise BadAuthentication("Wrong authentication")                      
    except gdata.service.CaptchaRequired:
        token = youtube.service.captcha_token
        message = [
            "Captcha request: %s" % youtube.service.captcha_url,
            "Re-run the command: --captcha-token=%s --captcha-response=CAPTCHA" % token,
        ]
        raise CaptchaRequired("\n".join(message))

    if options.create_playlist:
        title, description, private = tosize(options.create_playlist.split("|", 2), 3)
        playlist_uri = youtube.create_playlist(title, description, (private == "1"))
        debug("Playlist created: %s" % playlist_uri)
        output.write(playlist_uri+"\n")
        return

    if options.add_to_playlist:
        for url in args:
            debug("Adding video (%s) to playlist: %s" % (url, options.add_to_playlist))
            video_id = re.search("v=(.*)$", url).group(1)
            youtube.add_video_to_playlist(video_id, options.add_to_playlist)
        return 
    
    videos = args
    for index, video_path in enumerate(videos):
        namespace = dict(title=options.title, n=index+1, total=len(videos))
        complete_title = (string.Template(options.title_template).substitute(**namespace) 
                          if len(videos) > 1 else options.title)
        args = [video_path, complete_title, options.description, 
                options.category, options.keywords]
        kwargs = dict(private=options.private, location=parse_location(options.location))
        
        if options.get_upload_form_data:
            data = youtube.get_upload_form_data(*args, **kwargs)
            output.write("\n".join([video_path, data["token"], data["post_url"]]) + "\n")
            continue
        elif options.api_upload or not pycurl:
            if not options.api_upload:
                debug("Install pycurl to upload the video using HTTP")
            debug("Start upload using basic gdata API: %s" % video_path) 
            entry = youtube.upload_video(*args, **kwargs)
            url, video_id = get_entry_info(entry)
        else: # upload with curl
            data = youtube.get_upload_form_data(*args, **kwargs)
            entry = data["entry"]
            debug("Start upload using a HTTP post: %s" % video_path)
            http_code, headers, body = \
                post(data["post_url"], {"file": video_path}, {"token": data["token"]})
            if http_code != 302:
                raise UnsuccessHTTPResponseCode(
                    "HTTP code on upload: %d (expected 302)" % http_code)
            params = dict(s.split("=", 1) for s in headers["Location"].split("?", 1)[1].split("&"))
            if params["status"] !=  "200":
                raise UnsuccessHTTPResponseCode(
                    "HTTP status on upload link: %s (expected 200)" % params["status"])
            video_id = params["id"]
            url = "http://www.youtube.com/watch?v=%s" % video_id
        if options.wait_processing:
            wait_processing(youtube, video_id)
        output.write(url + "\n")
def main_upload(arguments, output=sys.stdout):
    """Upload video to Youtube."""
    usage = """Usage: %prog [OPTIONS] VIDEO_PATH ...

    Upload videos to youtube."""
    parser = optparse.OptionParser(usage, version=VERSION)

    # Required options
    parser.add_option('-m', '--email', dest='email', type="string",
        help='Authentication user email')
    parser.add_option('-p', '--password', dest='password', type="string",
        help='Authentication user password')
    parser.add_option('-t', '--title', dest='title', type="string",
        help='Video(s) title')
    parser.add_option('-c', '--category', dest='category', type="string",
        help='Video(s) category')

    # Side commands
    parser.add_option('', '--get-categories', dest='get_categories',
        action="store_true", default=False, help='Show video categories')
    parser.add_option('', '--create-playlist', dest='create_playlist', type="string",
        default=None, metavar="TITLE|DESCRIPTION|PRIVATE (0=no, 1=yes)",
        help='Create new playlist and add uploaded video(s) to it')

    # Optional options
    parser.add_option('-d', '--description', dest='description', type="string",
        help='Video(s) description')
    parser.add_option('', '--keywords', dest='keywords', type="string",
        help='Video(s) keywords (separated by commas: tag1,tag2,...)')
    parser.add_option('', '--title-template', dest='title_template', type="string",
        default="$title [$n/$total]", metavar="STRING",
        help='Title template to use on multiple videos (default: $title [$n/$total])')
    parser.add_option('', '--private', dest='private',
        action="store_true", default=False, help='Set uploaded video(s) as private')
    parser.add_option('', '--unlisted', dest='unlisted',
        action="store_true", default=False, help='Set uploaded video(s) as unlisted')
    parser.add_option('', '--location', dest='location', type="string", default=None,
        metavar="LAT,LON", help='Video(s) location (lat, lon). example: "43.3,5.42"')

    # Upload options
    parser.add_option('', '--api-upload', dest='api_upload',
        action="store_true", default=False, help="Use the API upload instead of pycurl")
    parser.add_option('', '--get-upload-form-info', dest='get_upload_form_data',
        action="store_true", default=False, help="Don't upload, get the form info (PATH, TOKEN, URL)")

    # Playlist options
    parser.add_option('', '--add-to-playlist', dest='add_to_playlist', type="string", default=None,
        metavar="URI", help='Add video(s) to an existing playlist')
    parser.add_option('', '--wait-processing', dest='wait_processing', action="store_true",
        default=False, help='Wait until the video(s) has been processed')

    # Captcha options
    parser.add_option('', '--captcha-token', dest='captcha_token', type="string",
      metavar="STRING", help='Captcha token')
    parser.add_option('', '--captcha-response', dest='captcha_response', type="string",
      metavar="STRING", help='Captcha response')

    options, args = parser.parse_args(arguments)

    if options.get_categories:
        output.write(" ".join(Youtube.get_categories().keys()) + "\n")
        return
    elif options.create_playlist or options.add_to_playlist:
        required_options = ["email", "password"]
    else:
        if not args:
            parser.print_usage()
            raise VideoArgumentMissing("Specify a video file to upload")
        required_options = ["email", "title", "category"]

    missing = [opt for opt in required_options if not getattr(options, opt)]
    if missing:
        parser.print_usage()
        raise OptionsMissing("Some required option are missing: %s" % ", ".join(missing))

    if options.password is None:
        password = getpass.getpass("Password for account <%s>: " % options.email)
    elif options.password == "-":
        password = sys.stdin.readline().strip()
    else:
        password = options.password
    youtube = Youtube(DEVELOPER_KEY)
    debug("Login to Youtube API: email='%s', password='******'" %
          (options.email, "*" * len(password)))
    try:
        youtube.login(options.email, password, captcha_token=options.captcha_token,
                      captcha_response=options.captcha_response)
    except gdata.service.BadAuthentication:
        raise BadAuthentication("Authentication failed")
    except gdata.service.CaptchaRequired:
        token = youtube.service.captcha_token
        message = [
            "Captcha request: %s" % youtube.service.captcha_url,
            "Re-run the command with: --captcha-token=%s --captcha-response=CAPTCHA" % token,
        ]
        raise CaptchaRequired("\n".join(message))

    if options.create_playlist:
        title, description, private = tosize(options.create_playlist.split("|", 2), 3)
        playlist_uri = youtube.create_playlist(title, description, (private == "1"))
        debug("Playlist created: %s" % playlist_uri)
        output.write(playlist_uri+"\n")
        return

    if options.add_to_playlist:
        for url in args:
            debug("Adding video (%s) to playlist: %s" % (url, options.add_to_playlist))
            video_id = get_video_id_from_url(url)
            youtube.add_video_to_playlist(video_id, options.add_to_playlist)
        return

    videos = args
    for index, video_path in enumerate(videos):
        namespace = dict(title=options.title, n=index+1, total=len(videos))
        complete_title = (string.Template(options.title_template).substitute(**namespace)
                          if len(videos) > 1 else options.title)
        args = [video_path, complete_title, options.description,
                options.category, options.keywords]
        kwargs = {
          "private": options.private,
          "location": parse_location(options.location),
          "unlisted": options.unlisted,
        }

        if options.get_upload_form_data:
            data = youtube.get_upload_form_data(*args, **kwargs)
            output.write("\n".join([video_path, data["token"], data["post_url"]]) + "\n")
            continue
        elif options.api_upload or not pycurl:
            if not options.api_upload:
                debug("Install pycurl to upload the video using HTTP")
            debug("Start upload using basic gdata API: %s" % video_path)
            entry = youtube.upload_video(*args, **kwargs)
            url, video_id = get_entry_info(entry)
        else: # upload with curl
            data = youtube.get_upload_form_data(*args, **kwargs)
            entry = data["entry"]
            debug("Start upload using a HTTP post: %s" % video_path)
            http_code, headers, body = \
                post(data["post_url"], {"file": video_path}, {"token": data["token"]})
            if http_code != 302:
                raise UnsuccessfulHTTPResponseCode(
                    "HTTP code on upload: %d (expected 302)" % http_code)
            params = dict(s.split("=", 1) for s in headers["Location"].split("?", 1)[1].split("&"))
            if params["status"] !=  "200":
                raise UnsuccessfulHTTPResponseCode(
                    "HTTP status on upload link: %s (expected 200)" % params["status"])
            video_id = params["id"]
            url = "http://www.youtube.com/watch?v=%s" % video_id
        if options.wait_processing:
            wait_processing(youtube, video_id)
        output.write(url + "\n")