]> Raphaƫl G. Git Repositories - youtubedl/commitdiff
Imported Debian patch 2007.03.27-1
authorRobert S. Edmonds <edmonds@debian.org>
Tue, 3 Apr 2007 01:46:56 +0000 (21:46 -0400)
committerRobert S. Edmonds <edmonds@debian.org>
Sat, 18 Jun 2011 05:16:45 +0000 (02:16 -0300)
1  2 
debian/changelog
debian/youtube-dl.1
youtube-dl

diff --combined debian/changelog
index d5f6237835751c04d0af1f1c2a73a51be1f82445,0000000000000000000000000000000000000000..a303b1b5ae99a5cc36452acd3ba16c4a0c81ac23
mode 100644,000000..100644
--- /dev/null
@@@ -1,41 -1,0 +1,50 @@@
++youtube-dl (2007.03.27-1) unstable; urgency=low
++
++  * New upstream release:
++    - Progress meter.
++    - "--literal" command line option to use the video title in the filename.
++    - "--get-url" command line option to print the real video URL.
++
++ -- Robert S. Edmonds <edmonds@debian.org>  Mon,  2 Apr 2007 21:46:56 -0400
++
 +youtube-dl (2007.02.18-1) unstable; urgency=low
 +
 +  * New upstream release:
 +    - Diction.
 +    - Catches socket errors.
 +
 + -- Robert S. Edmonds <edmonds@debian.org>  Tue, 20 Feb 2007 13:57:32 -0500
 +
 +youtube-dl (2007.01.19-1) unstable; urgency=low
 +
 +  * New upstream release, closes: #406146.
 +
 + -- Robert S. Edmonds <edmonds@debian.org>  Sun, 28 Jan 2007 17:41:44 -0500
 +
 +youtube-dl (2006.12.07-1) unstable; urgency=low
 +
 +  * New upstream release:
 +    - Use -t to name the downloaded file after the title, closes: #395184.
 +    - Parses URLs without a leading "http://", closes: #400321.
 +
 + -- Robert S. Edmonds <edmonds@debian.org>  Sun, 10 Dec 2006 13:52:36 -0500
 +
 +youtube-dl (2006.11.12-1) unstable; urgency=low
 +
 +  * New upstream release.
 +
 + -- Robert S. Edmonds <edmonds@debian.org>  Sat, 25 Nov 2006 16:12:03 -0500
 +
 +youtube-dl (2006.09.25-1) unstable; urgency=low
 +
 +  * New upstream release.
 +  * python >= 2.4 is now required.
 +
 + -- Robert S. Edmonds <edmonds@debian.org>  Wed, 27 Sep 2006 17:43:07 -0400
 +
 +youtube-dl (2006.08.28-1) unstable; urgency=low
 +
 +  * Initial release, closes: #385748.
 +
 + -- Robert S. Edmonds <edmonds@debian.org>  Sun,  3 Sep 2006 19:43:27 -0400
 +
diff --combined debian/youtube-dl.1
index fb270720006da63574af727456e5d1f2643b17d1,0000000000000000000000000000000000000000..ce3096156ba674d51107106ba4b8462b99e2d8bd
mode 100644,000000..100644
--- /dev/null
@@@ -1,33 -1,0 +1,38 @@@
- .TH YOUTUBE-DL "1" "January 2007" "youtube-dl" "User Commands"
++.TH YOUTUBE-DL "1" "April 2007" "youtube-dl" "User Commands"
 +.SH NAME
 +youtube-dl \- download a video file from YouTube.com
 +.SH DESCRIPTION
 +usage: youtube\-dl [options] video_url
 +.SS "options:"
 +.TP
 +\fB\-h\fR, \fB\-\-help\fR
 +print this help text and exit
 +.TP
 +\fB\-v\fR, \fB\-\-version\fR
 +print program version and exit
 +.TP
 +\fB\-u\fR USERNAME, \fB\-\-username\fR=\fIUSERNAME\fR
 +account username
 +.TP
 +\fB\-p\fR PASSWORD, \fB\-\-password\fR=\fIPASSWORD\fR
 +account password
 +.TP
 +\fB\-o\fR FILE, \fB\-\-output\fR=\fIFILE\fR
 +output video file name
 +.TP
 +\fB\-q\fR, \fB\-\-quiet\fR
 +activates quiet mode
 +.TP
 +\fB\-s\fR, \fB\-\-simulate\fR
 +do not download video
 +.TP
 +\fB\-t\fR, \fB\-\-title\fR
 +use title in file name
 +.TP
