Modulo:Cita siti musicali

Da Semi del Verbo, l'enciclopedia dell'influenza del Vangelo sulla cultura

La documentazione per questo modulo può essere creata in Modulo:Cita siti musicali/man

require('strict')

local getArgs = require('Modulo:Arguments').getArgs
local mWikidata = require('Modulo:Wikidata')
local mCitazione = require('Modulo:Citazione')
local p = {}

--[[ ===============================================================================
Funzione di utilità che restituisce class e id se non specificati:
* se class è specificato e id è nullo: ottiene id dalla proprietà Wikidata relativa a quel class.
* se class è nullo verifica una serie di proprietà Wikidata e restituisce
il valore (e il class corrispondente) della prima proprietà presente.
	===============================================================================]]
local function getClassAndId(class, id, class_type)
	if class then
		class = string.lower(class)
		if not id and class_type[class] then
			id = mWikidata._getProperty({ class_type[class], n = 1 })
		end
	else
		for try_class, property in pairs(class_type) do
			local try_id = mWikidata._getProperty({ property, n = 1 })
			if try_id then
				id = try_id
				class = try_class
				break
			end
		end
	end

	return class, id
end

--[[ ===============================================================================
Dati i parametri class, id e tab ritorna l'url di un artista od opera su Allmusic
- class = uno delle chiavi di class_type, indica se si vuole un artista o un'opera
- id = l'id dell'artista o opera su Allmusic
- tab = una sottopagina dell'url (opzionale)
	===============================================================================]]
function p.Allmusic_url(frame)
	local class_type = {
		artist = 'P1728',
		album = 'P1729',
		song = 'P1730',
		composition = 'P1994'
	}
	local args = getArgs(frame)
	local class, id = getClassAndId(args.class or args[1], args.id or args[2] or args.ID, class_type)	
	return (class and id) and
		   mw.ustring.format('http://www.allmusic.com/%s/%s%s', class, id, args.tab and ('/' .. args.tab) or '') or nil
end

--[[ ===============================================================================
Dati i parametri class e id ritorna l'url di un artista od opera su Discogs
- class = uno delle chiavi di class_type, indica se si vuole un artista o un'opera
- id = l'id dell'artista o opera su Discogs
	===============================================================================]]
function p.Discogs_url(frame)
	local class_type = {
		artist = 'P1953',
		label = 'P1955',
		master = 'P1954',
		release = 'P2206'
	}
	local args = getArgs(frame)
	local class, id = getClassAndId(args.class or args[1], args.ID or args[2] or args.id, class_type)
	return (class and id) and mw.ustring.format('https://www.discogs.com/it/%s/%s', class, id) or nil
end

--[[ ===============================================================================
Dati i parametri tipo e id ritorna l'url di un artista od opera su MusicBrainz
- tipo = uno delle chiavi di class_type, indica se si vuole un artista o un'opera
- id = l'id dell'artista o opera su MusicBrainz
	===============================================================================]]
function p.MusicBrainz_url(frame)
	local class_type = {
		artist = 'P434',
		work = 'P435',
		album = 'P436',
		label = 'P966'
	}
	local label = {
		artist = 'artist',
		album = 'release-group',
		label = 'label',
		work = 'work'
	}
	local args = getArgs(frame)
	local tipo, id = getClassAndId(args.tipo or args[1], args.ID or args[2] or args.id, class_type)
	return (label[tipo] and id) and mw.ustring.format('http://musicbrainz.org/%s/%s', label[tipo], id) or nil
end

--[[ ===============================================================================
Dati i parametri class e id ritorna l'url di un artista od opera su SecondHandSongs
- class = uno delle chiavi di class_type, indica se si vuole un artista o un'opera
- id = l'id dell'artista o opera su Discogs
	===============================================================================]]
function p.SecondHandSongs_url(frame)
	local class_type = {
		work = 'P2908',
		artist = 'P2909'
	}
	local args = getArgs(frame)
	local class, id = getClassAndId(args.class or args[1], args.id or args[2], class_type)
	return (class and id) and mw.ustring.format('http://secondhandsongs.com/%s/%s', class, id) or nil
end

--[[ ===============================================================================
Dati i parametri class e id ritorna l'url di un artista od opera su Metal Archives
- class = uno delle chiavi di class_type, indica se si vuole un artista, un gruppo o un'opera
- id = l'id dell'artista o opera su Metal Archives
	===============================================================================]]
function p.MetalArchives_url(frame)
	local class_type = {
		artist = 'P1989',
		band = 'P1952',
		release = 'P2721'
	}
	local args = getArgs(frame)
	local class, id = getClassAndId(args.class or args[1], args.id or args[2], class_type)
	return (class and id) and mw.ustring.format('http://www.metal-archives.com/%s.php?id=%s', class, id) or nil
end

--[[ ===============================================================================
Ritorna un'eventuale categoria di errore per tracciare le voci i cui elementi Wikidata contengono
per una certa proprietà più dichiarazioni fra le quali nessuna è classificata come 'preferito'
	===============================================================================]]
function p.controllo_duplicati(frame)
	-- nome della categoria
	local errorCategory = '[[Categoria:Voci musicali con ID multipli o duplicati]]'
	-- proprietà da controllare
	local properties = {
		-- MusicBrainz artista, canzone, album, label
		'P434', 'P435', 'P436', 'P966',
		-- AllMusic artista, album, canzone e composizione
		'P1728', 'P1729', 'P1730', 'P1994',
		-- Discogs artista, master, etichetta, release
		'P1953', 'P1954', 'P1955', 'P2206',
		-- SecondHandSongs canzone e artista
		'P2908', 'P2909',
		-- MetalArchives opera, gruppo e artista
		'P1989', 'P1952', 'P2721'
	}
	local ret = ''

	for _, propertyId in ipairs(properties) do
		if mWikidata._N({ propertyId }) > 1 then
			ret = errorCategory
			break
		end
	end

	return ret
end

return p