Pokaż spersonalizowane banery w Centrum oprogramowania Ubuntu

11

Jak mogę wyświetlać własne spersonalizowane banery w Centrum oprogramowania Ubuntu?

Widziałem kilka definicji URL na /usr/share/software-center/softwarecenter/enums.pyi /usr/share/software-center/softwarecenter/distro/Ubuntu.pytak daleko.

Próbowałem także śledzić kod z widoków do rdzenia. Ale zgubiłem się. _append_banner_addspołączenia SoftwareCenterAgent. Wzywa SpawnHelper. Potem się zgubiłem. Są też połączenia na, SimpleFileDownloaderale nie jestem w stanie ich wyśledzić.

Zauważyłem również ten wpis w dzienniku debugowania.

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

Czy istnieje dokumentacja dotycząca tego, jak jest to realizowane? Bardzo prosty byłby prosty przepis na zmianę domyślnych banerów i umieszczenie własnych banerów w czysty sposób.

Przypuszczam, że mogę po prostu przepisać tę _append_banner_addsfunkcję, ale nie jestem bardzo płodny w Pythonie i chciałbym zrozumieć i korzystać z tych samych metod, których używa Ubuntu, jeśli to możliwe.

Jorge Suárez de Lis
źródło

Odpowiedzi:

6

Otwórz /usr/share/software-center/softwarecenter/backend/scagent.pyi edytuj początek tej funkcji, aby brzmiała:

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

Resztę możesz zostawić taką, jaka jest, nigdy nie zostanie osiągnięta.

Jeśli chcesz mieć obsługę skryptów <iframe>, edytuj

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

i znajdź settings.set_property("enable-scripts", False). Zmień Falsena True.

Teraz spraw, /var/www/cgi-bin/bannerlist.pyaby był wykonywalny:

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

Pokazuje to wygenerowaną listę banerów.

Teraz spraw, /var/www/cgi-bin/banner.pyaby był wykonywalny:

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

Pokazuje to wygenerowany baner.

Może być konieczne wyczyszczenie pamięci podręcznej centrum oprogramowania. Możesz to zrobić za pomocą rm -rf ~/.cache/software-center.

Oczywiście musisz włożyć coś, /tmp/test.htmlżeby pierwszy baner zadziałał.

Aby działało, potrzebujesz także serwera WWW działającego pod 8800 cgi-bin. Jeśli nie masz tego, uruchom to w 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()"

Musisz tak zaprojektować, iframeaby wypełnił przestrzeń, ale wymyśliłeś to.

Janus Troelsen
źródło
Dzięki! Czy nie mogę ponownie użyć standardowego rotatora banerów? Próbowałem zadeklarować wiele klas i zadziałało całkiem nieźle. Mam pewne problemy ze stylem w ramce iframe, ale powinienem być w stanie to rozwiązać. Teraz chcę zebrać eksponaty banerów z serwera WWW, więc prawdopodobnie powinienem użyć JSON. Proszę zauważyć, że nagroda obejmuje to, zbierając banery z mojego własnego serwera. Jeśli podasz te informacje, będę mógł przyznać ci nagrodę :)
Jorge Suárez de Lis
@ JorgeSuárezdeLis: gotowe
Janus Troelsen
Ok, to nie działa. W aplikacji widzę taki błąd: Unable to load page - Problem occurred while loading the URL http:localhost:8800cgi-binbanner.py(taki sam dla wersji lokalnej /tmp). Stara wersja działała, ale teraz wydaje się, że gdzieś rozbija adresy URL. Eksponaty są zebrane OK i mogę wydrukować zawartość HTML w konsoli i ukośniki tam są, ale w aplikacji ich brakuje! Co może się dziać?
Jorge Suárez de Lis
Czy jesteś pewien, że adres URL jest dostępny? Spróbuj załadować go za pomocą curlkonsoli. Myślę, że usuwa tylko ukośniki w komunikacie o błędzie.
Janus Troelsen,
Nie wydaje mi się Zrobiłem zrzut ekranu . Dwie pierwsze petycje pochodzą z Firefoksa. Wydaje się, że tylko lista bannerów została zebrana z centrum oprogramowania.
Jorge Suárez de Lis