++\fB\-l\fR, \fB\-\-literal\fR
++use literal title in file name
++.TP
 +\fB\-n\fR, \fB\-\-netrc\fR
 +use .netrc authentication data
++\fB\-g\fR, \fB\-\-get-url\fR
++print final video URL only
diff --combined youtube-dl
index 6d53fa3c4d7acbe6c0a49ba25751853ad03943d6,8399e88bf5d94ecec2ffcc9825a88b4a98d19e18..5e1248939d13e02aba8f655ba9921c7d5bb4fa5c
@@@ -27,6 -27,7 +27,7 @@@
  #
  import getpass
  import httplib
+ import math
  import netrc
  import optparse
  import os
@@@ -39,7 -40,7 +40,7 @@@ import urllib
  
  # Global constants
  const_video_url_str = 'http://www.youtube.com/watch?v=%s'
- const_video_url_re = re.compile(r'(?:http://)?(?:www\d*\.)?youtube\.com/(?:v/|(?:watch(?:\.php)?)?\?v=)([^&]+).*')
+ const_video_url_re = re.compile(r'(?:http://)?(?:www\d*\.)?youtube\.com/(?:v/|(?:watch(?:\.php)?)?\?(?:.+&)?v=)([^&]+).*')
  const_login_url_str = 'http://www.youtube.com/login?next=/watch%%3Fv%%3D%s'
  const_login_post_str = 'current_form=loginForm&next=%%2Fwatch%%3Fv%%3D%s&username=%s&password=%s&action_login=Log+In'
  const_age_url_str = 'http://www.youtube.com/verify_age?next_url=/watch%%3Fv%%3D%s'
@@@ -55,11 -56,11 +56,11 @@@ def error_advice_exit(error_text)
        sys.stderr.write('Error: %s.\n' % error_text)
        sys.stderr.write('Try again several times. It may be a temporary problem.\n')
        sys.stderr.write('Other typical problems:\n\n')
-       sys.stderr.write('\tVideo no longer exists.\n')
-       sys.stderr.write('\tVideo requires age confirmation but you did not provide an account.\n')
-       sys.stderr.write('\tYou provided the account data, but it is not valid.\n')
-       sys.stderr.write('\tThe connection was cut suddenly for some reason.\n')
-       sys.stderr.write('\tYouTube changed their system, and the program no longer works.\n')
+       sys.stderr.write('Video no longer exists.\n')
+       sys.stderr.write('Video requires age confirmation but you did not provide an account.\n')
+       sys.stderr.write('You provided the account data, but it is not valid.\n')
+       sys.stderr.write('The connection was cut suddenly for some reason.\n')
+       sys.stderr.write('YouTube changed their system, and the program no longer works.\n')
        sys.stderr.write('\nTry to confirm you are able to view the video using a web browser.\n')
        sys.stderr.write('Use the same video URL and account information, if needed, with this program.\n')
        sys.stderr.write('When using a proxy, make sure http_proxy has http://host:port format.\n')
@@@ -84,15 -85,10 +85,10 @@@ def perform_request(url, data=None)
        response = urllib2.urlopen(request)
        return response
  
- # Convert bytes to KiB
- def to_k(bytes):
-       global const_1k
-       return bytes / const_1k
  # Conditional print
  def cond_print(str):
        global cmdl_opts
-       if not cmdl_opts.quiet:
+       if not (cmdl_opts.quiet or cmdl_opts.get_url):
                sys.stdout.write(str)
                sys.stdout.flush()
  
@@@ -103,6 -99,10 +99,10 @@@ def title_string_norm(title)
        title = title.lower()
        return title
  
+ # Title string minimal transformation
+ def title_string_touch(title):
+       return title.replace(os.sep, '%')
  # Generic download step
  def download_step(return_data_flag, step_title, step_error, url, post_data=None):
        try:
