Показать персонализированные баннерные экспонаты в Ubuntu Software Center

11

Как я могу показать свои собственные персонализированные баннеры в Ubuntu Software Center?

Я видел некоторые определения 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чтобы первый баннер заработал.

Вам также нужен веб-сервер, работающий на 8800 с, cgi-binчтобы это работало. Если у вас этого нет, запустите это в 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: сделано
Янус Троелсен
Хорошо, это не работает В приложении я вижу такую ​​ошибку: Unable to load page - Problem occurred while loading the URL http:localhost:8800cgi-binbanner.py(то же самое для локальной версии на /tmp). Старая версия работала, но теперь, кажется, где-то убирает косые черты URL. Экспонаты собраны в порядке, и я могу напечатать содержимое HTML в консоли, и косые черты уже есть, но в приложении их нет! Что может случиться?
Хорхе Суарес де Лис
Ну, а вы уверены, что URL доступен? Попробуйте загрузить его с помощью curlконсоли. Я думаю, что это только удаляет косые черты в сообщении об ошибке.
Янус Троелсен
Я так не думаю. Я сделал скриншот . Две первые петиции от Firefox. Похоже, что только список баннеров собран из центра программного обеспечения.
Хорхе Суарес де Лис