Показуйте персоналізовані експонати банерів у програмному центрі Ubuntu


11

Як я можу показувати власні персоналізовані експонати банерів у програмному центрі Ubuntu?

Я бачив деякі визначення URL /usr/share/software-center/softwarecenter/enums.pyі до /usr/share/software-center/softwarecenter/distro/Ubuntu.pyцих пір.

Я також намагався відстежувати код від перегляду до основної. Але я заблукала. _append_banner_addsдзвінки SoftwareCenterAgent. Це дзвонить SpawnHelper. Тоді я гублюсь. Також є деякі дзвінки, SimpleFileDownloaderале я не в змозі відстежити їх.

Також я помітив цей запис у журналі налагодження.

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

Чи є документація про те, як це реалізується? Якийсь простий рецепт зміни банери за замовчуванням і чистого розміщення моїх банерів був би дуже корисним.

Я думаю, я можу просто переписати _append_banner_addsфункцію, але я не дуже плідний на python, і я хотів би зрозуміти і використовувати ті самі методи, якими користується Ubuntu, якщо це можливо.

Відповіді:


6

Відкрийте /usr/share/software-center/softwarecenter/backend/scagent.pyта відредагуйте початок цієї функції, щоб вона писала:

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

Ви можете залишити решту такою, якою вона є, вона ніколи не буде досягнута.

Якщо ви хочете підтримати сценарій у вашому <iframe>, відредагуйте

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

і знайти settings.set_property("enable-scripts", False). Змінити Falseна True.

Тепер зробіть /var/www/cgi-bin/bannerlist.pyі зробіть його виконуваним:

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

Це демонструє створений список банерів.

Тепер зробіть /var/www/cgi-bin/banner.pyі зробіть його виконуваним:

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

Це демонструє сформований банер.

Можливо, вам доведеться очистити кеш-центр програмного забезпечення. Це можна зробити, використовуючи rm -rf ~/.cache/software-center.

Очевидно, що вам потрібно щось поставити, /tmp/test.htmlщоб перший банер працював.

Також cgi-binдля цього вам потрібен веб-сервер, який працює на 8800, з a . Якщо у вас цього немає, запустіть це в 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()"

Вам потрібно додати стиль, iframeщоб він заповнив простір, але ви це зрозуміли.


Спасибі! Не можу я використати стандартний ротатор банера? Я спробував оголосити кілька класів, і це спрацювало досить добре. У мене є проблеми зі стилізацією iframe, але я повинен бути в змозі розібратися в цьому. Тепер я хочу зібрати експонати банерів з веб-сервера, тому, мабуть, я повинен використовувати JSON. Будь ласка, зауважте, що це включає в себе щедро, збираючи банери з мого власного сервера. Якщо ви включите цю інформацію, я зможу нагородити вас винагородою :)
Хорхе Суарес де Лис

@ JorgeSuárezdeLis: зроблено
Janus Troelsen

Гаразд, це не працює. У програмі я бачу помилку на зразок такої: Unable to load page - Problem occurred while loading the URL http:localhost:8800cgi-binbanner.py(те ж саме для локальної версії /tmp). Стара версія працювала, але тепер, здається, десь знімається косої частини URL-адреси. Експонати зібрані нормально, і я можу надрукувати вміст HTML на консолі, а косої риси є, але в програмі вони відсутні! Що може статися?
Хорхе Суарес де Ліс

Ну, ви впевнені, що URL-адреса доступна? Спробуйте завантажити його за curlдопомогою консолі. Я думаю, що це лише знімає косу рису в повідомленні про помилку.
Янус Трольсен

Я не думаю, що так. Я зробив скріншот . Дві перші клопотання - від Firefox. Здається, лише банерний список зібраний з програмного центру.
Хорхе Суарес де Ліс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.