User:John Bot II/Source

  1. -*- coding: utf-8 -*-
  2. MoveIMG.py
  3. Moves images from wikipedia to the commons that have been approved
  4. by users.
  5. By CWii, 2008
  6. Uploading portion based off imagecopy.py

import os, sys, re, codecs

import urllib, httplib, urllib2

import catlib, thread, webbrowser

import time, threading

import wikipedia, config, socket

import pagegenerators, add_text

from upload import *

from image import *

moveToCommonsTemplate = {

'en': [u'Commons ok', u'Copy to Wikimedia Commons', u'Move to commons', u'Movetocommons', u'To commons', u'Copy to Wikimedia Commons by BotMultichill'],

}

def pageTextPost(url,parameters):

gotInfo = False;

while(not gotInfo):

try:

commonsHelperPage = urllib.urlopen("http://toolserver.org/~magnus/commonshelper.php", parameters)

data = commonsHelperPage.read().decode('utf-8')

gotInfo = True;

except IOError:

wikipedia.output(u'Got an IOError, let\'s try again')

except socket.timeout:

wikipedia.output(u'Got a timeout, let\'s try again')

return data

class imageTransfer (threading.Thread):

def __init__ ( self, imagePage, newname, comcat1, comcat2, comcat3, comcat4, comcat5, comcat6, hascat, user ):

self.imagePage = imagePage

self.newname = newname

self.comcat1 = comcat1

self.comcat2 = comcat2

self.comcat3 = comcat3

self.comcat4 = comcat4

self.comcat5 = comcat5

self.comcat6 = comcat6

self.hascat = hascat

self.user = user

threading.Thread.__init__ ( self )

def run(self):

tosend={'language':self.imagePage.site().language().encode('utf-8'),

'image':self.imagePage.titleWithoutNamespace().encode('utf-8'),

'newname':self.newname.encode('utf-8'),

'project':self.imagePage.site().family.name.encode('utf-8'),

'username':'',

'commonsense':'1',

'remove_categories':'1',

'ignorewarnings':'1',

'doit':'Uitvoeren'

}

tosend=urllib.urlencode(tosend)

print tosend

CH=pageTextPost('http://www.toolserver.org/~magnus/commonshelper.php', tosend)

print 'Got CH desc.'

tablock=CH.split('')[0]

CH=CH.replace(u'×', u'×')

wikipedia.output(CH);

if self.hascat:

if not self.comcat1 == '':

CH=CH+'\nCategory:%s'%self.comcat1

if not self.comcat2 == '':

CH=CH+'\nCategory:%s'%self.comcat2

if not self.comcat3 == '':

CH=CH+'\nCategory:%s'%self.comcat3

if not self.comcat4 == '':

CH=CH+'\nCategory:%s'%self.comcat4

if not self.comcat5 == '':

CH=CH+'\nCategory:%s'%self.comcat5

if not self.comcat6 == '':

CH=CH+'\nCategory:%s'%self.comcat6

CH=u'{{JB2-Moved|'+ self.imagePage.site().language() + '.' + self.imagePage.site().family.name +'|time=~~~~~|user=%s}}' % self.user + CH

CH=CH.decode('utf-8')

if '[[category:' in CH.lower():

# I want every picture to be tagged with the bottemplate so i can check my contributions later.

re.sub(r'\{\{subst:Unc\}\} ', '', CH)

#urlEncoding='utf-8'

bot = UploadRobot(url=self.imagePage.fileUrl(), description=CH, useFilename=self.newname, keepFilename=True, verifyDescription=False, ignoreWarning = True, targetSite = wikipedia.getSite('commons', 'commons'))

bot.run()

#Should check if the image actually was uploaded

if wikipedia.Page(wikipedia.getSite('commons', 'commons'), u'Image:' + self.newname).exists():

#Get a fresh copy, force to get the page so we dont run into edit conflicts

imtxt=self.imagePage.get(force=True)

#Remove the move to commons templates

##if moveToCommonsTemplate.has_key(self.imagePage.site().language()):

for moveTemplate in moveToCommonsTemplate[self.imagePage.site().language()]:

imtxt = re.sub(u'(?i)\{\{' + moveTemplate + u'\}\}', u'', imtxt)

#add {{NowCommons}}

#if nowCommonsTemplate.has_key(self.imagePage.site().language()):

addTemplate = u'{{subst:ncd|%s}}' % self.newname

#else:

# addTemplate = nowCommonsTemplate['_default'] % self.newname

#if nowCommonsMessage.has_key(self.imagePage.site().language()):

commentText = u'File is now available on Wikimedia Commons.'

#else:

# commentText = nowCommonsMessage['_default']

re.sub('\|canMove=yes\|', '|canMove=botMoved|', imtxt)

wikipedia.showDiff(self.imagePage.get(), imtxt+addTemplate)

self.imagePage.put(imtxt + addTemplate, comment = commentText)

self.gen = pagegenerators.FileLinksGenerator(self.imagePage)

self.preloadingGen = pagegenerators.PreloadingGenerator(self.gen)

#If the image is uploaded under a different name, replace all instances

if self.imagePage.titleWithoutNamespace() != self.newname:

#if imageMoveMessage.has_key(self.imagePage.site().language()):

moveSummary = u'Image moved to commons.' % (self.imagePage.titleWithoutNamespace(), self.newname)

#else:

# moveSummary = imageMoveMessage['_default'] % (self.imagePage.titleWithoutNamespace(), self.newname)

