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">&#8676;</button>\n' +
0063 '      <button class="arrow" id="next-button">&#8677;</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 }