Mostra mostre di banner personalizzate su Ubuntu Software Center


11

Come posso mostrare i miei banner personalizzati su Ubuntu Software Center?

Ho visto alcune definizioni di URL su /usr/share/software-center/softwarecenter/enums.pye /usr/share/software-center/softwarecenter/distro/Ubuntu.pyfinora.

Ho anche provato a tracciare il codice dalle viste al core. Ma mi sono perso. _append_banner_addschiamate SoftwareCenterAgent. Chiama SpawnHelper. Poi mi perdo. Ci sono anche alcune chiamate a SimpleFileDownloaderma non sono in grado di seguirle.

Inoltre, ho notato questa voce nel registro di debug.

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

Esiste una documentazione su come questo è implementato? Sarebbe molto utile qualche semplice ricetta per cambiare i banner predefiniti e mettere i miei banner in modo pulito.

Suppongo di poter semplicemente riscrivere la _append_banner_addsfunzione, ma non sono molto prolifico su Python e mi piacerebbe capire e usare gli stessi metodi che Ubuntu sta usando, se possibile.

Risposte:


6

Apri /usr/share/software-center/softwarecenter/backend/scagent.pye modifica l'inizio di questa funzione, in modo che sia scritto:

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

Puoi lasciare il resto così com'è, non sarà mai raggiunto.

Se vuoi il supporto per gli script nel tuo <iframe>, modifica

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

e trova settings.set_property("enable-scripts", False). Cambia Falsein True.

Ora crea /var/www/cgi-bin/bannerlist.pye rendilo eseguibile:

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

Ciò dimostra un elenco di banner generato.

Ora crea /var/www/cgi-bin/banner.pye rendilo eseguibile:

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

Questo dimostra un banner generato.

Potrebbe essere necessario svuotare la cache del software center. Puoi farlo usando rm -rf ~/.cache/software-center.

Ovviamente devi inserire qualcosa /tmp/test.htmlaffinché il primo banner funzioni.

È inoltre necessario un server Web in esecuzione a 8800 con a cgi-binaffinché questo funzioni. Se non lo hai, eseguilo in 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()"

Devi modellare il iframeper riempire lo spazio, ma l'hai capito.


Grazie! Non riesco a riutilizzare il rotatore banner standard? Ho provato a dichiarare più classi e ha funzionato abbastanza bene. Sto riscontrando alcuni problemi di stile con l'iframe, ma dovrei essere in grado di risolverlo. Ora voglio raccogliere i banner pubblicitari da un server web, quindi probabilmente dovrei usare JSON. Si noti che la taglia include questo, raccogliendo i banner dal mio server. Se includi queste informazioni, sarò in grado di assegnarti la generosità :)
Jorge Suárez de Lis

@ JorgeSuárezdeLis: fatto
Janus Troelsen,

Ok, questo non funziona. Sull'applicazione vedo un errore come questo: Unable to load page - Problem occurred while loading the URL http:localhost:8800cgi-binbanner.py(lo stesso per la versione locale attivata /tmp). La vecchia versione ha funzionato, ma ora sembra rimuovere da qualche parte le barre degli URL. I reperti sono raccolti correttamente e posso stampare i contenuti HTML nella console e le barre sono presenti, ma sull'applicazione mancano! Cosa potrebbe succedere?
Jorge Suárez de Lis,

Bene, sei sicuro che l'URL sia accessibile? Prova a caricarlo utilizzando curlnella console. Penso che rimuova solo le barre nel messaggio di errore.
Janus Troelsen,

Io non la penso così. Ho fatto uno screenshot . Le due prime petizioni provengono da Firefox. Solo il bannerlist sembra essere raccolto dal centro software.
Jorge Suárez de Lis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.