Mostrar exhibiciones de pancartas personalizadas en el Centro de software de Ubuntu

11

¿Cómo puedo mostrar mis propias exhibiciones de pancartas personalizadas en el Centro de software de Ubuntu?

He visto algunas definiciones de URL /usr/share/software-center/softwarecenter/enums.pyy /usr/share/software-center/softwarecenter/distro/Ubuntu.pyhasta ahora.

También intenté rastrear el código desde las vistas hasta el núcleo. Pero me perdí. _append_banner_addsllamadas SoftwareCenterAgent. Llama SpawnHelper. Entonces me pierdo. También hay algunas llamadas SimpleFileDownloaderpero no puedo rastrearlas.

Además, he notado esta entrada en el registro de depuración.

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

¿Existe documentación sobre cómo se implementa esto? Sería muy útil alguna receta simple para cambiar los banners predeterminados y poner mis propios banners de manera limpia.

Supongo que simplemente puedo reescribir la _append_banner_addsfunción, pero no soy muy prolífico en Python y me gustaría entender y usar los mismos métodos que Ubuntu usa, si es posible.

Jorge Suárez de Lis
fuente

Respuestas:

6

Abre /usr/share/software-center/softwarecenter/backend/scagent.pyy edita el comienzo de esta función, para que diga:

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

Puedes dejar el resto como está, nunca se alcanzará.

Si desea soporte de scripting en su <iframe>, edite

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

y encontrar settings.set_property("enable-scripts", False). Cambiar Falsea True.

Ahora hazlo /var/www/cgi-bin/bannerlist.pyy hazlo ejecutable:

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

Esto demuestra una lista de pancartas generada.

Ahora hazlo /var/www/cgi-bin/banner.pyy hazlo ejecutable:

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

Esto demuestra un banner generado.

Es posible que deba borrar la memoria caché del centro de software. Puedes hacerlo usando rm -rf ~/.cache/software-center.

Obviamente, necesitas poner algo /tmp/test.htmlpara que el primer banner funcione.

También necesita un servidor web que funcione a 8800 con un cgi-binpara que esto funcione. Si no tienes esto, ejecuta esto en 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()"

Necesitas diseñar el estilo iframepara que llene el espacio, pero lo descubriste.

Janus Troelsen
fuente
¡Gracias! ¿No puedo reutilizar el rotador de banner estándar? Intenté declarar varias clases y funcionó bastante bien. Tengo algunos problemas de estilo con el iframe, pero debería poder solucionarlo. Ahora quiero reunir las exhibiciones de pancartas de un servidor web, por lo que probablemente debería usar JSON. Tenga en cuenta que la recompensa incluye esto, reuniendo las pancartas de mi propio servidor. Si incluye esta información, podré otorgarle la recompensa :)
Jorge Suárez de Lis
@ JorgeSuárezdeLis: hecho
Janus Troelsen
Ok, esto no está funcionando. En la aplicación veo un error como este: Unable to load page - Problem occurred while loading the URL http:localhost:8800cgi-binbanner.py(lo mismo para la versión local en /tmp). La versión anterior funcionaba, pero ahora parece eliminar las barras diagonales en alguna parte. Las exhibiciones están reunidas OK, y puedo imprimir el contenido HTML en la consola y las barras están allí, ¡pero en la aplicación faltan! ¿Qué podría estar pasando?
Jorge Suárez de Lis
Bueno, ¿estás seguro de que la URL es accesible? Intenta cargarlo usando curlen la consola. Creo que solo elimina las barras en el mensaje de error.
Janus Troelsen
No lo creo. Tomé una captura de pantalla . Las dos primeras peticiones son de Firefox. Solo la lista de banner parece haberse recopilado del centro de software.
Jorge Suárez de Lis