├── .gitignore ├── .gitmodules ├── BUILDING.md ├── LICENSE.txt ├── QLVideo.dmgbuild ├── QLVideo.xcodeproj └── project.pbxproj ├── README.md ├── app ├── AppDelegate.swift ├── AppIcon.xcf ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── icon_128x128.png │ │ ├── icon_128x128@2x.png │ │ ├── icon_16x16.png │ │ ├── icon_16x16@2x.png │ │ ├── icon_256x256.png │ │ ├── icon_256x256@2x.png │ │ ├── icon_32x32.png │ │ ├── icon_32x32@2x.png │ │ ├── icon_512x512.png │ │ └── icon_512x512@2x.png │ ├── Contents.json │ └── Document.iconset │ │ ├── icon_128x128.png │ │ ├── icon_128x128@2x.png │ │ ├── icon_16x16.png │ │ ├── icon_16x16@2x.png │ │ ├── icon_256x256.png │ │ ├── icon_256x256@2x.png │ │ ├── icon_32x32.png │ │ ├── icon_32x32@2x.png │ │ ├── icon_512x512.png │ │ └── icon_512x512@2x.png ├── Base.lproj │ └── Main.xib ├── CoverArtView.swift ├── Document.xcf ├── Info.plist ├── IssueView.swift ├── LogarithmicSlider.swift ├── OldVersionView.swift ├── QuickLookVideo.entitlements ├── buildstrings ├── ca.lproj │ └── Main.strings ├── cs.lproj │ └── Main.strings ├── de.lproj │ └── Main.strings ├── el.lproj │ └── Main.strings ├── en.lproj │ └── Main.strings ├── es.lproj │ └── Main.strings ├── fr.lproj │ └── Main.strings ├── hu.lproj │ └── Main.strings ├── it.lproj │ └── Main.strings ├── ja.lproj │ └── Main.strings ├── ko.lproj │ └── Main.strings ├── nb.lproj │ └── Main.strings ├── nl.lproj │ └── Main.strings ├── pt-BR.lproj │ └── Main.strings ├── pt-PT.lproj │ └── Main.strings ├── ru.lproj │ └── Main.strings ├── snapshotter-bridge.h ├── sv.lproj │ └── Main.strings └── zh-Hans.lproj │ └── Main.strings ├── benchmark └── bench.m ├── buildaom ├── buildffmpeg ├── img ├── finder.jpeg ├── info.jpeg └── preview.jpeg ├── mdimporter ├── GetMetadataForFile.h ├── GetMetadataForFile.m ├── Info.plist ├── buildschema ├── ca.lproj │ └── schema.strings ├── cs.lproj │ └── schema.strings ├── de.lproj │ └── schema.strings ├── el.lproj │ └── schema.strings ├── en.lproj │ └── schema.strings ├── es.lproj │ └── schema.strings ├── fr.lproj │ └── schema.strings ├── hu.lproj │ └── schema.strings ├── it.lproj │ └── schema.strings ├── ja.lproj │ └── schema.strings ├── ko.lproj │ └── schema.strings ├── main.m ├── nb.lproj │ └── schema.strings ├── nl.lproj │ └── schema.strings ├── pt-BR.lproj │ └── schema.strings ├── pt-PT.lproj │ └── schema.strings ├── ru.lproj │ └── schema.strings ├── sv.lproj │ └── schema.strings └── zh-Hans.lproj │ └── schema.strings ├── previewer ├── Info.plist ├── PreviewViewController.swift ├── PreviewViewController.xib ├── SidebarItem.swift ├── SidebarItem.xib ├── Snapshotter.h ├── Snapshotter.m ├── ca.lproj │ └── Localizable.strings ├── cs.lproj │ └── Localizable.strings ├── de.lproj │ └── Localizable.strings ├── el.lproj │ └── Localizable.strings ├── en.lproj │ └── Localizable.strings ├── es.lproj │ └── Localizable.strings ├── fr.lproj │ └── Localizable.strings ├── hu.lproj │ └── Localizable.strings ├── it.lproj │ └── Localizable.strings ├── ja.lproj │ └── Localizable.strings ├── ko.lproj │ └── Localizable.strings ├── nb.lproj │ └── Localizable.strings ├── nl.lproj │ └── Localizable.strings ├── previewer-bridge.h ├── previewer.entitlements ├── pt-BR.lproj │ └── Localizable.strings ├── pt-PT.lproj │ └── Localizable.strings ├── ru.lproj │ └── Localizable.strings ├── sv.lproj │ └── Localizable.strings └── zh-Hans.lproj │ └── Localizable.strings ├── requirements.txt └── thumbnailer ├── Info.plist ├── ThumbnailProvider.swift ├── thumbnailer-bridge.h └── thumbnailer.entitlements /.gitignore: -------------------------------------------------------------------------------- 1 | Build 2 | notarize* 3 | test 4 | xcuserdata 5 | .DS_Store 6 | *.bak 7 | *.dmg 8 | *.framework 9 | *.pkg 10 | *.xcworkspace 11 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "ffmpeg"] 2 | path = ffmpeg 3 | url = git://source.ffmpeg.org/ffmpeg.git 4 | [submodule "aom"] 5 | path = aom 6 | url = https://aomedia.googlesource.com/aom 7 | [submodule "gas-preprocessor"] 8 | path = gas 9 | url = https://github.com/FFmpeg/gas-preprocessor.git 10 | -------------------------------------------------------------------------------- /BUILDING.md: -------------------------------------------------------------------------------- 1 | Building 2 | ======== 3 | 4 | Prerequisites 5 | ------- 6 | * Requires Xcode with macOS 12 SDK or later. 7 | * Before building, update submodules with `git submodule update --init --recursive`. 8 | * ffmpeg and its dependencies require "CMake", "pkg-config" and the "yasm" assembler to build. You can obtain them 9 | through [Homebrew](https://brew.sh) via `brew install cmake pkg-config yasm`. 10 | * Packaging require several Python modules. Install these via `pip3 install -r requirements.txt` 11 | 12 | Products 13 | ------- 14 | The Xcode project `QLVideo.xcodeproj` builds the following Products: 15 | 16 | * QuickLook Video.app - App that hosts plugins and extensions, and registers the 17 | [Uniform Type Identifiers](http://developer.apple.com/library/mac/documentation/General/Conceptual/DevPedia-CocoaCore/UniformTypeIdentifier.html) 18 | of the media types that the plugins understand. 19 | * mdimporter - Spotlight plugin provides metadata. 20 | * previewer - QuickLook app extension provides previews for non-native file types. 21 | * thumbnailer - QuickLook app extension provides thumbnails. 22 | * benchmark - Simple executable for benchmarking, not included in the app. 23 | * ffmpeg - The [FFmpeg](http://ffmpeg.org/) libraries. The plugins depend on these. Also builds a standalone version of the `ffprobe` executable for bug reporting. 24 | * aom - Support for the [AV1](https://en.wikipedia.org/wiki/AV1) codec. ffmpeg depends on this. 25 | 26 | Debugging 27 | --------- 28 | All plugins produce output in the system log. Use the filter `subsystem:marginal.qlvideo` in the Console app. 29 | 30 | To debug in Xcode: 31 | * mdimporter - Edit the "Run" scheme for the "mdimporter" target as follows: "Executable": `/usr/bin/mdimport`, "Debug executable": ✔, "Arguments": `-n -d3 `. 32 | * previewer - Run the "previewer" target in Xcode. When prompted, choose "Finder" as the app to run. In any Finder window press Space to preview a non-native video file. 33 | * thumbnailer - Doesn't seem possible to debug in Xcode. Good luck! 34 | 35 | Notes 36 | ----- 37 | FFmpeg's demuxers and codecs can sometimes crash on corrupt or incompletely downloaded media files. In Release builds both plugins install exception handlers which quietly kill the worker process so that the user isn't disturbed by crash reports. This is an ugly hack. 38 | -------------------------------------------------------------------------------- /QLVideo.dmgbuild: -------------------------------------------------------------------------------- 1 | # settings file for dmgbuild -*- mode: python; -*- 2 | # see https://dmgbuild.readthedocs.io/en/latest/example.html 3 | 4 | import os.path 5 | import plistlib 6 | 7 | application = "Build/Products/Release/QuickLook Video.app" 8 | appname = os.path.basename(application) 9 | 10 | # Files to include 11 | files = [application] 12 | 13 | # Symlinks to create 14 | symlinks = {"Applications": "/Applications"} 15 | 16 | badge_icon = os.path.join(application, "Contents", "Resources", "AppIcon.icns") 17 | 18 | icon_locations = {appname: (140, 120), "Applications": (500, 120)} 19 | 20 | default_view = "icon-view" 21 | background = "builtin-arrow" 22 | show_icon_preview = False 23 | show_pathbar = False 24 | show_status_bar = False 25 | show_tab_view = False 26 | show_toolbar = False 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | QuickLook Video 2 | =============== 3 | 4 | This package allows macOS Finder to display thumbnails, static previews, cover art and metadata for most types of video files. 5 | 6 | QuickLook and Spotlight understand a limited number of media files - mostly only MPEG audio and video codecs within MPEG container files. This package adds support for wide range of other codecs and "non-native" media file types, including `.asf`, `.avi`, `.flv`, `.mkv`, `.rm`, `.webm`, `.wmf` etc. 7 | 8 | Finder   Finder Info 9 | QuickLook preview 10 | 11 | Installation and Usage 12 | ---------------------- 13 | See [Getting Started](https://github.com/Marginal/QLVideo/wiki/Getting-Started). 14 | 15 | License 16 | ------- 17 | Copyright © 2014-2025 Jonathan Harris. 18 | 19 | Licensed under the [GNU Public License (GPL)](http://www.gnu.org/licenses/gpl-2.0.html) version 2 or later. 20 | -------------------------------------------------------------------------------- /app/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // QuickLook Video 4 | // 5 | // Created by Jonathan Harris on 15/11/2022. 6 | // 7 | 8 | import Cocoa 9 | import OSLog 10 | 11 | 12 | // Settings 13 | let kSettingsLastSpotlight = "LastSpotlight" // Last version ran - for upgrade check 14 | let kSettingsLastQuickLook = "LastQuickLook" // Last version ran - for upgrade check 15 | let kSettingsSnapshotCount = "SnapshotCount" // Max number of snapshots generated in Preview mode. 16 | let kSettingsSnapshotTime = "SnapshotTime" // Seek offset for thumbnails and single Previews [s]. 17 | let kSettingsSnapshotAlways = "SnapshotAlways" // Whether to generate static snapshot(s) even if playable Preview is available. 18 | 19 | // Setting defaults 20 | let kDefaultSnapshotTime = 60; // CoreMedia generator appears to use 10s. Completely arbitrary. 21 | let kDefaultSnapshotCount = 10; // 7-14 fit in the left bar of the Preview window without scrolling, depending on the display vertical resolution. 22 | let kMaxSnapshotCount = 25; 23 | 24 | @main 25 | class AppDelegate: NSObject, NSApplicationDelegate { 26 | 27 | @IBOutlet var mainWindow: NSWindow! 28 | 29 | @IBOutlet var versionLabel: NSTextField! 30 | @IBOutlet var copyrightNote: NSTextField! 31 | 32 | @IBOutlet var snapshotTime: NSSlider! 33 | @IBOutlet var snapshotTimeValue: NSTextField! 34 | 35 | @IBOutlet var regenerateNote: NSTextField! 36 | @IBOutlet var reindexingNote: NSTextField! 37 | 38 | // Dialogs 39 | @IBOutlet var issueWindow: NSWindow! 40 | @IBOutlet var coverArtWindow: NSWindow! 41 | @IBOutlet var oldVersionWindow: NSWindow! 42 | 43 | var defaults: UserDefaults? 44 | var logger: OSLog? 45 | 46 | lazy var snapshotTimeFormatter: DateComponentsFormatter = { 47 | let formatter = DateComponentsFormatter() 48 | formatter.unitsStyle = .abbreviated 49 | return formatter 50 | }() 51 | 52 | // View is loaded but not yet displayed - read settings 53 | func applicationDidFinishLaunching(_ aNotification: Notification) { 54 | 55 | logger = OSLog(subsystem: "uk.org.marginal.qlvideo", category: "app") 56 | os_log("applicationDidFinishLaunching", log: logger!, type: .info) 57 | 58 | // Remove the searchable Help entry 59 | NSApplication.shared.helpMenu = NSMenu(title: "Unused") 60 | 61 | let myBundle = Bundle.main 62 | let version: String = myBundle.infoDictionary!["CFBundleShortVersionString"] as! String 63 | versionLabel.stringValue = "Version \(version)" 64 | copyrightNote.stringValue = myBundle.infoDictionary!["NSHumanReadableCopyright"] as! String 65 | regenerateNote.isHidden = true 66 | reindexingNote.isHidden = true 67 | 68 | let suiteName: String = myBundle.infoDictionary!["ApplicationGroup"] as! String 69 | defaults = UserDefaults(suiteName: suiteName) 70 | 71 | if (defaults?.integer(forKey: kSettingsSnapshotTime) ?? kDefaultSnapshotTime <= 0) { 72 | snapshotTime.integerValue = kDefaultSnapshotTime 73 | } else { 74 | snapshotTime.integerValue = defaults?.integer(forKey: kSettingsSnapshotTime) ?? kDefaultSnapshotTime 75 | } 76 | snapshotTimeValue.stringValue = snapshotTimeFormatter.string(from: TimeInterval(snapshotTime.integerValue)) ?? "\(snapshotTime.integerValue)" 77 | 78 | // Check if unsupported hardware and don't do further setup if so 79 | if sysCtl("hw.machine") == "x86_64" && sysCtl("hw.optional.avx2_0") != "yes" { 80 | let alert = NSAlert() 81 | alert.alertStyle = .critical 82 | alert.messageText = "QuickLook Video requires a late-2013 Mac or newer, with AVX2 support" 83 | alert.informativeText = "The QuickLook and Spotlight plugins will crash!" 84 | alert.addButton(withTitle: "OK") 85 | alert.runModal() 86 | return 87 | } 88 | 89 | // Remove old plugins 90 | if !cleanup() { 91 | // Will fail if Sandboxed or if user refuses to authorize 92 | mainWindow.beginSheet(oldVersionWindow, completionHandler: nil) 93 | } 94 | 95 | if (defaults == nil) { 96 | os_log("Can't access defaults for application group %{public}s", log: logger!, type: .error, suiteName) 97 | } else { 98 | maybeResetCache(version) 99 | maybeResetSpotlight(version) 100 | } 101 | } 102 | 103 | func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 104 | return true 105 | } 106 | 107 | // MARK:- UI actions 108 | 109 | // snapshotTime slider changed - round to int, update text field, and update defaults 110 | @IBAction func snapshotTimeChanged(sender: NSSlider) { 111 | let value = snapshotTime.intValue 112 | snapshotTime.intValue = value 113 | snapshotTimeValue.stringValue = snapshotTimeFormatter.string(from: TimeInterval(value)) ?? "\(value)" 114 | defaults?.set(value, forKey: kSettingsSnapshotTime) 115 | } 116 | 117 | @IBAction func regenerateThumbnails(sender: NSButton) { 118 | defaults?.synchronize() 119 | if resetCache() { 120 | do { 121 | try helper("/usr/bin/killall", args: ["Finder"]) 122 | } catch { 123 | // Managed to tell QuickLook to regenerate cache, but couldn't restart Finder - Sandboxed? 124 | regenerateNote.isHidden = false 125 | return 126 | } 127 | } 128 | regenerateNote.isHidden = true 129 | } 130 | 131 | @IBAction func showHelp(sender: NSMenuItem) { 132 | NSWorkspace.shared.open(URL(string: "https://github.com/Marginal/QLVideo/wiki")!) 133 | } 134 | 135 | func alertShowHelp(_ alert: NSAlert) -> Bool { 136 | NSWorkspace.shared.open(URL(string: "https://github.com/Marginal/QLVideo/wiki")!) 137 | } 138 | 139 | @IBAction func reportIssue(sender: NSMenuItem) { 140 | mainWindow.beginSheet(issueWindow, completionHandler: nil) 141 | } 142 | 143 | @IBAction func coverArt(sender: NSMenuItem) { 144 | coverArtWindow.makeKeyAndOrderFront(self) 145 | } 146 | 147 | // MARK:- plugin management 148 | 149 | func cleanup() -> Bool { 150 | let fm = FileManager.default 151 | let home = fm.homeDirectoryForCurrentUser.path 152 | do { 153 | if fm.fileExists(atPath: home + "/Library/Application Support/QLVideo") { 154 | try fm.removeItem(atPath: home + "/Library/Application Support/QLVideo") 155 | } 156 | if fm.fileExists(atPath: home + "/Library/QuickLook/Video.qlgenerator") { 157 | try fm.removeItem(atPath: home + "/Library/QuickLook/Video.qlgenerator") 158 | } 159 | if fm.fileExists(atPath: home + "/Library/Spotlight/Video.mdimporter") { 160 | try fm.removeItem(atPath: home + "/Library/Spotlight/Video.mdimporter") 161 | } 162 | } catch { 163 | // Can't happen :) 164 | os_log("Couldn't remove old user plugins: %{public}s", log: logger!, type: .error, String(describing: error)) 165 | } 166 | 167 | if (fm.fileExists(atPath: "/Library/Application Support/QLVideo") || 168 | fm.fileExists(atPath: "/Library/QuickLook/Video.qlgenerator") || 169 | fm.fileExists(atPath: "/Library/Spotlight/Video.mdimporter")) { 170 | // AuthorizationExecuteWithPrivileges isn't available in Swift. Just do this instead: 171 | let prompt = (oldVersionWindow.contentView as! OldVersionView).authorizationPrompt.stringValue.replacingOccurrences(of: "\"", with: "\\\"") 172 | if let script = NSAppleScript(source: "do shell script \"/bin/rm -rf /Library/Application\\\\ Support/QLVideo /Library/QuickLook/Video.qlgenerator /Library/Spotlight/Video.mdimporter\" with prompt \"\(prompt)\" with administrator privileges") { 173 | var error: NSDictionary? 174 | script.executeAndReturnError(&error) 175 | if (error == nil) { 176 | return true; 177 | } else { 178 | os_log("Couldn't remove old system plugins: %{public}s", log: logger!, type: .error, String(describing: error!)) 179 | 180 | } 181 | } 182 | } else { 183 | return true 184 | } 185 | 186 | return false 187 | } 188 | 189 | // Reset the QuickLook cache if this is the first time this version of the app is run 190 | func maybeResetCache(_ currentVersion: String) { 191 | let oldVersion = defaults!.double(forKey: kSettingsLastQuickLook) // will be zero if not set 192 | if Double(currentVersion)! > oldVersion && resetCache() { 193 | defaults!.set(currentVersion, forKey: kSettingsLastQuickLook) 194 | regenerateNote.isHidden = false 195 | } else { 196 | regenerateNote.isHidden = true 197 | } 198 | } 199 | 200 | // Reindex Spotlight metadata if this is the first time this version of the app is run 201 | func maybeResetSpotlight(_ currentVersion: String) { 202 | let oldVersion = defaults!.double(forKey: kSettingsLastSpotlight) // will be zero if not set 203 | if Double(currentVersion)! > oldVersion { 204 | // Spotlight can be slow to notice new importers 205 | // Nothing we can do about that so poll 206 | let timer = Timer.scheduledTimer(withTimeInterval: 10, repeats: true) { timer in 207 | let mdimporter = "\(Bundle.main.bundlePath)/Contents/Library/Spotlight/Video.mdimporter" 208 | do { 209 | let listing = try helper("/usr/bin/mdimport", args: ["-L"]) 210 | if listing.contains(mdimporter) { 211 | timer.invalidate() 212 | if resetSpotlight() { 213 | self.defaults!.set(currentVersion, forKey: kSettingsLastSpotlight) 214 | self.reindexingNote.isHidden = false 215 | } else { 216 | self.reindexingNote.isHidden = true 217 | } 218 | } 219 | } catch { 220 | timer.invalidate() 221 | self.reindexingNote.isHidden = true 222 | } 223 | } 224 | timer.fire() 225 | } else { 226 | reindexingNote.isHidden = true 227 | } 228 | } 229 | } 230 | 231 | // MARK:- Helper functions 232 | 233 | func resetCache() -> Bool { 234 | do { 235 | try helper("/usr/bin/qlmanage", args: ["-r", "cache"]) 236 | return true 237 | } catch { 238 | return false 239 | } 240 | } 241 | 242 | func resetSpotlight() -> Bool { 243 | let mdimporter = "\(Bundle.main.bundlePath)/Contents/Library/Spotlight/Video.mdimporter" 244 | do { 245 | try helper("/usr/bin/mdimport", args: ["-r", mdimporter]) 246 | return true 247 | } catch { 248 | return false 249 | } 250 | } 251 | 252 | func sysCtl(_ name: String) -> String { 253 | var size = 0 254 | if sysctlbyname(name, nil, &size, nil, 0) != 0 || size == 0 { 255 | return "???" 256 | } 257 | var value = [CChar](repeating: 0, count: size) 258 | if sysctlbyname(name, &value, &size, nil, 0) != 0 { 259 | return "???" 260 | } 261 | 262 | // sysctl can return a int32, uint64 or chars. TODO: handle uint 263 | if size == 4 && value[0] == 1 { 264 | return "yes" 265 | } else if size == 4 && value[0] == 0 { 266 | return "no" 267 | } else { 268 | return String(cString: value) 269 | } 270 | } 271 | 272 | @discardableResult 273 | func helper(_ exe: String, args: [String]) throws -> String { 274 | let task = Process() 275 | do { 276 | task.executableURL = URL(fileURLWithPath: exe) 277 | task.arguments = args 278 | task.standardOutput = Pipe() 279 | task.standardError = Pipe() 280 | try task.run() 281 | task.waitUntilExit() 282 | } catch { 283 | throw NSError(domain: "uk.org.marginal.qlvideo", 284 | code: -1, 285 | userInfo:[NSLocalizedFailureReasonErrorKey: "\(error)"]) 286 | } 287 | 288 | let stdout = String(data: (task.standardOutput as! Pipe).fileHandleForReading.readDataToEndOfFile(), 289 | encoding: .utf8) ?? "" 290 | let stderr = String(data: (task.standardError as! Pipe).fileHandleForReading.readDataToEndOfFile(), 291 | encoding: .utf8) ?? "" 292 | if (task.terminationStatus != 0) { 293 | throw NSError(domain: "uk.org.marginal.qlvideo", 294 | code: Int(task.terminationStatus), 295 | userInfo:[NSLocalizedFailureReasonErrorKey: stderr]) 296 | } 297 | 298 | return stdout + stderr 299 | } 300 | 301 | -------------------------------------------------------------------------------- /app/AppIcon.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/AppIcon.xcf -------------------------------------------------------------------------------- /app/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon_16x16.png", 5 | "idiom" : "mac", 6 | "scale" : "1x", 7 | "size" : "16x16" 8 | }, 9 | { 10 | "filename" : "icon_16x16@2x.png", 11 | "idiom" : "mac", 12 | "scale" : "2x", 13 | "size" : "16x16" 14 | }, 15 | { 16 | "filename" : "icon_32x32.png", 17 | "idiom" : "mac", 18 | "scale" : "1x", 19 | "size" : "32x32" 20 | }, 21 | { 22 | "filename" : "icon_32x32@2x.png", 23 | "idiom" : "mac", 24 | "scale" : "2x", 25 | "size" : "32x32" 26 | }, 27 | { 28 | "filename" : "icon_128x128.png", 29 | "idiom" : "mac", 30 | "scale" : "1x", 31 | "size" : "128x128" 32 | }, 33 | { 34 | "filename" : "icon_128x128@2x.png", 35 | "idiom" : "mac", 36 | "scale" : "2x", 37 | "size" : "128x128" 38 | }, 39 | { 40 | "filename" : "icon_256x256.png", 41 | "idiom" : "mac", 42 | "scale" : "1x", 43 | "size" : "256x256" 44 | }, 45 | { 46 | "filename" : "icon_256x256@2x.png", 47 | "idiom" : "mac", 48 | "scale" : "2x", 49 | "size" : "256x256" 50 | }, 51 | { 52 | "filename" : "icon_512x512.png", 53 | "idiom" : "mac", 54 | "scale" : "1x", 55 | "size" : "512x512" 56 | }, 57 | { 58 | "filename" : "icon_512x512@2x.png", 59 | "idiom" : "mac", 60 | "scale" : "2x", 61 | "size" : "512x512" 62 | } 63 | ], 64 | "info" : { 65 | "author" : "xcode", 66 | "version" : 1 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /app/Assets.xcassets/AppIcon.appiconset/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/AppIcon.appiconset/icon_128x128.png -------------------------------------------------------------------------------- /app/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png -------------------------------------------------------------------------------- /app/Assets.xcassets/AppIcon.appiconset/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/AppIcon.appiconset/icon_16x16.png -------------------------------------------------------------------------------- /app/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png -------------------------------------------------------------------------------- /app/Assets.xcassets/AppIcon.appiconset/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/AppIcon.appiconset/icon_256x256.png -------------------------------------------------------------------------------- /app/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png -------------------------------------------------------------------------------- /app/Assets.xcassets/AppIcon.appiconset/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/AppIcon.appiconset/icon_32x32.png -------------------------------------------------------------------------------- /app/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png -------------------------------------------------------------------------------- /app/Assets.xcassets/AppIcon.appiconset/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/AppIcon.appiconset/icon_512x512.png -------------------------------------------------------------------------------- /app/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png -------------------------------------------------------------------------------- /app/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /app/Assets.xcassets/Document.iconset/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/Document.iconset/icon_128x128.png -------------------------------------------------------------------------------- /app/Assets.xcassets/Document.iconset/icon_128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/Document.iconset/icon_128x128@2x.png -------------------------------------------------------------------------------- /app/Assets.xcassets/Document.iconset/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/Document.iconset/icon_16x16.png -------------------------------------------------------------------------------- /app/Assets.xcassets/Document.iconset/icon_16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/Document.iconset/icon_16x16@2x.png -------------------------------------------------------------------------------- /app/Assets.xcassets/Document.iconset/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/Document.iconset/icon_256x256.png -------------------------------------------------------------------------------- /app/Assets.xcassets/Document.iconset/icon_256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/Document.iconset/icon_256x256@2x.png -------------------------------------------------------------------------------- /app/Assets.xcassets/Document.iconset/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/Document.iconset/icon_32x32.png -------------------------------------------------------------------------------- /app/Assets.xcassets/Document.iconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/Document.iconset/icon_32x32@2x.png -------------------------------------------------------------------------------- /app/Assets.xcassets/Document.iconset/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/Document.iconset/icon_512x512.png -------------------------------------------------------------------------------- /app/Assets.xcassets/Document.iconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Assets.xcassets/Document.iconset/icon_512x512@2x.png -------------------------------------------------------------------------------- /app/Document.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/app/Document.xcf -------------------------------------------------------------------------------- /app/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ApplicationGroup 6 | $(TeamIdentifierPrefix)qlvideo 7 | CFBundleDevelopmentRegion 8 | $(DEVELOPMENT_LANGUAGE) 9 | CFBundleDisplayName 10 | $(INFOPLIST_KEY_CFBundleDisplayName) 11 | CFBundleExecutable 12 | ${EXECUTABLE_NAME} 13 | CFBundleIdentifier 14 | $(PRODUCT_BUNDLE_IDENTIFIER) 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | ${PRODUCT_NAME} 19 | CFBundlePackageType 20 | APPL 21 | CFBundleShortVersionString 22 | $(MARKETING_VERSION) 23 | CFBundleSignature 24 | ???? 25 | CFBundleVersion 26 | $(CURRENT_PROJECT_VERSION) 27 | LSApplicationCategoryType 28 | public.app-category.video 29 | LSMinimumSystemVersion 30 | ${MACOSX_DEPLOYMENT_TARGET} 31 | NSHumanReadableCopyright 32 | ${INFOPLIST_KEY_NSHumanReadableCopyright} 33 | NSMainNibFile 34 | Main 35 | NSPrincipalClass 36 | NSApplication 37 | UTImportedTypeDeclarations 38 | 39 | 40 | UTTypeConformsTo 41 | 42 | public.movie 43 | com.real.realmedia 44 | 45 | UTTypeDescription 46 | RealVideo 47 | UTTypeIdentifier 48 | com.real.realvideo 49 | UTTypeTagSpecification 50 | 51 | public.filename-extension 52 | 53 | rv 54 | 55 | 56 | 57 | 58 | UTTypeConformsTo 59 | 60 | public.movie 61 | org.matroska.mkv 62 | 63 | UTTypeDescription 64 | WebM Video File 65 | UTTypeIdentifier 66 | org.webmproject.webm 67 | UTTypeReferenceURL 68 | http://www.webmproject.org/ 69 | UTTypeTagSpecification 70 | 71 | public.filename-extension 72 | 73 | webm 74 | 75 | public.mime-type 76 | 77 | video/webm 78 | 79 | 80 | 81 | 82 | UTTypeConformsTo 83 | 84 | public.movie 85 | public.mpeg 86 | 87 | UTTypeDescription 88 | Video Object 89 | UTTypeIdentifier 90 | jp.co.dvdfllc.vob 91 | UTTypeReferenceURL 92 | http://www.dvdfllc.co.jp/ 93 | UTTypeTagSpecification 94 | 95 | public.filename-extension 96 | 97 | vob 98 | 99 | public.mime-type 100 | 101 | video/dvd 102 | 103 | 104 | 105 | 106 | UTTypeConformsTo 107 | 108 | public.movie 109 | public.mpeg-2-transport-stream 110 | 111 | UTTypeDescription 112 | BDAV MPEG-2 Transport Stream 113 | UTTypeIdentifier 114 | com.blu-raydisc.bdav 115 | UTTypeReferenceURL 116 | http://www.blu-raydisc.com/ 117 | UTTypeTagSpecification 118 | 119 | public.filename-extension 120 | 121 | mts 122 | m2ts 123 | 124 | public.mime-type 125 | 126 | video/MP2T 127 | 128 | 129 | 130 | 131 | 132 | 133 | UTTypeConformsTo 134 | 135 | public.audio 136 | 137 | UTTypeDescription 138 | Matroska Audio File 139 | UTTypeIdentifier 140 | org.matroska.mka 141 | UTTypeReferenceURL 142 | http://www.matroska.org/ 143 | UTTypeTagSpecification 144 | 145 | public.filename-extension 146 | 147 | mka 148 | 149 | public.mime-type 150 | 151 | audio/x-matroska 152 | 153 | 154 | 155 | 156 | UTTypeConformsTo 157 | 158 | public.movie 159 | 160 | UTTypeDescription 161 | Matroska Video File 162 | UTTypeIdentifier 163 | org.matroska.mkv 164 | UTTypeReferenceURL 165 | http://www.matroska.org 166 | UTTypeTagSpecification 167 | 168 | public.filename-extension 169 | 170 | mkv 171 | 172 | public.mime-type 173 | 174 | video/x-matroska 175 | 176 | 177 | 178 | 179 | UTTypeConformsTo 180 | 181 | public.movie 182 | public.avi 183 | 184 | UTTypeDescription 185 | DivX Movie File 186 | UTTypeIdentifier 187 | com.divx.divx 188 | UTTypeReferenceURL 189 | http://www.divx.com/ 190 | UTTypeTagSpecification 191 | 192 | public.filename-extension 193 | 194 | divx 195 | 196 | public.mime-type 197 | 198 | video/x-divx 199 | 200 | 201 | 202 | 203 | UTTypeConformsTo 204 | 205 | public.movie 206 | 207 | UTTypeDescription 208 | NuppelVideo 209 | UTTypeIdentifier 210 | org.mythtv.nuppelvideo 211 | UTTypeReferenceURL 212 | http://www.mythtv.org/wiki/NuppelVideo 213 | UTTypeTagSpecification 214 | 215 | public.filename-extension 216 | 217 | nuv 218 | 219 | public.mime-type 220 | 221 | audio/x-nuv 222 | video/x-nuv 223 | 224 | 225 | 226 | 227 | UTTypeConformsTo 228 | 229 | public.audio 230 | 231 | UTTypeDescription 232 | FLAC audio 233 | UTTypeIdentifier 234 | net.sourceforge.flac.flac 235 | UTTypeReferenceURL 236 | http://flac.sourceforge.net/ 237 | UTTypeTagSpecification 238 | 239 | public.filename-extension 240 | 241 | flac 242 | 243 | public.mime-type 244 | 245 | audio/x-flac 246 | audio/flac 247 | 248 | 249 | 250 | 251 | UTTypeConformsTo 252 | 253 | public.audio 254 | 255 | UTTypeDescription 256 | Ogg Vorbis Audio 257 | UTTypeIdentifier 258 | org.xiph.ogg 259 | UTTypeReferenceURL 260 | http://xiph.org/ogg/ 261 | UTTypeTagSpecification 262 | 263 | public.filename-extension 264 | 265 | ogg 266 | 267 | public.mime-type 268 | 269 | audio/ogg 270 | audio/x-ogg 271 | 272 | 273 | 274 | 275 | UTTypeConformsTo 276 | 277 | public.movie 278 | 279 | UTTypeDescription 280 | Ogg Video 281 | UTTypeIdentifier 282 | org.xiph.ogv 283 | UTTypeReferenceURL 284 | http://xiph.org/ogg/ 285 | UTTypeTagSpecification 286 | 287 | public.filename-extension 288 | 289 | ogv 290 | 291 | public.mime-type 292 | 293 | video/ogg 294 | video/x-ogg 295 | 296 | 297 | 298 | 299 | UTTypeConformsTo 300 | 301 | public.audio 302 | public.data 303 | 304 | UTTypeDescription 305 | TrueAudio File 306 | UTTypeIdentifier 307 | com.true-audio.tta 308 | UTTypeReferenceURL 309 | http://en.true-audio.com/TTA_Lossless_Audio_Codec_-_Format_Description 310 | UTTypeTagSpecification 311 | 312 | public.filename-extension 313 | 314 | tta 315 | 316 | public.mime-type 317 | 318 | audio/x-tta 319 | 320 | 321 | 322 | 323 | 324 | 325 | UTTypeConformsTo 326 | 327 | public.movie 328 | 329 | UTTypeDescription 330 | Expression Encoder Screen Capture File 331 | UTTypeIdentifier 332 | com.microsoft.xesc 333 | UTTypeTagSpecification 334 | 335 | public.filename-extension 336 | 337 | xesc 338 | 339 | public.mime-type 340 | 341 | video/x-xesc 342 | 343 | 344 | 345 | 346 | UTTypeConformsTo 347 | 348 | public.audio 349 | 350 | UTTypeDescription 351 | Monkey's Audio 352 | UTTypeIdentifier 353 | com.monkeysaudio.ape 354 | UTTypeReferenceURL 355 | http://www.monkeysaudio.com/developers.html 356 | UTTypeTagSpecification 357 | 358 | public.filename-extension 359 | 360 | ape 361 | 362 | public.mime-type 363 | 364 | audio/x-ape 365 | 366 | 367 | 368 | 369 | UTTypeConformsTo 370 | 371 | public.audio 372 | 373 | UTTypeDescription 374 | FLAC Audio File 375 | UTTypeIdentifier 376 | org.xiph.flac 377 | UTTypeReferenceURL 378 | http://xiph.org/flac/format.html 379 | UTTypeTagSpecification 380 | 381 | public.filename-extension 382 | 383 | flac 384 | 385 | public.mime-type 386 | 387 | audio/x-flac 388 | audio/flac 389 | 390 | 391 | 392 | 393 | UTTypeConformsTo 394 | 395 | public.audio 396 | 397 | UTTypeDescription 398 | WavePack Audio File 399 | UTTypeIdentifier 400 | com.wavpack.wv 401 | UTTypeReferenceURL 402 | http://wavpack.com/file_format.txt 403 | UTTypeTagSpecification 404 | 405 | public.filename-extension 406 | 407 | wv 408 | 409 | public.mime-type 410 | 411 | audio/x-wv 412 | 413 | 414 | 415 | 416 | UTTypeConformsTo 417 | 418 | public.audio 419 | 420 | UTTypeDescription 421 | Musepack Audio File 422 | UTTypeIdentifier 423 | net.musepack.mpc 424 | UTTypeReferenceURL 425 | http://www.musepack.net/ 426 | UTTypeTagSpecification 427 | 428 | public.filename-extension 429 | 430 | mpc 431 | 432 | public.mime-type 433 | 434 | audio/x-mpc 435 | 436 | 437 | 438 | 439 | UTTypeConformsTo 440 | 441 | public.movie 442 | 443 | UTTypeDescription 444 | General eXchange Format 445 | UTTypeIdentifier 446 | org.smpte.gxf 447 | UTTypeReferenceURL 448 | https://www.smpte.org/standards 449 | UTTypeTagSpecification 450 | 451 | public.filename-extension 452 | 453 | gxf 454 | 455 | public.mime-type 456 | 457 | application/gxf 458 | video/x-gxf 459 | 460 | 461 | 462 | 463 | UTTypeConformsTo 464 | 465 | public.movie 466 | 467 | UTTypeDescription 468 | Material eXchange Format 469 | UTTypeIdentifier 470 | org.smpte.mxf 471 | UTTypeReferenceURL 472 | https://www.smpte.org/standards 473 | UTTypeTagSpecification 474 | 475 | public.filename-extension 476 | 477 | mxf 478 | 479 | public.mime-type 480 | 481 | application/mxf 482 | video/x-mxf 483 | 484 | 485 | 486 | 487 | UTTypeConformsTo 488 | 489 | public.movie 490 | 491 | UTTypeDescription 492 | Windows Recorded TV Show 493 | UTTypeIdentifier 494 | com.microsoft.wtv 495 | UTTypeTagSpecification 496 | 497 | public.filename-extension 498 | 499 | wtv 500 | 501 | public.mime-type 502 | 503 | video/x-wtv 504 | 505 | 506 | 507 | 508 | UTTypeConformsTo 509 | 510 | public.audio 511 | 512 | UTTypeDescription 513 | Meridian Lossless Packing Audio File 514 | UTTypeIdentifier 515 | com.meridian-audio.mlp 516 | UTTypeReferenceURL 517 | http://www.meridian-audio.com/ 518 | UTTypeTagSpecification 519 | 520 | public.filename-extension 521 | 522 | mlp 523 | 524 | public.mime-type 525 | 526 | audio/x-mlp 527 | 528 | 529 | 530 | 531 | 532 | 533 | UTTypeConformsTo 534 | 535 | public.movie 536 | 537 | UTTypeDescription 538 | Canon RAW Movie 539 | UTTypeIdentifier 540 | com.canon.raw.movie 541 | UTTypeTagSpecification 542 | 543 | public.filename-extension 544 | 545 | crm 546 | rmf 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | -------------------------------------------------------------------------------- /app/IssueView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IssueView.swift 3 | // QuickLook Video 4 | // 5 | // Created by Jonathan Harris on 01/12/2022. 6 | // 7 | 8 | import Cocoa 9 | 10 | 11 | class IssueView: NSView { 12 | 13 | @IBOutlet weak var dropTarget: IssueDropTarget! 14 | @IBOutlet weak var advice: NSTextField! 15 | @IBOutlet weak var sendButton: NSButton! 16 | 17 | var files:[String] = [] 18 | 19 | override func awakeFromNib() { 20 | // Reformat list items in advice 21 | let style = NSMutableParagraphStyle() 22 | style.headIndent = NSAttributedString(string: " • ", attributes: [.font: advice.font!]).size().width 23 | advice.attributedStringValue = NSAttributedString.init(string: advice.stringValue.replacingOccurrences(of: "\n- ", with: "\n • "), 24 | attributes: [.font: advice.font!, 25 | .paragraphStyle: style]) 26 | } 27 | 28 | @IBAction func dismessReport(sender: NSButton) { 29 | reset() 30 | let delegate = NSApp.delegate as! AppDelegate 31 | delegate.mainWindow.endSheet(self.window!) 32 | } 33 | 34 | @IBAction func sendReport(sender: NSButton) { 35 | sendButton.isEnabled = false 36 | let version = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String 37 | let macOS = ProcessInfo().operatingSystemVersionString 38 | let machine = sysCtl("hw.machine") 39 | var hardware = "\(sysCtl("hw.model")) \(machine)" 40 | if machine == "arm64" { 41 | hardware = hardware + " neon=\(sysCtl("hw.optional.neon"))" 42 | } else if machine == "x86_64" { 43 | hardware = hardware + " avx2=\(sysCtl("hw.optional.avx2_0")) avx512f=\(sysCtl("hw.optional.avx512f"))" 44 | } 45 | var report = "Your description of the problem here!\n\n\n---\nQLVideo: \(version)\nmacOS: \(macOS)\nHardware: \(hardware)\n" 46 | 47 | // limit to one file to try to avoid hitting GitHub POST character limit 48 | for filenum in 0..<1 { 49 | var filereport = "" 50 | let videofile = files[filenum] 51 | do { 52 | try filereport.append("mdimport: \(helper("/usr/bin/mdimport", args: ["-n", "-d1"] + [videofile]).replacingOccurrences(of: "\n", with: " ")).\n") 53 | } catch { 54 | filereport.append("mdimport: \(error)\n") 55 | } 56 | do { 57 | try filereport.append("```json\n\(helper(Bundle.main.path(forAuxiliaryExecutable: "ffprobe")!, args: ["-loglevel", "error", "-print_format", "json", "-show_entries", "format=format_name,duration,size,bit_rate,probe_score:stream=codec_type,codec_name,profile,codec_tag_string,pix_fmt,sample_fmt,channel_layout,language,width,height,display_aspect_ratio:stream_disposition=default,attached_pic,timed_thumbnails"] + [videofile]).replacingOccurrences(of: "\n\n", with: "\n").replacingOccurrences(of: " ", with: " "))```\n") 58 | } catch { 59 | filereport.append("ffprobe: \(error)\n") 60 | } 61 | filereport = filereport.replacingOccurrences(of: videofile, 62 | with: "*file*.\(NSString(string: videofile).pathExtension)") 63 | report.append("\(filereport)\n") 64 | } 65 | 66 | var url: URL 67 | if let encoded = report.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) { 68 | url = URL(string: "https://github.com/Marginal/QLVideo/issues/new?body=".appending(encoded))! 69 | } else { 70 | url = URL(string: "https://github.com/Marginal/QLVideo/issues/new")! 71 | } 72 | NSWorkspace.shared.open(url) 73 | 74 | reset() 75 | let delegate = NSApp.delegate as! AppDelegate 76 | delegate.mainWindow.endSheet(self.window!) 77 | } 78 | 79 | func reset() { 80 | files = [] 81 | dropTarget.image = nil 82 | sendButton.isEnabled = false 83 | } 84 | } 85 | 86 | // https://www.appcoda.com/nspasteboard-macos/ 87 | class IssueDropTarget: NSImageView { 88 | 89 | weak var parent: IssueView! 90 | 91 | override func awakeFromNib() { 92 | parent = (window?.contentView as! IssueView) 93 | registerForDraggedTypes([.fileURL]) 94 | } 95 | 96 | override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation { 97 | return .copy 98 | } 99 | 100 | override func performDragOperation(_ sender: NSDraggingInfo) -> Bool { 101 | if let items = sender.draggingPasteboard.readObjects(forClasses: [NSURL.self], options:[NSPasteboard.ReadingOptionKey.urlReadingFileURLsOnly: true]) { 102 | for item in items { 103 | let path = (item as! NSURL).path 104 | if path != nil { 105 | parent.files.append(path!) 106 | } 107 | } 108 | if parent.files.count > 0 { 109 | self.image = NSImage(named: "Document") 110 | parent.sendButton.isEnabled = true 111 | parent.sendButton.setAccessibilityFocused(true) 112 | return true 113 | } 114 | } 115 | return false; 116 | } 117 | } 118 | 119 | -------------------------------------------------------------------------------- /app/LogarithmicSlider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Copied from from LogarithmicSlider.m and converted to macOS/Swift 3 | // Copyright (c) 2022 Jonathan Harris. 4 | // 5 | // Created by Matt Kane on 19/01/2012. 6 | // Copyright (c) 2012 Matt Kane. All rights reserved. 7 | // 8 | // Permission is hereby granted, free of charge, to any person obtaining a copy of 9 | // this software and associated documentation files (the "Software"), to deal in 10 | // the Software without restriction, including without limitation the rights to 11 | // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 12 | // of the Software, and to permit persons to whom the Software is furnished to do 13 | // so, subject to the following conditions: 14 | // 15 | // The above copyright notice and this permission notice shall be included in all 16 | // copies or substantial portions of the Software. 17 | // 18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24 | // SOFTWARE. 25 | // 26 | 27 | import Cocoa 28 | 29 | class LogarithmicSlider: NSSlider { 30 | 31 | // Range requested 32 | private var _minValue: Double = 0 33 | private var _maxValue: Double = 0 34 | 35 | // NSSlider superclass operates with log values 36 | // Override setters to log values 37 | // Override getters to convert back to linear 38 | 39 | override var minValue:Double { 40 | get { 41 | _minValue 42 | } 43 | set 44 | { 45 | super.minValue = log(_minValue) 46 | _minValue = newValue 47 | } 48 | } 49 | 50 | override var maxValue: Double { 51 | get { 52 | _maxValue 53 | } 54 | set 55 | { 56 | super.doubleValue = log(_maxValue) 57 | _maxValue = newValue 58 | } 59 | } 60 | 61 | override var doubleValue: Double { 62 | get { 63 | // This works around rounding errors. 64 | if super.doubleValue == super.maxValue { 65 | return _maxValue 66 | } 67 | else if super.doubleValue == super.minValue { 68 | return _minValue 69 | } 70 | else { 71 | return exp(super.doubleValue) 72 | } 73 | } 74 | set { 75 | super.doubleValue = log(newValue) 76 | } 77 | } 78 | 79 | override var floatValue: Float { 80 | get { 81 | Float(doubleValue) 82 | } 83 | set { 84 | doubleValue = Double(newValue) 85 | } 86 | } 87 | 88 | override var intValue: Int32 { 89 | get { 90 | Int32(round(doubleValue)) 91 | } 92 | set { 93 | doubleValue = Double(newValue) 94 | } 95 | } 96 | 97 | override var integerValue: Int { 98 | get { 99 | Int(round(doubleValue)) 100 | } 101 | set { 102 | doubleValue = Double(newValue) 103 | } 104 | } 105 | 106 | override var stringValue: String { 107 | get { 108 | String(doubleValue) 109 | } 110 | set { 111 | doubleValue = Double(newValue)! 112 | } 113 | } 114 | 115 | required init?(coder: NSCoder) { 116 | super.init(coder: coder) 117 | 118 | super.doubleValue = log(super.doubleValue) 119 | 120 | _maxValue = super.maxValue 121 | super.maxValue = log(_maxValue) 122 | 123 | _minValue = super.minValue 124 | super.minValue = log(_minValue) 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /app/OldVersionView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OldVersionView.swift 3 | // QuickLook Video 4 | // 5 | // Created by Jonathan Harris on 04/12/2022. 6 | // 7 | 8 | import Cocoa 9 | 10 | 11 | class OldVersionView: NSView { 12 | 13 | @IBOutlet weak var advice: NSTextField! 14 | @IBOutlet weak var helpButton: NSButton! 15 | @IBOutlet var authorizationPrompt: NSTextField! 16 | 17 | override func awakeFromNib() { 18 | authorizationPrompt.isHidden = true 19 | helpButton.setAccessibilityFocused(true) 20 | } 21 | 22 | @IBAction func dismess(sender: NSButton) { 23 | let delegate = NSApp.delegate as! AppDelegate 24 | delegate.mainWindow.endSheet(self.window!) 25 | } 26 | 27 | @IBAction func help(sender: NSButton) { 28 | NSWorkspace.shared.open(URL(string: "https://github.com/Marginal/QLVideo/wiki/Troubleshooting")!) 29 | let delegate = NSApp.delegate as! AppDelegate 30 | delegate.mainWindow.endSheet(self.window!) 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /app/QuickLookVideo.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | $(TeamIdentifierPrefix)qlvideo 8 | 9 | com.apple.security.assets.movies.read-only 10 | 11 | com.apple.security.assets.pictures.read-only 12 | 13 | com.apple.security.files.downloads.read-only 14 | 15 | com.apple.security.files.user-selected.read-only 16 | 17 | com.apple.security.network.client 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/buildstrings: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -*- mode: python; -*- 3 | # Regenerate a .strings file for the default language from a .xib or .storyboard 4 | # file in a form suitable for translation, and 5 | # copy localised strings for all available languages into product bundle 6 | 7 | import os 8 | import re 9 | import subprocess 10 | import sys 11 | import tempfile 12 | from pathlib import Path 13 | 14 | 15 | class Entry: 16 | def __init__(self, groups): 17 | self.kind = groups[0].replace("NS", "").replace("Cell", "") 18 | self.string = groups[1] 19 | self.objectIDs = [groups[2]] 20 | self.note = groups[3] and groups[3].replace(r"\"", '"') 21 | 22 | 23 | # Expected environment from Xcode 24 | assert len(sys.argv) == 2, f"Usage: {sys.argv[0]} FILE.[storyboard|xib]" 25 | assert os.getenv("BUILT_PRODUCTS_DIR"), "$BUILT_PRODUCTS_DIR is not set" 26 | assert os.getenv("DEVELOPMENT_LANGUAGE"), "$DEVELOPMENT_LANGUAGE is not set" 27 | assert os.getenv("UNLOCALIZED_RESOURCES_FOLDER_PATH", "$UNLOCALIZED_RESOURCES_FOLDER_PATH not set") 28 | 29 | storyboard = Path(sys.argv[1]) 30 | srcdir = storyboard.parent.parent 31 | name = storyboard.stem 32 | 33 | # Extract strings from storyboard 34 | tmpfile = tempfile.mkstemp(prefix="buildstrings.")[1] 35 | p = subprocess.run(["ibtool", "--generate-strings-file", tmpfile, storyboard]) 36 | assert p.returncode == 0 37 | 38 | # Slurp and de-duplicate 39 | entries = {} 40 | with open(tmpfile, encoding="utf_16") as infile: 41 | for line in infile: 42 | if r := re.match( 43 | r"\/\* Class = \"((?:\\.|[^\"])*)\"; title = \"((?:\\.|[^\"])*)\"; ObjectID = \"((?:\\.|[^\"])*)\"; (?:Note = \"((?:\\.|[^\"])*)\"; )?\*\/", 44 | line, 45 | ): 46 | entry = Entry(r.groups()) 47 | if entry.string == os.getenv("PRODUCT_NAME") or entry.note == "do not translate": 48 | # doesn't need translation 49 | pass 50 | elif entry.string in entries: 51 | entries[entry.string].objectIDs.append(entry.objectIDs[0]) 52 | if not entries[entry.string].note: 53 | # Only keep first comment 54 | entries[entry.string].note = entry.note 55 | else: 56 | entries[entry.string] = entry 57 | os.unlink(tmpfile) 58 | 59 | # Write development language template in sorted order 60 | with open( 61 | srcdir / f'{os.getenv("DEVELOPMENT_LANGUAGE")}.lproj' / f"{name}.strings", "w" 62 | ) as outfile: 63 | for key in sorted(entries): 64 | e = entries[key] 65 | outfile.write( 66 | f'/* {e.note and e.note + " " or ""}({e.kind}: {", ".join(e.objectIDs)}) */\n"{e.string}" = "{e.string}";\n\n' 67 | ) 68 | 69 | # Copy localised strings into bundle 70 | for inpath in srcdir.glob(f"*.lproj/{name}.strings"): 71 | outdir = ( 72 | Path(os.getenv("BUILT_PRODUCTS_DIR")) 73 | / Path(os.getenv("UNLOCALIZED_RESOURCES_FOLDER_PATH")) 74 | / inpath.parent.name 75 | ) 76 | outdir.mkdir(exist_ok=True) 77 | with open(inpath) as infile, open( 78 | outdir / f"{name}.strings", "w", encoding="utf_16" 79 | ) as outfile: 80 | for line in infile: 81 | if r := re.match(r"\/\*.* \(.+: (.+)\) \*\/", line): 82 | # get objectIDs from comment line 83 | objectIDs = r.group(1).split(", ") 84 | elif r := re.match(r"\"((?:\\.|[^\"])*)\" += +\"((?:\\.|[^\"])*)\" *;", line): 85 | for objectID in objectIDs: 86 | outfile.write(f'"{objectID}.title" = "{r.group(2)}";\n') 87 | else: 88 | assert not line.strip(), f'Unrecognised translation "{line.strip()}"' 89 | -------------------------------------------------------------------------------- /app/ca.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "Arxiu"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "Portar-ho tot a primer pla"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "Tancar"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "Ajuda"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "Ocultar la resta"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "Ocultar QuickLook Video"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "Ajuda QuickLook Video"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "Sortir de QuickLook Video"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "Miniatures"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "Per veure les previsualitzacions dels fitxers de video hauries de recarregar el Finder o tancar la sessió i tornar a entrar."; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "Versió"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "Finestra"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "Pots experimentar un increment d'utilització de CPU i d'accés al disc per uns minuts, mentre el Spotlight torna a re-indexar tots els teus arxius de video i audio “no-nadius”."; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "Actualitzar"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "Instantània"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "Cancel·lar"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "Comunicar"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "Comunicar un problema"; 54 | 55 | -------------------------------------------------------------------------------- /app/cs.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "Soubor"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "Převést vše do popředí"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "Zavřít"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "Nápověda"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "Skrýt ostatní"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "Skrýt QuickLook Video"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "Nápověda pro QuickLook Video"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "Ukončit QuickLook Video"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "Miniatury"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "Pro zobrazení náhledů video souborů je potřeba restartovat Finder nebo se odhlásit a přihlásit zpět."; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "Verze"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "Okno"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "Po několik následujících minut můžete pociťovat zvýšenou práci procesoru a využití disku z důvodu re-indexace Spotlightu pro všechny Vaše \"nenativní\" audio a video soubory."; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "Aktualizovat"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "Snímek"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "Zrušit"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "Nahlásit"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "Nahlásit problém"; 54 | 55 | -------------------------------------------------------------------------------- /app/de.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "Ablage"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "Alle nach vorne bringen"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "Schließen"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "Hilfe"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "Andere ausblenden"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "QuickLook Video ausblenden"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "QuickLook Video-Hilfe"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "QuickLook Video beenden"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "Miniaturen"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "Bitte starten Sie Finder neu oder melden Sie sich erneut an, um die Vorschau von Videodateien zu sehen."; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "Version"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "Fenster"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "In den nächsten Minuten kann es zu einer erhöhten Prozessor- und Festplattenauslastung kommen, da Spotlight zunächst alle nicht-unterstützten Audio- und Videodateien indexiert."; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "Aktualisieren"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "Schnappschuss"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "Abbrechen"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "Melden"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "Problem melden"; 54 | 55 | -------------------------------------------------------------------------------- /app/el.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "Αρχείο"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "Μεταφορά όλων σε πρώτο πλάνο"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "Κλείσιμο"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "Βοήθεια"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "Απόκρυψη άλλων"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "Απόκρυψη QuickLook Video"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "Βοήθεια για το QuickLook Video"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "Τερματισμός QuickLook Video"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "Μικρογραφίες"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "Για να δείτε μικρογραφίες στα αρχεία βίντεο μπορεί να χρειαστεί να επανεκκινήσετε τον Finder ή να πραγματοποιήσετε έξοδο και επανείσοδο στο σύστημα."; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "Έκδοση"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "Παράθυρο"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "Ενδέχεται να αντιμετωπίσετε υψηλή χρήση CPU και δίσκου για τα επόμενα λίγα λεπτά, καθώς το Spotlight επανευρετηριάζει όλα τα “μη-εγγενή” αρχεία ήχου και βίντεο."; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "Ανανέωση"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "Στιγμιότυπο"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "Ακύρωση"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "Αναφορά"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "Αναφορά ζητήματος"; 54 | 55 | -------------------------------------------------------------------------------- /app/en.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Submit button in cover art dialog (Button: 6rg-QU-OWy) */ 2 | "Add" = "Add"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "Bring All to Front"; 6 | 7 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A, a7M-WT-Cyx) */ 8 | "Cancel" = "Cancel"; 9 | 10 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 11 | "Close" = "Close"; 12 | 13 | /* (Window: XG0-j0-Zcf) */ 14 | "Cover Art" = "Cover Art"; 15 | 16 | /* (MenuItem: bIO-Lx-JiA) */ 17 | "Cover Art..." = "Cover Art..."; 18 | 19 | /* Guidance note in cover art dialog (TextField: X7T-Dc-xUC) */ 20 | "Cover art is displayed in Finder thumbnails and in static QuickLook previews.\n\nYou can add, replace or remove cover art in MP4, M4V, MKV and WEBM files.\n\nCover art must be supplied as a JPEG or PNG file." = "Cover art is displayed in Finder thumbnails and in static QuickLook previews.\n\nYou can add, replace or remove cover art in MP4, M4V, MKV and WEBM files.\n\nCover art must be supplied as a JPEG or PNG file."; 21 | 22 | /* Generating a bug report: Prompt (TextField: eA4-FA-7dc) */ 23 | "Drop a problematic video file here" = "Drop a problematic video file here"; 24 | 25 | /* Prompt in cover art dialog (TextField: TX8-mu-sca) */ 26 | "Drop file to use as cover art here.\nLeave empty to remove existing cover art." = "Drop file to use as cover art here.\nLeave empty to remove existing cover art."; 27 | 28 | /* Prompt in cover art dialog (TextField: SDg-KK-0Nv) */ 29 | "Drop video file here" = "Drop video file here"; 30 | 31 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 32 | "File" = "File"; 33 | 34 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 35 | "Help" = "Help"; 36 | 37 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 38 | "Hide Others" = "Hide Others"; 39 | 40 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 41 | "Hide QuickLook Video" = "Hide QuickLook Video"; 42 | 43 | /* Generating a bug report: Guidance note (TextField: dCn-U3-hOJ) */ 44 | "Note:\n- You will need a GitHub account to report an Issue. You can register for one in the next step.\n- The file format will be included in the new Issue.\n- No file names or other file content will be sent.\n- You wil be able to review the new Issue before submission." = "Note:\n- You will need a GitHub account to report an Issue. You can register for one in the next step.\n- The file format will be included in the new Issue.\n- No file names or other file content will be sent.\n- You wil be able to review the new Issue before submission."; 45 | 46 | /* Old plugins dialog: Window title (Window: zsS-mw-BMN) */ 47 | "Old version detected" = "Old version detected"; 48 | 49 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 50 | "QuickLook Video Help" = "QuickLook Video Help"; 51 | 52 | /* Old plugins dialog: Request for authorization (TextField: R1n-Z4-BMI) */ 53 | "QuickLook Video would like to clean up old plugins" = "QuickLook Video would like to clean up old plugins"; 54 | 55 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 56 | "Quit QuickLook Video" = "Quit QuickLook Video"; 57 | 58 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 59 | "Refresh" = "Refresh"; 60 | 61 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 62 | "Report" = "Report"; 63 | 64 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 65 | "Report an Issue" = "Report an Issue"; 66 | 67 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 68 | "Snapshot" = "Snapshot"; 69 | 70 | /* Old plugins dialog: Guidance note (TextField: elO-ga-k4P) */ 71 | "There are older versions of the QuickLook and Spotlight plugins that this app supplies installed on your Mac.\nThese may prevent Finder from showing thumbails and metadata for your video files.\n\nPress Help for advice on how to delete these older plugins." = "There are older versions of the QuickLook and Spotlight plugins that this app supplies installed on your Mac.\nThese may prevent Finder from showing thumbails and metadata for your video files.\n\nPress Help for advice on how to delete these older plugins."; 72 | 73 | /* Settings heading (TextField: 37f-qP-fvU) */ 74 | "Thumbnails" = "Thumbnails"; 75 | 76 | /* Advice (TextField: QE0-Cv-OSp) */ 77 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "To see thumbnails of video files you may need to relaunch Finder or log out and back in again."; 78 | 79 | /* Product version (TextField: 9ZM-hR-Vmn) */ 80 | "Version" = "Version"; 81 | 82 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 83 | "Window" = "Window"; 84 | 85 | /* Advice (TextField: wBi-TN-rGU) */ 86 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files."; 87 | 88 | -------------------------------------------------------------------------------- /app/es.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "Archivo"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "Traer todo al frente"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "Cerrar"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "Ayuda"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "Ocultar otros"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "Ocultar QuickLook Video"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "Ayuda de QuickLook Video"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "Salir de QuickLook Video"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "Miniaturas"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "Para ver las vistas en miniatura de los archivos de video es posible que necesites reiniciar el Finder, o cerrar sesión y reingresar."; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "Versión"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "Ventana"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "Es posible que experimentes un alto uso del CPU y disco durante algunos minutos mientras Spotlight reindexa todos tus archivos de audio y video “no nativos”."; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "Actualizar"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "Instantánea"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "Cancelar"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "Informar"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "Informar de un problema"; 54 | 55 | -------------------------------------------------------------------------------- /app/fr.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "Fichier"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "Tout ramener au premier plan"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "Fermer"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "Aide"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "Masquer les autres"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "Masquer QuickLook Video"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "Aide QuickLook Video"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "Quitter QuickLook Video"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "Vignettes"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "Pour voir les vignettes des fichiers vidéo, vous devez relancer le Finder ou vous déconnecter puis vous reconnecter."; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "Version"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "Fenêtre"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "Vous pouvez rencontrer une forte activité du processeur et du disque dur pendant quelques minutes, le temps que Spotlight ré-indexe tous vos fichiers vidéos et audio «non natifs»."; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "Actualiser"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "Instantané"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "Annuler"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "Signaler"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "Signaler un problème"; 54 | 55 | -------------------------------------------------------------------------------- /app/hu.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "Fájl"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "Az összes előtérbe hozása"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "Bezárás"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "Súgó"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "Többi elrejtése"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "A Szövegszerkesztő elrejtése"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "A Szövegszerkesztő súgója"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "Kilépés a Szövegszerkesztőből"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "Bélyegképek"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "Ahhoz hogy a videó fájlok bélyegképei láthatóak legyenek újra kell indítani a Findert, vagy ki és be kell jelentkezni."; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "Verzió"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "Ablak"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "Magas CPU és lemezhasználat tapasztalható a következő pár percben, ameddig a Spotlight újraindexeli az összes \"nem natív\" audió és videó fájlt."; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "Frissítés"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "Pillanatkép"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "Mégsem"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "Jelentés"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "Probléma jelentése"; 54 | 55 | -------------------------------------------------------------------------------- /app/it.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "File"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "Porta tutto in primo piano"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "Chiudi"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "Aiuto"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "Nascondi altre"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "Nascondi QuickLook Video"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "Aiuto di QuickLook Video"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "Esci da QuickLook Video"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "Miniature"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "Per visualizzare le miniature dei file video potrebbe essere necessario rilanciare il Finder o uscire e rientrare di nuovo."; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "Versione"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "Finestra"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "Si può verificare unʼelevata attività del processore e del disco rigido per qualche minuto il tempo che Spotlight re-indicizza i tuoi file video e audio «non nativo»."; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "Aggiorna"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "Snapshot"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "Annulla"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "Segnala"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "Segnala un problema"; 54 | 55 | -------------------------------------------------------------------------------- /app/ja.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "ファイル"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "すべてを手前に移動"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "閉じる"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "ヘルプ"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "ほかを非表示"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "テキストエディットを非表示"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "テキストエディットヘルプ"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "テキストエディットを終了"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "サムネール"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "ムービーのサムネイルが表示されない場合は、Finderを再起動するか、一旦システムからログアウトして再度ログインしてください。"; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "バージョン"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "ウインドウ"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "Spotlightが、標準でサポートされない音声・動画ファイル全てのインデックスを再作成するため、今後数分間、CPUやディスクの使用率が高まる場合があります。"; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "更新"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "スナップショット"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "キャンセル"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "報告"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "問題を報告"; 54 | 55 | -------------------------------------------------------------------------------- /app/ko.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "파일"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "모두 앞으로 가져오기"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "닫기"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "도움말"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "기타 가리기"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "텍스트 편집기 가리기"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "텍스트 편집기 도움말"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "텍스트 편집기 종료"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "축소판"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "동영상 파일의 썸네일을 보기 위해서는 Finder를 재실행하거나 로그아웃 후 다시 로그인해야 합니다."; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "버전"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "윈도우"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "Spotlight이 시스템이 기본 지원하지 않는 오디오와 비디오 파일의 색인을 재작성하는 동안 CPU와 디스크 사용량이 몇 분간 높아질 수 있습니다."; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "새로 고침"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "스냅샷"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "취소"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "리포트"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "문제 리포트"; 54 | 55 | -------------------------------------------------------------------------------- /app/nb.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "Arkiv"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "Legg alle øverst"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "Lukk"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "Hjelp"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "Skjul andre"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "Skjul Tekstredigering"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "Hjelp for Tekstredigering"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "Avslutt Tekstredigering"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "Miniatyrbilder"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "For å se miniatyrbilder av videofiler så trenger du i noen tilfeller å starte Finder på nytt. Du kan og logge ut og inn igjen."; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "Versjon"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "Vindu"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "Du kan oppleve høy CPU- og diskbruk noen minutter etter installasjonen. Dette er fordi Spotlight re-indexerer alle lyd- og videofilene som tidligere ikke var tilgjengelig i Mac OS X."; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "Oppdater"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "Øyeblikksbilde"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "Avbryt"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "Rapporter"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "Rapporter et problem"; 54 | 55 | -------------------------------------------------------------------------------- /app/nl.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "Archief"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "Alles op voorgrond"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "Sluit"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "Help"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "Verberg andere"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "Verberg Teksteditor"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "Teksteditor Help"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "Stop Teksteditor"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "Miniaturen"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "Herstart Finder of log opnieuw in om de voorvertoning van videobestanden te zien."; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "Versie"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "Venster"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "In de komende minuten kan uw processor- en schijfactiviteit sterk toenemen, omdat Spotlight eerst alle niet-ondersteunde audio- en videobestanden indexeert."; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "Vernieuw"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "Momentopname"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "Annuleer"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "Meld"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "Meld een probleem"; 54 | 55 | -------------------------------------------------------------------------------- /app/pt-BR.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "Arquivo"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "Trazer Todas para a Frente"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "Fechar"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "Ajuda"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "Ocultar Outros"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "Ocultar Editor de Texto"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "Ajuda do Editor de Texto"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "Encerrar Editor de Texto"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "Miniaturas"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "Para ver miniaturas dos vídeos você precisa reiniciar o Finder ou finalizar sessão e iniciar novamente."; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "Versão"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "Janela"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "Você poderá perceber um alto uso da CPU e do disco nos próximos minutos enquanto a Spotlight indexa todos os arquivos de áudio e vídeo “não-nativos”."; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "Atualizar"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "Captura"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "Cancelar"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "Comunicar"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "Comunicar Problema"; 54 | 55 | -------------------------------------------------------------------------------- /app/pt-PT.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "Ficheiro"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "Passar tudo para a frente"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "Fechar"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "Ajuda"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "Ocultar outras aplicações"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "Ocultar o Editor de Texto"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "Ajuda do Editor de Texto"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "Sair do Editor de Texto"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "Miniaturas"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "Para ver as miniaturas de ficheiros de vídeo, poderá ter de reiniciar o Finder ou terminar a sua sessão e iniciar novamente."; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "Versão"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "Janela"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "Poderá reparar num uso elevado do CPU e disco nos próximos minutos, enquanto o Spotlight reindexa todos os seus arquivos de áudio e vídeo não nativos ao macOS."; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "Atualizar"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "Instantâneo"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "Cancelar"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "Comunicar"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "Comunicar um problema"; 54 | 55 | -------------------------------------------------------------------------------- /app/ru.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "Файл"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "Все окна — на передний план"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "Закрыть"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "Справка"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "Скрыть остальные"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "Скрыть QuickLook Video"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "Справка QuickLook Video"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "Завершить QuickLook Video"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "Миниатюры"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "Чтобы увидеть миниатюры файлов, вам может потребоваться перезапустить Finder или перезагрузить систему."; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "Версия"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "Окно"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "В течение следующих нескольких минут процессор и диск могут быть загружены, пока Spotlight переиндексирует все ваши «неродные» аудио и видео файлы."; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "Обновить"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "Снимок"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "Отменить"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "Сообщить"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "Сообщить о проблеме"; 54 | 55 | -------------------------------------------------------------------------------- /app/snapshotter-bridge.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #import "Snapshotter.h" 6 | -------------------------------------------------------------------------------- /app/sv.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "Arkiv"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "Lägg alla överst"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "Stäng"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "Hjälp"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "Göm övriga"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "Göm Textredigerare"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "Textredigerare Hjälp"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "Avsluta Textredigerare"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "Miniatyrer"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "För att se miniatyrer av videofiler så behöver du i vissa dall starta om Finder. Du kan också logga ut och logga in igen."; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "Version"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "Fönster"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "Du kan uppleva hög CPU- och diskanvändning några minuter efter installationen. Detta beror på att Spotlight omindexerar alla dina video- och audiofiler som på förhand ej stöds av Mac OS X."; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "Uppdatera"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "Ögonblicksbild"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "Avbryt"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "Rapportera"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "Rapportera ett problem"; 54 | 55 | -------------------------------------------------------------------------------- /app/zh-Hans.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Standard macOS menu entry (Menu: bib-Uj-vzu, dMs-cI-mzQ) */ 2 | "File" = "文件"; 3 | 4 | /* Standard macOS menu entry (MenuItem: LE2-aR-0XJ) */ 5 | "Bring All to Front" = "前置全部窗口"; 6 | 7 | /* Standard macOS menu entry (MenuItem: DVo-aG-piG) */ 8 | "Close" = "关闭"; 9 | 10 | /* Standard macOS menu entry (Menu: F2S-fz-NVQ, sf8-Ko-Xhb, wpr-3q-Mcd) */ 11 | "Help" = "帮助"; 12 | 13 | /* Standard macOS menu entry (MenuItem: Vdr-fp-XzO) */ 14 | "Hide Others" = "隐藏其他"; 15 | 16 | /* Standard macOS menu entry (MenuItem: Olw-nP-bQN) */ 17 | "Hide QuickLook Video" = "隐藏文本编辑"; 18 | 19 | /* Standard macOS menu entry (MenuItem: FKE-Sm-Kum) */ 20 | "QuickLook Video Help" = "文本编辑帮助"; 21 | 22 | /* Standard macOS menu entry (MenuItem: 4sb-4s-VLi) */ 23 | "Quit QuickLook Video" = "退出文本编辑"; 24 | 25 | /* Settings heading (TextField: 37f-qP-fvU) */ 26 | "Thumbnails" = "缩略图"; 27 | 28 | /* Advice (TextField: QE0-Cv-OSp) */ 29 | "To see thumbnails of video files you may need to relaunch Finder or log out and back in again." = "您可能需要重新启动Finder或登出账户并重新登录以显示视频缩略图。"; 30 | 31 | /* Product version (TextField: 9ZM-hR-Vmn) */ 32 | "Version" = "版本"; 33 | 34 | /* Standard macOS menu entry (Menu: Td7-aD-5lo, aUF-d1-5bR) */ 35 | "Window" = "窗口"; 36 | 37 | /* Advice (TextField: wBi-TN-rGU) */ 38 | "You may experience high CPU and disk usage for the next few minutes while Spotlight re-indexes all of your “non-native” audio and video files." = "此后几分钟您的CPU和硬盘可能会出现高负荷,因为Spotlight需要重新检索您的所有非默认支持的音频和视频文件。"; 39 | 40 | /* Regenerate thumbnails (Button: KHh-sh-atU) */ 41 | "Refresh" = "刷新"; 42 | 43 | /* Setting - time interval (TextField: fxY-dc-4ds) */ 44 | "Snapshot" = "快照"; 45 | 46 | /* Dismiss dialog (Button: ScK-fP-kjN, TjD-TN-u0A) */ 47 | "Cancel" = "取消"; 48 | 49 | /* Generating a bug report: Submission button (Button: N0n-6K-3kI) */ 50 | "Report" = "报告"; 51 | 52 | /* Menu item for generating a bug report (Window: Gye-Xd-78R, vHb-9r-BgU) */ 53 | "Report an Issue" = "报告问题"; 54 | 55 | -------------------------------------------------------------------------------- /benchmark/bench.m: -------------------------------------------------------------------------------- 1 | // 2 | // 3 | // bench.m 4 | // QLVideo 5 | // 6 | // Run core snapshot generation code. Useful for benchmarking various ffmpeg builds. 7 | // 8 | // 9 | 10 | #import 11 | #import 12 | 13 | #include "snapshotter.h" 14 | 15 | 16 | static const int kMinimumPeriod = 60; 17 | static const int kSnapshotCount = 10; 18 | static const int kSnapshotTime = 60; 19 | 20 | int main(int argc, char *argv[]) 21 | { 22 | @autoreleasepool { 23 | 24 | av_log_set_level(AV_LOG_ERROR|AV_LOG_SKIP_REPEATED); 25 | 26 | CFURLRef url; 27 | if (argc != 2 || !(url = CFURLCreateWithFileSystemPath(NULL, CFStringCreateWithBytes(NULL, (UInt8*) argv[1], strlen(argv[1]), kCFStringEncodingUTF8, false), kCFURLPOSIXPathStyle , false))) 28 | { 29 | printf("Usage:\t%s [video file]\n", argv[0]); 30 | exit(1); 31 | } 32 | 33 | int loop, image_count = 0; 34 | Snapshotter *snapshotter; 35 | 36 | for (loop = 0; loop < 100; loop++) 37 | { 38 | snapshotter = [[Snapshotter alloc] initWithURL:url]; 39 | if (!snapshotter) 40 | { 41 | printf("Can't read %s\n", [(__bridge NSURL *) url fileSystemRepresentation]); 42 | exit(1); 43 | } 44 | 45 | CGSize size = [snapshotter displaySize]; 46 | NSInteger duration = [snapshotter duration]; 47 | image_count = duration <= 0 ? 0 : (int) (duration / kMinimumPeriod) - 1; 48 | if (image_count > kSnapshotCount) 49 | image_count = kSnapshotCount; 50 | if (image_count < 1) 51 | image_count = 1; 52 | 53 | for (int i = 0; i < image_count; i++) 54 | { 55 | NSInteger time = image_count > 1 ? (duration * (i + 1)) / (image_count + 1) : (duration < 2 * kSnapshotTime ? duration/2 : kSnapshotTime); 56 | #if 0 // Generate PNG from CGImageRef 57 | CGImageRef snapshot = [snapshotter newSnapshotWithSize:size atTime:time]; 58 | if (!snapshot) 59 | { 60 | printf("Can't generate image #%d at time %lds\n", i, (long) time); 61 | exit(1); 62 | } 63 | CFMutableDataRef png = CFDataCreateMutable(NULL, 0); 64 | CGImageDestinationRef destination = CGImageDestinationCreateWithData(png, kUTTypePNG, 1, NULL); 65 | CGImageDestinationAddImage(destination, snapshot, nil); 66 | if (!CGImageDestinationFinalize(destination)) 67 | { 68 | printf("Can't generate PNG #%d at time %lds\n", i, (long) time); 69 | exit(1); 70 | } 71 | CFRelease(destination); 72 | CFRelease(png); 73 | CGImageRelease(snapshot); 74 | #else // Generate PNG directly 75 | CFDataRef png = [snapshotter newPNGWithSize:size atTime:time]; 76 | if (!png) 77 | { 78 | printf("Can't generate PNG #%d at time %lds\n", i, (long) time); 79 | exit(1); 80 | } 81 | CFRelease(png); 82 | #endif 83 | } 84 | } 85 | 86 | printf ("Generated %dx%d snapshots at %dx%d\n", loop, image_count, (int) [snapshotter displaySize].width, (int) [snapshotter displaySize].height); 87 | } 88 | return 0; 89 | } 90 | -------------------------------------------------------------------------------- /buildaom: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | shopt -s extglob 5 | 6 | SCRIPT=`readlink -fn "$0"` 7 | 8 | if [ "${ACTION}" == "clean" ]; then 9 | echo Remove "${OBJECT_FILE_DIR}" 10 | [ -n "${OBJECT_FILE_DIR}" -a -d "${OBJECT_FILE_DIR}" ] && rm -rf "${OBJECT_FILE_DIR}" 11 | else 12 | # For cmake & yasm 13 | PATH=$PATH:/opt/homebrew/bin:/usr/local/bin 14 | 15 | echo Build in ${OBJECT_FILE_DIR} 16 | for ARCH in $ARCHS; do 17 | mkdir -p "${OBJECT_FILE_DIR}/${ARCH}" 18 | cd "${OBJECT_FILE_DIR}/${ARCH}" 19 | if [ -f CMakeCache.txt -a CMakeCache.txt -nt "${SCRIPT}" ]; then 20 | echo Skipping cmake 21 | else 22 | rm -f CMakeCache.txt 23 | cmake "${SRCROOT}/${TARGET_NAME}" -Wno-deprecated -DCMAKE_INSTALL_PREFIX="${BUILT_PRODUCTS_DIR}/${ARCH}" -DCMAKE_BUILD_TYPE=${CONFIGURATION} -DCMAKE_C_FLAGS=-fapplication-extension -DBUILD_SHARED_LIBS=1 -DCMAKE_OSX_ARCHITECTURES=${ARCH} -DCONFIG_AV1_ENCODER=0 -DENABLE_DOCS=0 -DENABLE_EXAMPLES=0 -DENABLE_TOOLS=0 -DAOM_TARGET_CPU=${ARCH} 24 | fi 25 | make -j`sysctl -n hw.physicalcpu` install 26 | done 27 | 28 | # Combine into Universal 29 | echo Installing into ${BUILT_PRODUCTS_DIR}/universal 30 | mkdir -p "${BUILT_PRODUCTS_DIR}/universal/include" 31 | cp -pr "${BUILT_PRODUCTS_DIR}/${ARCHS/ */}/include/aom" "${BUILT_PRODUCTS_DIR}/universal/include/" 32 | 33 | mkdir -p "${CONFIGURATION_BUILD_DIR}/universal/lib" 34 | lipo -create "${BUILT_PRODUCTS_DIR}/"+(${ARCHS/ /|})"/lib/libaom.a" -output "${BUILT_PRODUCTS_DIR}/universal/lib/libaom.a" 35 | # Install using the dylib's "install name" since that's what other FFmpeg dylibs will look for 36 | DYLIB=$(basename `otool -DX ${BUILT_PRODUCTS_DIR}/${ARCHS/ */}/lib/libaom.dylib`) 37 | lipo -create "${BUILT_PRODUCTS_DIR}/"+(${ARCHS/ /|})"/lib/libaom.dylib" -output "${BUILT_PRODUCTS_DIR}/universal/lib/${DYLIB}" 38 | fi 39 | -------------------------------------------------------------------------------- /buildffmpeg: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | shopt -s extglob 5 | 6 | SCRIPT=`readlink -fn "$0"` 7 | EXES="ffmpeg ffprobe" 8 | LIBS="libavcodec libavfilter libavformat libavutil libpostproc libswresample libswscale" 9 | 10 | if [ "${ACTION}" == "clean" ]; then 11 | echo Remove "${OBJECT_FILE_DIR}" 12 | [ -n "${OBJECT_FILE_DIR}" -a -d "${OBJECT_FILE_DIR}" ] && rm -rf "${OBJECT_FILE_DIR}" 13 | else 14 | # For yasm and pkg-config 15 | PATH=$PATH:/opt/homebrew/bin:/usr/local/bin 16 | 17 | echo Build in ${OBJECT_FILE_DIR} 18 | BUILT="" 19 | for ARCH in $ARCHS; do 20 | mkdir -p "${OBJECT_FILE_DIR}/${ARCH}" 21 | cd "${OBJECT_FILE_DIR}/${ARCH}" 22 | if [ -f config.h -a config.h -nt "${SCRIPT}" ]; then 23 | echo Skipping configure 24 | else 25 | rm -f config.h 26 | if [ "${CONFIGURATION}" == "Debug" ]; then 27 | FLAGS="--disable-optimizations --disable-stripping" 28 | else 29 | FLAGS= 30 | fi 31 | if [ $ARCH == arm64 ]; then 32 | FLAGS="$FLAGS --enable-cross-compile --enable-vfp --enable-neon" 33 | elif [ $ARCH == x86_64 ]; then 34 | FLAGS="$FLAGS --enable-cross-compile --cpu=haswell" 35 | fi 36 | PKG_CONFIG_LIBDIR="${BUILT_PRODUCTS_DIR}/${ARCH}/lib/pkgconfig" "${SRCROOT}/${TARGET_NAME}/configure" --prefix="${BUILT_PRODUCTS_DIR}/${ARCH}" --arch=${ARCH} --cc="clang -arch ${ARCH} -fapplication-extension" ${FLAGS} --enable-shared --enable-rpath --install-name-dir=@rpath --extra-ldflags=-liconv --enable-gpl --disable-doc --disable-indevs --disable-outdevs --disable-network --disable-avdevice --disable-muxers --disable-encoders --disable-bsfs --disable-filters --disable-protocols --disable-autodetect --enable-appkit --enable-avfoundation --enable-bzlib --enable-coreimage --enable-iconv --enable-libaom --enable-zlib --enable-audiotoolbox --enable-videotoolbox --enable-filter=scale --enable-muxer=image2 --enable-muxer=mp4 --enable-muxer=m4v --enable-muxer=ipod --enable-muxer=matroska --enable-muxer=webm --enable-encoder=png --enable-protocol=file --enable-protocol=pipe 37 | fi 38 | make -j`sysctl -n hw.physicalcpu` install 39 | 40 | # Add rpath for install-time location of executables 41 | for LIB in $LIBS; do 42 | install_name_tool -delete_rpath "${BUILT_PRODUCTS_DIR}/${ARCH}/lib" `realpath "${BUILT_PRODUCTS_DIR}/${ARCH}/lib/${LIB}.dylib"` 43 | done 44 | for EXE in $EXES; do 45 | install_name_tool -rpath "${BUILT_PRODUCTS_DIR}/${ARCH}/lib" @executable_path/../Frameworks "${BUILT_PRODUCTS_DIR}/${ARCH}/bin/${EXE}" 46 | done 47 | done 48 | 49 | # Combine into Universal 50 | echo Installing into ${BUILT_PRODUCTS_DIR}/universal 51 | 52 | mkdir -p "${BUILT_PRODUCTS_DIR}/universal/bin" 53 | for EXE in $EXES; do 54 | lipo -create "${BUILT_PRODUCTS_DIR}/"+(${ARCHS/ /|})"/bin/${EXE}" -output "${BUILT_PRODUCTS_DIR}/universal/bin/${EXE}" 55 | if [ -n "$DEVELOPMENT_TEAM" -a -n "$PRODUCT_BUNDLE_IDENTIFIER" ]; then 56 | # Add sandbox entitlement suitable for a helper app 57 | ENTITLEMENTS=`mktemp -t buildffmpeg` 58 | if [ "${CONFIGURATION}" == "Debug" ]; then 59 | echo -e '\n\ncom.apple.security.inherit\n\ncom.apple.security.get-task-allow\n\n\n' > "${ENTITLEMENTS}" 60 | else 61 | echo -e '\n\ncom.apple.security.inherit\n\n\n' > "${ENTITLEMENTS}" 62 | fi 63 | codesign -s "${DEVELOPMENT_TEAM}" -i "${PRODUCT_BUNDLE_IDENTIFIER}.${EXE}" -o runtime --entitlements "${ENTITLEMENTS}" "${BUILT_PRODUCTS_DIR}/universal/bin/${EXE}" 64 | rm "${ENTITLEMENTS}" 65 | fi 66 | done 67 | 68 | mkdir -p "${BUILT_PRODUCTS_DIR}/universal/include" 69 | # Assumes there aren't any material client impacting differences in config between archs 70 | cp -p "${OBJECT_FILE_DIR}/${ARCHS/ */}/config.h" "${BUILT_PRODUCTS_DIR}/universal/include/" 71 | 72 | mkdir -p "${BUILT_PRODUCTS_DIR}/universal/lib" 73 | for LIB in $LIBS; do 74 | cp -pr "${BUILT_PRODUCTS_DIR}/${ARCHS/ */}/include/${LIB}" "${BUILT_PRODUCTS_DIR}/universal/include/" 75 | lipo -create "${BUILT_PRODUCTS_DIR}/"+(${ARCHS/ /|})"/lib/${LIB}.a" -output "${BUILT_PRODUCTS_DIR}/universal/lib/${LIB}.a" 76 | # Install using the dylib's "install name" since that's what other FFmpeg dylibs will look for 77 | DYLIB=$(basename `otool -DX ${BUILT_PRODUCTS_DIR}/${ARCHS/ */}/lib/${LIB}.dylib`) 78 | lipo -create "${BUILT_PRODUCTS_DIR}/"+(${ARCHS/ /|})"/lib/${LIB}.dylib" -output "${BUILT_PRODUCTS_DIR}/universal/lib/${DYLIB}" 79 | done 80 | fi 81 | -------------------------------------------------------------------------------- /img/finder.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/img/finder.jpeg -------------------------------------------------------------------------------- /img/info.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/img/info.jpeg -------------------------------------------------------------------------------- /img/preview.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/QLVideo/8f721ca4d7b284f63c78ca6c4efd0d87de1c883d/img/preview.jpeg -------------------------------------------------------------------------------- /mdimporter/GetMetadataForFile.h: -------------------------------------------------------------------------------- 1 | // 2 | // GetMetadataForFile.h 3 | // QLVideo 4 | // 5 | // Created by Jonathan Harris on 09/12/2022. 6 | // 7 | 8 | #ifndef GetMetadataForFile_h 9 | #define GetMetadataForFile_h 10 | 11 | #include "Snapshotter.h" 12 | 13 | #include 14 | 15 | extern os_log_t logger; 16 | 17 | #endif /* GetMetadataForFile_h */ 18 | -------------------------------------------------------------------------------- /mdimporter/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ApplicationGroup 6 | $(TeamIdentifierPrefix)qlvideo 7 | CFBundleDevelopmentRegion 8 | $(DEVELOPMENT_LANGUAGE) 9 | CFBundleDisplayName 10 | $(INFOPLIST_KEY_CFBundleDisplayName) 11 | CFBundleDocumentTypes 12 | 13 | 14 | CFBundleTypeRole 15 | MDImporter 16 | LSItemContentTypes 17 | 18 | 19 | public.movie 20 | 21 | 22 | 23 | 24 | com.adobe.flash.video 25 | com.microsoft.advanced-systems-format 26 | com.microsoft.windows-media-wm 27 | com.microsoft.windows-media-wmp 28 | com.microsoft.windows-media-wmv 29 | com.real.realmedia 30 | com.real.realmedia-vbr 31 | org.smpte.mxf 32 | public.avi 33 | public.dv-movie 34 | public.flc-animation 35 | public.mpeg-2-transport-stream 36 | public.mpeg-2-video 37 | 38 | 39 | com.apple.m4v-video 40 | com.apple.protected-mpeg-4-video 41 | com.apple.quicktime-movie 42 | public.3gpp 43 | public.3gpp2 44 | public.mpeg 45 | public.mpeg-4 46 | 47 | 48 | com.blu-raydisc.bdav 49 | com.divx.divx 50 | com.google.webm 51 | com.microsoft.wtv 52 | com.microsoft.xesc 53 | com.real.realvideo 54 | jp.co.dvdfllc.vob 55 | org.matroska.mkv 56 | org.smpte.gxf 57 | org.smpte.mxf 58 | org.mythtv.nuppelvideo 59 | org.webmproject.webm 60 | org.xiph.ogv 61 | 62 | 63 | org.perian.matroska 64 | org.perian.flash-video 65 | org.perian.nuppelvideo 66 | org.perian.ogv 67 | org.perian.divx 68 | 69 | 70 | org.videolan.flash 71 | org.videolan.xesc 72 | org.videolan.realmedia 73 | org.videolan.ogg-video 74 | org.videolan.axv 75 | org.videolan.gxf 76 | org.videolan.mxf 77 | org.videolan.avi 78 | org.videolan.quicktime 79 | org.videolan.divx 80 | org.videolan.dv 81 | org.videolan.asf 82 | org.videolan.wmv 83 | org.videolan.wtv 84 | org.videolan.mpeg-video 85 | org.videolan.mpeg-stream 86 | org.videolan.3gp 87 | org.videolan.mkv 88 | org.videolan.webm 89 | org.videolan.rec 90 | org.videolan.vro 91 | org.videolan.tod 92 | org.videolan.nsv 93 | org.videolan.nuv 94 | 95 | 96 | org.niltsh.mplayerx-divx 97 | org.niltsh.mplayerx-dv 98 | org.niltsh.mplayerx-flash-video 99 | org.niltsh.mplayerx-mts 100 | org.niltsh.mplayerx-matroska-video 101 | org.niltsh.mplayerx-mxf 102 | org.niltsh.mplayerx-ogg-video 103 | org.niltsh.mplayerx-rmvb 104 | org.niltsh.mplayerx-xvid 105 | 106 | 107 | indy.jt.niceplayer.divx 108 | indy.jt.niceplayer.mkv 109 | 110 | 111 | com.macblurayplayer.matroska 112 | com.macblurayplayer.nuppelvideo 113 | com.macblurayplayer.ogv 114 | com.macblurayplayer.divx 115 | 116 | 117 | io.mpv.wma 118 | io.mpv.avi 119 | io.mpv.divx 120 | io.mpv.dv 121 | io.mpv.flv 122 | io.mpv.mkv 123 | io.mpv.ogv 124 | io.mpv.rmvb 125 | io.mpv.wmv 126 | io.mpv.xvid 127 | io.mpv.webm 128 | 129 | 130 | com.massanti.mediainfomac.ogv 131 | com.massanti.mediainfomac.nuppelvideo 132 | com.massanti.mediainfomac.matroska 133 | com.massanti.mediainfomac.flash-video 134 | com.massanti.mediainfomac.mpeg2TS 135 | com.massanti.mediainfomac.mpeg2 136 | 137 | 138 | com.blurayplayersoftware.matroska 139 | com.blurayplayersoftware.nuppelvideo 140 | com.blurayplayersoftware.divx 141 | com.blurayplayersoftware.ogv 142 | 143 | 144 | io.iina.flash 145 | io.iina.realmedia 146 | io.iina.vob 147 | io.iina.ogg-video 148 | io.iina.avi 149 | io.iina.quicktime 150 | io.iina.divx 151 | io.iina.dv 152 | io.iina.asf 153 | io.iina.wmv 154 | io.iina.wtv 155 | io.iina.mpeg-video 156 | io.iina.mpeg4-video 157 | io.iina.mpeg-stream 158 | io.iina.3gpp 159 | io.iina.3gpp2 160 | io.iina.mkv 161 | io.iina.webm 162 | 163 | 164 | com.canon.raw.movie 165 | 166 | 167 | com.firecore.fileformat.dvr-ms 168 | com.firecore.fileformat.flv 169 | com.firecore.fileformat.mpg 170 | com.firecore.fileformat.wmv 171 | com.firecore.fileformat.mkv 172 | com.firecore.fileformat.ts 173 | com.firecore.fileformat.m2ts 174 | com.firecore.fileformat.mts 175 | com.firecore.fileformat.avi 176 | com.firecore.fileformat.m4v 177 | com.firecore.fileformat.mov 178 | com.firecore.fileformat.mp4 179 | com.firecore.fileformat.mpeg 180 | com.firecore.fileformat.mod 181 | com.firecore.fileformat.wtv 182 | com.firecore.fileformat.ogm 183 | com.firecore.fileformat.ogv 184 | com.firecore.fileformat.webm 185 | com.firecore.fileformat.asf 186 | com.firecore.fileformat.rmvb 187 | com.firecore.fileformat.vob 188 | com.firecore.fileformat.mxf 189 | com.firecore.fileformat.dvdmedia 190 | 191 | 192 | 193 | 194 | public.audiovisual-content 195 | 196 | 197 | com.microsoft.windows-media-wma 198 | com.real.realaudio 199 | com.soundblaster.soundfont 200 | public.aac-audio 201 | public.ac3-audio 202 | public.mp2 203 | 204 | 205 | com.dolby.dd 206 | com.meridian-audio.mlp 207 | com.monkeysaudio.ape 208 | com.true-audio.tta 209 | com.wavpack.wv 210 | net.musepack.mpc 211 | net.sourceforge.flac.flac 212 | org.matroska.mka 213 | org.xiph.flac 214 | org.xiph.ogg 215 | 216 | 217 | org.perian.true-audio 218 | org.perian.ac3 219 | org.perian.flac 220 | org.perian.ogg 221 | 222 | 223 | org.videolan.ape 224 | org.videolan.flac 225 | org.videolan.wv 226 | org.videolan.tta 227 | org.videolan.mpc 228 | org.videolan.mod 229 | org.videolan.it 230 | org.videolan.xm 231 | org.videolan.aiff 232 | org.videolan.amr 233 | org.videolan.dts 234 | org.videolan.spx 235 | org.videolan.wav 236 | org.videolan.ac3 237 | org.videolan.aac 238 | org.videolan.opus 239 | org.videolan.ogg-audio 240 | org.videolan.oma 241 | org.videolan.voc 242 | org.videolan.vqf 243 | org.videolan.axa 244 | org.videolan.wma 245 | org.videolan.mpeg-audio 246 | org.videolan.mid 247 | org.videolan.mlp 248 | org.videolan.mka 249 | org.videolan.rmi 250 | org.videolan.s3m 251 | 252 | 253 | org.niltsh.mplayerx-aac 254 | org.niltsh.mplayerx-ac3 255 | org.niltsh.mplayerx-flac 256 | org.niltsh.mplayerx-matroska-audio 257 | org.niltsh.mplayerx-ogg 258 | 259 | 260 | com.macblurayplayer.ogg 261 | 262 | 263 | io.mpv.ac3 264 | io.mpv.flac 265 | io.mpv.mka 266 | io.mpv.ogg-audio 267 | io.mpv.wma 268 | 269 | 270 | com.massanti.mediainfomac.ogg 271 | com.massanti.mediainfomac.flac 272 | com.massanti.mediainfomac.ac3 273 | com.massanti.mediainfomac.true-audio 274 | 275 | 276 | com.blurayplayersoftware.ogg 277 | 278 | 279 | io.iina.ape 280 | io.iina.flac 281 | io.iina.wv 282 | io.iina.xm 283 | io.iina.aiff 284 | io.iina.wav 285 | io.iina.ac3 286 | io.iina.aac 287 | io.iina.opus 288 | io.iina.ogg-audio 289 | io.iina.wma 290 | io.iina.mpeg-audio 291 | io.iina.mpeg4-audio 292 | io.iina.mpeg3-audio 293 | io.iina.mid 294 | io.iina.mka 295 | 296 | 297 | 298 | 299 | CFBundleExecutable 300 | ${EXECUTABLE_NAME} 301 | CFBundleIconFile 302 | 303 | CFBundleIdentifier 304 | $(PRODUCT_BUNDLE_IDENTIFIER) 305 | CFBundleInfoDictionaryVersion 306 | 6.0 307 | CFBundleName 308 | ${PRODUCT_NAME} 309 | CFBundleShortVersionString 310 | $(MARKETING_VERSION) 311 | CFBundleVersion 312 | $(CURRENT_PROJECT_VERSION) 313 | CFPlugInDynamicRegisterFunction 314 | 315 | CFPlugInDynamicRegistration 316 | 317 | CFPlugInFactories 318 | 319 | 3BD30E87-1D12-4322-AFCE-F58CB4B56096 320 | MetadataImporterPluginFactory 321 | 322 | CFPlugInTypes 323 | 324 | 8B08C4BF-415B-11D8-B3F9-0003936726FC 325 | 326 | 3BD30E87-1D12-4322-AFCE-F58CB4B56096 327 | 328 | 329 | LSMinimumSystemVersion 330 | ${MACOSX_DEPLOYMENT_TARGET} 331 | NSHumanReadableCopyright 332 | ${INFOPLIST_KEY_NSHumanReadableCopyright} 333 | 334 | 335 | -------------------------------------------------------------------------------- /mdimporter/buildschema: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Build Resources/schema.xml with UTIs extacted from Info.plist 4 | # 5 | 6 | SCRIPT=`basename $0` 7 | PLIST=${SRCROOT}/${INFOPLIST_FILE} 8 | SCHEMA=${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/schema.xml 9 | 10 | # echo $0 "+" $PLIST "->" $SCHEMA 11 | 12 | rm -f $SCHEMA 13 | 14 | DELIMSTART=schema:start 15 | DELIMSTOP=schema:stop 16 | utis=`awk "/$DELIMSTART/, /$DELIMSTOP/" "$PLIST" | sed -n -E 's|^[[:space:]]*(.*).*|\1|p'` 17 | 18 | cat > $SCHEMA <
20 | 21 | 22 | 23 | 26 | 27 | 28 | 29 | 30 | 31 | HEADER 32 | 33 | for uti in $utis; do 34 | cat >> $SCHEMA < 36 | 37 | kMDItemAlternateNames 38 | kMDItemContentCreationDate 39 | kMDItemComment 40 | kMDItemLanguages 41 | kMDItemPublishers 42 | kMDItemRecordingDate 43 | kMDItemRecordingYear 44 | uk_org_marginal_qlvideo_framerate 45 | uk_org_marginal_qlvideo_subtitles 46 | 47 | 48 | 49 | kMDItemTitle 50 | 51 | kMDItemPixelHeight 52 | kMDItemPixelWidth 53 | kMDItemCodecs 54 | kMDItemProfileName 55 | uk_org_marginal_qlvideo_framerate 56 | 57 | kMDItemDurationSeconds 58 | kMDItemAuthors 59 | kMDItemPerformers 60 | kMDItemDirector 61 | kMDItemProducer 62 | kMDItemRecordingYear 63 | kMDItemComment 64 | kMDItemGenre 65 | kMDItemCopyright 66 | kMDItemLanguages 67 | kMDItemAudioChannelCount 68 | kMDItemAudioSampleRate 69 | kMDItemBitsPerSample 70 | uk_org_marginal_qlvideo_subtitles 71 | kMDItemEncodingApplications 72 | kMDItemAlternateNames 73 | kMDItemOriginalFormat 74 | kMDItemOriginalSource 75 | kMDItemStarRating 76 | kMDItemInformation 77 | 78 | 79 | UTI 80 | done 81 | 82 | cat >> $SCHEMA <