Usuari:PereBot/robot posa commonscat i busca fotos

# -*- coding: utf-8 -*-
"""
Programa que agafa els articles d'una categoria d'articles mancats de foto,
tria els que tenen la plantilla Commonscat, i fa una llista amb els que tenen
com a mínim una imatge jpeg a la categoria de Commons. A la llista hi posa
galeries de cada categoria.
A més, posa la plantilla commonscat a les categories que no la tinguin
si a Wikidata hi ha el paràmetre categoria de Commons.
PER FER: Aprofitar per fer llista de pàgines sense interviquis.
"""
import re, sys
sys.path.append('C:\pywikipedia')
import wikipedia,catlib

def insertaccat(page,afegit):
    """Funció que inserta la plantilla Commonscat (o un altre text) en una pàgina.
    Mira de posar-la davant de la plantilla Viquiespècies i si no hi és va buscant
    més llocs fins que al final la posa davant de les categories.
    Els arguments són la pàgina i el text a afegir (habitualment la plantilla amb
    el seu paràmetre.
    Retorna el text amb la plantilla (o sense, si no ha trobat on posar-la).
    És una adaptació de la del programa ccat monuments (l'argument és l'objecte pàgina i no el text).
    """
    if page.isRedirectPage():
        page = page.getRedirectTarget()
    text = page.get()
    if re.search(u"\{\{([Vv]iquiespècies|[Ww]ikispecies)", text):
        text = re.sub(u"\{\{([Vv]iquiespècies|[Ww]ikispecies)", u"%s\n{{Viquiespècies" % afegit, text)
        print u"Text afegit davant de la plantilla esborrany"
    elif re.search(u"== ?Enllaços externs ?==", text):  # PER FER: POSAR LA PLANTILLA ABANS DE VIQUIDITES, VIQUITEXTS, VIQUILLIBRES O VIQUINOTÍCIES, COM A PRIMERA OPCIÓ
        text=re.sub(u"(===? ?Enllaços externs ?===?)", u"== Enllaços externs ==\n%s" % afegit, text, count=1)
        print u"Text afegit a la secció Enllaços externs"
    elif re.search(u"== ?Enllaços ?==", text):
        text=re.sub(u"(== ?Enllaços ?==)", u"== Enllaços externs ==\n%s" % afegit, text, count=1)
        print u"Text afegit a la secció Enllaços (externs)"
    elif re.search(u"== ?Bibliograf[ií]a ?==", text):
        text=re.sub(u"== ?Bibliograf[ií]a ?==", u"== Bibliografia ==\n%s" % afegit, text, count=1)
        print u"Text afegit a la secció Bibliograf[ií]a"
    elif re.search(u"== ?Refer[eè]ncies ?==", text):
        text=re.sub(u"== ?Refer[eè]ncies ?==",u"== Referències ==\n%s" % afegit, text, count=1)
        print u"Text afegit a la secció Referències"
    elif re.search(u"\{\{[Ee]sborrany",text):
        text=re.sub(u"\{\{[Ee]sborrany", u"%s\n{{Esborrany" % afegit, text, count=1)
        print u"Text afegit davant de la plantilla esborrany"
    elif re.search(u"\{\{ORDENA", text):
        text=re.sub(u"\{\{ORDENA", u"%s\n{{ORDENA" % afegit, text, count=1)
        print u"Text afegit davant de l'ORDENA"
    elif re.search(u"\[\[ ?[Cc]ategoria:", text):
        text=re.sub(u"\[\[ ?[Cc]ategoria:",u"%s\n[[Categoria:" % afegit, text, count=1)
        print u"Text afegit davant de les categories"
    else:
        print u"No he trobat on afegir el text a %s" % page.title(asLink=True)
    return text

