Douban Site Playlist Archiver

douban site for fk's sake

// ==UserScript==
// @name         Douban Site Playlist Archiver
// @namespace    https://gist.github.com/ned42
// @version      0.1
// @description  douban site for fk's sake
// @author       ned42
// @match        https://site.douban.com/*/widget/playlist/*/edit_songs
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(function() {
    'use strict';
    function addDownloadLink() {
        const nav = document.querySelector('.widget-nav ul');
        if (nav) {
            let songlib_id = String(window.location).split('/')[6]
            const link = document.createElement('li');
            link.style.float = "right"
            const anchor = document.createElement('a');
            anchor.href = '#';
            anchor.textContent = '⇩ 导出';
            anchor.addEventListener('click', function(e) {
                e.preventDefault();
                generateMarkdownPlaylist(songlib_id);
            });
            link.appendChild(anchor);
            nav.appendChild(link);
            console.log('insert!')
        }
        else console.log('error')
    }

    async function generateMarkdownPlaylist(songlib_id) {
        console.log('start generating markdown...');

        GM_xmlhttpRequest({
            method: "GET",
            url: `https://site.douban.com/j/widget/playlist/${songlib_id}/songlib?__t=${Date.now()}`,
            onload: function(response) {
                try {
                    const data = JSON.parse(response.responseText);
                    let markdownContent = '';

                    for (const song of data.songs) {
                        const songLine = `★ ${song.title} - ${song.play_length}\n${song.url}\n———————————————————————————————————————\n`;
                        markdownContent += songLine;
                    }
                    const blob = new Blob([markdownContent], {type: "text/plain;charset=utf-8"});
                    const url = URL.createObjectURL(blob);
                    const downloadLink = document.createElement('a');
                    downloadLink.href = url;
                    downloadLink.download = `${document.querySelector('h1').innerText}_${new Date().toLocaleString()}.md`;
                    document.body.appendChild(downloadLink);
                    downloadLink.click();
                    document.body.removeChild(downloadLink);
                    URL.revokeObjectURL(url);
                } catch (e) {
                    console.error('Failed to parse response or generate Markdown:', e);
                }
            }
        });
    }

    document.addEventListener('DOMContentLoaded', ()=>{console.log('loaded');setTimeout(addDownloadLink,2000)});
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址