Erweiterung media.windows-media-foundation.enabled

  • Ich war gestern etwas genervt. Ich wollte einige mp3 Dateien herunter laden und seit neuestem werden die ja direkt im Browser abgespielt. Eigentlich alles kein Problem, man kann ja entweder auch Rechtsklick "Ziel speichern unter.." machen, (was bei vielen Dateien aber recht aufwändig ist), oder aber in about:config den Schalter media.windows-media-foundation.enabled zu false umlegen. Letzteres habe ich auch gemacht.

    Da ich aber immer mal wieder wechseln möchte, und nicht immer in about:config gehen möchte habe ich gedacht: "Da gibts doch bestimmt eine Erweiterung dafür" :| Ich bin nicht fündig geworden. Und bevor ich noch länger rum suche habe ich mir gedacht: ok, dann machste das irgendwie selbst. :mrgreen:

    Es gibt ja x Anleitungen im Netz, aber ehrlich Leute, ich bin zu doof für diese Anleitungen. Ich hab einfach zu wenig (eigentlich gar keine) Ahnung vom coden. Selbst von unserem lieben Sören seine Anleitungs Seiten war das für mich zu kompliziert.

    Also suchte ich nach einer Erweiterung die es schon gibt und nahm diese Opentabs Erweiterung quasi als Vorlage und fing an zu basteln.

    Kurz und knapp:
    hier ist sie im Anhang Anhang per xpi ging nicht, deshalb dann hier
    EDIT: ehemaligen Link entfernt, da es mittlerweile eine offizielle Version gibt.

    Was macht sie?
    Nach der Installation findet man unten rechts in der Add-on Leiste einen Button mit dem man wahlweise "media.windows-media-foundation.enabled" auf false oder true setzen kann (Standard ist seit Firefox 21 true).

    Nun meine Frage: bitte die Fachmänner hier den Code ansehen und sagen ob das so in Ordnung ist und ob und vor allem wie ich es noch möglich machen kann, dass man den Button per "Anpassen" an eine andere Stelle verschieben kann.
    Auch mit dem Namen der Erweiterung bin ich noch nicht so ganz zufrieden. Vorschläge sind willkommen :lol:

    Hilfe auch im deutschsprachigen Matrix-Chat möglich oder im IRC-Chat
    Meine Anleitungstexte dürfen gerne "geklaut" und weiter verwendet/kopiert werden ;)

    5 Mal editiert, zuletzt von Zitronella (2. Januar 2014 um 21:33)

  • Hallo Zitronella,

    von mir bekommst du natürlich auch ein bisschen Input. ;) Grundsätzlich macht die Erweiterung, was sie machen soll, und ist damit für den eigenen Gebrauch absolut ausreichend. Die Erweiterung ist extrem schlank, was den Download sehr schnell macht, aber in der Konsequenz eben auch bedeutet, dass das gewisse drum herum fehlt.

    Zunächst sehe ich das Problem, dass die Erweiterung sich nicht darum kümmert, was mit der Einstellung passiert, wenn die Erweiterung deinstalliert wird. Wenn du die Einstellung auf false setzt und dann die Erweiterung deinstallierst, bleibt die Einstellung weiter auf false stehen. In den Add-on-Guidelines von Mozilla steht unter dem Abschnitt "Be Respectful to Users", dass Einstellungen bei Deinstallation zurückgesetzt werden sollen [1].

    Der zweite Punkt, der mich stört, ist die Tatsache, dass der Browser zur Installation der Erweiterung neu gestartet werden soll. Für eine Erweiterung, welche lediglich einen Schalter umkippt, ist das absolut nicht notwendig. Nur die entsprechende Logik, dass der Neustart nicht notwendig ist, fehlt der Erweiterung.

    Ein weiteres Problem hast du selber angesprochen, du kannst das Symbol weder innerhalb der Add-on-Leiste noch raus in die Navigationssymbolleiste verschieben. Du kannst beide Dinge, kein Neustart und das Verschieben, ganz einfach haben, ohne dafür auch nur eine einzige Zeile Code schreiben zu müssen. Verwende ganz einfach das Add-on SDK von Mozilla. Die Erweiterungen lassen sich online erstellen und live testen [2].

    Wenn du das SDK verwendest, hast du weitere Vorteile gratis: Du sparst es dir, XUL-Overlays verwenden zu müssen, das ist immer sehr unschön. Außerdem wäre ich mir nicht sicher, ob die Erweiterung so nicht sehr bald schon eine Anpassung brauchen wird, aufgrund der Änderungen an der Add-on-Leiste im Rahmen des Australis-Redesigns, welches für Firefox 24 angestrebt wird. Das SDK hingegen ist fest in Firefox integriert, das heißt, solche Änderungen können dir egal sein, weil Mozilla dafür sorgt, dass die Erweiterung angezeigt wird, du nutzt einfach nur noch die API, welche Mozilla dir bereitstellt, um ein Symbol in der Add-on-Leiste zu platzieren (Widget-API, [3]). Und schließlich sind SDK-Erweiterungen von Haus aus e10s-kompatibel. Das heißt, sobald Mozilla alles in eigene Prozesse ausgelagert hat, musst du deine Erweiterung nicht anpassen, damit sie weiter funktioniert, das SDK wurde bereits in Hinblick auf e10s entwickelt.

    Anbei folgt ein Beispiel, welches im Prinzip das macht, was deine Erweiterung auch macht, mit der Ausnahme, dass das Symbol nicht geändert wird. Als Symbol lade ich einfach das Favicon von der Mozilla-Webseite, aber man kann auch ein einges Symbol mitliefern, das ist kein Problem. Dafür kommt diese SDK-Variante ohne Browser-Neustart aus, ist in der Browseroberfläche verschiebbar und die Einstellung wird bei Deaktivierung der Erweiterung zurückgesetzt. Eigentlich sollte sie das auch bei Deinstallation werden, wird sie aufgrund eines Bugs aber nicht [4]. Der Code berücksichtigt den Fall der Deinstallation aber, das heißt, sobald Mozilla den Fehler behebt, wird die Einstellung auch bei Deinstallation der Erweiterung zurückgesetzt. Hier nun also ein Code, wie man ihn im Add-on Builder [2] schreiben würde:

    [1] https://developer.mozilla.org/en-US/docs/Moz…d-on_guidelines
    [2] https://builder.addons.mozilla.org
    [3] https://addons.mozilla.org/en-US/develope…sdk/widget.html
    [4] https://bugzilla.mozilla.org/show_bug.cgi?id=627432

  • ui, erst einmal danke für deinen ausführlichen Bericht Sören. Aber genau mit diesem Builder habe ich ja anfangs versucht zurecht zu kommen. Ich blicks einfach nicht. Auch nicht wenn ich deinen Code da rein werfe (main.js). Dann kann ich eine .zip oder auch .xpi herunterladen und auch installieren aber das wars auch schon. Keinerlei Funktion scheint das Ding zu haben. Auch ist mir unklar wie ich den Button dort rein bekomme um den Schalter dann letztendlich um zu legen :-??

    An sich finde ich deine Argumentation ja durchaus richtig, und ich hätte es auch gerne so dass die Erweiterung voll kompatibel und anpassbar ist, aber ich glaube letztendlich bin ich dafür zu ungeeignet. :traurig:

    Wahrscheinlich braucht man eben doch etwas mehr KnowHow von der Materie als nur ein fertiges Addon zu nehmen und mit try&error anzupassen bis es funktioniert.

    Hilfe auch im deutschsprachigen Matrix-Chat möglich oder im IRC-Chat
    Meine Anleitungstexte dürfen gerne "geklaut" und weiter verwendet/kopiert werden ;)

  • Ich glaub, mir ist beim Kopieren ein Anführungszeichen abhanden gekommen. Ich hab den Code oben aktualisiert, jetzt sollte er hoffentlich funktionieren. ;)

    Mit dieser Erweiterung hast du das Firefox-Logo (http://www.mozilla.org/favicon.ico) in der Add-on-Leiste. Klickst du im Builder neben Data auf das [+], dann kannst du dein Symbol hochladen. Im Code würdest du oben (bei den anderen const-Deklarationen) dann sowas einfügen wie:

    Code
    const data = require('sdk/self').data;

    und aus der Zeile:

    Code
    contentURL: 'http://www.mozilla.org/favicon.ico',

    würdest du dann machen:

    Code
    contentURL: data.url('logo.png'),

    natürlich mit dem Namen der hochgeladenen Datei. Und schon hast du dein eigenes Icon drin. Und bei Klick auf dieses Symbol passiert eben das, was im Code oben innerhalb von onClick steht. Dort wird einfach überprüft, ob die Einstellung false ist und wenn ja, die Einstellung auf true gesetzt oder vice versa.

    Wieso ich das SDK nahelege, hat ganz einfach den Grund, dass es einem gratis all die weiter oben genannten Vorteile bringt, ohne dass man das selber implementieren müsste. Und die Dokumentation des SDKs verdient wirklich das Prädikat Weltklasse. So klassische Erweiterungen mit XUL-Overlays und alles sind deutlich schwieriger umzusetzen und erfordern mehr Pflege, wenn Mozilla Teile von Firefox ändert.

  • ui klasse, das klappt schonmal. :klasse: Nur wie bekomme ich es hin dass sich der Button ändert? Im Moment seh ich ja gar nicht ob es auf false oder true steht.
    Außerdem hätte ich natürlich noch gerne das ein Icon drin wenn man about:addons eingibt, wie bei anderen auch, neben der Beschreibung.

    Hilfe auch im deutschsprachigen Matrix-Chat möglich oder im IRC-Chat
    Meine Anleitungstexte dürfen gerne "geklaut" und weiter verwendet/kopiert werden ;)

  • Das Ändern des Icons ist relativ einfach, du musst einfach contentURL bei Klick neu setzen, hier der angepasste onClick-Handler:

    Code
    onClick: function() {
        if (false === prefs.get('media.windows-media-foundation.enabled')) {
            prefs.set('media.windows-media-foundation.enabled', true);
            this.contentURL = data.url('enabled.png');
        }
        else {
            prefs.set('media.windows-media-foundation.enabled', false);
            this.contentURL = data.url('disabled.png');
        }
    }

    Das Symbol sollte natürlich bereits bei Initialisierung der Erweiterung passen und nicht erst nach einem Klick. Daher füge vor dem

    Code
    widgets.Widget({

    noch soetwas ein wie das hier:

    Code
    let icon =
        true === prefs.get('media.windows-media-foundation.enabled') ?
        'enabled.png' : 'disabled.png'

    und änder das

    Code
    contentURL: data.url('logo.png'),

    in

    Code
    contentURL: data.url(icon),

    Die Beschreibung kannst du genauso wie den Namen der Erweiterung direkt im Builder ändern, wenn du auf das Zahnrad-Icon klickst. Dort würde ich auch eine vernünftige JID vergeben, das ist eine eindeutige ID für deine Erweiterung, üblicherweise ist die ID im Format einer E-Mail-Adresse (muss keine tatsächliche E-Mail-Adresse sein).

    Ein Logo für den Add-on-Manager kannst du nicht über den Add-on Builder einstellen, ist aber auch sehr einfach einzubinden. Exportiere die Erweiterung als XPI, entpacke sie und füge hier direkt in die oberste Ebene eine Datei mit dem Namen icon.png ein, Größe 48x48px. Zusätzlich kannst du noch eine Version mit 64x64px als icon64.png dazulegen. Danach neu packen und die Erweiterung hat ein Logo. Die kleinere Version wird in der Auflistung der Add-ons benutzt, die größere in der Detail-Ansicht. Wenn du keine 64x64-Version dazulegst, wird in der Detailansicht die 48x48-Version benutzt.

  • Vielen vielen Dank Sören, das hätt ich nie alleine geschafft. :oops:
    Jetzt scheint alles so zu funktionieren wie ich es haben will :klasse: Dann werde ich mir vielleicht irgendwann noch eine andere kleine Erweiterung basteln nach ähnlichem Schema. :mrgreen:

    Hilfe auch im deutschsprachigen Matrix-Chat möglich oder im IRC-Chat
    Meine Anleitungstexte dürfen gerne "geklaut" und weiter verwendet/kopiert werden ;)

  • Kein Problem, dafür bin ich ja da. :) Im Prinzip könntest du den Tooltip, welcher beim Herüberfahren mit der Maus über das Symbol erscheint, noch zweisprachig (Deutsch, Englisch) machen und die Erweiterung dann auf AMO hochladen. Mehrsprachigkeit ist zwar nicht wichtig, aber viel zu übersetzen wäre es ja nicht. :D Leider muss man dafür aus dem Builder heraus, das ist beim ersten mal etwas komplizierter. :-/

  • ok, dann brauch ich aber wahrscheinlich deine Hilfe. Aber vor nächster Woche wird das nix. Du kannst mir aber gerne schon Tipps geben was ich dazu machen muss. Einen Ordner "locale" gibts ja schon und wenn drin quasi ein gepacktes .jar drin sein sollte bekomme ich das auch irgendwie hin.

    Hilfe auch im deutschsprachigen Matrix-Chat möglich oder im IRC-Chat
    Meine Anleitungstexte dürfen gerne "geklaut" und weiter verwendet/kopiert werden ;)

  • Ich werd das nachher mal testen, ob man einfach nur eine Datei mit einer bestimmten Struktur benötigt. Das weiß ich ehrlich gesagt gar nicht, weil ich den Builder nicht mehr benutze, sondern auf meinem Notebook die Erweiterungen mittels Kommandozeilen-Tool kompiliere (dafür muss Python installiert sein), das wandelt die Sprachdateien, wie sie in der Dokumentation des SDKs stehen, nämlich um. Ob das schon die ganze Magie ist oder noch mehr dazu gehört, werd ich schauen. Ich meld mich dann später wieder hier, muss noch bisschen was arbeiten vorher.

  • /*

    Zitat von Sören Hentzschel

    Erweiterungen mittels Kommandozeilen-Tool kompiliere

    Wenn wieder Zeit vorliegt, könntest du das Verfahren bitte etwas erläutern ?
    */

  • Das kann ich sogar jetzt noch schnell machen. ;)

    Voraussetzung: Python 2.5 oder Python 2.6, Python 3.x wird nicht unterstützt.

    Zunächst lädt man sich das SDK herunter und entpackt das Archiv:
    https://ftp.mozilla.org/pub/mozilla.or…-sdk-latest.zip

    Dann navigiert man über die Kommandozeile in den entsprechenden Ordner und gibt folgendes ein:

    auf OS X / Linux:
    source bin/activate

    auf Windows:
    bin\activate

    Dann erstellt man sich einen Ordner für seine Erweiterung (mkdir myAwesomeAddon && cd myAwesomeAddon, z.B.) und kann mittels cfx init das Grundgerüst für eine SDK-Erweiterung erstellen. Dann bearbeitet man wie man es im Builder auch tun würde, seine Dateien, zum Beispiel die main.js (im Verzeichnis lib). Mit cfx run kann man die Erweiterung dann ausführen. Beim ersten mal erscheint noch eine Fehlermeldung, weil dann erst eine eindeutige ID für die Erweiterung generiert und in die Datei package.json eingetragen wird, einfach noch ein zweites mal ausführen, dann geht das. Mit dem Kommando cfx xpi wird dann die XPI-Datei generiert. Es gibt dann noch so tolle Kommandos wie cfx docs zum Anzeigen der Dokumentation und cfx test zum Durchlaufenlassen der Tests, die man möglicherweise geschrieben hat (Test-Driven-Development ftw!).

    Hier gibt es eine cfx-Dokumentation:
    https://addons.mozilla.org/en-US/develope…e/cfx-tool.html

  • Ich hab mir das mit den Übersetzungen nun mal angeschaut, das ist auch nicht kompliziert. Erstelle im Verzeichnis /locales/ eine Datei de.json für Deutsch und eine Datei en-US.json für Englisch. Der Inhalt muss ein gültiges JSON-Objekt sein, das heißt der komplette Inhalt muss zwischen { und } und es müssen zwangsläufig doppelte Anführungszeichen verwendet werden. Das sieht dann etwa so aus:

    Code
    {
       "LABEL_1": "Deine eine Sprachvariable",
       "LABEL_2": "Eine weitere Sprachvariable"
    }

    Du musst die Namen der Sprachvariablen nicht komplett in Großbuchstaben schreiben, aber ich mach das grundsätzlich so. Zusätzlich muss im Hauptverzeichnis der Erweiterung eine Datei locales.json mit folgendem Inhalt existieren:

    Code
    {"locales": ["de", "en-US"]}

    Und wenn du die Sprachvariablen in der Erweiterung nutzen möchtest, definierst du oben bei den anderen Modulen, welche du lädst:

    Code
    const _ = require('sdk/l10n').get;

    und kannst dann beispielsweise statt

    Code
    label: 'Quick Windows Foundation Codecs',

    sowas schreiben wie

    Code
    label: _('LABEL_1'),
  • ui.. sorry, ich hatte mich noch gar nicht bedankt. Danke Sören. Irgendwie ist mir der Thread mental abhanden gekommen und ich habe mich nicht mehr darum gekümmert und somit auch noch nicht die Sprachdateien. Möchte aber mitteilen dass ich nun auch für Linux (was ich ja auch ab und zu nutze) quasi eine gleiche Erweiterung bastelte. Ist identisch mit der obigen, nur dass anstatt der Wert "media.windows-media-foundation.enabled" stattdessen der Wert "media.gstreamer.enabled" wahlweise auf false oder true gesetzt werden kann.
    Sie heißt quick-media-gstreamer.xpi und man findet sie genauso wie die andere hier Link gelöscht

    Edit: stelle gerade fest dass meine Erweiterung im nightly nicht mehr funktioniert. Sie verstellt zwar den Wert media.windows-media-foundation.enabled auf false oder true, aber es hat keine Auswirkungen mehr. Die mp3 Datei wird immer abgespielt. :evil:
    Edit2: herausgefunden dass wohl zusätzlich der Eintrag "media.directshow.enabled" auf false/true gesetzt werden muss ... mal sehen ob ich das hinbekomme dass beide Einträge geändert werden :| Oder lohnt sich das noch nicht, da in nightly noch zu viel geändert wird?

    Hilfe auch im deutschsprachigen Matrix-Chat möglich oder im IRC-Chat
    Meine Anleitungstexte dürfen gerne "geklaut" und weiter verwendet/kopiert werden ;)

    3 Mal editiert, zuletzt von Zitronella (17. März 2016 um 17:21)

  • Zitat von Zitronella

    Möchte aber mitteilen dass ich nun auch für Linux (was ich ja auch ab und zu nutze) quasi eine gleiche Erweiterung bastelte. Ist identisch mit der obigen, nur dass anstatt der Wert "media.windows-media-foundation.enabled" stattdessen der Wert "media.gstreamer.enabled" wahlweise auf false oder true gesetzt werden kann.
    Sie heißt quick-media-gstreamer.xpi und man findet sie genauso wie die andere hier

    Also macht die Erweiterung im Prinzip das Gleiche, bloß mit einem anderen Schalter in Abhängigkeit vom Betriebssystem. Was hältst du davon, das Betriebssystem in der Erweiterung zu überprüfen und dann beides in einer Erweiterung abzuhandeln? Für mich müsstest du sonst bald noch eine dritte Erweiterung erstellen (OS X). :P

    Code
    let appInfo = Cu.import('resource://gre/modules/Services.jsm').Services.appinfo;
    appInfo.os // hier steckt das Betriebssystem drin

    WINNT = Windows
    Linux = GNU/Linux
    Darwin = OS X

    Nachtrag: Musst dafür Cu erst einmal importieren. Zu den anderen require-Anweisungen dazuschreiben:

    Code
    const {Cu} = require('chrome');
    Zitat von Zitronella

    Edit: stelle gerade fest dass meine Erweiterung im nightly nicht mehr funktioniert. Sie verstellt zwar den Wert media.windows-media-foundation.enabled auf false oder true, aber es hat keine Auswirkungen mehr. Die mp3 Datei wird immer abgespielt. :evil:

    Ich schau heut Abend mal, ob ich dazu was herausfinde.

  • Danke Sören für die Antwort (siehe noch meinen Edit2).

    Zitat von Sören Hentzschel

    Was hältst du davon, das Betriebssystem in der Erweiterung zu überprüfen und dann beides in einer Erweiterung abzuhandeln? Für mich müsstest du sonst bald noch eine dritte Erweiterung erstellen (OS X). :P


    klasse Idee, das wäre natürlich optimal wenn das ginge. Aber wirklich schlau aus deinem Code werde ich nicht. Ich weiß nicht wo der hin muss :o Glaub ich brauche dafür wieder Erklärungen wie bei Sendungen mit der Maus :D

    Hilfe auch im deutschsprachigen Matrix-Chat möglich oder im IRC-Chat
    Meine Anleitungstexte dürfen gerne "geklaut" und weiter verwendet/kopiert werden ;)

  • Oki, Edit2 gesehen. Stimmt, den Schalter hab ich ganz vergessen.

    Ich verlink dir mal den Quellcode einer Erweiterung von mir:
    https://addons.mozilla.org/de/firefox/fil…log/lib/main.js

    In Zeile 25 definiere ich eine Funktion getAppName(), die ist ganz ähnlich. Ich lese dort halt nicht das Betriebssystem, sondern den Anwendungsnamen aus. Und in Zeile 92 verwende ich die Funktion, dort überprüfe ich, ob der Anwendungsname ein bestimmter Name ist. Und die Zeile mit dem require ist bei mir die Zeile Nummer 1 (ich importiere da ein paar Sachen mehr, du brauchst nur Component.Utils (Cu).

    Hier findest du eine Übersicht, was appInfo dir liefern kann:
    https://developer.mozilla.org/en-US/docs/Moz…tilsAPI/appInfo

    Hilft das?

  • Ach, noch was. Benutzt du den Add-on Builder? Wenn ja, solltest du dich schonmal an das Verfahren aus Beitrag #13 gewöhnen. Denn den Add-on Builder wird Mozilla am 7. Januar auf Read-Only setzen und im April dann komplett abschalten. Der Add-on Builder nutzt außerdem auch nicht das SDK in Version 1.15, womit Erweiterungen wirklich wesentlich kleiner sind als wenn du sie im Builder erstellst.