app.uti - Uniform Type Identifier API
macOS Uniform Type Identifier (UTI) querying and conversion.
Permission level: L0 (safe, always available)
Methods
app.uti.fromExtension(ext)
Converts a file extension to a UTI.
Parameters:
ext(string) - File extension (e.g., “pdf”)
Returns: string, error - UTI string
local uti = app.uti.fromExtension("pdf") -- "com.adobe.pdf"
local uti = app.uti.fromExtension("png") -- "public.png"
local uti = app.uti.fromExtension("swift") -- "public.swift-source"
app.uti.fromMimeType(mime)
Converts a MIME type to a UTI.
Parameters:
mime(string) - MIME type
Returns: string, error
local uti = app.uti.fromMimeType("application/pdf") -- "com.adobe.pdf"
local uti = app.uti.fromMimeType("image/png") -- "public.png"
app.uti.toExtension(uti)
Converts a UTI to its preferred file extension.
Parameters:
uti(string) - UTI string
Returns: string, error
local ext = app.uti.toExtension("com.adobe.pdf") -- "pdf"
local ext = app.uti.toExtension("public.png") -- "png"
app.uti.toMimeType(uti)
Converts a UTI to a MIME type.
Parameters:
uti(string) - UTI string
Returns: string, error
local mime = app.uti.toMimeType("com.adobe.pdf") -- "application/pdf"
app.uti.conforms(uti, parent)
Checks whether a UTI conforms to a parent type.
Parameters:
uti(string) - UTI stringparent(string) - Parent UTI string
Returns: boolean
app.uti.conforms("public.png", "public.image") -- true
app.uti.conforms("com.adobe.pdf", "public.data") -- true
app.uti.conforms("public.png", "public.movie") -- false
app.uti.forFile(path)
Gets the UTI for a file.
Parameters:
path(string) - File path
Returns: string, error
local uti = app.uti.forFile("/path/to/image.png") -- "public.png"
app.uti.description(uti)
Gets the localized description of a UTI.
Parameters:
uti(string) - UTI string
Returns: string|nil
local desc = app.uti.description("com.adobe.pdf") -- "PDF Document"
local desc = app.uti.description("public.png") -- "PNG Image"
Examples
Classify Files by Type
function MyPlugin:handleClassify(context)
local categories = {}
for _, file in ipairs(context.selectedFiles) do
local uti = app.uti.forFile(file)
if uti then
local category = "other"
if app.uti.conforms(uti, "public.image") then
category = "images"
elseif app.uti.conforms(uti, "public.movie") then
category = "videos"
elseif app.uti.conforms(uti, "public.audio") then
category = "audio"
elseif app.uti.conforms(uti, "public.text") then
category = "text"
end
categories[category] = (categories[category] or 0) + 1
end
end
local info = ""
for cat, count in pairs(categories) do
info = info .. cat .. ": " .. count .. "\n"
end
app.dialog.alert("File Classification", info)
end