def dataccat(data):
    """
    Recupera la propietat "categoria de Commons" a Wikidata
    L'argument és una pàgina de wikidata (objecte pàgina)
    Retorna una cadena.
    Si no hi ha la propietat, retorna una cadena buida.
    """
    ccat=u""
    try:
        dict = data.get()
        claims = dict[u'claims']
        for el in claims:
            m = el[u'm']
            num = m[1]
            if num == 373:
                ccat = m[3]
    except IndexError:
        print u"Error: paràmetre sense contingut a wikidata"
        ccat = u""
    except wikipedia.NoPage:
        print u"Error: no hi ha pàgina a wikidata"
    except wikipedia.MaxTriesExceededError:
        print u"Error: Temps excedit"
    except urllib2.HTTPError:
        print u"Error HTTP (no deu funcionar el web)"
    return ccat

def catexisteix(nomcat):
    """
    Funció que comprova si una categoria existeix a Commons
    L'argument és el nom de la categoria (sense "category:")
    Retorna True o False
    Necessita la variable global sitecommons=wikipedia.getSite('commons','commons')
    """
    if len(nomcat)>1:
        titcat = u"Category:%s" % nomcat
        pagcat = wikipedia.Page(sitecommons, titcat)
        try:
            return pagcat.exists()
        except wikipedia.BadTitle:
            print u"Error: Mal títol"
            return False
        except wikipedia.InvalidTitle:
            print u"Error: Títol invàlid"
            return False
        except wikipedia.MaxTriesExceededError:
            print u"Error: Temps excedit"
            return False
        except urllib2.HTTPError:
            print u"Error HTTP (no deu funcionar el web)"
            return False
    else:
        print u"%s és massa curt per ser un nom de categoria" % nomcat
        return False

def galeria(llistimatges):
    """Transforma llista de fotos en galeria"""
    gal = "<gallery>\n"
    for imatge in llistimatges:
        if imatge.isImage():
            gal += u"{i}|{i}\n".format(i=imatge.title())
    gal += "</gallery>\n\n"
    return gal

