Warning, /multimedia/kid3/src/qml/script/ExportJson.qml is written in an unsupported language. File is not indexed.

0001 /**
0002  * \file ExportJson.qml
0003  * Export all tags of all files to a JSON file.
0004  *
0005  * \b Project: Kid3
0006  * \author Urs Fleisch
0007  * \date 29 Oct 2021
0008  *
0009  * Copyright (C) 2021  Urs Fleisch
0010  *
0011  * This program is free software; you can redistribute it and/or modify
0012  * it under the terms of the GNU Lesser General Public License as published by
0013  * the Free Software Foundation; version 3.
0014  *
0015  * This program is distributed in the hope that it will be useful,
0016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0018  * GNU Lesser General Public License for more details.
0019  *
0020  * You should have received a copy of the GNU Lesser General Public License
0021  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
0022  */
0023 
0024 import Kid3 1.0
0025 
0026 Kid3Script {
0027   onRun: {
0028     var obj = {data: []}
0029     var selectedFramesV1 = null
0030     var selectedFramesV2 = null
0031     var selectedFramesV3 = null
0032 
0033     /**
0034      * Get list of frame names which are selected in frame table.
0035      * @param tagNr Frame.Tag_1, Frame.Tag_2, or Frame.Tag_3
0036      * @return selected frame names, null if all frames are selected.
0037      */
0038     function getSelectedFrames(tagNr) {
0039       var checked = []
0040       var frameModel = app.tag(tagNr).frameModel
0041       var numRows = frameModel.rowCount()
0042       for (var row = 0; row < numRows; ++row) {
0043         var name = script.getRoleData(frameModel, row, "name")
0044         if (script.getRoleData(frameModel, row, "checkState") === Qt.Checked) {
0045           checked.push(name)
0046         }
0047       }
0048       return checked.length < numRows ? checked : null
0049     }
0050 
0051     /**
0052      * Remove all frames from tags which are not included in @a selectedFrames.
0053      * @param tags object with frame names as keys
0054      * @param selectedFrames array with keys which will not be removed,
0055      * if null, nothing will be removed
0056      */
0057     function removeUnselectedFrames(tags, selectedFrames) {
0058       if (selectedFrames) {
0059         for (var name in tags) {
0060           if (tags.hasOwnProperty(name)) {
0061             if (!selectedFrames.includes(name)) {
0062               delete tags[name]
0063             }
0064           }
0065         }
0066       }
0067     }
0068 
0069     function doWork() {
0070       var tags
0071       var prop
0072       if (app.selectionInfo.tag(Frame.Tag_2).tagFormat) {
0073         tags = app.getAllFrames(tagv2)
0074         removeUnselectedFrames(tags, selectedFramesV2)
0075       }
0076       if (app.selectionInfo.tag(Frame.Tag_1).tagFormat) {
0077         var tagsV1 = app.getAllFrames(tagv1)
0078         removeUnselectedFrames(tagsV1, selectedFramesV1)
0079         if (typeof tags === "undefined") {
0080           tags = {}
0081         }
0082         for (prop in tagsV1) {
0083           tags["v1" + prop] = tagsV1[prop]
0084         }
0085       }
0086       if (app.selectionInfo.tag(Frame.Tag_3).tagFormat) {
0087         var tagsV3 = app.getAllFrames(Frame.TagV3)
0088         removeUnselectedFrames(tagsV3, selectedFramesV3)
0089         if (typeof tags === "undefined") {
0090           tags = {}
0091         }
0092         for (prop in tagsV3) {
0093           tags["v3" + prop] = tagsV3[prop]
0094         }
0095       }
0096       if (tags) {
0097         // Feel free to add additional elements, but you may have to exclude
0098         // them in ImportJson.qml too.
0099         // tags["Duration"] = app.selectionInfo.formatString(Frame.Tag_2, "%{duration}")
0100         // tags["Bitrate"] = app.selectionInfo.formatString(Frame.Tag_2, "%{bitrate}")
0101         // tags["Mode"] = app.selectionInfo.formatString(Frame.Tag_2, "%{mode}")
0102         // tags["Codec"] = app.selectionInfo.formatString(Frame.Tag_2, "%{codec}")
0103         // tags["Directory"] = app.selectionInfo.formatString(Frame.Tag_2, "%{dirname}")
0104         // tags["File"] = app.selectionInfo.formatString(Frame.Tag_2, "%{file}")
0105         obj.data.push(tags)
0106         tags["File Path"] = app.selectionInfo.filePath
0107       }
0108 
0109       if (!app.nextFile()) {
0110         var txt = JSON.stringify(obj)
0111         var exportPath = getArguments()[0]
0112         if (!exportPath) {
0113           exportPath = app.selectFileName(
0114             "Export", app.dirName + "/export.json",
0115             "JSON files (*.json);;All files (*)", true)
0116           if (!exportPath) {
0117             Qt.quit()
0118             return
0119           }
0120         }
0121         if (script.writeFile(exportPath, txt)) {
0122           console.log("Exported tags of %1 files to %2".
0123                       arg(obj.data.length).arg(exportPath))
0124         } else {
0125           console.log("Failed to write", exportPath)
0126         }
0127         Qt.quit()
0128       } else {
0129         setTimeout(doWork, 1)
0130       }
0131     }
0132 
0133     function startWork() {
0134       selectedFramesV1 = getSelectedFrames(Frame.Tag_1)
0135       selectedFramesV2 = getSelectedFrames(Frame.Tag_2)
0136       selectedFramesV3 = getSelectedFrames(Frame.Tag_3)
0137 
0138       app.expandFileListFinished.disconnect(startWork)
0139       console.log("Reading tags")
0140       app.firstFile()
0141       doWork()
0142     }
0143 
0144     if (!isStandalone() && app.hasGui()) {
0145       console.log("Expanding file list")
0146       app.expandFileListFinished.connect(startWork)
0147       app.requestExpandFileList()
0148     } else {
0149       startWork()
0150     }
0151   }
0152 }