Aller au contenu

Module:Episode/MultiSeries

De Stargate Wiki Sémantique
Documentation icon Documentation module[créer]
-- Module:Episode/MultiSeries
-- Loads series index modules and season modules, merges episodes and aliases
local utils = require("Module:Episode/Shared/Utils")
local Master = {
    episodes = {},   -- id -> episode table
    aliases  = {},   -- normalized alias -> id
    loaded   = {},   -- list of loaded module paths
}

-- Load a season module safely and merge
local function load_and_merge(module_path)
    local ok, mod = pcall(require, module_path)
    if not ok or type(mod) ~= "table" then return false end
    for k,v in pairs(mod) do
        if type(v) == "table" and v.id and utils.validate_episode(v) then
            Master.episodes[v.id] = v
            if type(v.aliases) == "table" then
                for _, a in ipairs(v.aliases) do
                    local norm = utils.normalize_alias(a)
                    if norm then Master.aliases[norm] = v.id end
                end
            end
        elseif type(v) == "string" then
            local norm = utils.normalize_alias(k)
            if norm and v ~= "" then Master.aliases[norm] = v end
        end
    end
    table.insert(Master.loaded, module_path)
    return true
end

-- Public: load a list of series index modules
function Master.load_series(series_index_modules)
    series_index_modules = series_index_modules or {
        "Module:Episode/SG1/Index",
        "Module:Episode/SGA/Index",
        "Module:Episode/SGU/Index",
    }
    for _, idx_path in ipairs(series_index_modules) do
        local ok, idx = pcall(require, idx_path)
        if ok and type(idx) == "table" and idx.list_seasons then
            for _, s in ipairs(idx.list_seasons()) do
                load_and_merge(s.module)
            end
        end
    end
    return {
        episodes_count = (function() local c=0; for _ in pairs(Master.episodes) do c=c+1 end; return c end)(),
        aliases_count = (function() local c=0; for _ in pairs(Master.aliases) do c=c+1 end; return c end)(),
        loaded = Master.loaded,
    }
end

function Master.get_by_id(id) return Master.episodes[id] end
function Master.resolve_alias(alias) return Master.aliases[utils.normalize_alias(alias)] end
function Master.get_by_alias(alias)
    local id = Master.resolve_alias(alias)
    if id then return Master.get_by_id(id) end
    return nil
end

return Master