#!/usr/bin/env python3"""Bot to add images to Wikidata items.The image is extracted from the page_props. For this to be available thePageImages extension (https://www.mediawiki.org/wiki/Extension:PageImages)needs to be installedUsage: python pwb.py illustrate_wikidata <some generator>¶ms;"""## (C) Pywikibot team, 2013-2022## Distributed under the terms of MIT license.#from__future__importannotationsimportpywikibotfrompywikibotimportWikidataBot,pagegeneratorsdocuReplacements={'¶ms;':pagegenerators.parameterHelp}# noqa: N816
[docs]classIllustrateRobot(WikidataBot):"""A bot to add Wikidata image claims."""def__init__(self,wdproperty:str='P18',**kwargs)->None:"""Initializer. :param wdproperty: The property to add. Should be of type commonsMedia """super().__init__(**kwargs)self.wdproperty=wdpropertyself.cacheSources()claim=pywikibot.Claim(self.repo,self.wdproperty)ifclaim.type!='commonsMedia':raiseValueError('{} is of type {}, should be commonsMedia'.format(self.wdproperty,claim.type))
[docs]deftreat_page_and_item(self,page,item)->None:"""Treat a page / item."""pywikibot.info('Found '+item.title())imagename=page.properties().get('page_image_free')ifnotimagename:returnclaims=item.get().get('claims')ifself.wdpropertyinclaims:pywikibot.info('Item {} already contains image ({})'.format(item.title(),self.wdproperty))returnnewclaim=pywikibot.Claim(self.repo,self.wdproperty)commonssite=pywikibot.Site('commons')imagelink=pywikibot.Link(imagename,source=commonssite,default_namespace=6)image=pywikibot.FilePage(imagelink)ifimage.isRedirectPage():image=pywikibot.FilePage(image.getRedirectTarget())ifnotimage.exists():pywikibot.info(f"{image} doesn't exist so I can't link to it")returnnewclaim.setTarget(image)# A generator might yield pages from multiple sitesself.user_add_claim(item,newclaim,page.site)
[docs]defmain(*args:str)->None:""" Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. :param args: command line arguments """# Process global args and prepare generator args parserlocal_args=pywikibot.handle_args(args)generator_factory=pagegenerators.GeneratorFactory()wdproperty='P18'forarginlocal_args:ifarg.startswith('-property'):iflen(arg)==9:wdproperty=pywikibot.input('Please enter the property you want to add:')else:wdproperty=arg[10:]else:generator_factory.handle_arg(arg)generator=generator_factory.getCombinedGenerator(preload=True)ifnotgenerator:pywikibot.bot.suggest_help(missing_generator=True)returnbot=IllustrateRobot(wdproperty,generator=generator)bot.run()