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 /usr/share/software-center/softwarecenter/enums.pye /usr/share/software-center/softwarecenter/distro/Ubuntu.pyaté agora.

Também tentei rastrear o código das visualizações até o núcleo. Mas eu me perdi. _append_banner_addschamadas SoftwareCenterAgent. Isso chama SpawnHelper. Então eu me perco. Também há algumas chamadas em, SimpleFileDownloadermas 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? Alguma 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 _append_banner_addsfunção, 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.

Jorge Suárez de Lis
fonte

Respostas:

6

Abra /usr/share/software-center/softwarecenter/backend/scagent.pye edite o início desta função, para que ele 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ê deseja suporte para scripts <iframe>, edite

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

e encontre settings.set_property("enable-scripts", False). Mude Falsepara True.

Agora faça /var/www/cgi-bin/bannerlist.pye execute:

#!/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 gerada.

Agora faça /var/www/cgi-bin/banner.pye execute:

#!/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.

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

Obviamente, você precisa colocar algo /tmp/test.htmlpara o primeiro banner funcionar.

Você também precisa de um servidor Web rodando em 8800 com um cgi-binpara que isso funcione. Se você não tiver isso, execute-o 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 criar um estilo iframepara fazê-lo preencher o espaço, mas você descobriu isso.

Janus Troelsen
fonte
Obrigado! Não posso reutilizar o rotador de faixa padrão? Tentei declarar várias classes e funcionou muito bem. Estou tendo alguns problemas de estilo com o iframe, mas devo resolver isso. Agora eu quero reunir as exibições de banner de um servidor da web, então provavelmente devo usar JSON. Observe que a recompensa inclui isso, reunindo os banners do meu próprio servidor. Se você incluir esta informação, eu vou ser capaz de conceder-lhe a recompensa :)
Jorge Suárez de Lis
@ JorgeSuárezdeLis: done
Janus Troelsen
Ok, isso não está funcionando. No aplicativo, vejo um erro como este: Unable to load page - Problem occurred while loading the URL http:localhost:8800cgi-binbanner.py(o mesmo para a versão local ativada /tmp). A versão antiga funcionou, mas agora parece remover as barras dos URLs em algum lugar. As exposições estão reunidas OK, e eu posso imprimir o conteúdo HTML no console e as barras estão lá, mas no aplicativo elas estão faltando! O que poderia estar acontecendo?
Jorge Suárez de Lis
Bem, você tem certeza de que o URL está acessível? Tente carregá-lo usando curlo console. Eu acho que apenas retira as barras na mensagem de erro.
Janus Troelsen
Acho que não. Tirei uma captura de tela . As duas primeiras petições são do Firefox. Apenas a lista de faixas parece ser coletada no centro de software.
Jorge Suárez de Lis