mirror of
				https://gitlab.com/ytdl-org/youtube-dl.git
				synced 2025-11-04 03:27:06 -05:00 
			
		
		
		
	Add --xattr-set-filesize option (Fixes #1348)
This commit is contained in:
		@@ -231,7 +231,8 @@ class YoutubeDL(object):
 | 
				
			|||||||
    The following parameters are not used by YoutubeDL itself, they are used by
 | 
					    The following parameters are not used by YoutubeDL itself, they are used by
 | 
				
			||||||
    the FileDownloader:
 | 
					    the FileDownloader:
 | 
				
			||||||
    nopart, updatetime, buffersize, ratelimit, min_filesize, max_filesize, test,
 | 
					    nopart, updatetime, buffersize, ratelimit, min_filesize, max_filesize, test,
 | 
				
			||||||
    noresizebuffer, retries, continuedl, noprogress, consoletitle
 | 
					    noresizebuffer, retries, continuedl, noprogress, consoletitle,
 | 
				
			||||||
 | 
					    xattr_set_filesize.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    The following options are used by the post processors:
 | 
					    The following options are used by the post processors:
 | 
				
			||||||
    prefer_ffmpeg:     If True, use ffmpeg instead of avconv if both are available,
 | 
					    prefer_ffmpeg:     If True, use ffmpeg instead of avconv if both are available,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -241,6 +241,11 @@ def _real_main(argv=None):
 | 
				
			|||||||
            'verboseOutput': opts.verbose,
 | 
					            'verboseOutput': opts.verbose,
 | 
				
			||||||
            'exec_cmd': opts.exec_cmd,
 | 
					            'exec_cmd': opts.exec_cmd,
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
 | 
					    if opts.xattr_set_filesize:
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            import xattr
 | 
				
			||||||
 | 
					        except ImportError:
 | 
				
			||||||
 | 
					            parser.error('setting filesize xattr requested but python-xattr is not available')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ydl_opts = {
 | 
					    ydl_opts = {
 | 
				
			||||||
        'usenetrc': opts.usenetrc,
 | 
					        'usenetrc': opts.usenetrc,
 | 
				
			||||||
@@ -337,6 +342,7 @@ def _real_main(argv=None):
 | 
				
			|||||||
        'external_downloader': opts.external_downloader,
 | 
					        'external_downloader': opts.external_downloader,
 | 
				
			||||||
        'list_thumbnails': opts.list_thumbnails,
 | 
					        'list_thumbnails': opts.list_thumbnails,
 | 
				
			||||||
        'playlist_items': opts.playlist_items,
 | 
					        'playlist_items': opts.playlist_items,
 | 
				
			||||||
 | 
					        'xattr_set_filesize': opts.xattr_set_filesize,
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    with YoutubeDL(ydl_opts) as ydl:
 | 
					    with YoutubeDL(ydl_opts) as ydl:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,21 +25,23 @@ class FileDownloader(object):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    Available options:
 | 
					    Available options:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    verbose:           Print additional info to stdout.
 | 
					    verbose:            Print additional info to stdout.
 | 
				
			||||||
    quiet:             Do not print messages to stdout.
 | 
					    quiet:              Do not print messages to stdout.
 | 
				
			||||||
    ratelimit:         Download speed limit, in bytes/sec.
 | 
					    ratelimit:          Download speed limit, in bytes/sec.
 | 
				
			||||||
    retries:           Number of times to retry for HTTP error 5xx
 | 
					    retries:            Number of times to retry for HTTP error 5xx
 | 
				
			||||||
    buffersize:        Size of download buffer in bytes.
 | 
					    buffersize:         Size of download buffer in bytes.
 | 
				
			||||||
    noresizebuffer:    Do not automatically resize the download buffer.
 | 
					    noresizebuffer:     Do not automatically resize the download buffer.
 | 
				
			||||||
    continuedl:        Try to continue downloads if possible.
 | 
					    continuedl:         Try to continue downloads if possible.
 | 
				
			||||||
    noprogress:        Do not print the progress bar.
 | 
					    noprogress:         Do not print the progress bar.
 | 
				
			||||||
    logtostderr:       Log messages to stderr instead of stdout.
 | 
					    logtostderr:        Log messages to stderr instead of stdout.
 | 
				
			||||||
    consoletitle:      Display progress in console window's titlebar.
 | 
					    consoletitle:       Display progress in console window's titlebar.
 | 
				
			||||||
    nopart:            Do not use temporary .part files.
 | 
					    nopart:             Do not use temporary .part files.
 | 
				
			||||||
    updatetime:        Use the Last-modified header to set output file timestamps.
 | 
					    updatetime:         Use the Last-modified header to set output file timestamps.
 | 
				
			||||||
    test:              Download only first bytes to test the downloader.
 | 
					    test:               Download only first bytes to test the downloader.
 | 
				
			||||||
    min_filesize:      Skip files smaller than this size
 | 
					    min_filesize:       Skip files smaller than this size
 | 
				
			||||||
    max_filesize:      Skip files larger than this size
 | 
					    max_filesize:       Skip files larger than this size
 | 
				
			||||||
 | 
					    xattr_set_filesize: Set ytdl.filesize user xattribute with expected size.
 | 
				
			||||||
 | 
					                        (experimenatal)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Subclasses of this one must re-define the real_download method.
 | 
					    Subclasses of this one must re-define the real_download method.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -157,6 +157,14 @@ class HttpFD(FileDownloader):
 | 
				
			|||||||
                except (OSError, IOError) as err:
 | 
					                except (OSError, IOError) as err:
 | 
				
			||||||
                    self.report_error('unable to open for writing: %s' % str(err))
 | 
					                    self.report_error('unable to open for writing: %s' % str(err))
 | 
				
			||||||
                    return False
 | 
					                    return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if self.params.get('xattr_set_filesize', False) and data_len is not None:
 | 
				
			||||||
 | 
					                    try:
 | 
				
			||||||
 | 
					                        import xattr
 | 
				
			||||||
 | 
					                        xattr.setxattr(tmpfilename, 'user.ytdl.filesize', str(data_len))
 | 
				
			||||||
 | 
					                    except(OSError, IOError, ImportError) as err:
 | 
				
			||||||
 | 
					                        self.report_error('unable to set filesize xattr: %s' % str(err))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                stream.write(data_block)
 | 
					                stream.write(data_block)
 | 
				
			||||||
            except (IOError, OSError) as err:
 | 
					            except (IOError, OSError) as err:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -394,6 +394,10 @@ def parseOpts(overrideArguments=None):
 | 
				
			|||||||
        '--playlist-reverse',
 | 
					        '--playlist-reverse',
 | 
				
			||||||
        action='store_true',
 | 
					        action='store_true',
 | 
				
			||||||
        help='Download playlist videos in reverse order')
 | 
					        help='Download playlist videos in reverse order')
 | 
				
			||||||
 | 
					    downloader.add_option(
 | 
				
			||||||
 | 
					        '--xattr-set-filesize',
 | 
				
			||||||
 | 
					        dest='xattr_set_filesize', action='store_true',
 | 
				
			||||||
 | 
					        help='(experimental) set file xattribute ytdl.filesize with expected filesize')
 | 
				
			||||||
    downloader.add_option(
 | 
					    downloader.add_option(
 | 
				
			||||||
        '--external-downloader',
 | 
					        '--external-downloader',
 | 
				
			||||||
        dest='external_downloader', metavar='COMMAND',
 | 
					        dest='external_downloader', metavar='COMMAND',
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user