Zeigen Sie personalisierte Banner-Exponate im Ubuntu Software Center

11

Wie kann ich meine eigenen personalisierten Banner-Exponate im Ubuntu Software Center zeigen?

Ich habe einige URL-Definitionen auf /usr/share/software-center/softwarecenter/enums.pyund /usr/share/software-center/softwarecenter/distro/Ubuntu.pybis jetzt gesehen.

Ich habe auch versucht, den Code von den Ansichten bis zum Kern zu verfolgen. Aber ich habe mich verlaufen. _append_banner_addsAnrufe SoftwareCenterAgent. Es ruft SpawnHelper. Dann verliere ich mich. Es gibt auch einige Anrufe bei, SimpleFileDownloaderaber ich kann sie nicht verfolgen.

Außerdem habe ich diesen Eintrag im Debug-Protokoll bemerkt.

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

Gibt es eine Dokumentation darüber, wie dies implementiert wird? Ein einfaches Rezept, um die Standardbanner zu ändern und meine eigenen Banner sauber zu platzieren, wäre sehr hilfreich.

Ich nehme an, ich kann die _append_banner_addsFunktion einfach umschreiben , aber ich bin nicht sehr produktiv in Python und möchte die gleichen Methoden verstehen und anwenden, die Ubuntu verwendet, wenn möglich.

Jorge Suárez de Lis
quelle

Antworten:

6

Öffnen /usr/share/software-center/softwarecenter/backend/scagent.pyund bearbeiten Sie den Anfang dieser Funktion so, dass er lautet:

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

Sie können den Rest so lassen, wie er ist, er wird niemals erreicht werden.

Wenn Sie Skriptunterstützung in Ihrem möchten <iframe>, bearbeiten Sie

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

und finden settings.set_property("enable-scripts", False). Wechseln Sie Falsezu True.

/var/www/cgi-bin/bannerlist.pyMachen Sie es jetzt und machen Sie es ausführbar:

#!/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
}
]))

Dies zeigt eine generierte Bannerliste.

/var/www/cgi-bin/banner.pyMachen Sie es jetzt und machen Sie es ausführbar:

#!/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> 
""")

Dies zeigt ein generiertes Banner.

Möglicherweise müssen Sie den Software-Center-Cache leeren. Sie können das mit tun rm -rf ~/.cache/software-center.

Natürlich müssen Sie etwas einfügen, /tmp/test.htmldamit das erste Banner funktioniert.

Sie benötigen außerdem einen Webserver mit 8800 und einem, cgi-bindamit dies funktioniert. Wenn Sie dies nicht haben, führen Sie dies in Bash aus:

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()"

Sie müssen das stylen iframe, damit es den Raum ausfüllt, aber Sie haben das herausgefunden.

Janus Troelsen
quelle
Vielen Dank! Kann ich den Standard-Banner-Rotator nicht wiederverwenden? Ich habe versucht, mehrere Klassen zu deklarieren, und es hat ziemlich gut funktioniert. Ich habe einige Styling-Probleme mit dem Iframe, aber ich sollte das klären können. Jetzt möchte ich die Banner-Exponate von einem Webserver sammeln, daher sollte ich wahrscheinlich JSON verwenden. Bitte beachten Sie, dass das Kopfgeld dies beinhaltet und die Banner von meinem eigenen Server sammelt. Wenn Sie diese Informationen angeben, kann ich Ihnen das Kopfgeld gewähren :)
Jorge Suárez de Lis
@ JorgeSuárezdeLis: fertig
Janus Troelsen
Ok, das funktioniert nicht. In der Anwendung wird ein Fehler wie der folgende angezeigt: Unable to load page - Problem occurred while loading the URL http:localhost:8800cgi-binbanner.py(Gleiches gilt für die lokale Version /tmp). Die alte Version hat funktioniert, aber jetzt scheint sie die Schrägstriche der URLs irgendwo zu entfernen. Die Exponate sind in Ordnung gesammelt, und ich kann den HTML-Inhalt in die Konsole drucken, und die Schrägstriche sind dort, aber in der Anwendung fehlen sie! Was könnte passieren?
Jorge Suárez de Lis
Sind Sie sicher, dass auf die URL zugegriffen werden kann? Versuchen Sie es mit curlin der Konsole zu laden . Ich denke, es entfernt nur die Schrägstriche in der Fehlermeldung.
Janus Troelsen
Das glaube ich nicht. Ich habe einen Screenshot gemacht . Die beiden ersten Petitionen stammen von Firefox. Nur die Bannerliste scheint aus dem Software-Center zu stammen.
Jorge Suárez de Lis