| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- 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, track.hasLocalFile 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)/\(track.fileURL.lastPathComponent)")
- } else {
- lines.append(track.filePath)
- }
- lines.append("")
- }
- let content = lines.joined(separator: "\n")
- try content.write(to: url, atomically: true, encoding: .utf8)
- }
- }
|