In 1998 ist das Familienunternehmen meiner Eltern von Schreibmaschine auf PC umgestiegen. Um zu üben stand der erste Firmen-Rechner bei uns zwei Wochen lang im Wohnzimmer. Das erste was ich gemacht habe war alle frei lesbaren Files im System32
-Ornder zu lesen.... warum auch immer... . Das zweite war mit die PC Games im zwei Kilometer entfernten EDEKA zu kaufen, denn da war die die Demo von Command & Conquer: Tibirian Sun
drauf.
Fun Fakt: Ich bin heut zutage zuständig für die IT im Unternehmen und als ich 2004 den PC entsorgt habe war die Demo immer noch installiert. ... Ja, unprofessionell ... aber wer einen (damals) 10-Jährigen zum "Sys-Admin" einer Firma macht ist doch selbst schuld oder?
Was will ich mit dieser Ausschweifenden Einleitung aussagen? Nun, ich habe es schon immer geliebt durch's System zu streifen um zu verstehen wie alles funktioniert. Bei Windows ist das freilich nicht so einfach wie unter Linux... sagen wir einfach heuzutage macht es noch mehr Spaß.
Für eines meiner Projekte, brauchte ich etwas Inspiration und weil mint-install
in Python geschrieben ist und ich das lesen kann, habe ich es mir mal genauer angeschaut.
Wie kommen eigentlich die Screenshots in die Mint-Anwendungsverwaltung?
Zu wissen, wo man suchen muss, ist alles. Kleine Programme und Bash-Dateien liegen für gewöhnlich in /bin
. Scrollen wir durch den Ordner, so finden wir irgendwann eine Datei mit dem Namen mintinstall
. Öffnet man diese, bekommt man einen Pfad zur ausführbaren Datei [/usr/lib/linuxmint/mintinstall]
mintinstall.py. Im Hauptverzeichnis befinden sich noch andere Skripte, denn für die Übersichtlichkeit ist das Ganze auf viele Skripte aufgeteilt, die zusammenarbeiten.
Ich persönlich habe alle Dateien komplett gelesen und bin zu dem Schluss gekommen, dass eine Stichwortsuche nach "Screenshot" alles viel einfacher gemacht hätte.
Unsere erste Station ist gi.require_version('AppStreamGlib', '1.0')
. Wenn ihr euch auf Flathub rumtreibt, wird euch bestimmt schon aufgefallen sein, dass die Indexnamen von Programmen in Flatpak eine gewisse Struktur haben: org.gimp.GIMP
> also z.B. git
,org
,de
,com
+ Projekt/Entwickler
+ Programmname
. Das ist wichtig für AppStream
zur Identifizierung des Programms. Das Ganze folgt FreeDesktop-Richtlinien, die ihr hier einfach mal nachlesen könnt: https://www.freedesktop.org/software/appstream/docs/
AppStreamGlib ist eine Bibliothek in Linux, die Entwicklern dabei hilft, mit Metadaten von Anwendungen und Softwarepaketen umzugehen. Sie wird oft in Anwendungen und Tools verwendet, die mit Software- oder Anwendungsinformationen arbeiten, wie z.B. Software-Centern oder Paketmanagern. AppStreamGlib ermöglicht es, Metadaten zu lesen, zu analysieren und zu manipulieren, was es Entwicklern erleichtert, Anwendungsdaten zu verarbeiten und anzuzeigen. Sie ist Teil des AppStream-Projekts, das sich auf die Standardisierung und Verbesserung der Softwareverteilung und -installation auf Linux-Systemen konzentriert.
Für uns ist wichtig, dass wir appstream
auch über das Terminal ansteuern können. Mit appstreamcli --help
bekommen wir heraus, wie man das Tool nutzt. Der Befehl appstreamcli dump org.gimp.GIMP
druckt das komplette Index-File ins Terminal. Wir können den Output mit > gimp_test.txt hinten dran in eine Datei umleiten.
Relevant sind aber in unserem Fall die folgenden Zeilen, die ganz klar die Größe und den abrufbaren Ort der Bilddatei definieren:
Zeichnen in GIMP
https://dl.flathub.org/media/org/gimp/GIMP/2acd7abfc48a8f2932f425ddb03aca56/screenshots/image-1_orig.png
https://dl.flathub.org/media/org/gimp/GIMP/2acd7abfc48a8f2932f425ddb03aca56/screenshots/image-1_1248x702@1.png
https://dl.flathub.org/media/org/gimp/GIMP/2acd7abfc48a8f2932f425ddb03aca56/screenshots/image-1_752x423@1.png
https://dl.flathub.org/media/org/gimp/GIMP/2acd7abfc48a8f2932f425ddb03aca56/screenshots/image-1_624x351@1.png
https://dl.flathub.org/media/org/gimp/GIMP/2acd7abfc48a8f2932f425ddb03aca56/screenshots/image-1_224x126@1.png
Wenn ihr also nach einem Programm sucht, wird diese XML
-Datei temporär geladen, und der Screenshot für eine gewisse Zeit gespeichert.
Hier gut zu sehen ab Zeile 316
Von da aus geht die Information nach screenshot_window.py zum Anzeigen. Das ist aber alles ganz langweilig, da wir ja alle Infos in einem Register haben. Richtig freaky wird es erst bei den .DEB
-Dateien, da haben wir ...
Variablen mit mehreren Unbekannten
Die Debian-Dateien kommen zwar auch mit einer Fülle an Informationen (apt show gimp), aber nichts mit Screenshots. Wenn wir weiter mintinstall
durchgucken, sehen wir ab Zeile 360, wie die Magie passiert.
Über from bs4 import BeautifulSoup
werden HTML
-Parameter ausgelesen. Man könnte sagen, bs4
ist ein Suchhund für Zeug im Web. In den folgenden Zeilen lernen wir, dass Debian ein Screenshotarchiv hat: "http://screenshots.debian.net".
Beautiful Soup ist eine Python-Bibliothek, die häufig für das Web-Scraping verwendet wird. Mit Beautiful Soup können Python-Entwickler Webseiteninhalte analysieren und extrahieren, indem sie einen bequemen Weg bieten, HTML und XML-Dokumente zu durchsuchen und zu manipulieren. Es ermöglicht das Durchsuchen des HTML- oder XML-Codes einer Webseite, das Extrahieren von bestimmten Elementen wie Texten, Links, Bildern usw. und das Arbeiten mit diesen Daten in Python. Es ist besonders nützlich für das Extrahieren von Informationen aus Webseiten oder das Durchsuchen von HTML-Dokumenten für bestimmte Muster oder Strukturen.
Gimp hat hier auch eine Galerie (https://screenshots.debian.net/package/gimp), und die Adresse für einen Screenshot kann man über den Browser gleich herausfinden: "https://screenshots.debian.net/shrine/screenshot/simage/large-a62ff8cb75dfe34341ef93da0c96b542.png". Blöd nur, wenn man mal etwas anderes als gimp sucht. Die Adresse für das PNG kennen wir ja, aber was ist mit den 64.000 anderen Programmen? Nun, der erste Teil der Information ist statisch: https://screenshots.debian.net/shrine/screenshot/simage/large-
. Was wir nicht wissen, ist, was zwischen large-
und .png
los ist. Da kommt BeautifulSoup ins Spiel.
Die Variable images = page.findAll('img')
weist an, alle Bilder zu finden, die sich unter der genannten Adresse befinden. Crazy!!!! mintinstall
sucht dann bis zu 4 Bilder und gibt die HTTP-Adresse dazu aus.
Billignachbau aus dem Bastelkeller!
Das Problem ist das bei mintinstall sehr viele Räder in einander greifen. Man kann diese eine Funktion nicht einfach rauskopieren und erwarten, das es funktioniert. Vor zwei Jahren habe ich mir die Nächte um die Ohren geschlagen um meine Eigene Variante zu schreiben. Das ist eine sehr stark vereinfachte Version:
In der Variable apt_app = "gimp"
kann man nun "gimp" mit so ziemlich jedem Programm-Namen austauschen.
from bs4 import BeautifulSoup
from urllib.request import urlopen
import requests
from PIL import ImageTk, Image
import tkinter as tk
def get_img():
apt_app = "gimp"
url = f"https://screenshots.debian.net/package/{apt_app}#gallery-1"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
links = [
link.get("href")
for link in soup.find_all("a")
if link.get("href").endswith(".png")
]
url_output = f"https://screenshots.debian.net{str(links[1])}"
with urlopen(url_output) as url_output:
app_img = Image.open(url_output)
app_img = resize(app_img)
app_img = ImageTk.PhotoImage(app_img)
apt_panel.config(image=app_img)
# Keeping a reference to the image to avoid garbage collection
apt_panel.image = app_img
def resize(image, width=200, height=200):
return image.resize((width, height))
root = tk.Tk()
root.title("Screenshot")
apt_panel = tk.Label(root)
apt_panel.pack(pady=20)
get_img()
root.mainloop()
Importieren der erforderlichen Module:
BeautifulSoup
ausbs4
für das Parsen von HTML-Inhalten.urlopen
ausurllib.request
zum Öffnen von URLs.requests
für das Senden von HTTP-Anfragen.ImageTk
undImage
ausPIL
(Python Imaging Library) für die Verarbeitung von Bildern.tkinter
alstk
für die Erstellung des GUI.
Definition der Funktion get_img()
:
- Die Funktion holt sich Screenshots eines bestimmten Debian-Pakets (hier "gimp") von der Webseite
https://screenshots.debian.net
. - Sie erstellt eine URL für das entsprechende Paket und ruft die Seite mit
requests.get()
auf. - Dann verwendet sie
BeautifulSoup
, um den HTML-Code der Seite zu parsen und die Links zu den PNG-Bildern zu extrahieren. - Der zweite PNG-Link wird ausgewählt und eine vollständige URL für das Bild wird erstellt.
- Das Bild wird mit
urlopen()
von der URL geöffnet und mitImage.open()
gelesen. - Das Bild wird dann auf eine Standardgröße von 200x200 Pixel mit der Funktion
resize()
skaliert. - Schließlich wird das Bild als
ImageTk.PhotoImage
konvertiert, um es in einemLabel
-Widget anzuzeigen.
Definition der Funktion resize()
:
- Eine Hilfsfunktion zum Skalieren von Bildern auf eine bestimmte Breite und Höhe.
Initialisierung des GUI:
- Ein Tkinter-Fenster wird erstellt und mit dem Titel "Screenshot" versehen.
- Ein
Label
-Widgetapt_panel
wird erstellt, um das Bild anzuzeigen. - Die Funktion
get_img()
wird aufgerufen, um das Bild zu laden.
Ausführung des GUI:
- Die
mainloop()
-Methode wird aufgerufen, um das GUI anzuzeigen und auf Benutzereingaben zu warten.
Und jetzt entschuldigt mich... Seit kurzem gibt es Tiberian Sun auf Steam und das muss gezockt werden! :D
Quellen:
https://github.com/linuxmint/mintinstall
Quellen sind direkt im Text verarbeitet
Mit MS-DOS 3.3/ 5.0/6.2 und WfW 3.11 bin ich ja noch problemlos klargekommen, aber ab Windows_98se und Linux ist mir das alles, die Software intern, zu spooky! Ich bin zu alt für diesen Sche***! Nun, hauptsache die Hardware funktioniert.
Na dann... Viel Spass.
Command & Conquer: Tiberian Sun + Firestorm 1.0
....Als Krönung der C&C-Reihe gilt auch heute bei vielen Spielern noch Teil drei – Command & Conquer: Tiberian Sun, der seit 2010 als englische Freeware-Vollversion ganz legal im Internet erhältlich ist. Dazu gibt's außerdem – ebenfalls komplett kostenlos – das Firestorm genannte Add-on. ...
https://www.heise.de/download/product/command-conquer-tiberian-sun-firestorm-71708
Futter für den Retro-PC!