When I try to use FilePage.upload() (or APISite.upload()) to replace an existing file from a URL, I get a ValueError, "Can request stash information only when using a file name." Here's a trivial test case (running in a valid bot account, targetting Commons):
import pywikibot site = pywikibot.Site() page = pywikibot.FilePage(site, "File:Barth Bridge.jpg") url = "http://www.geograph.org.uk/reuse.php?id=3629869&download=b6f1d3b9&size=original" site.upload(page, source_url=url, ignore_warnings=["exists"], comment="Higher-resolution version from Geograph.")
I'd expect this to successfully overwrite the file, but instead it does this:
Sleeping for 7.9 seconds, 2017-08-28 16:23:54 Traceback (most recent call last): File "pwb.py", line 262, in <module> if not main(): File "pwb.py", line 255, in main run_python_file(filename, [filename] + args, argvu, file_package) File "pwb.py", line 121, in run_python_file main_mod.__dict__) File "../scripts/uploadtest.py", line 9, in <module> comment="Higher-resolution version from Geograph.") File "/home/bjh21/geograph-update-bot/pywikibot-core/pywikibot/tools/__init__.py", line 1458, in wrapper return obj(*__args, **__kw) File "/home/bjh21/geograph-update-bot/pywikibot-core/pywikibot/site.py", line 6363, in upload result['offset'], report_success=False) File "/home/bjh21/geograph-update-bot/pywikibot-core/pywikibot/tools/__init__.py", line 1458, in wrapper return obj(*__args, **__kw) File "/home/bjh21/geograph-update-bot/pywikibot-core/pywikibot/site.py", line 6149, in upload raise ValueError('Can request stash information only when ' ValueError: Can request stash information only when using a file name. <class 'ValueError'> CRITICAL: Closing network session.
version.py output:
Pywikibot: [https] r-pywikibot-core.git (f07e4bb, g8564, 2017/08/27, 22:45:37, n/a) Release version: 3.0-dev requests version: 2.9.1 cacerts: /etc/ssl/certs/ca-certificates.crt certificate test: ok Python: 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] PYWIKIBOT2_DIR: Not set PYWIKIBOT2_DIR_PWB: PYWIKIBOT2_NO_USER_CONFIG: Not set Config base dir: /home/bjh21/geograph-update-bot/pywikibot-core Usernames for family "commons": commons: Geograph Update Bot (no sysop configured)
This patch works around the problem for me, but I really don't think it's correct. I think it causes pywikibot to assume that the stashed upload is valid rather than trying to check it against a local file:
diff --git a/pywikibot/site.py b/pywikibot/site.py index 0e5efbd..cd0927b 100644 --- a/pywikibot/site.py +++ b/pywikibot/site.py @@ -6355,7 +6355,7 @@ class APISite(BaseSite): pywikibot.warning('No filekey defined.') if not report_success: if 'offset' not in result: - result['offset'] = True + result['offset'] = False if ignore_warnings(create_warnings_list(result)): return self.upload( filepage, source_filename, source_url, comment, text,