Mostrar exibições de banner personalizadas no Ubuntu Software Center

11

Como posso mostrar minhas próprias exibições de banner personalizadas no Ubuntu Software Center?

Eu já vi algumas definições de URL em /usr/share/software-center/softwarecenter/enums.py e /usr/share/software-center/softwarecenter/distro/Ubuntu.py até o momento.

Eu também tentei rastrear o código das visualizações para o núcleo. Mas eu me perdi. _append_banner_adds chamadas SoftwareCenterAgent . Chama SpawnHelper . Então eu me perco. Há também algumas chamadas em SimpleFileDownloader , mas não consigo rastreá-las.

Além disso, notei essa entrada no log de depuração.

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 documentação sobre como isso é implementado? Uma receita simples para alterar os banners padrão e colocar meus próprios banners de maneira limpa seria muito útil.

Suponho que posso simplesmente reescrever a função _append_banner_adds , mas não sou muito prolífico em python e gostaria de entender e usar os mesmos métodos que o Ubuntu está usando, se possível.

    
por Jorge Suárez de Lis 08.02.2013 / 15:23

1 resposta

6

Abra /usr/share/software-center/softwarecenter/backend/scagent.py e edite o início desta função, de modo 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

Você pode deixar o resto como está, nunca será alcançado.

Se você quiser suporte a script no seu <iframe> , edite

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

e encontre settings.set_property("enable-scripts", False) . Altere False para True .

Agora, crie /var/www/cgi-bin/bannerlist.py e torne-o executável:

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

Isso demonstra uma lista de banners gerados.

Agora, crie /var/www/cgi-bin/banner.py e torne-o executável:

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

Isso demonstra um banner gerado.

Talvez seja necessário limpar o cache do centro de software. Você pode fazer isso usando rm -rf ~/.cache/software-center .

Obviamente, você precisa colocar algo em /tmp/test.html para o primeiro banner funcionar.

Você também precisa de um servidor da web executando 8800 com cgi-bin para que isso funcione. Se você não tem isso, execute isso no 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()"

Você precisa estilizar o iframe para preencher o espaço, mas você descobriu isso.

    
por Janus Troelsen 13.02.2013 / 04:04