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

0001 /**
0002  * \file ExportPlaylistFolder.qml
0003  * Export files found in playlist to a new folder.
0004  *
0005  * \b Project: Kid3
0006  * \author Urs Fleisch
0007  * \date 07 Sep 2018
0008  *
0009  * Copyright (C) 2018  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.1
0025 
0026 Kid3Script {
0027   onRun: {
0028     var playlistItems, exportItems, exportPlaylistPath, itemNr
0029 
0030     function getPlaylistPath() {
0031       var paths = isStandalone()
0032           ? getArguments().slice(1) : app.getSelectedFilePaths(false)
0033       for (var i = 0, len = paths.length; i < len; i++) {
0034         var path = paths[i]
0035         var dotPos = path.lastIndexOf(".")
0036         if (dotPos !== -1) {
0037           var ext = path.substring(dotPos)
0038           if ([".m3u", ".pls", ".xspf"].indexOf(ext) !== -1) {
0039             return path
0040           }
0041         }
0042       }
0043       return null
0044     }
0045 
0046     function getFileName(path) {
0047       var slashPos = path.lastIndexOf("/")
0048       return slashPos !== -1 ? path.substring(slashPos + 1) : path
0049     }
0050 
0051     function createPathLists() {
0052       var playlistPath = getPlaylistPath()
0053       if (!playlistPath) {
0054         console.error("No playlist file selected")
0055         return false
0056       }
0057       console.log("Reading playlist", playlistPath)
0058       playlistItems = app.getPlaylistItems(playlistPath)
0059       var numPlaylistItems = playlistItems.length
0060       if (numPlaylistItems <= 0) {
0061         return false
0062       }
0063       var exportPath = getArguments()[0]
0064       if (!exportPath) {
0065         exportPath = app.selectDirName(
0066           "Select Destination Folder", app.dirName)
0067       }
0068       if (!exportPath) {
0069         return false
0070       }
0071       if (exportPath[exportPath.length - 1] !== "/") {
0072         exportPath += "/"
0073       }
0074 
0075       // Create path to playlist in export directory.
0076       exportPlaylistPath = exportPath + getFileName(playlistPath)
0077       if (script.fileExists(exportPlaylistPath)) {
0078         console.error("File already exists:", exportPlaylistPath)
0079         return false
0080       }
0081 
0082       // Create the paths of the files in the exported playlist.
0083       exportItems = []
0084       var numDigits = Math.max(
0085           2, Math.floor(Math.log(exportItems.length) / Math.log(10)) + 1)
0086       var zeros = ""
0087       for (var i = 0; i < numDigits; i++) {
0088         zeros += "0"
0089       }
0090       for (i = 0; i < numPlaylistItems; i++) {
0091         // Make sure that the file name starts with the number
0092         // of the position in the playlist.
0093         var nr = (zeros + (i + 1)).slice(-numDigits)
0094         var fileName = getFileName(playlistItems[i])
0095         fileName = fileName.replace(/^\d+/, nr)
0096         if (fileName.substring(0, numDigits) !== nr) {
0097           fileName = nr + " " + fileName
0098         }
0099 
0100         var filePath = exportPath + fileName
0101         if (script.fileExists(filePath)) {
0102           console.error("File already exists:", filePath)
0103           return false
0104         }
0105 
0106         exportItems.push(filePath)
0107       }
0108       return true
0109     }
0110 
0111     function doWork() {
0112       if (itemNr < playlistItems.length) {
0113         // Copy the next file.
0114         var src = playlistItems[itemNr]
0115         var dst = exportItems[itemNr]
0116         console.log("Copy " + src + " to " + dst)
0117         if (!script.copyFile(src, dst)) {
0118           console.error("Failed to copy")
0119           Qt.quit()
0120         } else {
0121           ++itemNr
0122           setTimeout(doWork, 1)
0123         }
0124       } else {
0125         // Finally create a playlist in the export folder.
0126         app.setPlaylistItems(exportPlaylistPath, exportItems)
0127         Qt.quit()
0128       }
0129     }
0130 
0131     if (createPathLists()) {
0132       itemNr = 0
0133       doWork()
0134     } else {
0135       Qt.quit()
0136     }
0137   }
0138 }