Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Documentation for this module may be created at Module:File/doc

-- Module for handling Media files (Origin: Wikimedia Commons)

require('strict')

-- ==================================================
-- === helper Lookup table ==========================
-- ==================================================

local extensionMap = {
	-- File types with full support in Commons (See [[c:Commons:File types]]).
	DJVU = 'image/vnd.djvu',
	FLAC = 'audio/x-flac',
	GIF  = 'image/gif',
	JPEG = 'image/jpeg',
	JPG  = 'image/jpeg',
	MID  = 'audio/midi',
	MP3  = 'audio/mpeg',
	OGA  = 'audio/ogg',
	OGG  = 'audio/ogg',
	OGV  = 'video/ogg',
	PDF  = 'application/pdf',
	PNG  = 'image/png',
	SVG  = 'image/svg+xml',
	TIF  = 'image/tiff',
	TIFF = 'image/tiff',
	WEBM = 'video/webm',
	WEBP = 'image/webp',
	WAV  = 'audio/x-wav',
	XCF  = 'image/xcf',

	-- Other file types with restrictions (not accepted in standard uploads on Commons but in 'User:' namespace).
	-- They could be supported in Wiki pages by embedding their content in an <pre> or <source> elements.
	CSS  = 'text/css',
	CSV  = 'text/csv',
	JS   = 'application/javascript',
	JSON = 'application/json',
	TXT  = 'text/plain',
	XML  = 'application/xml',

	-- Only generated by MediaWiki on output of some queries, restricted in all uploads.
	GZ   = 'application/gzip', -- delivered only only for some wiki results
	ZIP  = 'application/zip', -- delivered only for some wiki data exports

	-- Other file types not supported and to convert (a few of them may be in special administration namespaces).
	DOC  = 'application/msword', -- please convert to PDF, DJVU, or Wiki
	F4V  = 'video/mpeg', -- (deprecated, replaced by MP4) please convert to OGV or WEBM
	FLV  = 'video/x-flv', -- (deprecated, replaced by MP4) please convert to OGV or WEBM
	ICO  = 'image/vnd.microsoft.icon', -- used in MediaWiki resources for 'website icons'
	MP4  = 'video/mp4', 
	QT   = 'video/quicktime', -- (deprecated, replaced by MP4) please convert to OGV or WEBM
	RA   = 'audio/vnd.rn-realaudio', -- (deprecated, replaced by MP3) please convert to OGA
	SWF  = 'video/x-flv', -- (deprecated, replaced by MP4) please convert to OGV or WEBM
	WMA  = 'audio/x-ms-wma', -- please convert to OGA
	WMV  = 'video/x-ms-wmv', -- please convert to OGV or WEBM
	XLS  = 'application/vnd.ms-excel', -- please convert to PDF, DJVU, or Wiki
}

-- ==================================================
-- === Local functions ==============================
-- ==================================================

local function filename(frame)
	return frame.args[1] or frame.args["file"] or frame.args["title"] 
end

local function getMetadata(frame)
	local fname = filename(frame)
	local title
	if fname then
        title = mw.title.new(fname, 6)
	else
        title = mw.title.getCurrentTitle()
	end
	if title then
		return title.file
	else
		return {exists=false}
	end
end

-- ==================================================
-- === External functions ===========================
-- ==================================================
local p = {}

-- p.csExtension("Foo.bar.svg")
-- @return "svg"
function p.csExtension(frame)
	local fname = filename(frame) or mw.title.getCurrentTitle().text
	local parts = mw.text.split(fname, '.', true)
	if #parts>1 then
		return parts[#parts]
	else
		return ''
	end
end

function p.extension(frame)
	return p.csExtension(frame):lower()
end

function p.extensionUpper(frame)
	return p.csExtension(frame):upper()
end

-- p.woExtension("Foo.bar.svg")
-- @return "Foo.bar"
-- Original author: Bawolff at [[Module:FileName]]
function p.woExtension(frame)
	local fname = filename(frame) or mw.title.getCurrentTitle().text
	local parts = mw.text.split(fname , '.', true)
	local upTo = #parts - 1
	if upTo == 0 then upTo = 1 end
	return table.concat(parts, '.', 1, upTo)
end

function p.mime(frame)
	local meta  = getMetadata(frame)
	if meta.exists then
		return meta.mimeType
	else
		return extensionMap[p.extensionUpper(frame)] or 'unknown'
	end
end 

function p.mimeType(frame)
	return getMetadata(frame).mimeType
end

function p.fileExists(frame)
	return getMetadata(frame).exists or ''
end

-- This one won't throw errors at you
function p.fileExistsRelaxed(frame)
	local ok, metadata = pcall(getMetadata(frame))
	if ok then
		return metadata.exists or ''
	else
		return ''
	end
end

function p.maxthumb(frame)
-- Limits in megapixels are currently stored in Commons templates, they could be in this module.
-- There may be more limits for other supported mime types (djvu, flac, ogv, pdf, svg, webm, xcf).
	local maxthumbMap = {
		['image/gif']  = 1000, 
		['image/png' ] = 2500, -- see Template:LargePNG/limit
		['image/tiff'] = 1000, -- see Template:LargeTIFF/limit
	}
	local mime = p.mime(frame)
	return maxthumbMap[mime] or 'unknown @Module:File'
end

function p.dateWorkCreated(frame)
	return '' -- no longer supported
end

function p.width(frame)
	return getMetadata(frame).width
end

function p.height(frame)
	return getMetadata(frame).height
end

function p.dimensions(frame)
	local d = getMetadata(frame)
	if d.exists then
		return d.width .. ' × ' .. d.height  
	else
		return ''
	end
end

function p.size(frame)
	return getMetadata(frame).size
end

function p.pageCount(frame)
	local pages = getMetadata(frame).pages or {1}
	return #pages
end

return p