1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
#!/usr/bin/env python
# fetch-thumbnails
#
# Copyright 2010 Evgeni Golov <evgeni@debian.org>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
# * Neither the name of the nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from debian import debtags
import json
import urllib2
from PIL import Image
from os import path, mkdir
__BASE_DIR = 'games-thumbnails'
__ORIG_DIR = '%s/orig' % __BASE_DIR
__THUMB_DIR = '%s/thumbs' % __BASE_DIR
__JSON_URL = 'http://screenshots.debian.net/json/screenshots'
__DEBTAGS_FILE = '/var/lib/debtags/debtags-fetch-apt.tag'
__DEBTAGS_GZ_FILE = '/var/lib/debtags/debtags-fetch-apt.tag.gz'
__FACET = 'game'
if not path.exists(__BASE_DIR):
mkdir(__BASE_DIR)
if not path.exists(__ORIG_DIR):
mkdir(__ORIG_DIR)
if not path.exists(__THUMB_DIR):
mkdir(__THUMB_DIR)
screenshots_json = json.load(urllib2.urlopen(__JSON_URL))
screenshots_json = screenshots_json['screenshots']
screenshots = {}
for s in screenshots_json:
screenshots[s['name']] = s['large_image_url']
try:
f = open(__DEBTAGS_FILE, "r")
except IOError:
import gzip
f = gzip.open(__DEBTAGS_GZ_FILE, "r")
db = debtags.DB()
db.read(f)
games = db.filter_tags(lambda t: t.startswith(__FACET))
work = []
for g in games.iter_packages():
p = {}
if 'role::program' in db.tags_of_package(g):
p['name'] = g
if p['name'] in screenshots.keys():
p['screenshot'] = screenshots[p['name']]
else:
p['screenshot'] = None
work.append(p)
for p in work:
if p['screenshot']:
orig_file_name = "%s/%s.png" % (__ORIG_DIR, p['name'])
thumb_file_name = "%s/%s.png" % (__THUMB_DIR, p['name'])
if not path.exists(orig_file_name):
print "Fetching screenshot for %(name)s from %(screenshot)s" % p
f = file(orig_file_name, "wb")
f.write(urllib2.urlopen(p['screenshot']).read())
f.close()
if not path.exists(thumb_file_name):
print "Creating thumbnail for %(name)s" % p
img = Image.open(orig_file_name)
scale = []
scale.append(img.size[0]/320.0)
scale.append(img.size[1]/240.0)
scale = max(scale)
new_size = (int(round(img.size[0]/scale)), int(round(img.size[1]/scale)))
i = img.resize(new_size, Image.ANTIALIAS)
i.save(thumb_file_name)
else:
print "WARNING: %(name)s has no screenshot!" % p
|