Warning, /multimedia/kid3/src/qml/script/ExportHtmlPlayer.qml is written in an unsupported language. File is not indexed.
0001 /** 0002 * \file ExportHtmlPlayer.qml 0003 * Export HTML file to have a player. 0004 * 0005 * \b Project: Kid3 0006 * \author Urs Fleisch 0007 * \date 21 Aug 2015 0008 * 0009 * Copyright (C) 2015 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 function storeTags(src, dst) { 0029 for (var prop in src) { 0030 var val = src[prop] 0031 if (val) { 0032 var key = prop.toLowerCase() 0033 if (key === "track number") { 0034 key = "track" 0035 } else if (key === "date") { 0036 key = "year" 0037 } 0038 dst[key] = val 0039 } 0040 } 0041 } 0042 0043 function splitFileName(fileName) { 0044 var dotPos = fileName.lastIndexOf(".") 0045 var ext = "" 0046 if (dotPos !== -1) { 0047 ext = fileName.substring(dotPos + 1) 0048 fileName = fileName.substring(0, dotPos) 0049 } 0050 return [fileName, ext] 0051 } 0052 0053 var template = 0054 '<!DOCTYPE html>\n' + 0055 '<html>\n' + 0056 ' <head>\n' + 0057 ' <title class="title"></title>\n' + 0058 ' <meta charset="utf-8" />\n' + 0059 ' </head>\n' + 0060 ' <body>\n' + 0061 ' <div id="player">\n' + 0062 ' <button class="arrow" id="prev-button">⇤</button>\n' + 0063 ' <button class="arrow" id="next-button">⇥</button>\n' + 0064 ' <audio class="current-src" preload="true" autoplay controls></audio>\n' + 0065 ' </div>\n' + 0066 ' <div id="track-data"></div>\n' + 0067 '\n' + 0068 ' <script type="text/javascript">\n' + 0069 'var trackData = %{trackdata};\n' + 0070 '\n' + 0071 'var audio = document.getElementsByTagName("audio")[0];\n' + 0072 'var prevButton = document.getElementById("prev-button");\n' + 0073 'var nextButton = document.getElementById("next-button");\n' + 0074 'var currentTrack = 0;\n' + 0075 '\n' + 0076 'function setCurrentTrackData() {\n' + 0077 ' var data = trackData[currentTrack];\n' + 0078 ' var elements = document.getElementsByClassName("title");\n' + 0079 ' var i;\n' + 0080 ' for (i = 0; i < elements.length; ++i) {\n' + 0081 ' elements[i].innerHTML = data["title"] || "";\n' + 0082 ' }\n' + 0083 ' var currentFile = data["filename"];\n' + 0084 ' elements = document.getElementsByClassName("current-src");\n' + 0085 ' for (i = 0; i < elements.length; ++i) {\n' + 0086 ' elements[i].setAttribute("src", currentFile);\n' + 0087 ' }\n' + 0088 '\n' + 0089 ' var dataStr = "<table>";\n' + 0090 ' for (var key in data) {\n' + 0091 ' if (key !== "filename" && key !== "picture") {\n' + 0092 ' dataStr += "<tr><td>";\n' + 0093 ' dataStr += key;\n' + 0094 ' dataStr += "</td><td><b>";\n' + 0095 ' dataStr += data[key];\n' + 0096 ' dataStr += "</b></td></tr>\\n";\n' + 0097 ' }\n' + 0098 ' }\n' + 0099 ' dataStr += "</table>";\n' + 0100 ' document.getElementById("track-data").innerHTML = dataStr;\n' + 0101 '}\n' + 0102 '\n' + 0103 'function toPrevious() {\n' + 0104 ' if (currentTrack > 0) {\n' + 0105 ' --currentTrack;\n' + 0106 ' setCurrentTrackData();\n' + 0107 ' }\n' + 0108 '}\n' + 0109 '\n' + 0110 'function toNext() {\n' + 0111 ' if (currentTrack + 1 < trackData.length) {\n' + 0112 ' ++currentTrack;\n' + 0113 ' setCurrentTrackData();\n' + 0114 ' }\n' + 0115 '}\n' + 0116 '\n' + 0117 'function loadUrl(newLocation) {\n' + 0118 ' window.location = newLocation;\n' + 0119 ' return false;\n' + 0120 '}\n' + 0121 '\n' + 0122 'audio.addEventListener("ended", function() {\n' + 0123 ' audio.pause();\n' + 0124 ' audio.currentTime=0;\n' + 0125 ' toNext();\n' + 0126 '});\n' + 0127 '\n' + 0128 'prevButton.addEventListener("click", toPrevious, false);\n' + 0129 'nextButton.addEventListener("click", toNext, false);\n' + 0130 'document.addEventListener("DOMContentLoaded", setCurrentTrackData, false);\n' + 0131 ' </script>\n' + 0132 ' <style type="text/css">\n' + 0133 ' #player {\n' + 0134 ' display: flex;\n' + 0135 ' }\n' + 0136 ' #player button {\n' + 0137 ' margin: 0 5px 0 0;\n' + 0138 ' }\n' + 0139 ' </style>\n' + 0140 ' </body>\n' + 0141 '</html>\n' 0142 0143 var trackData = [] 0144 var dirName = ""; 0145 0146 function doWork() { 0147 var fileName = app.selectionInfo.fileName 0148 var baseNameExt = splitFileName(fileName) 0149 var baseName = baseNameExt[0] 0150 if (!dirName && fileName) { 0151 dirName = app.selectionInfo.filePath 0152 dirName = dirName.substring(0, dirName.length - fileName.length) 0153 } 0154 0155 var tags = {} 0156 if (app.selectionInfo.tag(Frame.Tag_1).tagFormat) { 0157 storeTags(app.getAllFrames(tagv1), tags) 0158 } 0159 if (app.selectionInfo.tag(Frame.Tag_2).tagFormat) { 0160 storeTags(app.getAllFrames(tagv2), tags) 0161 } 0162 var hasTags = Object.keys(tags).length > 0 0163 if (hasTags) { 0164 tags["filename"] = fileName 0165 trackData.push(tags) 0166 } 0167 if (!app.nextFile()) { 0168 var contents = template.replace("%{trackdata}", 0169 JSON.stringify(trackData)) 0170 script.writeFile(dirName + "index.html", contents) 0171 Qt.quit() 0172 } else { 0173 setTimeout(doWork, 1) 0174 } 0175 } 0176 0177 app.firstFile() 0178 doWork() 0179 } 0180 }