Progetto:Bot/Programmi in Python per i bot/CategorieAutori.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

import pywikibot as wikipedia, re
from pywikibot import pagegenerators
from scripts import touch
import catlib, string, random

sito=wikipedia.getSite("it")

def crea(catname, catsopra, nomecognome, cognomenome):

        cat = catlib.Category(sito, title=catname)

        if not cat.isEmptyCategory() and not cat.exists():
                cat.put(u"{{Vedi anche autore|"+nomecognome+"}}\n\n[[Categoria:"+catsopra+"|"+cognomenome+"]]", "Bot - CategorieAutori.py: creazione categoria")
                return True
        return False

def esegui(gen, titoloPrefix):

        for page in gen:
                titolo = page.title()
                titolo = titolo.replace(titoloPrefix, "")
                testo = page.get()
                m = re.search("<section begin=\"Nome\"/>(.*?)<section end=\"Nome\"/>", testo)
                if m:
                        nome = m.group(1)
                else:
                        nome = ""
                m = re.search("<section begin=\"Cognome\"/>(.*?)<section end=\"Cognome\"/>", testo)
                if m:
                        cognome = m.group(1)
                else:
                        cognome = nome
                        nome = ""

                if nome != "":
                        cognomenome = cognome + ", " + nome
                        nomecognome = nome+" "+cognome
                else:
                        cognomenome = cognome
                        nomecognome = cognome

                m = re.search("<section begin=\"Disambigua\"/>(.*?)<section end=\"Disambigua\"/>", testo)
                if m:
                        nomecognome = nomecognome + " " + m.group(1)

                creata = crea(u"Testi di "+titolo, "Testi per autore", nomecognome, cognomenome)
                creata = creata or crea(u"Testi curati da "+titolo, "Testi per curatore", nomecognome, cognomenome)
                creata = creata or crea(u"Testi musicati da "+titolo, "Testi per compositore", nomecognome, cognomenome)
                creata = creata or crea(u"Traduzioni di "+titolo, "Testi per traduttore", nomecognome, cognomenome)
                creata = creata or crea(u"Testi in cui è citato "+titolo, "Testi per autore citato", nomecognome, cognomenome)
                creata = creata or crea(u"Pagine in cui è citato "+titolo, "Pagine per autore citato", nomecognome, cognomenome)
                creata = creata or crea(u"Libri curati da "+titolo, "Libri per curatore", nomecognome, cognomenome)
                creata = creata or crea(u"Libri di "+titolo, "Libri per autore", nomecognome, cognomenome)
                creata = creata or crea(u"Opere di "+titolo, "Opere per autore", nomecognome, cognomenome)

                #touch della pagina per forzare il refresh delle categorie
                if creata:
                        page.put(testo, "Pywikibot touch script")

def main():

        #inizia da un punto casuale
        begin = 'A'
        if random.random() < 0.5:
                begin = random.choice(string.ascii_lowercase) + random.choice(string.ascii_lowercase);
        gen = pagegenerators.AllpagesPageGenerator(begin, namespace=102, includeredirects=False, site=sito)
        gen = pagegenerators.PreloadingGenerator(gen)

        esegui(gen, "Autore:")

if __name__ == "__main__":
        try:
                main()
        finally:
                wikipedia.stopme()