打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

模块:SongPlayer

来自Rizline中文维基
卡介菌留言 | 贡献2025年12月1日 (一) 15:52的版本

此模块的文档可以在模块:SongPlayer/doc创建

local p = {}
local getArgs = require('Module:Arguments').getArgs

function p.player(frame)
    local args = getArgs(frame)
    
    local title = args.title
    local artist = args.artist
    local imageName = args.image
    
    local c1 = args.color1 or '#94E1FF'
    local c2 = args.color2 or '#A3E5FF'
    local c3 = args.color3 or '#B2E9FE'
    local c4 = args.color4 or '#D5F3FE'

    if not title or title == '' or not imageName or imageName == '' then
        return ''
    end

    local sanitizedTitle = title:gsub(' ', '_'):gsub('[\\/:*?"<>|]', '-')
    local encodedTitle = mw.uri.encode(sanitizedTitle, 'PATH')
    local songUrl = 'https://pan.rizwiki.cn/d/song/' .. encodedTitle .. '.mp3'

    local rawPath = mw.text.trim(frame:preprocess('{{filepath:' .. imageName .. '}}'))
    
    local srcPath = rawPath:gsub('^https?://[^/]+', ''):gsub('^//[^/]+', '')
    
    local fullPath = rawPath
    if fullPath:match('^//') then
        fullPath = 'https:' .. fullPath
    elseif fullPath:match('^/') and not fullPath:match('^//') then
        fullPath = 'https://rizwiki.cn' .. fullPath
    end
    
    srcPath = srcPath:gsub(' ', '_')
    fullPath = fullPath:gsub(' ', '_')

    local html = mw.html.create('div')
        :attr('id', 'riz-player')
        :addClass('riz-player-mini')
        :attr('data-url', songUrl)
        :attr('data-image', fullPath)
        :css({
            ['--rp-c1'] = c1,
            ['--rp-c2'] = c2,
            ['--rp-c3'] = c3,
            ['--rp-c4'] = c4,
            ['display'] = 'none'
        })
    
    local cover = html:tag('div'):addClass('rp-cover')
    cover:tag('img')
        :attr('src', srcPath)
        :attr('alt', 'cover')
        :attr('loading', 'eager')
        :attr('crossorigin', 'anonymous')
    
    cover:tag('div'):addClass('rp-btn-toggle'):wikitext('<div class="rp-icon-play"></div><div class="rp-icon-pause"></div>')

    local info = html:tag('div'):addClass('rp-info')
    info:tag('div'):addClass('rp-title'):wikitext(title)
    info:tag('div'):addClass('rp-artist'):wikitext(artist or '')

    local progressWrap = info:tag('div'):addClass('rp-progress-wrap')
    local progressBar = progressWrap:tag('div'):addClass('rp-progress-bar')
    progressBar:tag('div'):addClass('rp-progress-current')
    progressBar:tag('div'):addClass('rp-progress-handle')

    info:tag('div'):addClass('rp-time'):wikitext('<span class="rp-cur">00:00</span> / <span class="rp-dur">00:00</span>')

    return tostring(html)
end

return p