@@@ -139,21 -139,59 +139,59 @@@ def extract_step(step_title, step_error
  
  # Calculate new block size based on previous block size
  def new_block_size(before, after, bytes):
-       new_min = max(bytes / 2, 1)
-       new_max = max(bytes * 2, 1)
+       new_min = max(bytes / 2.0, 1.0)
+       new_max = max(bytes * 2.0, 1.0)
        dif = after - before
        if dif < 0.0001:
-               return new_max
-       rate = int(bytes / dif)
+               return int(new_max)
+       rate = bytes / dif
        if rate > new_max:
-               return new_max
+               return int(new_max)
        if rate < new_min:
-               return new_min
-       return rate
+               return int(new_min)
+       return int(rate)
+ # Get optimum 1k exponent to represent a number of bytes
+ def optimum_k_exp(num_bytes):
+       global const_1k
+       if num_bytes == 0:
+               return 0
+       return long(math.log(num_bytes, const_1k))
+ # Get optimum representation of number of bytes
+ def format_bytes(num_bytes):
+       global const_1k
+       try:
+               exp = optimum_k_exp(num_bytes)
+               suffix = 'bkMGTPEZY'[exp]
+               if exp == 0:
+                       return '%s%s' % (num_bytes, suffix)
+               converted = float(num_bytes) / float(const_1k**exp)
+               return '%.2f%s' % (converted, suffix)
+       except IndexError:
+               sys.exit('Error: internal error formatting number of bytes.')
+ # Calculate ETA and return it in string format as MM:SS
+ def calc_eta(start, now, total, current):
+       if current == 0:
+               return '--:--'
+       rate = float(current) / (now - start)
+       eta = long((total - current) / rate)
+       eta_mins = eta / 60
+       eta_secs = eta % 60
+       if eta_mins > 99:
+               return '--:--'
+       return '%02d:%02d' % (eta_mins, eta_secs)
+ # Calculate speed and return it in string format
+ def calc_speed(start, now, bytes):
+       if bytes == 0:
+               return 'N/A b'
+       return format_bytes(float(bytes) / (now - start))
  
  # Create the command line options parser and parse command line
  cmdl_usage = 'usage: %prog [options] video_url'
- cmdl_version = '2007.02.18'
+ cmdl_version = '2007.03.27'
  cmdl_parser = optparse.OptionParser(usage=cmdl_usage, version=cmdl_version, conflict_handler='resolve')
  cmdl_parser.add_option('-h', '--help', action='help', help='print this help text and exit')
  cmdl_parser.add_option('-v', '--version', action='version', help='print program version and exit')
@@@ -163,7 -201,9 +201,9 @@@ cmdl_parser.add_option('-o', '--output'
  cmdl_parser.add_option('-q', '--quiet', action='store_true', dest='quiet', help='activates quiet mode')
  cmdl_parser.add_option('-s', '--simulate', action='store_true', dest='simulate', help='do not download video')
  cmdl_parser.add_option('-t', '--title', action='store_true', dest='use_title', help='use title in file name')
+ cmdl_parser.add_option('-l', '--literal', action='store_true', dest='use_literal', help='use literal title in file name')
  cmdl_parser.add_option('-n', '--netrc', action='store_true', dest='use_netrc', help='use .netrc authentication data')
+ cmdl_parser.add_option('-g', '--get-url', action='store_true', dest='get_url', help='print final video URL only')
  (cmdl_opts, cmdl_args) = cmdl_parser.parse_args()
  
  # Get video URL
@@@ -180,15 -220,21 +220,21 @@@ video_url_id = video_url_mo.group(1
  video_url = const_video_url_str % video_url_id
  
  # Check conflicting options
- if cmdl_opts.outfile is not None and cmdl_opts.simulate:
+ if cmdl_opts.outfile is not None and (cmdl_opts.simulate or cmdl_opts.get_url):
        sys.stderr.write('Warning: video file name given but will not be used.\n')
  
- if cmdl_opts.outfile is not None and cmdl_opts.use_title:
+ if cmdl_opts.outfile is not None and (cmdl_opts.use_title or cmdl_opts.use_literal):
        sys.exit('Error: using the video title conflicts with using a given file name.')
  
  if cmdl_opts.use_netrc and cmdl_opts.password is not None:
        sys.exit('Error: using netrc conflicts with giving command line password.')
  
+ if cmdl_opts.use_title and cmdl_opts.use_literal:
+       sys.exit('Error: cannot use title and literal title at the same time.')
+ if cmdl_opts.quiet and cmdl_opts.get_url:
+       sys.exit('Error: cannot be quiet and print final URL at the same time.')
  # Incorrect option formatting
  if cmdl_opts.username is None and cmdl_opts.password is not None:
        sys.exit('Error: password give but username is missing.')
@@@ -238,7 -284,7 +284,7 @@@ if not video_filename.lower().endswith(
        sys.stderr.write('Warning: video file name does not end in .flv\n')
  
  # Test writable file
- if not cmdl_opts.simulate:
+ if not (cmdl_opts.simulate or cmdl_opts.get_url):
        try:
                disk_test = open(video_filename, 'wb')
                disk_test.close()
@@@ -264,7 -310,7 +310,7 @@@ if account_username is not None
  video_webpage = download_step(True, 'Retrieving video webpage', 'unable to retrieve video webpage', video_url)
  
  # Extract video title if needed
- if cmdl_opts.use_title:
+ if cmdl_opts.use_title or cmdl_opts.use_literal:
        video_title = extract_step('Extracting video title', 'unable to extract video title', const_video_title_re, video_webpage)
  
  # Extract needed video URL parameters
@@@ -276,20 -322,35 +322,35 @@@ try
        video_data = perform_request(video_url_real)
        cond_print('Video data found at %s\n' % video_data.geturl())
  
-       # Abort here if in simulate mode
-       if cmdl_opts.simulate:
+       if cmdl_opts.get_url:
+               print video_data.geturl()
+       if cmdl_opts.simulate or cmdl_opts.get_url:
                sys.exit()
  
        video_file = open(video_filename, 'wb')
        try:
-               video_len_str = '%sk' % to_k(long(video_data.info()['Content-length']))
+               video_len = long(video_data.info()['Content-length'])
+               video_len_str = format_bytes(video_len)
        except KeyError:
-               video_len_str = '(unknown)'
+               video_len = None
+               video_len_str = 'N/A'
  
        byte_counter = 0
        block_size = const_initial_block_size
+       start_time = time.time()
        while True:
-               cond_print('\rRetrieving video data... %sk of %s ' % (to_k(byte_counter), video_len_str))
+               if video_len is not None:
+                       percent = float(byte_counter) / float(video_len) * 100.0
+                       percent_str = '%.1f' % percent
+                       eta_str = calc_eta(start_time, time.time(), video_len, byte_counter)
+               else:
+                       percent_str = '---.-'
+                       eta_str = '--:--'
+               counter = format_bytes(byte_counter)
+               speed_str = calc_speed(start_time, time.time(), byte_counter)
+               cond_print('\rRetrieving video data: %5s%% (%8s of %s) at %8s/s ETA %s ' % (percent_str, counter, video_len_str, speed_str, eta_str))
                before = time.time()
                video_block = video_data.read(block_size)
                after = time.time()
                video_file.write(video_block)
                block_size = new_block_size(before, after, dl_bytes)
  
 -              error_advice_exit('server did not send the expected ammount of data')
+       if video_len is not None and byte_counter != video_len:
++              error_advice_exit('server did not send the expected amount of data')
        video_file.close()
        cond_print('done.\n')
        cond_print('Video data saved to %s\n' % video_filename)
@@@ -312,9 -376,13 +376,13 @@@ except KeyboardInterrupt
        sys.exit('\n')
  
  # Rename video file if needed
- if cmdl_opts.use_title:
+ if cmdl_opts.use_title or cmdl_opts.use_literal:
        try:
-               final_filename = '%s-%s.flv' % (title_string_norm(video_title), video_url_id)
+               if cmdl_opts.use_title:
+                       prefix = title_string_norm(video_title)
+               else:
+                       prefix = title_string_touch(video_title)
+               final_filename = '%s-%s.flv' % (prefix, video_url_id)
                os.rename(video_filename, final_filename)
                cond_print('Video file renamed to %s\n' % final_filename)