imagebot = ImageRobot(generator = self.preloadingGen, oldImage = self.imagePage.titleWithoutNamespace(), newImage = self.newname, summary = moveSummary, always = True, loose = True)

imagebot.run()

return

def log(event, site):

logPage = wikipedia.Page(site,'User:John_Bot_II/Report')

pageText = logPage.get()

newText = '\n*' + event + '-- ~~~~'

logPage.put(pageText+newText,'BOT: Error Report')

return

def main():

site = wikipedia.getSite()

cat = catlib.Category(site,'Images_ready_to_be_moved_by_John_Bot_II')

#gen = pagegenerators.CategorizedPageGenerator('Category:Images ready to be moved by John Bot II')

gen = pagegenerators.CategorizedPageGenerator(cat)

pgen = pagegenerators.PreloadingGenerator(gen)

wikipedia.handleArgs()

checkPage = wikipedia.Page(site,'User:John Bot II/CheckPage')

checkPageText = checkPage.get()

aUsers = checkPageText.lower().split('\n')

for page in pgen:

#page = wikipedia.Page(site,'Image:CWii2.jpg')

if page.exists() and (page.namespace() == 6) and (not page.isRedirectPage()) :

imagepage = wikipedia.ImagePage(page.site(), page.title())

#Let's process.

ptext = imagepage.get()

if not re.search('\{\{Jb2move',ptext,re.I):

#page not found

wikipedia.output('Template not found')

continue

#test = re.findall('\|canMove="(.*?)"\|', ptext, re.I)

canmoveRe = re.compile(r"\|canMove=(.*?)\|")

cmMatch = canmoveRe.search(ptext)

if cmMatch:

canMove = cmMatch.group()

canMove = canMove.strip('|').split('=')

canMove = canMove[1]

else:

canMove = ""

wikipedia.output("ERROR: Couldn't get canMove status, skiping.")

log('Could not get canMove status on :%s' % imagepage.title(), site)

#TODO: Log and error mark here

continue

if not canMove == 'yes':

wikipedia.output("Image isn't movable")

log('WTF? Image isnt movable on :%s' % imagepage.title(), site)

continue

userRe = re.compile(r"\|user=(.*?)\|")

uMatch = userRe.search(ptext)

if uMatch:

user = uMatch.group()

user = user.strip('|').split('=')

user = user[1]

else:

user = ""

wikipedia.output("ERROR: User is not given")

log('User not given. :%s' % imagepage.title(), site)

continue

if not user.lower() in aUsers:

wikipedia.output("ERROR: %s isn't on CheckPage!" % user)

log('User %s isnt given on :%s' % (user,imagepage.title()) , site)

continue

newnameRe = re.compile(r"\|newName=.*?\}\}")

newnameMatch = newnameRe.search(ptext)

if newnameMatch:

newname = newnameMatch.group()

newname = newname.strip('|}').split('=')

newname = newname[1]

else:

newname = ''

if not newname == '':

commonsImage = wikipedia.Page(wikipedia.getSite('commons','commons'),'Image:'+newname)

else:

commonsImage = wikipedia.Page(wikipedia.getSite('commons','commons'),imagepage.title())

if commonsImage.exists():

#Yarr! They be taking our names!

wikipedia.output('ERROR: The image already exists on the commons')

continue

hascatRe = re.compile(r"\|comCat\d=.*?\|")

hascatMatch = hascatRe.search(ptext)

if hascatMatch:

hascat = True

else:

hascat = False

wikipedia.output("NOTICE: No cats defined!")

if hascat:

comcat1Match = re.search(r"\|comCat1=.*?\|", ptext, re.I)

comcat2Match = re.search(r"\|comCat2=.*?\|", ptext, re.I)

comcat3Match = re.search(r"\|comCat3=.*?\|", ptext, re.I)

comcat4Match = re.search(r"\|comCat4=.*?\|", ptext, re.I)

comcat5Match = re.search(r"\|comCat5=.*?\|", ptext, re.I)

comcat6Match = re.search(r"\|comCat6=.*?\|", ptext, re.I)

if comcat1Match:

comcat1 = comcat1Match.group()

comcat1 = comcat1.strip('|').split('=')

comcat1 = comcat1[1]

else:

comcat1 = ''

if comcat2Match:

comcat2 = comcat2Match.group()

comcat2 = comcat2.strip('|').split('=')

comcat2 = comcat2[1]

else:

comcat2 = ''

if comcat3Match:

comcat3 = comcat3Match.group()

comcat3 = comcat3.strip('|').split('=')

comcat3 = comcat3[1]

else:

comcat3 = ''

if comcat4Match:

comcat4 = comcat4Match.group()

comcat4 = comcat4.strip('|').split('=')

comcat4 = comcat4[1]

else:

comcat4 = ''

if comcat5Match:

comcat5 = comcat5Match.group()

comcat5 = comcat5.strip('|').split('=')

comcat5 = comcat5[1]

else:

comcat5 = ''

if comcat6Match:

comcat6 = comcat6Match.group()

comcat6 = comcat6.strip('|').split('=')

comcat6 = comcat6[1]

else:

comcat6 = ''

else:

comcat1 = ''

comcat2 = ''

comcat3 = ''

comcat4 = ''

comcat5 = ''

comcat6 = ''

if newname == '': newname = imagepage.titleWithoutNamespace()

imageTransfer(imagepage, newname, comcat1, comcat2, comcat3, comcat4, comcat5, comcat6, hascat, user).start()

if __name__ == "__main__":

try:

main()

finally:

wikipedia.stopme()