Revision: 7188
Author: multichill
Date: 2009-08-31 09:30:38 +0000 (Mon, 31 Aug 2009)
Log Message:
-----------
svn properties
Modified Paths:
--------------
trunk/pywikipedia/flickrripper.py
Property Changed:
----------------
trunk/pywikipedia/flickrripper.py
Modified: trunk/pywikipedia/flickrripper.py
===================================================================
--- trunk/pywikipedia/flickrripper.py 2009-08-28 23:11:46 UTC (rev 7187)
+++ trunk/pywikipedia/flickrripper.py 2009-08-31 09:30:38 UTC (rev 7188)
@@ -1,392 +1,392 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-'''
-Tool to copy a flickr stream to Commons
-
-# Get a set to work on (start with just a username).
-# * Make it possible to delimit the set (from/to)
-#For each image
-#*Check the license
-#*Check if it isn't already on Commons
-#*Build suggested filename
-#**Check for name collision and maybe alter it
-#*Pull description from Flinfo
-#*Show image and description to user
-#**Add a nice hotcat lookalike for the adding of categories
-#**Filter the categories
-#*Upload the image
-
-Todo:
-*Check if the image is already uploaded (SHA hash)
-*Check and prevent filename collisions
-**Initial suggestion
-**User input
-*Filter the categories
-
-'''
-#
-# (C) Multichill, 2009
-#
-# Distributed under the terms of the MIT license.
-#
-__version__ = '$Id: upload_to_commons.py 69 2009-08-23 11:44:26Z multichill $'
-
-import sys, urllib, re, StringIO
-import wikipedia, config, query, imagerecat, upload
-
-import flickrapi # see:
http://stuvel.eu/projects/flickrapi
-import xml.etree.ElementTree
-from Tkinter import *
-from PIL import Image, ImageTk # see:
http://www.pythonware.com/products/pil/
-
-def getPhoto(flickr = None, photo_id = ''):
- '''
- Get the photo info and the photo sizes so we can use these later on
- '''
- photoInfo = flickr.photos_getInfo(photo_id=photo_id)
- #xml.etree.ElementTree.dump(photoInfo)
- photoSizes = flickr.photos_getSizes(photo_id=photo_id)
- #xml.etree.ElementTree.dump(photoSizes)
- return (photoInfo, photoSizes)
-
-def isAllowedLicense(photoInfo = None):
- '''
- Check if the image contains the right license
- '''
- license = photoInfo.find('photo').attrib['license']
- if license == '4' or license == '5':
- #Is cc-by or cc-by-sa
- return True
- else:
- #We don't accept other licenses
- return False
-
-def getTags(photoInfo = None):
- '''
- Get all the tags on a photo
- '''
- result = []
- for tag in
photoInfo.find('photo').find('tags').findall('tag'):
- result.append(tag.text.lower())
-
- return result
-
-def getFlinfoDescription(photo_id = 0):
- '''
- Get the description from
http://wikipedia.ramselehof.de/flinfo.php
- '''
- parameters = urllib.urlencode({'id' : photo_id, 'raw' :
'on'})
-
- #print 'Flinfo gaat nu aan de slag'
- rawDescription =
urllib.urlopen("http://wikipedia.ramselehof.de/flinfo.php?%s" %
parameters).read()
- #print rawDescription.decode('utf-8')
- return rawDescription.decode('utf-8')
-
-def getFilename(photoInfo=None):
- '''
- Build a good filename for the upload based on the username and the title
- '''
- username =
photoInfo.find('photo').find('owner').attrib['username']
- title = photoInfo.find('photo').find('title').text
- if title:
- title = cleanUpTitle(title)
- else:
- title = u''
-
- return u'Flickr - %s - %s.jpg' % (username, title)
-
-def cleanUpTitle(title):
- title = title.strip()
-
- title = re.sub("[<{\\[]", "(", title)
- title = re.sub("[>}\\]]", ")", title)
- title = re.sub("[ _]?\\(!\\)", "", title)
- title = re.sub(",:[ _]", ", ", title)
- title = re.sub("[;:][ _]", ", ", title)
- title = re.sub("[\t\n ]+", " ", title)
- title = re.sub("[\r\n ]+", " ", title)
- title = re.sub("[\n]+", "", title)
- title = re.sub("[?!]([.\"]|$)", "\\1", title)
- title = re.sub("[&#%?!]", "^", title)
- title = re.sub("[;]", ",", title)
- title = re.sub("[/+\\\\:]", "-", title)
- title = re.sub("--+", "-", title)
- title = re.sub(",,+", ",", title)
- title = re.sub("[-,^]([.]|$)", "\\1", title)
- title = title.replace(" ", "_")
-
- return title
-
-def getPhotoUrl(photoSizes=None):
- '''
- Get the url of the jpg file with the highest resolution
- '''
- url = ''
- # The assumption is that the largest image is last
- for size in photoSizes.find('sizes').findall('size'):
- url = size.attrib['source']
- return url
-
-def buildDescription(flinfoDescription=u'', flickrreview=False,
reviewer=u'', override=u''):
- '''
- Build the final description for the image. The description is based on the info from
flickrinfo and improved.
- '''
- description = flinfoDescription
-
- if(override):
- description = description.replace(u'{{cc-by-sa-2.0}}\n', u'')
- description = description.replace(u'{{cc-by-2.0}}\n', u'')
- description = description.replace(u'{{flickrreview}}\n', u'')
- description = description.replace(u'{{copyvio|Flickr, licensed as "All
Rights Reserved" which is not a free license --~~~~}}\n', u'')
- description = description.replace(u'=={{int:license}}==',
u'=={{int:license}}==\n' + override)
- elif(flickrreview):
- if(reviewer):
- description = description.replace(u'{{flickrreview}}',
u'{{flickrreview|' + reviewer +
'|{{subst:CURRENTYEAR}}-{{subst:CURRENTMONTH}}-{{subst:CURRENTDAY2}}}}')
- description = description.replace(u'\r\n', u'\n')
- return description
-
-def getPhotos(flickr=None, user_id=u'', group_id=u'',
photoset_id=u'', tags=u''):
- result = []
- #
http://www.flickr.com/services/api/flickr.groups.pools.getPhotos.html
- if(group_id):
- #First get the total number of photo's in the group
- photos = flickr.groups_pools_getPhotos(group_id=group_id, user_id=user_id,
tags=tags, per_page='100', page='1')
- pages = photos.find('photos').attrib['pages']
-
- for i in range(1, int(pages)):
- for photo in flickr.groups_pools_getPhotos(group_id=group_id,
user_id=user_id, tags=tags, per_page='100',
page=i).find('photos').getchildren():
- yield photo.attrib['id']
-
- #
http://www.flickr.com/services/api/flickr.photosets.getPhotos.html
- elif(photoset_id):
- photos = flickr.photosets_getPhotos(photoset_id=photoset_id,
per_page='100', page='1')
- pages = photos.find('photos').attrib['pages']
-
- for i in range(1, int(pages)):
- for photo in flickr.photosets_getPhotos(photoset_id=photoset_id,
per_page='100', page=i).find('photos').getchildren():
- yield photo.attrib['id']
-
- #
http://www.flickr.com/services/api/flickr.people.getPublicPhotos.html
- elif(user_id):
- photos = flickr.people_getPublicPhotos(user_id=user_id, per_page='100',
page='1')
- pages = photos.find('photos').attrib['pages']
-
- for i in range(1, int(pages)):
- for photo in flickr.people_getPublicPhotos(user_id=user_id,
per_page='100', page=i).find('photos').getchildren():
- yield photo.attrib['id']
- return
-
-
-def processPhoto(flickr=None, photo_id=u'', flickrreview=False,
reviewer=u'', override=u''):
- if(photo_id):
- print photo_id
- (photoInfo, photoSizes) = getPhoto(flickr=flickr, photo_id=photo_id)
- if (isAllowedLicense(photoInfo=photoInfo) or override):
- # Tags not needed atm
- #tags=getTags(photoInfo=photoInfo)
-
- flinfoDescription = getFlinfoDescription(photo_id=photo_id)
-
- filename = getFilename(photoInfo=photoInfo)
- #print filename
- photoUrl = getPhotoUrl(photoSizes=photoSizes)
- #print photoUrl
- photoDescription = buildDescription(flinfoDescription=flinfoDescription,
flickrreview=flickrreview, reviewer=reviewer, override=override)
- #wikipedia.output(photoDescription)
- (newPhotoDescription, newFilename, skip)=Tkdialog(photoDescription, photoUrl,
filename).run()
- #wikipedia.output(newPhotoDescription)
- #if (wikipedia.Page(title=u'File:'+ filename,
site=wikipedia.getSite()).exists()):
- # I should probably check if the hash is the same and if not upload it under a
different name
- #wikipedia.output(u'File:' + filename + u' already exists!')
- #else:
- #Do the actual upload
- #Would be nice to check before I upload if the file is already at Commons
- #Not that important for this program, but maybe for derived programs
- if not skip:
- bot = upload.UploadRobot(url=photoUrl, description=newPhotoDescription,
useFilename=newFilename, keepFilename=True, verifyDescription=False)
- bot.upload_image(debug=False)
- return 0
-
-class Tkdialog:
- def __init__(self, photoDescription, photoUrl, filename):
- self.root=Tk()
- #"%dx%d%+d%+d" % (width, height, xoffset, yoffset)
- self.root.geometry("%ix%i+10-10"%(config.tkhorsize,
config.tkvertsize))
-
- self.root.title(filename)
- self.photoDescription = photoDescription
- self.filename = filename
- self.photoUrl = photoUrl
- self.skip=False
- self.exit=False
-
- ## Init of the widgets
- # The image
- self.image=self.getImage(self.photoUrl, 800, 600)
- self.imagePanel=Label(self.root, image=self.image)
-
- self.imagePanel.image = self.image
-
- # The filename
- self.filenameLabel=Label(self.root,text=u"Suggested filename")
- self.filenameField=Entry(self.root, width=100)
- self.filenameField.insert(END, filename)
-
- # The description
- self.descriptionLabel=Label(self.root,text=u"Suggested description")
- self.descriptionScrollbar=Scrollbar(self.root, orient=VERTICAL)
- self.descriptionField=Text(self.root)
- self.descriptionField.insert(END, photoDescription)
- self.descriptionField.config(state=NORMAL, height=12, width=100, padx=0, pady=0,
wrap=WORD, yscrollcommand=self.descriptionScrollbar.set)
- self.descriptionScrollbar.config(command=self.descriptionField.yview)
-
- # The buttons
- self.okButton=Button(self.root, text="OK", command=self.okFile)
- self.skipButton=Button(self.root, text="Skip", command=self.skipFile)
-
- ## Start grid
-
- # The image
- self.imagePanel.grid(row=0, column=0, rowspan=11, columnspan=4)
-
- # The buttons
- self.okButton.grid(row=11, column=1, rowspan=2)
- self.skipButton.grid(row=11, column=2, rowspan=2)
-
- # The filename
- self.filenameLabel.grid(row=13, column=0)
- self.filenameField.grid(row=13, column=1, columnspan=3)
-
- # The description
- self.descriptionLabel.grid(row=14, column=0)
- self.descriptionField.grid(row=14, column=1, columnspan=3)
- self.descriptionScrollbar.grid(row=14, column=5)
-
- def getImage(self, url, width, height):
- image=urllib.urlopen(url).read()
- output = StringIO.StringIO(image)
- image2 = Image.open(output)
- image2.thumbnail((width, height))
- imageTk = ImageTk.PhotoImage(image2)
- return imageTk
-
- def okFile(self):
- '''
- The user pressed the OK button.
- '''
- self.filename=self.filenameField.get()
- self.photoDescription=self.descriptionField.get(0.0, END)
- self.root.destroy()
-
- def skipFile(self):
- '''
- The user pressed the Skip button.
- '''
- self.skip=True
- self.root.destroy()
-
- def run(self):
- '''
- Activate the dialog and return the new name and if the image is skipped.
- '''
- self.root.mainloop()
- return (self.photoDescription, self.filename, self.skip)
-
-
-def usage():
- wikipedia.output(u"Flickrripper is a tool to transfer flickr photos to Wikimedia
Commons")
- wikipedia.output(u"-group_id:<group_id>\n")
- wikipedia.output(u"-photoset_id:<photoset_id>\n")
- wikipedia.output(u"-user_id:<user_id>\n")
- wikipedia.output(u"-tags:<tag>\n")
- return
-
-def main():
- site = wikipedia.getSite(u'commons', u'commons')
- wikipedia.setSite(site)
- #imagerecat.initLists()
-
- #Get the api key
- if(config.flickr['api_key']):
- flickr = flickrapi.FlickrAPI(config.flickr['api_key'])
- else:
- wikipedia.output('Flickr api key not found! Get yourself an api key')
- wikipedia.output('Any flickr user can get a key at
http://www.flickr.com/services/api/keys/apply/')
- return
-
- group_id = u''
- photoset_id = u''
- user_id = u''
- tags = u''
- totalPhotos = 0
- uploadedPhotos = 0
-
- # Do we mark the images as reviewed right away?
- if config.flickr['review']:
- flickrreview = config.flickr['review']
- else:
- flickrreview = False
-
- # Set the Flickr reviewer
- if config.flickr['reviewer']:
- reviewer = config.flickr['reviewer']
- elif 'commons' in config.sysopnames['commons']:
- print config.sysopnames['commons']
- reviewer = config.sysopnames['commons']['commons']
- elif 'commons' in config.usernames['commons']:
- reviewer = config.usernames['commons']['commons']
- else:
- reviewer = u''
-
- override = u''
-
- for arg in wikipedia.handleArgs():
- if arg.startswith('-group_id'):
- if len(arg) == 9:
- group_id = wikipedia.input(u'What is the group_id of the pool?')
- else:
- group_id = arg[10:]
- elif arg.startswith('-photoset_id'):
- if len(arg) == 12:
- photoset_id = wikipedia.input(u'What is the photoset_id)?')
- else:
- photoset_id = arg[13:]
- elif arg.startswith('-user_id'):
- if len(arg) == 8:
- user_id = wikipedia.input(u'What is the user_id of the flickr
user?')
- else:
- user_id = arg[9:]
- elif arg.startswith('-tags'):
- if len(arg) == 5:
- tags = wikipedia.input(u'What is the tag you want to filter out
(currently only one supported)?')
- else:
- tags = arg[6:]
- elif arg == '-flickrreview':
- flickrreview = True
- elif arg.startswith('-reviewer'):
- if len(arg) == 9:
- reviewer = wikipedia.input(u'Who is the reviewer?')
- else:
- reviewer = arg[10:]
- elif arg.startswith('-override'):
- if len(arg) == 9:
- override = wikipedia.input(u'What is the override text?')
- else:
- override = arg[10:]
-
- if user_id or group_id or photoset_id:
- for photo_id in getPhotos(flickr=flickr, user_id=user_id, group_id=group_id,
photoset_id=photoset_id, tags=tags):
- uploadedPhotos = uploadedPhotos + processPhoto(flickr=flickr,
photo_id=photo_id, flickrreview=flickrreview, reviewer=reviewer, override=override)
- totalPhotos = totalPhotos + 1
- else:
- usage()
-
- wikipedia.output(u'Finished running')
- wikipedia.output(u'Total photos: ' + str(totalPhotos))
- wikipedia.output(u'Uploaded photos: ' + str(uploadedPhotos))
-
-if __name__ == "__main__":
- try:
- main()
- finally:
- wikipedia.stopme()
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+'''
+Tool to copy a flickr stream to Commons
+
+# Get a set to work on (start with just a username).
+# * Make it possible to delimit the set (from/to)
+#For each image
+#*Check the license
+#*Check if it isn't already on Commons
+#*Build suggested filename
+#**Check for name collision and maybe alter it
+#*Pull description from Flinfo
+#*Show image and description to user
+#**Add a nice hotcat lookalike for the adding of categories
+#**Filter the categories
+#*Upload the image
+
+Todo:
+*Check if the image is already uploaded (SHA hash)
+*Check and prevent filename collisions
+**Initial suggestion
+**User input
+*Filter the categories
+
+'''
+#
+# (C) Multichill, 2009
+#
+# Distributed under the terms of the MIT license.
+#
+__version__ = '$Id$'
+
+import sys, urllib, re, StringIO
+import wikipedia, config, query, imagerecat, upload
+
+import flickrapi # see:
http://stuvel.eu/projects/flickrapi
+import xml.etree.ElementTree
+from Tkinter import *
+from PIL import Image, ImageTk # see:
http://www.pythonware.com/products/pil/
+
+def getPhoto(flickr = None, photo_id = ''):
+ '''
+ Get the photo info and the photo sizes so we can use these later on
+ '''
+ photoInfo = flickr.photos_getInfo(photo_id=photo_id)
+ #xml.etree.ElementTree.dump(photoInfo)
+ photoSizes = flickr.photos_getSizes(photo_id=photo_id)
+ #xml.etree.ElementTree.dump(photoSizes)
+ return (photoInfo, photoSizes)
+
+def isAllowedLicense(photoInfo = None):
+ '''
+ Check if the image contains the right license
+ '''
+ license = photoInfo.find('photo').attrib['license']
+ if license == '4' or license == '5':
+ #Is cc-by or cc-by-sa
+ return True
+ else:
+ #We don't accept other licenses
+ return False
+
+def getTags(photoInfo = None):
+ '''
+ Get all the tags on a photo
+ '''
+ result = []
+ for tag in
photoInfo.find('photo').find('tags').findall('tag'):
+ result.append(tag.text.lower())
+
+ return result
+
+def getFlinfoDescription(photo_id = 0):
+ '''
+ Get the description from
http://wikipedia.ramselehof.de/flinfo.php
+ '''
+ parameters = urllib.urlencode({'id' : photo_id, 'raw' :
'on'})
+
+ #print 'Flinfo gaat nu aan de slag'
+ rawDescription =
urllib.urlopen("http://wikipedia.ramselehof.de/flinfo.php?%s" %
parameters).read()
+ #print rawDescription.decode('utf-8')
+ return rawDescription.decode('utf-8')
+
+def getFilename(photoInfo=None):
+ '''
+ Build a good filename for the upload based on the username and the title
+ '''
+ username =
photoInfo.find('photo').find('owner').attrib['username']
+ title = photoInfo.find('photo').find('title').text
+ if title:
+ title = cleanUpTitle(title)
+ else:
+ title = u''
+
+ return u'Flickr - %s - %s.jpg' % (username, title)
+
+def cleanUpTitle(title):
+ title = title.strip()
+
+ title = re.sub("[<{\\[]", "(", title)
+ title = re.sub("[>}\\]]", ")", title)
+ title = re.sub("[ _]?\\(!\\)", "", title)
+ title = re.sub(",:[ _]", ", ", title)
+ title = re.sub("[;:][ _]", ", ", title)
+ title = re.sub("[\t\n ]+", " ", title)
+ title = re.sub("[\r\n ]+", " ", title)
+ title = re.sub("[\n]+", "", title)
+ title = re.sub("[?!]([.\"]|$)", "\\1", title)
+ title = re.sub("[&#%?!]", "^", title)
+ title = re.sub("[;]", ",", title)
+ title = re.sub("[/+\\\\:]", "-", title)
+ title = re.sub("--+", "-", title)
+ title = re.sub(",,+", ",", title)
+ title = re.sub("[-,^]([.]|$)", "\\1", title)
+ title = title.replace(" ", "_")
+
+ return title
+
+def getPhotoUrl(photoSizes=None):
+ '''
+ Get the url of the jpg file with the highest resolution
+ '''
+ url = ''
+ # The assumption is that the largest image is last
+ for size in photoSizes.find('sizes').findall('size'):
+ url = size.attrib['source']
+ return url
+
+def buildDescription(flinfoDescription=u'', flickrreview=False,
reviewer=u'', override=u''):
+ '''
+ Build the final description for the image. The description is based on the info from
flickrinfo and improved.
+ '''
+ description = flinfoDescription
+
+ if(override):
+ description = description.replace(u'{{cc-by-sa-2.0}}\n', u'')
+ description = description.replace(u'{{cc-by-2.0}}\n', u'')
+ description = description.replace(u'{{flickrreview}}\n', u'')
+ description = description.replace(u'{{copyvio|Flickr, licensed as "All
Rights Reserved" which is not a free license --~~~~}}\n', u'')
+ description = description.replace(u'=={{int:license}}==',
u'=={{int:license}}==\n' + override)
+ elif(flickrreview):
+ if(reviewer):
+ description = description.replace(u'{{flickrreview}}',
u'{{flickrreview|' + reviewer +
'|{{subst:CURRENTYEAR}}-{{subst:CURRENTMONTH}}-{{subst:CURRENTDAY2}}}}')
+ description = description.replace(u'\r\n', u'\n')
+ return description
+
+def getPhotos(flickr=None, user_id=u'', group_id=u'',
photoset_id=u'', tags=u''):
+ result = []
+ #
http://www.flickr.com/services/api/flickr.groups.pools.getPhotos.html
+ if(group_id):
+ #First get the total number of photo's in the group
+ photos = flickr.groups_pools_getPhotos(group_id=group_id, user_id=user_id,
tags=tags, per_page='100', page='1')
+ pages = photos.find('photos').attrib['pages']
+
+ for i in range(1, int(pages)):
+ for photo in flickr.groups_pools_getPhotos(group_id=group_id,
user_id=user_id, tags=tags, per_page='100',
page=i).find('photos').getchildren():
+ yield photo.attrib['id']
+
+ #
http://www.flickr.com/services/api/flickr.photosets.getPhotos.html
+ elif(photoset_id):
+ photos = flickr.photosets_getPhotos(photoset_id=photoset_id,
per_page='100', page='1')
+ pages = photos.find('photos').attrib['pages']
+
+ for i in range(1, int(pages)):
+ for photo in flickr.photosets_getPhotos(photoset_id=photoset_id,
per_page='100', page=i).find('photos').getchildren():
+ yield photo.attrib['id']
+
+ #
http://www.flickr.com/services/api/flickr.people.getPublicPhotos.html
+ elif(user_id):
+ photos = flickr.people_getPublicPhotos(user_id=user_id, per_page='100',
page='1')
+ pages = photos.find('photos').attrib['pages']
+
+ for i in range(1, int(pages)):
+ for photo in flickr.people_getPublicPhotos(user_id=user_id,
per_page='100', page=i).find('photos').getchildren():
+ yield photo.attrib['id']
+ return
+
+
+def processPhoto(flickr=None, photo_id=u'', flickrreview=False,
reviewer=u'', override=u''):
+ if(photo_id):
+ print photo_id
+ (photoInfo, photoSizes) = getPhoto(flickr=flickr, photo_id=photo_id)
+ if (isAllowedLicense(photoInfo=photoInfo) or override):
+ # Tags not needed atm
+ #tags=getTags(photoInfo=photoInfo)
+
+ flinfoDescription = getFlinfoDescription(photo_id=photo_id)
+
+ filename = getFilename(photoInfo=photoInfo)
+ #print filename
+ photoUrl = getPhotoUrl(photoSizes=photoSizes)
+ #print photoUrl
+ photoDescription = buildDescription(flinfoDescription=flinfoDescription,
flickrreview=flickrreview, reviewer=reviewer, override=override)
+ #wikipedia.output(photoDescription)
+ (newPhotoDescription, newFilename, skip)=Tkdialog(photoDescription, photoUrl,
filename).run()
+ #wikipedia.output(newPhotoDescription)
+ #if (wikipedia.Page(title=u'File:'+ filename,
site=wikipedia.getSite()).exists()):
+ # I should probably check if the hash is the same and if not upload it under a
different name
+ #wikipedia.output(u'File:' + filename + u' already exists!')
+ #else:
+ #Do the actual upload
+ #Would be nice to check before I upload if the file is already at Commons
+ #Not that important for this program, but maybe for derived programs
+ if not skip:
+ bot = upload.UploadRobot(url=photoUrl, description=newPhotoDescription,
useFilename=newFilename, keepFilename=True, verifyDescription=False)
+ bot.upload_image(debug=False)
+ return 0
+
+class Tkdialog:
+ def __init__(self, photoDescription, photoUrl, filename):
+ self.root=Tk()
+ #"%dx%d%+d%+d" % (width, height, xoffset, yoffset)
+ self.root.geometry("%ix%i+10-10"%(config.tkhorsize,
config.tkvertsize))
+
+ self.root.title(filename)
+ self.photoDescription = photoDescription
+ self.filename = filename
+ self.photoUrl = photoUrl
+ self.skip=False
+ self.exit=False
+
+ ## Init of the widgets
+ # The image
+ self.image=self.getImage(self.photoUrl, 800, 600)
+ self.imagePanel=Label(self.root, image=self.image)
+
+ self.imagePanel.image = self.image
+
+ # The filename
+ self.filenameLabel=Label(self.root,text=u"Suggested filename")
+ self.filenameField=Entry(self.root, width=100)
+ self.filenameField.insert(END, filename)
+
+ # The description
+ self.descriptionLabel=Label(self.root,text=u"Suggested description")
+ self.descriptionScrollbar=Scrollbar(self.root, orient=VERTICAL)
+ self.descriptionField=Text(self.root)
+ self.descriptionField.insert(END, photoDescription)
+ self.descriptionField.config(state=NORMAL, height=12, width=100, padx=0, pady=0,
wrap=WORD, yscrollcommand=self.descriptionScrollbar.set)
+ self.descriptionScrollbar.config(command=self.descriptionField.yview)
+
+ # The buttons
+ self.okButton=Button(self.root, text="OK", command=self.okFile)
+ self.skipButton=Button(self.root, text="Skip", command=self.skipFile)
+
+ ## Start grid
+
+ # The image
+ self.imagePanel.grid(row=0, column=0, rowspan=11, columnspan=4)
+
+ # The buttons
+ self.okButton.grid(row=11, column=1, rowspan=2)
+ self.skipButton.grid(row=11, column=2, rowspan=2)
+
+ # The filename
+ self.filenameLabel.grid(row=13, column=0)
+ self.filenameField.grid(row=13, column=1, columnspan=3)
+
+ # The description
+ self.descriptionLabel.grid(row=14, column=0)
+ self.descriptionField.grid(row=14, column=1, columnspan=3)
+ self.descriptionScrollbar.grid(row=14, column=5)
+
+ def getImage(self, url, width, height):
+ image=urllib.urlopen(url).read()
+ output = StringIO.StringIO(image)
+ image2 = Image.open(output)
+ image2.thumbnail((width, height))
+ imageTk = ImageTk.PhotoImage(image2)
+ return imageTk
+
+ def okFile(self):
+ '''
+ The user pressed the OK button.
+ '''
+ self.filename=self.filenameField.get()
+ self.photoDescription=self.descriptionField.get(0.0, END)
+ self.root.destroy()
+
+ def skipFile(self):
+ '''
+ The user pressed the Skip button.
+ '''
+ self.skip=True
+ self.root.destroy()
+
+ def run(self):
+ '''
+ Activate the dialog and return the new name and if the image is skipped.
+ '''
+ self.root.mainloop()
+ return (self.photoDescription, self.filename, self.skip)
+
+
+def usage():
+ wikipedia.output(u"Flickrripper is a tool to transfer flickr photos to Wikimedia
Commons")
+ wikipedia.output(u"-group_id:<group_id>\n")
+ wikipedia.output(u"-photoset_id:<photoset_id>\n")
+ wikipedia.output(u"-user_id:<user_id>\n")
+ wikipedia.output(u"-tags:<tag>\n")
+ return
+
+def main():
+ site = wikipedia.getSite(u'commons', u'commons')
+ wikipedia.setSite(site)
+ #imagerecat.initLists()
+
+ #Get the api key
+ if(config.flickr['api_key']):
+ flickr = flickrapi.FlickrAPI(config.flickr['api_key'])
+ else:
+ wikipedia.output('Flickr api key not found! Get yourself an api key')
+ wikipedia.output('Any flickr user can get a key at
http://www.flickr.com/services/api/keys/apply/')
+ return
+
+ group_id = u''
+ photoset_id = u''
+ user_id = u''
+ tags = u''
+ totalPhotos = 0
+ uploadedPhotos = 0
+
+ # Do we mark the images as reviewed right away?
+ if config.flickr['review']:
+ flickrreview = config.flickr['review']
+ else:
+ flickrreview = False
+
+ # Set the Flickr reviewer
+ if config.flickr['reviewer']:
+ reviewer = config.flickr['reviewer']
+ elif 'commons' in config.sysopnames['commons']:
+ print config.sysopnames['commons']
+ reviewer = config.sysopnames['commons']['commons']
+ elif 'commons' in config.usernames['commons']:
+ reviewer = config.usernames['commons']['commons']
+ else:
+ reviewer = u''
+
+ override = u''
+
+ for arg in wikipedia.handleArgs():
+ if arg.startswith('-group_id'):
+ if len(arg) == 9:
+ group_id = wikipedia.input(u'What is the group_id of the pool?')
+ else:
+ group_id = arg[10:]
+ elif arg.startswith('-photoset_id'):
+ if len(arg) == 12:
+ photoset_id = wikipedia.input(u'What is the photoset_id)?')
+ else:
+ photoset_id = arg[13:]
+ elif arg.startswith('-user_id'):
+ if len(arg) == 8:
+ user_id = wikipedia.input(u'What is the user_id of the flickr
user?')
+ else:
+ user_id = arg[9:]
+ elif arg.startswith('-tags'):
+ if len(arg) == 5:
+ tags = wikipedia.input(u'What is the tag you want to filter out
(currently only one supported)?')
+ else:
+ tags = arg[6:]
+ elif arg == '-flickrreview':
+ flickrreview = True
+ elif arg.startswith('-reviewer'):
+ if len(arg) == 9:
+ reviewer = wikipedia.input(u'Who is the reviewer?')
+ else:
+ reviewer = arg[10:]
+ elif arg.startswith('-override'):
+ if len(arg) == 9:
+ override = wikipedia.input(u'What is the override text?')
+ else:
+ override = arg[10:]
+
+ if user_id or group_id or photoset_id:
+ for photo_id in getPhotos(flickr=flickr, user_id=user_id, group_id=group_id,
photoset_id=photoset_id, tags=tags):
+ uploadedPhotos = uploadedPhotos + processPhoto(flickr=flickr,
photo_id=photo_id, flickrreview=flickrreview, reviewer=reviewer, override=override)
+ totalPhotos = totalPhotos + 1
+ else:
+ usage()
+
+ wikipedia.output(u'Finished running')
+ wikipedia.output(u'Total photos: ' + str(totalPhotos))
+ wikipedia.output(u'Uploaded photos: ' + str(uploadedPhotos))
+
+if __name__ == "__main__":
+ try:
+ main()
+ finally:
+ wikipedia.stopme()
Property changes on: trunk/pywikipedia/flickrripper.py
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision
Added: svn:eol-style
+ native