#La part interessant comença aquí
def main():
    catbuscar = u"Amfibis que necessiten una foto"  # Categoria d'articles sense foto a buscar (sense subcategories)
    catnofoto = catlib.Category(site,catbuscar)
    artcat = catnofoto.articlesList(recurse=False)
    wikipedia.output(u"%i articles a %s" % (len(artcat), catnofoto)) 
    wikipedia.getall(site, artcat)
    numarticles = len(artcat)
    print u"%i articles a revisar" % numarticles
    paginforme = wikipedia.Page(
        site,
        u"Usuari:PereBot/Fotos per on manquen" # Canvieu això pel lloc on vulgueu la informació
    ) 
    noutext = paginforme.get()
    comptarticles = compta = 0
    resum = u"\n\n==%s==\n\n" % catbuscar
    for pag in artcat:
        comptarticles += 1
        compta += 1
        wikipedia.output(u"{}/{} {}" .format(comptarticles, numarticles, pag))
        tottemppar=pag.templatesWithParams()
        plantarticle=pag.templates()
        nhiha=False
        if not (u'Commonscat' in plantarticle):  # Aquí comença la part de posar la plantilla commonscat
            if u'Commonscat' in plantarticle or \
                u'Commons cat' in plantarticle or \
                u'Projectes germans' in plantarticle or \
                u'Commons category' in plantarticle or \
                u'Commons' in plantarticle or \
                u'Commonscat-inline' in plantarticle or \
                u'Commons cat' in plantarticle or \
                u'Wikimedia' in plantarticle:
                nhiha=True
                treure=False
                wikipedia.output(u"%s té la plantilla Commonscat, projectes germans, o similar" % pag.title(asLink=True))
            else:
                espai = pag.namespace()
                if espai not in (0, 14):
                    print pag, u"no és a l'espai d'articles ni al de categories"
                else:
                    try:
                        data = wikipedia.DataPage(pag)
                    except wikipedia.NoPage:
                        data = False
                        print u"Error: no hi ha pàgina a wikidata"
                    except wikipedia.MaxTriesExceededError:
                        data = False
                        print u"Error: Temps excedit"
                    except urllib2.HTTPError:
                        data = False
                        print u"Error HTTP (no deu funcionar el web)"
                    if data != False:
                        paramdata = dataccat(data)
                        if paramdata == "":
                            print u"No hi ha categoria a Commons segons Wikidata"
                        else:
                            print u"Categoria segons wikidata: %s" % paramdata
                            catdata = wikipedia.Page(sitecommons, u"Category:%s" % paramdata)
                            if catdata.exists():
                                wikipedia.output(u"la categoria %s existeix a Commons" % paramdata)
                                try:
                                    noutextart = insertaccat(pag, u"{{Commonscat}}\n")
                                    pag.put(
                                        noutextart,
                                        u"Robot afegint {{Commonscat}} que enllaça a "
                                        u"[[commons:category:%s]]" % paramdata
                                    )
                                    textactualitzat = pag.get(force=True) # Només serveix per recarregar la pàgina i actualitzar a la línia següent
                                    tottemppar = pag.templatesWithParams()
                                except wikipedia.LockedPage:
                                    print u"Error: Pàgina blocada"
                                except wikipedia.MaxTriesExceededError:
                                    print u"Error: Temps excedit"
                            else:
                                wikipedia.output(
                                    u"la categoria Commons:category:%s "
                                    "NO existeix a Commons" % paramdata
                                )
        for plant in tottemppar:   # Aquí comença la part de buscar fotos
            if plant[0] == u'Commonscat':
                nhiha = True
                if plant[1] == []:
                    try:
                        data = wikipedia.DataPage(pag)
                    except wikipedia.NoPage:
                        data = False
                        print u"Error: no hi ha pàgina a wikidata"
                    except wikipedia.MaxTriesExceededError:
                        data = False
                        print u"Error: Temps excedit"
                    except urllib2.HTTPError:
                        data = False
                        print u"Error HTTP (no deu funcionar el web)"
                    if data != False:
                        paramdata = dataccat(data)
                        if paramdata == "":
                            print u"No hi ha categoria a Commons segons Wikidata"
                            param = ""
                        else:
                            param = paramdata
                else:
                    param = plant[1][0]
                if len(param)>1:
                    if catexisteix(param): 
                        print u"La categoria %s existeix a Commons" % param
                        catcommons = catlib.Category(sitecommons, param)
                        fotos = catcommons.articlesList()
                        numfotos = len(fotos)
                        jpegs = 0
                        for imatge in fotos:
                            titfoto = imatge.title()
                            if re.search(u"\.jpe?g", titfoto, re.I):
                                jpegs += 1
                        tit = pag.title()
                        print u"Hi ha %i imatges a la categoria" % numfotos
                        print u"de les quals %i són jpeg" % jpegs
                        subcats = catcommons.subcategoriesList()
                        try:
                            print u"Hi ha les subcategories %s a la categoria" % subcats
                        except UnicodeEncodeError:
                            print u"Error subcategories amb caràcters no imprimibles"
                        if jpegs > 0 or len(subcats) > 0:
                            resum += u"\n===[[{t}]]===\n*[[{t}]]\n*[[:commons:Category:{}]]\n".format(param, t=tit)
                        if jpegs > 0:
                            resum += galeria(fotos)
                            compta += 3
                        if len(subcats) > 0:
                            resum += u"*Subcategories:\n"
                            for subcat in subcats:
                                resum += u"**[[:commons:%s]]\n" % subcat.title()            
                            compta += 3
                        if jpegs > 0 or len(subcats) > 0:
                            if compta>160:
                                noutext += resum
                                try:
                                    paginforme.put(noutext,catbuscar)
                                except EditConflict:
                                    noutext = paginforme.get(force=True)
                                    noutext += resum
                                    paginforme.put(noutext, u"%s (conflicte d'edicions)" % catbuscar)
                                resum = u""
                                compta = 0
                    else:
                        wikipedia.output(u"La categoria %s no existeix a Commons." % param) 
                        treure=True            
    noutext=noutext+resum
    try:
        paginforme.put(noutext, u"%s, tasca acabada." % catbuscar)
    except EditConflict:
        noutext = paginforme.get(force=True)
        noutext += resum
        paginforme.put(noutext, u"%s, tasca acabada (conflicte d'edicions)" % catbuscar)
    return

#El programa comença aquí
if __name__ == '__main__':
    try:
        site=wikipedia.getSite('ca')
        sitecommons=wikipedia.getSite('commons','commons')
        main()
    finally:
        wikipedia.stopme()