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

模块:SongPlayer:修订间差异

来自Rizline中文维基
第6行: 第6行:
     local artist = args.artist
     local artist = args.artist
     local imageName = args.image
     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
     if not title or title == '' or not imageName or imageName == '' then
第11行: 第16行:
     end
     end


     local sanitizedTitle = title
    -- 处理文件名
    sanitizedTitle = sanitizedTitle:gsub(' ', '_')
     local sanitizedTitle = title:gsub(' ', '_'):gsub('[\\/:*?"<>|]', '-')
    sanitizedTitle = sanitizedTitle:gsub('[\\/:*?"<>|]', '-')
 
     local encodedTitle = mw.uri.encode(sanitizedTitle, 'PATH')
     local encodedTitle = mw.uri.encode(sanitizedTitle, 'PATH')
     local imagePath = frame:preprocess('{{filepath:' .. imageName .. '}}')
     local imagePath = frame:preprocess('{{filepath:' .. imageName .. '}}')
     local songUrl = 'https://pan.rizwiki.cn/d/song/' .. encodedTitle .. '.mp3'
     local songUrl = 'https://pan.rizwiki.cn/d/song/' .. encodedTitle .. '.mp3'


     local data_div = mw.html.create('div')
    -- 构建 HTML
         :attr('id', 'song-player-data')
     local html = mw.html.create('div')
         :attr('style', 'display:none;')
         :attr('id', 'riz-player')
        :attr('data-name', title)
        :addClass('riz-player-mini')
        :attr('data-artist', artist or 'Unknown Artist')
         :css({
        :attr('data-url', songUrl)
            ['--rp-c1'] = c1,
        :attr('data-cover', imagePath)
            ['--rp-c2'] = c2,
        :done()
            ['--rp-c3'] = c3,
            ['--rp-c4'] = c4,
            ['display'] = 'none' -- JS加载前隐藏
        })
   
    -- 封面区域
    local cover = html:tag('div'):addClass('rp-cover')
    cover:tag('img'):attr('src', imagePath)
    -- 播放/暂停 遮罩图标
    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 'Unknown')
 
    -- 进度条容器
    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>')


     local html = {
     -- 隐藏的 audio 标签
        '<div id="song-player-fixed"></div>',
    html:tag('audio'):attr('id', 'riz-audio'):attr('src', songUrl):attr('preload', 'metadata')
        tostring(data_div)
    }


     return table.concat(html, '\n')
     return tostring(html)
end
end


return p
return p

2025年11月30日 (日) 15:59的版本

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

local p = {}

function p.player(frame)
    local args = frame:getParent().args
    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 imagePath = frame:preprocess('{{filepath:' .. imageName .. '}}')
    local songUrl = 'https://pan.rizwiki.cn/d/song/' .. encodedTitle .. '.mp3'

    -- 构建 HTML
    local html = mw.html.create('div')
        :attr('id', 'riz-player')
        :addClass('riz-player-mini')
        :css({
            ['--rp-c1'] = c1,
            ['--rp-c2'] = c2,
            ['--rp-c3'] = c3,
            ['--rp-c4'] = c4,
            ['display'] = 'none' -- JS加载前隐藏
        })
    
    -- 封面区域
    local cover = html:tag('div'):addClass('rp-cover')
    cover:tag('img'):attr('src', imagePath)
    -- 播放/暂停 遮罩图标
    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 'Unknown')

    -- 进度条容器
    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>')

    -- 隐藏的 audio 标签
    html:tag('audio'):attr('id', 'riz-audio'):attr('src', songUrl):attr('preload', 'metadata')

    return tostring(html)
end

return p