diff --git a/test/parameters.json b/test/parameters.json index 2e186e2d5..1b7aa2ccd 100644 --- a/test/parameters.json +++ b/test/parameters.json @@ -7,6 +7,7 @@ "forcethumbnail": false, "forcetitle": false, "forceurl": false, + "force_write_download_archive": false, "format": "best", "ignoreerrors": false, "listformats": null, diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 24b660f93..8f2615b8f 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -162,6 +162,8 @@ class YoutubeDL(object): forcejson: Force printing info_dict as JSON. dump_single_json: Force printing the info_dict of the whole playlist (or video) as a single JSON line. + force_write_download_archive: Force writing download archive regardless of + 'skip_download' or 'simulate'. simulate: Do not download the video files. format: Video format code. See options.py for more information. outtmpl: Template for output names. @@ -214,9 +216,7 @@ class YoutubeDL(object): downloaded. None for no limit. download_archive: File name of a file where all downloads are recorded. Videos already present in the file are not downloaded - again. When 'writelink' (or similar) and - 'skip_download' are also present, the videos will be - recorded, too. + again. cookiefile: File name where cookies should be read from and dumped to. nocheckcertificate:Do not verify SSL certificates prefer_insecure: Use HTTP instead of HTTPS to retrieve information. @@ -1419,8 +1419,6 @@ class YoutubeDL(object): raise ExtractorError('Missing "id" field in extractor result') if 'title' not in info_dict: raise ExtractorError('Missing "title" field in extractor result') - if 'webpage_url' not in info_dict: - raise ExtractorError('Missing "webpage_url" field in extractor result. Should have been augmented with it.') def report_force_conversion(field, field_not, conversion): self.report_warning( @@ -1751,8 +1749,11 @@ class YoutubeDL(object): if self.params.get('forcejson', False): self.to_stdout(json.dumps(info_dict)) - # Do nothing else if in simulate mode if self.params.get('simulate', False): + if self.params.get('force_write_download_archive', False): + self.record_download_archive(info_dict) + + # Do nothing else if in simulate mode return if filename is None: @@ -1867,6 +1868,9 @@ class YoutubeDL(object): desktop_link = True if url_link or webloc_link or desktop_link: + if 'webpage_url' not in info_dict: + self.report_error('Cannot write internet shortcut file because the "webpage_url" field is missing in the media information') + return ascii_url = iri_to_uri(info_dict['webpage_url']) def _write_link_file(extension, template, newline, embed_filename): @@ -1896,13 +1900,9 @@ class YoutubeDL(object): if not _write_link_file('desktop', DESKTOP_LINK_TEMPLATE, '\n', embed_filename=True): return - if self.params.get('skip_download', False): - # Regarding the download archive, consider internet shortcut creation in conjunction with the `--skip-download` switch as everything the user wants. (See also help for the`--download-archive` switch.) - if url_link or webloc_link or desktop_link: - self.record_download_archive(info_dict) - # Download - else: # No `--skip-download` + must_record_download_archive = False + if not self.params.get('skip_download', False): try: def dl(name, info): fd = get_suitable_downloader(info, self.params)(self, self.params) @@ -2049,7 +2049,10 @@ class YoutubeDL(object): except (PostProcessingError) as err: self.report_error('postprocessing: %s' % str(err)) return - self.record_download_archive(info_dict) + must_record_download_archive = True + + if must_record_download_archive or self.params.get('force_write_download_archive', False): + self.record_download_archive(info_dict) def download(self, url_list): """Download a given list of URLs.""" diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index b05494c39..792ff2d59 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -333,6 +333,7 @@ def _real_main(argv=None): 'forceformat': opts.getformat, 'forcejson': opts.dumpjson or opts.print_json, 'dump_single_json': opts.dump_single_json, + 'force_write_download_archive': opts.force_write_download_archive, 'simulate': opts.simulate or any_getting, 'skip_download': opts.skip_download, 'format': opts.format, diff --git a/youtube_dl/options.py b/youtube_dl/options.py index 54d44af36..a17ee6322 100644 --- a/youtube_dl/options.py +++ b/youtube_dl/options.py @@ -343,7 +343,7 @@ def parseOpts(overrideArguments=None): selection.add_option( '--download-archive', metavar='FILE', dest='download_archive', - help='Download only videos not listed in the archive file. Record the IDs of all downloaded videos in it. When the switches --write-link (or similar) and --skip-download are used additionally, the IDs will also be recorded, even though nothing was actually downloaded.') + help='Download only videos not listed in the archive file. Record the IDs of all downloaded videos in it.') selection.add_option( '--include-ads', dest='include_ads', action='store_true', @@ -633,8 +633,11 @@ def parseOpts(overrideArguments=None): verbosity.add_option( '--print-json', action='store_true', dest='print_json', default=False, - help='Be quiet and print the video information as JSON (video is still being downloaded).', - ) + help='Be quiet and print the video information as JSON (video is still being downloaded).') + verbosity.add_option( + '--force-write-download-archive', + action='store_true', dest='force_write_download_archive', default=False, + help='Force download archive entries to be written as far as no errors occur, even though --skip-download or any simulation switch is used.') verbosity.add_option( '--newline', action='store_true', dest='progress_with_newline', default=False,