import gi import requests import os import sys import inspect from gi.repository import Gio gi.require_version('AppStreamGlib', '1.0') from gi.repository import AppStreamGlib from lists import alwaysAccept, alwaysDeny, badLicenses, badCategories, nonFreeAssets, nonFreeNetworkServices import itertools import argparse #Workaround to get the urls because app.get_urls() doesn't work :| def get_urls(app): kinds = [AppStreamGlib.UrlKind(kind) for kind in range(11)] urls = [(app.get_url_item(kind),kind.value_nick) for kind in kinds] return list(filter(lambda a: a[0] is not None, urls)) def acceptedGame(app): #return 'Game' in app.get_categories() if app.get_id() in alwaysAccept: return True if app.get_id() in alwaysDeny: return False return app.get_project_license() and \ not [x for x in badLicenses if x in app.get_project_license()] and \ 'Game' in app.get_categories() and \ not [x for x in badCategories if x in app.get_categories()] def getScreenshots(app): return [images.get_source() for images in app.get_screenshots()] currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) parentdir = os.path.dirname(currentdir) sys.path.insert(0,parentdir) from app.models import * from app.utils import make_flask_login_password from app.utils.image import get_image_size from app.utils import randomString parser = argparse.ArgumentParser(description='Generate HTML files from an Appimage and mako templates.') parser.add_argument("-p", '--appstream_path', help='specify the path of the appstream file') parser.add_argument("-i", '--icons_path', help='specify the path of the icons') parser.add_argument("-m", '--template_path', help='specify the path of the template') args = parser.parse_args() store = AppStreamGlib.Store() file = Gio.File.new_for_path(args.appstream_path) AppStreamGlib.Store.from_file(store, file, args.icons_path, None) apps = list(filter(acceptedGame, store.get_apps())) session=db.session licenses = { x.name : x for x in License.query.all() } tags = { x.name : x for x in Tag.query.all() } admin_user = User.query.filter_by(username="appstream").first() if not admin_user: admin_user = User("appstream") admin_user.is_active = True admin_user.password = make_flask_login_password("appstream") admin_user.github_username = "appstream" admin_user.forums_username = "appstream" admin_user.rank = UserRank.ADMIN session.add(admin_user) for app in apps: screenshots = getScreenshots(app) urls = get_urls(app) filename = app.get_name().replace(':', '').replace('/','') + ".html" print("APPLICATION: ",app.get_name()) game1 = Package() game1.state = PackageState.APPROVED game1.name = app.get_id().replace('.','_') game1.title = app.get_name() game1.type = PackageType.GAME game1.license = licenses["MIT"] #game1.license = licenses[app.get_project_license()] game1.media_license = licenses["MIT"] game1.author = admin_user game1.tags.append(tags["pvp"]) game1.tags.append(tags["survival"]) game1.tags.append(tags["multiplayer"]) for url,t in urls: if t == "bugtracker": game1.issueTracker = url elif t == "homepage": game1.repo = url game1.forums = 12835 game1.short_desc = app.get_comment() game1.desc = app.get_description() session.add(game1) for i,screenshot in enumerate(screenshots): ss = PackageScreenshot() ss.package = game1 ss.title = "Untitled" url = screenshot.get_url() r = requests.get(url) filename = randomString(10) + "." + "png" filepath = os.path.join("/var/cdb/uploads", filename) with open(filepath,"wb") as f: f.write(r.content) ss.url = "uploads/" + filename ss.approved = True ss.order = i ss.width, ss.height = get_image_size(filepath) session.add(ss) session.commit() game1.cover_image = ss session.commit() session.commit()