Bijlage C. QML-interface

QML-voorbeelden

QML-scripts kunnen aangeroepen worden via het contextmenu van de bestandenlijst en kunnen ingesteld worden in het tabblad Gebruikeracties van de instellingendialoog. De scripts die daar worden ingesteld kunnen gebruikt worden als voorbeelden om eigen scripts te programmeren. QML gebruikt JavaScript, hier is het verplichte "Hello World":

import Kid3 1.0

Kid3Script {
  onRun: {
    console.log("Hello world, map is", app.dirName)
    Qt.quit()
  }
}

Als dit script opgeslagen wordt als /pad/naar/Voorbeeld.qml, kan het gebruikerscommando gedefinieerd worden als @qml /pad/naar/Voorbeeld.qml met de naam QML Test en Uitvoer geactiveerd. Het kan gestart worden met het item QML Test in het contextmenu van de bestandenlijst en de uitvoer zal zichtbaar zijn in het venster.

Helaas is het starten van de QML-scripts met qml (bijv. qml -apptype widget -I /usr/lib/kid3/plugins/imports /pad/naar/Voorbeeld.qml) gebroken in recente versies van Qt. Maar kid3-cli biedt een alternatieve manier om een QML-script uit te voeren vanaf de opdrachtregel met zijn commando execute.

kid3-cli -c "execute @qml /pad/naar/Voorbeeld.qml"

Om een lijst te maken van de titels in tag 2 van alle bestanden in de huidige map, kan het volgende script worden gebruikt:

import Kid3 1.0

Kid3Script {
  onRun: {
    app.firstFile()
    do {
      if (app.selectionInfo.tag(Frame.Tag_2).tagFormat) {
        console.log(app.getFrame(tagv2, "title"))
      }
    } while (app.nextFile())
  }
}

Als de map veel bestanden bevat zou zo'n script het gebruikersinterface enige tijd kunnen blokkeren. Voor langere bewerkingen zou het daarom af en toe een pauze moeten hebben. De alternatieve onderstaande implementatie heeft het werk voor een enkel bestand verplaats naar een functie. Deze functie roept zichzelf aan met een timeout van 1 ms aan het eind, gegeven dat er meer bestanden zijn om te verwerken. Dit zal verzekeren dat de GUI actief zal blijven terwijl het script actief is.

import Kid3 1.0

Kid3Script {
  onRun: {
    function doWork() {
      if (app.selectionInfo.tag(Frame.Tag_2).tagFormat) {
        console.log(app.getFrame(tagv2, "title"))
      }
      if (!app.nextFile()) {
        Qt.quit()
      } else {
        setTimeout(doWork, 1)
      }
    }

    app.firstFile()
    doWork()
  }
}

Bij gebruik van app.firstFile() met app.nextFile(), zullen alle bestanden in de huidige map verwerkt worden. Als alleen de geselecteerde bestanden meegenomen moeten worden, gebruik in plaats daarvan firstFile() en nextFile(), dit zijn gemaksfuncties van de component Kid3Script. Het volgende voorbeeld is een script dat alleen het discnummer en de copyrightframes van de geselecteerde bestanden kopieert.

import Kid3 1.1

Kid3Script {
  onRun: {
    function doWork() {
      if (app.selectionInfo.tag(Frame.Tag_2).tagFormat) {
        app.setFrame(tagv2, "*.selected", false)
        app.setFrame(tagv2, "discnumber.selected", true)
        app.setFrame(tagv2, "copyright.selected", true)
        app.copyTags(tagv2)
      }
      if (!nextFile()) {
        Qt.quit()
      } else {
        setTimeout(doWork, 1)
      }
    }

    firstFile()
    doWork()
  }
}

Met Kid3 komen meer voorbeeldscripts en deze zijn al geregistreerd als gebruikercommando's.

  • ReplayGain to SoundCheck (ReplayGain2SoundCheck.qml): Create iTunNORM SoundCheck informatie uit "replay gain frames".

  • Albumillustraties van grootte wijzigen (ResizeAlbumArt.qml): Ingebedde hoesillustratieafbeeldingen die groter zijn dan 500x500 pixels van grootte wijzigen.

  • Albumillustraties uitpakken (ExtractAlbumArt.qml): Alle ingebedde hoesillustratieafbeeldingen uitpakken met vermijding van duplicaten.

  • Albumillustraties inbedden (EmbedAlbumArt.qml): Albumillustraties gevonden in afbeeldingsbestanden inbedden in audiobestanden in dezelfde map.

  • Liedteksten inbedden (EmbedLyrics.qml): Niet gesynchroniseerde liedteksten ophalen uit webservice.

  • Tekstcodering ID3v1 (ShowTextEncodingV1.qml): Helpt om de codering van ID3v1 tags te vinden door de tags van het huidige bestand in alle beschikbare tekencoderingen te tonen.

  • ID3v1 to ASCII (Tag1ToAscii.qml): Zet de uitgebreide latin-tekens in de ID3v1 tag over naar ASCII.

  • Engelse vorm van hoofd/kleine letters bij titels (TitleCase.qml): Formatteert tekst in de tags naar de Engelse vorm van hoofd/kleine letters bij titels.

  • Tags opnieuw schrijven (RewriteTags.qml): Alle tags in de geselecteerde bestanden opnieuw schrijven.

  • CSV exporteren (ExportCsv.qml): Exporteert recursief alle tags van alle bestanden naar een CSV-bestand.

  • CSV importeren (ImportCsv.qml): Importeert recursief alle tags van alle bestanden uit een CSV-bestand.

  • JSON exporteren (ExportJson.qml): Exporteert recursief alle tags van alle bestanden naar een JSON-bestand.

  • JSON importeren (ImportJson.qml): Importeert recursief alle tags van alle bestanden uit een JSON-bestand.

  • Afspeellijstmap exporteren (ExportPlaylist.qml): Alle bestanden uit een afspeellijst kopiëren in een map en ze hernoemen volgens hun positie.

  • QML-console (QmlConsole.qml): Eenvoudige console om af te spelen met QML API van Kid3.