Afficher des bannières personnalisées sur Ubuntu Software Center

11

Comment puis-je montrer mes propres bannières personnalisées sur Ubuntu Software Center?

J'ai vu quelques définitions d'URL sur /usr/share/software-center/softwarecenter/enums.pyet /usr/share/software-center/softwarecenter/distro/Ubuntu.pyjusqu'à présent.

J'ai également essayé de suivre le code depuis les vues jusqu'au cœur. Mais je me suis perdu. _append_banner_addsappels SoftwareCenterAgent. Il appelle SpawnHelper. Ensuite , je me perds. Il y a aussi quelques appels à SimpleFileDownloadermais je ne suis pas en mesure de les suivre.

J'ai également remarqué cette entrée dans le journal de débogage.

2013-02-08 15:07:43,731 - softwarecenter.simplefiledownloader - DEBUG - download_file: http://software-center.ubuntu.com/site_media/exhibits/2012/12/SC_banner_Mixxx_2.png None True

Y at-il des documents sur la façon dont cela est mis en œuvre? Une recette simple pour changer les bannières par défaut et mettre mes propres bannières sur une manière propre serait très utile.

Je suppose que je peux simplement réécrire la _append_banner_addsfonction, mais je ne suis pas très prolifique sur python et je voudrais comprendre et utiliser les mêmes méthodes Ubuntu utilise, si possible.

Jorge Suárez de Lis
la source

Réponses:

6

Ouvrez /usr/share/software-center/softwarecenter/backend/scagent.pyet modifiez le début de cette fonction, de sorte qu'elle indique:

def query_exhibits(self):
    import urllib, json
    class Obj:
      def __init__(self, obj):
        self.obj = obj
      def __getattr__(self, name):
        if name[:2] == "__": return object.__getattr__(self, name)
        return self.obj[name]

    self.emit("exhibits", [Obj(x) for x in json.loads(urllib.urlopen("http://localhost:8800/cgi-bin/bannerlist.py").read())])
    return

Vous pouvez laisser le reste comme il est, il ne sera jamais atteint.

Si vous voulez le support de script dans votre <iframe>, modifier

/usr/share/software-center/softwarecenter/ui/gtk3/widgets/exhibits.py

et trouver settings.set_property("enable-scripts", False). Changement Falsede True.

Maintenant faire /var/www/cgi-bin/bannerlist.pyet de le rendre exécutable:

#!/usr/bin/env python
import json

print("Content-type: application/json\n")

print(json.dumps([
{
  "html": "<iframe src='file:/tmp/test.html'></iframe>",
  "title_translated": "Hey dawg",
  "click_url": "http://4chan.org",
  "package_names": ("gimp"),
  "banner_urls": ["file:/"],
  "published": True
},
{
  "html": "<iframe src='http://localhost:8800/cgi-bin/banner.py'></iframe>",
  "title_translated": "Hey dawg",
  "click_url": "http://4chan.org",
  "package_names": ("gimp"),
  "banner_urls": ["file:/"],
  "published": True
}
]))

Cela montre une liste de bannière généré.

Maintenant faire /var/www/cgi-bin/banner.pyet de le rendre exécutable:

#!/usr/bin/env python3
import time
print("Content-type: image/svg+xml\n")
print("""
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <rect width="300" height="100"
  style="fill:rgba(0,0,255,0.5);stroke-width:1;stroke:rgba(0,0,0,0.5)"/>
  <text x="0" y="25" fill="black">Time is """ + str(time.time()) + """</text>
</svg> 
""")

Cela démontre une bannière générée.

Vous devrez peut - être effacer le cache centre du logiciel. Vous pouvez le faire en utilisant rm -rf ~/.cache/software-center.

De toute évidence, vous devez mettre quelque chose /tmp/test.htmlpour que la première bannière fonctionne.

Vous devez également en cours d'exécution à 8800 avec serveur Web un cgi-binpour que cela fonctionne. Si vous ne l'avez pas, exécutez-le dans Bash:

cd /var/www
python -c "import BaseHTTPServer as h, CGIHTTPServer as c;
i = c.CGIHTTPRequestHandler;
i.cgi_directories = ['/cgi-bin'];
h.HTTPServer(('', 8800),i).serve_forever()"

Vous devez styliser le iframepour qu'il remplisse l'espace, mais vous l'avez compris.

Janus Troelsen
la source
Merci! Puis-je réutiliser le rotateur de bannière standard? J'ai essayé de déclarer plusieurs classes et cela a plutôt bien fonctionné. J'ai des problèmes de style avec l'iframe, mais je devrais être en mesure de résoudre ce problème. Maintenant, je veux rassembler les bannières sur un serveur Web, donc je devrais probablement utiliser JSON. Veuillez noter que la prime inclut cela, rassemblant les bannières de mon propre serveur. Si vous incluez ces informations, je serai en mesure de vous attribuer la prime :)
Jorge Suárez de Lis
@ JorgeSuárezdeLis: fait
Janus Troelsen
Ok, ça ne marche pas. Sur l'application, je vois une erreur comme celle-ci: Unable to load page - Problem occurred while loading the URL http:localhost:8800cgi-binbanner.py(la même chose pour la version locale /tmp). L'ancienne version fonctionnait, mais maintenant elle semble supprimer les barres obliques des URL quelque part. Les expositions sont rassemblées OK, et je peux imprimer le contenu HTML dans la console et les barres obliques sont là, mais sur l'application, elles manquent! Que pourrait-il se passer?
Jorge Suárez de Lis
Eh bien, êtes-vous sûr que l'URL est accessible? Essayez de le charger à l'aide curlde la console. Je pense que cela supprime uniquement les barres obliques dans le message d'erreur.
Janus Troelsen
Je ne pense pas. J'ai pris une capture d'écran . Les deux premières pétitions proviennent de Firefox. Seule la liste des bannières semble être collectée à partir du centre logiciel.
Jorge Suárez de Lis