import Foundation /// Exports a playlist as an M3U/M3U8 playlist file. /// M3U is a simple, widely-supported playlist format. struct M3UExporter: DAWExporter { static let formatID = "m3u" static let formatName = "M3U Playlist" static let fileExtension = "m3u" static func export(playlist: Playlist, to url: URL, options: ExportOptions) throws { let entries = playlist.sortedEntries var lines: [String] = [] // Extended M3U header lines.append("#EXTM3U") lines.append("#PLAYLIST:\(playlist.name)") lines.append("") for entry in entries { guard let track = entry.track, let fileURL = options.effectiveFileURL(for: track) else { continue } let duration = Int(track.duration) let displayTitle: String if track.artist.isEmpty { displayTitle = track.title } else { displayTitle = "\(track.artist) - \(track.title)" } // EXTINF line: duration, artist - title lines.append("#EXTINF:\(duration),\(displayTitle)") // Additional metadata as comments if let bpm = track.bpm { lines.append("#EXTBPM:\(String(format: "%.1f", bpm))") } if let key = track.musicalKey { lines.append("#EXTKEY:\(key)") } // File path (relative if copying, absolute otherwise) if options.copyAudioFiles { lines.append("\(options.audioFilesRelativePath)/\(fileURL.lastPathComponent)") } else { lines.append(fileURL.path) } lines.append("") } let content = lines.joined(separator: "\n") try content.write(to: url, atomically: true, encoding: .utf8) } }