Tampilkan pameran spanduk yang dipersonalisasi di Pusat Perangkat Lunak Ubuntu

11

Bagaimana saya bisa memperlihatkan pameran spanduk pribadi saya di Ubuntu Software Center?

Saya telah melihat beberapa definisi URL /usr/share/software-center/softwarecenter/enums.pydan /usr/share/software-center/softwarecenter/distro/Ubuntu.pysejauh ini.

Saya juga mencoba melacak kode dari pandangan ke inti. Tapi saya tersesat. _append_banner_addspanggilan SoftwareCenterAgent. Itu panggilan SpawnHelper. Lalu saya tersesat. Ada juga beberapa panggilan SimpleFileDownloadertetapi saya tidak dapat melacaknya.

Juga, saya perhatikan entri ini di log debug.

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

Apakah ada dokumentasi tentang bagaimana ini diterapkan? Beberapa resep sederhana untuk mengubah spanduk default dan meletakkan spanduk saya sendiri di jalan yang bersih akan sangat membantu.

Saya kira saya bisa menulis ulang _append_banner_addsfungsinya, tetapi saya tidak terlalu produktif menggunakan python dan saya ingin memahami dan menggunakan metode yang sama yang digunakan Ubuntu, jika memungkinkan.

Jorge Suárez de Lis
sumber

Jawaban:

6

Buka /usr/share/software-center/softwarecenter/backend/scagent.pydan edit awal fungsi ini, sehingga dikatakan:

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

Anda dapat meninggalkan sisanya apa adanya, itu tidak akan pernah tercapai.

Jika Anda ingin dukungan skrip di <iframe>, edit

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

dan temukan settings.set_property("enable-scripts", False). Ubah Falseke True.

Sekarang buat /var/www/cgi-bin/bannerlist.pydan buat itu bisa dieksekusi:

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

Ini menunjukkan daftar spanduk yang dihasilkan.

Sekarang buat /var/www/cgi-bin/banner.pydan buat itu bisa dieksekusi:

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

Ini menunjukkan spanduk yang dihasilkan.

Anda mungkin perlu menghapus cache pusat perangkat lunak. Anda dapat melakukannya dengan menggunakan rm -rf ~/.cache/software-center.

Jelas Anda perlu memasukkan sesuatu /tmp/test.htmlagar spanduk pertama berfungsi.

Anda juga memerlukan server web yang berjalan di 8800 dengan cgi-binagar ini berfungsi. Jika Anda tidak memiliki ini, jalankan ini di 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()"

Anda perlu mendesain iframeuntuk membuatnya mengisi ruang, tetapi Anda mengetahuinya.

Janus Troelsen
sumber
Terima kasih! Tidak bisakah saya menggunakan kembali rotator spanduk standar? Saya mencoba mendeklarasikan beberapa kelas dan itu bekerja dengan cukup baik. Saya mengalami beberapa masalah styling dengan iframe, tapi saya harus bisa mengatasinya. Sekarang saya ingin mengumpulkan pameran banner dari server web, jadi saya mungkin harus menggunakan JSON. Harap perhatikan bahwa bounty termasuk ini, mengumpulkan spanduk dari server saya sendiri. Jika Anda memasukkan informasi ini, saya akan dapat memberi Anda hadiah :)
Jorge Suárez de Lis
@ JorgeSuárezdeLis: selesai
Janus Troelsen
Ok, ini tidak berfungsi. Pada aplikasi saya melihat kesalahan seperti ini: Unable to load page - Problem occurred while loading the URL http:localhost:8800cgi-binbanner.py(sama untuk versi lokal aktif /tmp). Versi lama berfungsi, tetapi sekarang tampaknya menghapus garis miring URL di suatu tempat. Pameran dikumpulkan OK, dan saya bisa mencetak konten HTML ke konsol dan garis miring ada, tetapi pada aplikasi mereka hilang! Apa yang mungkin terjadi?
Jorge Suárez de Lis
Ya, apakah Anda yakin URL itu dapat diakses? Coba muat menggunakan curldi konsol. Saya pikir itu hanya menghapus garis miring dalam pesan kesalahan.
Janus Troelsen
Saya kira tidak. Saya telah mengambil tangkapan layar . Dua petisi pertama berasal dari Firefox. Hanya spanduk yang tampaknya dikumpulkan dari pusat perangkat lunak.
Jorge Suárez de Lis