// ==UserScript== // @name Douyin User Video Downloader // @namespace https://github.com/CaoCuong2404 // @version 1.6 // @description Extract video links and metadata from Douyin user profiles // @author CaoCuong2404 // @match https://www.douyin.com/user/* // @icon https://www.google.com/s2/favicons?sz=64&domain=douyin.com // @grant none // @run-at document-end // @downloadURL https://update.greasyfork.icu/scripts/528620/Douyin%20User%20Video%20Downloader.user.js // @updateURL https://update.greasyfork.icu/scripts/528620/Douyin%20User%20Video%20Downloader.meta.js // ==/UserScript== (function () { "use strict"; // Add Tailwind CSS const tailwindCDN = document.createElement("script"); tailwindCDN.src = "https://cdn.tailwindcss.com"; document.head.appendChild(tailwindCDN); // Global state const state = { videos: [], selectedVideos: new Set(), isFetching: false, fetchedCount: 0, totalFound: 0, isDialogOpen: false, }; function createMainUI() { // Create backdrop const backdrop = document.createElement("div"); backdrop.className = "fixed inset-0 bg-black bg-opacity-50 z-[9999] hidden"; backdrop.id = "douyin-downloader-backdrop"; // Create dialog container const container = document.createElement("div"); container.className = "fixed top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 w-[900px] bg-white rounded-lg shadow-xl z-[10000] hidden"; container.id = "douyin-downloader"; container.innerHTML = `
Select | No. | Cover | Title | Date | Actions |
---|