mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 14:45:14 +00: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
	 Philipp Hagemeister
					Philipp Hagemeister