VirtualTaboo直播优化

https://zh.virtualtaboo.live##吉吉国王

CVGghhv (8592)7天前

更新了API
二维码导入
{
    "bookSourceComment": "如遇卡顿在章节URL切换下面线路\n         A\": \"doppiocdn.com\",\n        \"B\": \"doppiocdn1.com\",\n        \"C\": \"doppiocdn.media\",\n        \"D\": \"doppiocdn.net\",\n        \"E\": \"doppiocdn.org\",\n        \"F\": \"doppiocdn.live\",",
    "bookSourceGroup": "视频直播",
    "bookSourceName": "VirtualTaboo直播优化",
    "bookSourceType": 4,
    "bookSourceUrl": "https:\/\/zh.virtualtaboo.live##吉吉国王",
    "customButton": false,
    "customOrder": 4,
    "enabled": true,
    "enabledCookieJar": false,
    "enabledExplore": true,
    "eventListener": false,
    "exploreUrl": "@js:var currentPrimaryTag = 'girls';\nlet sort = [], push = (t, u, p) => sort.push({ title: t, url: u, style: { layout_flexBasisPercent: p } });\n\nlet data = JSON.parse(java.ajax('https:\/\/zh.virtualtaboo.live\/api\/front\/models\/liveTags?primaryTag=girls&withMixedTags=true&sac=true'));\nlet tagGroups = data.liveTagGroups || [], tagDetails = data.liveTagDetails || {};\n\nlet tagNameMap = {\n    'tagLanguageChinese':'中文','tagLanguageUkrainian':'乌克兰语','autoTagNew':'新主播','autoTagVr':'VR直播',\n    'subcultureBdsm':'虐恋','groupShow':'群组秀','ageTeen':'18+','ageYoung':'22+','ageMilf':'熟女',\n    'ageMature':'成熟','ageOld':'老年','ethnicityMiddleEastern':'中东','ethnicityAsian':'亚洲','ethnicityEbony':'黑人',\n    'ethnicityIndian':'印度','ethnicityLatino':'拉丁','ethnicityMultiracial':'混血','ethnicityWhite':'白人',\n    'bodyTypePetite':'娇小','bodyTypeAthletic':'运动型','bodyTypeMedium':'匀称','bodyTypeCurvy':'曲线型',\n    'bodyTypeBBW':'大码美女','bodyTypeBig':'丰满','hairColorBlonde':'金发','hairColorBrown':'棕发',\n    'hairColorBlack':'黑发','hairColorRed':'红发','hairColorColorful':'彩发','hairColorHairless':'无毛',\n    'privatePriceEight':'8元\/分钟','privatePriceSixteenToTwentyFour':'16-24元\/分钟','privatePriceThirtyTwoSixty':'32-60元\/分钟',\n    'privatePriceNinetyPlus':'90+元\/分钟','autoTagBestPrivates':'最佳私密秀','autoTagRecordablePrivate':'可录制私密秀',\n    'autoTagSpy':'可窥视','autoTagP2P':'P2P直播','autoTagInteractiveToy':'互动玩具','mobile':'手机直播',\n    'tagGroupSex':'群交','specificsBigTits':'巨乳','specificsHairy':'有毛','doPublicPlace':'公共场合',\n    'specificsBigAss':'大屁股','doAnal':'肛交','doSquirt':'喷水','fuckMachine':'炮机','doHardcore':'硬核',\n    'doBlowjob':'口交','specificSmallTits':'贫乳','specificPregnant':'孕妇','doFisting':'拳交',\n    'doMasturbation':'自慰','specificShaven':'剃毛','doDeepThroat':'深喉','doDildoOrVibrator':'假阳具\/震动器',\n    'doFootFetish':'恋足','doOffice':'办公室','subcultureGoth':'哥特','jerkOffInstruction':'射精指导',\n    'subcultureSwingers':'交换伴侣','doCosplay':'Cosplay','doSexToys':'性玩具','doTalk':'聊天',\n    'subcultureEmo':'Emo','subcultureCuckold':'出轨','subcultureMistresses':'情妇','videoGames':'电玩',\n    'doStriptease':'脱衣舞','asmr':'ASMR','doYoga':'瑜伽','doCooking':'烹饪','autoTagNonNude':'非全裸',\n    'specificInterracial':'跨种族','specificsTattoos':'纹身','specificsPiercing':'穿孔','autoTagLovense':'Lovense',\n    'latex':'乳胶','doRolePlay':'角色扮演','leather':'皮革','autoTagKiiroo':'Kiiroo','corset':'紧身内衣',\n    'doAnalToys':'后庭玩具','doNippleToys':'乳头玩具','specificBigClit':'大阴蒂','specificBigNipples':'大乳头',\n    'specificHairyArmpits':'腋毛','specificTrimmed':'修剪','specificTomboy':'假小子','specificQueer':'酷儿',\n    'specificNonBinary':'非二元性别','subcultureEgirl':'电子女孩','subcultureAnime':'动漫女孩',\n    'subcultureGlamour':'高贵','subcultureKpop':'韩流','subcultureHousewives':'家庭主妇',\n    'subcultureGymBabe':'健身宝贝','subcultureRomantic':'浪漫','subculturePunks':'朋克',\n    'subcultureNerds':'书呆子','subcultureGamers':'玩家','subcultureStudent':'学生',\n    'subcultureClubber':'夜店女郎','subcultureBottom':'Bottom','subcultureTop':'Top',\n    'subcultureChubbies':'胖熊','subcultureCubs':'小熊','subcultureDragQueens':'变装皇后',\n    'subcultureEboy':'E-boy','subcultureGymRats':'健身狂','subcultureHunks':'猛男',\n    'subcultureJocks':'运动男','subcultureOtters':'水獭','subcultureStuds':'种马',\n    'doEroticDance':'色情舞','cockRating':'大屌评分','doEjaculation':'射精','doTwerk':'电臀舞',\n    'doAssToMouth':'肛交到口交','doDoublePenetration':'双茎插入','doOrgasm':'高潮',\n    'doFoursome':'四人性交','doAhegao':'高潮脸','doCreamPie':'体内射精','doDoggyStyle':'狗式',\n    'doPussyLicking':'舔鲍鱼','doBukkake':'集体颜射','doShower':'洗澡','doHumiliation':'羞辱',\n    'doOilShow':'精油表演','doCumshot':'颜射','doGape':'开肛','doCamelToe':'阴部骆驼趾',\n    'doFlashing':'快闪裸体','doCowgirl':'骑乘女','doFacesitting':'骑脸','doGagging':'强制塞口',\n    'doStrapon':'穿戴式阳具','do69Position':'69姿势','doMassage':'按摩','doSpanking':'鞭打',\n    'doUpskirt':'裙底风光','doGloryHole':'厕板洞','doThreesome':'三人性交','doSmoking':'抽烟',\n    'boots':'靴子','heels':'高跟鞋','nylon':'丝袜','specificJeans':'牛仔裤','specificSportGear':'运动装备',\n    'tagLanguageAfrican':'非洲裔','tagLanguageAlgerian':'阿尔及利亚','tagLanguageArgentinian':'阿根廷',\n    'tagLanguageArmenian':'亚美尼亚','tagLanguageAssamese':'阿萨姆','tagLanguageAustralian':'澳大利亚',\n    'tagLanguageAustrian':'奥地利人','tagLanguageBangladeshi':'孟加拉','tagLanguageBelgian':'比利时',\n    'tagLanguageBengali':'孟加拉语','tagLanguageBrazilian':'巴西','tagLanguageBulgarian':'保加利亚人',\n    'tagLanguageCanadian':'加拿大','tagLanguageChilean':'智利','tagLanguageColombian':'哥伦比亚',\n    'tagLanguageCroatian':'克罗地亚','tagLanguageCzech':'捷克','tagLanguageDanish':'丹麦',\n    'tagLanguageDominican':'多米尼加','tagLanguageDutch':'荷兰','tagLanguageEcuadorian':'厄瓜多尔',\n    'tagLanguageEgyptian':'埃及','tagLanguageEstonian':'爱沙尼亚','tagLanguageEuropean':'欧洲女孩',\n    'tagLanguageFilipino':'菲律宾','tagLanguageFinnish':'芬兰','tagLanguageFrench':'法语',\n    'tagLanguageGeorgian':'格鲁吉亚','tagLanguageGermanSpeaking':'德语','tagLanguageGreek':'希腊',\n    'tagLanguageGujarati':'古吉拉特','tagLanguageHindi':'印地','tagLanguageHungarian':'匈牙利',\n    'tagLanguageIndonesian':'印度尼西亚','tagLanguageIrish':'爱尔兰','tagLanguageIsraeli':'以色列',\n    'tagLanguageItalian':'意大利','tagLanguageJamaican':'牙买加','tagLanguageJapanese':'日语',\n    'tagLanguageKannada':'卡纳达','tagLanguageKenyan':'肯尼亚','tagLanguageKiwi':'新西兰',\n    'tagLanguageKorean':'韩语','tagLanguageLatvian':'拉脱维亚','tagLanguageLithuanian':'立陶宛',\n    'tagLanguageMalagasy':'马尔加什','tagLanguageMalayalam':'马拉雅拉姆','tagLanguageMalaysian':'马来西亚',\n    'tagLanguageMarathi':'马拉地','tagLanguageMexican':'墨西哥','tagLanguageMoroccan':'摩洛哥',\n    'tagLanguageNigerian':'尼日利亚','tagLanguageNordic':'北欧','tagLanguageNorwegian':'挪威',\n    'tagLanguageOdia':'奥里亚','tagLanguagePeruvian':'秘鲁','tagLanguagePolish':'波兰',\n    'tagLanguagePortuguese':'葡萄牙','tagLanguagePortugueseSpeaking':'葡萄牙语','tagLanguagePunjabi':'旁遮普',\n    'tagLanguageRomanian':'罗马尼亚','tagLanguageRussianSpeaking':'俄罗斯','tagLanguageSerbian':'塞尔维亚',\n    'tagLanguageSlovakian':'斯洛伐克','tagLanguageSouthAfrican':'南非','tagLanguageSpanish':'西班牙语',\n    'tagLanguageSpanishSpeaking':'西班牙','tagLanguageSriLankan':'斯里兰卡','tagLanguageSwedish':'瑞典',\n    'tagLanguageSwiss':'瑞士','tagLanguageTaiwanese':'台湾省','tagLanguageTamil':'泰米尔',\n    'tagLanguageTelugu':'泰卢固','tagLanguageThai':'泰国','tagLanguageTurkish':'土耳其',\n    'tagLanguageUKModels':'英国','tagLanguageUSModels':'美国','tagLanguageUgandan':'乌干达',\n    'tagLanguageVenezuelan':'委内瑞拉','tagLanguageVietnamese':'越南','tagLanguageZimbabwean':'津巴布韦'\n};\n\nfunction getDisplay(tag) { return tagNameMap[tag] || tag.replace(\/([A-Z])\/g, ' $1').trim(); }\n\nfunction buildUrl(tag) {\n    return 'https:\/\/zh.virtualtaboo.live\/api\/front\/models?removeShows=false&recInFeatured=false&limit=60&offset={{(page-1)*60}}&primaryTag=' + currentPrimaryTag + '&filterGroupTags=' + encodeURIComponent(JSON.stringify([[tag]])) + '&sortBy=stripRanking&parentTag=' + tag + '&userRole=user&sac=true';\n}\n\nfunction render(tags, title) {\n    if (!tags || !tags.length) return;\n    push('❤️ ' + title + ' ❤️', null, 1);\n    for (var i = 0; i < tags.length; i++) {\n        var tag = tags[i];\n        if (!tag) continue;\n        var count = tagDetails[tag] ? tagDetails[tag].modelsLive || 0 : 0;\n        push(getDisplay(tag) + (count > 0 ? count + '人' : ''), buildUrl(tag), 0.29);\n    }\n}\n\nfunction sortTags(tags) {\n    tags.sort(function(a, b) {\n        var ca = tagDetails[a] ? tagDetails[a].modelsLive || 0 : 0;\n        var cb = tagDetails[b] ? tagDetails[b].modelsLive || 0 : 0;\n        return cb - ca;\n    });\n    return tags;\n}\n\nfunction findGroup(alias) {\n    for (var i = 0; i < tagGroups.length; i++) {\n        if (tagGroups[i].alias === alias) return tagGroups[i];\n    }\n    return null;\n}\n\nfunction renderManual(list, title) {\n    var valid = [];\n    for (var i = 0; i < list.length; i++) {\n        var tag = list[i];\n        if (tagDetails[tag] && tagDetails[tag].modelsLive > 0) valid.push(tag);\n    }\n    render(sortTags(valid), title);\n}\n\n\/\/ ============================================================\n\/\/ girls 频道\n\/\/ ============================================================\ncurrentPrimaryTag = 'girls';\npush('🔥 在线热门', 'https:\/\/zh.virtualtaboo.live\/api\/front\/models?removeShows=false&recInFeatured=false&limit=60&offset=0&primaryTag=girls&sortBy=stripRanking&userRole=user&sac=true', 1);\n\nvar quickLang = [\n    ['🇨🇳 中文', 'tagLanguageChinese'],\n    ['🇯🇵 日语', 'tagLanguageJapanese'],\n    ['🇻🇳 越南语', 'tagLanguageVietnamese']\n];\nfor (var i = 0; i < quickLang.length; i++) {\n    var tag = quickLang[i][1];\n    var count = tagDetails[tag] ? tagDetails[tag].modelsLive || 0 : 0;\n    if (count > 0) push(quickLang[i][0] + count + '人', buildUrl(tag), 0.29);\n}\n\nvar groupTitles = { 'specials': '🔥 特别推荐', 'age': '🎂 年龄', 'ethnicity': '🌍 人种', 'bodyType': '💪 体型', 'hairColor': '💇 发色', 'privatePrice': '💰 价格' };\n['specials', 'age', 'ethnicity', 'bodyType', 'hairColor', 'privatePrice'].forEach(function(alias) {\n    var group = findGroup(alias);\n    if (!group) return;\n    var valid = [];\n    var tags = group.tags || [];\n    for (var i = 0; i < tags.length; i++) {\n        var tag = tags[i];\n        if (tagDetails[tag] && tagDetails[tag].modelsLive > 0) valid.push(tag);\n    }\n    render(sortTags(valid), groupTitles[alias]);\n});\n\nvar langTags = [];\nfor (var tag in tagDetails) {\n    if (tag.indexOf('tagLanguage') === 0 && tag.indexOf('-') === -1 && tagDetails[tag].modelsLive > 0) langTags.push(tag);\n}\nrender(sortTags(langTags), '🌐 语言分类');\n\nvar subTags = [];\nfor (var tag in tagDetails) {\n    if (tag.indexOf('subculture') === 0 && tag.indexOf('-') === -1 && tagDetails[tag].modelsLive > 0) subTags.push(tag);\n}\nrender(sortTags(subTags), '🎭 亚文化');\n\nvar allGroup = findGroup('allTags');\nvar actionTags = [], bodyTags = [], perfTags = [];\nvar perfKeywords = ['striptease', 'eroticDance', 'twerk', 'oilShow', 'shower', 'topless', 'flashing', 'upskirt'];\nif (allGroup) {\n    var allTags = allGroup.tags || [];\n    for (var i = 0; i < allTags.length; i++) {\n        var tag = allTags[i];\n        if (!tagDetails[tag] || tagDetails[tag].modelsLive <= 0) continue;\n        if (tag.indexOf('do') === 0) actionTags.push(tag);\n        else if (tag.indexOf('specific') === 0) bodyTags.push(tag);\n        for (var k = 0; k < perfKeywords.length; k++) {\n            if (tag.indexOf(perfKeywords[k]) !== -1) { perfTags.push(tag); break; }\n        }\n    }\n}\nrender(sortTags(actionTags), '🎬 活动分类');\nrender(sortTags(bodyTags), '🔍 身体特征');\nrender(sortTags(perfTags), '💃 表演类型');\n\nrenderManual(['doStrapon','doAnalToys','autoTagInteractiveToy','doDildoOrVibrator','fuckMachine','doNippleToys','doSexToys','autoTagKiiroo','autoTagLovense'], '📱 设备分类');\nrenderManual(['doSmoking','subcultureCuckold','specificsPiercing','cockRating','heels','corset','doFootFetish','specificJeans','subcultureBdsm','leather','subcultureMistresses','latex','nylon','specificsTattoos','specificPregnant','specificSportGear'], '🖤 恋物癖');\n\n\/\/ ============================================================\n\/\/ couples 频道\n\/\/ ============================================================\nfunction buildCouples() {\n    currentPrimaryTag = 'couples';\n    var data2 = JSON.parse(java.ajax('https:\/\/zh.virtualtaboo.live\/api\/front\/models\/liveTags?primaryTag=couples&withMixedTags=true&sac=true'));\n    var tagGroups2 = data2.liveTagGroups || [];\n    var tagDetails2 = data2.liveTagDetails || {};\n\n    function renderCouplesTags(tags, title) {\n        if (!tags || !tags.length) return;\n        push('❤️ ' + title + ' ❤️', null, 1);\n        for (var i = 0; i < tags.length; i++) {\n            var tag = tags[i];\n            if (!tag) continue;\n            var count = tagDetails2[tag] ? tagDetails2[tag].modelsLive || 0 : 0;\n            push(getDisplay(tag) + (count > 0 ? count + '人' : ''), buildUrl(tag), 0.29);\n        }\n    }\n\n    function findGroup2(alias) {\n        for (var i = 0; i < tagGroups2.length; i++) {\n            if (tagGroups2[i].alias === alias) return tagGroups2[i];\n        }\n        return null;\n    }\n\n    function sortTags2(tags) {\n        tags.sort(function(a, b) {\n            var ca = tagDetails2[a] ? tagDetails2[a].modelsLive || 0 : 0;\n            var cb = tagDetails2[b] ? tagDetails2[b].modelsLive || 0 : 0;\n            return cb - ca;\n        });\n        return tags;\n    }\n\n    function renderManualCouples(list, title) {\n        var valid = [];\n        for (var i = 0; i < list.length; i++) {\n            var tag = list[i];\n            if (tagDetails2[tag] && tagDetails2[tag].modelsLive > 0) valid.push(tag);\n        }\n        renderCouplesTags(sortTags2(valid), title);\n    }\n\n    push('💕 情侣专区 💕', null, 1);\n\n    var groupTitles2 = {\n        'specials': '🔥 特别推荐',\n        'age': '🎂 年龄',\n        'ethnicity': '🌍 人种',\n        'bodyType': '💪 体型',\n        'hairColor': '💇 发色',\n        'privatePrice': '💰 价格'\n    };\n    ['specials', 'age', 'ethnicity', 'bodyType', 'hairColor', 'privatePrice'].forEach(function(alias) {\n        var group = findGroup2(alias);\n        if (!group) return;\n        var valid = [];\n        var tags = group.tags || [];\n        for (var i = 0; i < tags.length; i++) {\n            var tag = tags[i];\n            if (tagDetails2[tag] && tagDetails2[tag].modelsLive > 0) valid.push(tag);\n        }\n        renderCouplesTags(sortTags2(valid), groupTitles2[alias]);\n    });\n\n    ['tagLanguage', 'subculture'].forEach(function(prefix) {\n        var tags = [];\n        for (var tag in tagDetails2) {\n            if (tag.indexOf(prefix) === 0 && tag.indexOf('-') === -1 && tagDetails2[tag].modelsLive > 0) tags.push(tag);\n        }\n        renderCouplesTags(sortTags2(tags), prefix === 'tagLanguage' ? '🌐 语言分类' : '🎭 亚文化');\n    });\n\n    var allGroup2 = findGroup2('allTags');\n    var actionTags2 = [], bodyTags2 = [], perfTags2 = [];\n    var perfKeywords = ['striptease', 'eroticDance', 'twerk', 'oilShow', 'shower', 'topless', 'flashing', 'upskirt'];\n    if (allGroup2) {\n        var allTags2 = allGroup2.tags || [];\n        for (var i = 0; i < allTags2.length; i++) {\n            var tag = allTags2[i];\n            if (!tagDetails2[tag] || tagDetails2[tag].modelsLive <= 0) continue;\n            if (tag.indexOf('do') === 0) actionTags2.push(tag);\n            else if (tag.indexOf('specific') === 0) bodyTags2.push(tag);\n            for (var k = 0; k < perfKeywords.length; k++) {\n                if (tag.indexOf(perfKeywords[k]) !== -1) { perfTags2.push(tag); break; }\n            }\n        }\n    }\n    renderCouplesTags(sortTags2(actionTags2), '🎬 活动分类');\n    renderCouplesTags(sortTags2(bodyTags2), '🔍 身体特征');\n    renderCouplesTags(sortTags2(perfTags2), '💃 表演类型');\n\n    renderManualCouples(['doStrapon','doAnalToys','autoTagInteractiveToy','doDildoOrVibrator','fuckMachine','doNippleToys','doSexToys','autoTagKiiroo','autoTagLovense'], '📱 设备分类');\n    renderManualCouples(['doSmoking','subcultureCuckold','specificsPiercing','cockRating','heels','corset','doFootFetish','specificJeans','subcultureBdsm','leather','subcultureMistresses','latex','nylon','specificsTattoos','specificPregnant','specificSportGear'], '🖤 恋物癖');\n}\n\n\/\/ ============================================================\n\/\/ men 频道\n\/\/ ============================================================\nfunction buildMen() {\n    currentPrimaryTag = 'men';\n    var data2 = JSON.parse(java.ajax('https:\/\/zh.virtualtaboo.live\/api\/front\/models\/liveTags?primaryTag=men&withMixedTags=true&sac=true'));\n    var tagGroups2 = data2.liveTagGroups || [];\n    var tagDetails2 = data2.liveTagDetails || {};\n\n    function renderMenTags(tags, title) {\n        if (!tags || !tags.length) return;\n        push('❤️ ' + title + ' ❤️', null, 1);\n        for (var i = 0; i < tags.length; i++) {\n            var tag = tags[i];\n            if (!tag) continue;\n            var count = tagDetails2[tag] ? tagDetails2[tag].modelsLive || 0 : 0;\n            push(getDisplay(tag) + (count > 0 ? count + '人' : ''), buildUrl(tag), 0.29);\n        }\n    }\n\n    function findGroup2(alias) {\n        for (var i = 0; i < tagGroups2.length; i++) {\n            if (tagGroups2[i].alias === alias) return tagGroups2[i];\n        }\n        return null;\n    }\n\n    function sortTags2(tags) {\n        tags.sort(function(a, b) {\n            var ca = tagDetails2[a] ? tagDetails2[a].modelsLive || 0 : 0;\n            var cb = tagDetails2[b] ? tagDetails2[b].modelsLive || 0 : 0;\n            return cb - ca;\n        });\n        return tags;\n    }\n\n    function renderManualMen(list, title) {\n        var valid = [];\n        for (var i = 0; i < list.length; i++) {\n            var tag = list[i];\n            if (tagDetails2[tag] && tagDetails2[tag].modelsLive > 0) valid.push(tag);\n        }\n        renderMenTags(sortTags2(valid), title);\n    }\n\n    push('👨 男主播专区 👨', null, 1);\n\n    var groupTitles2 = {\n        'specials': '🔥 特别推荐',\n        'orientation': '💖 性取向',\n        'age': '🎂 年龄',\n        'ethnicity': '🌍 人种',\n        'bodyType': '💪 体型',\n        'hairColor': '💇 发色',\n        'privatePrice': '💰 价格'\n    };\n    ['specials', 'orientation', 'age', 'ethnicity', 'bodyType', 'hairColor', 'privatePrice'].forEach(function(alias) {\n        var group = findGroup2(alias);\n        if (!group) return;\n        var valid = [];\n        var tags = group.tags || [];\n        for (var i = 0; i < tags.length; i++) {\n            var tag = tags[i];\n            if (tagDetails2[tag] && tagDetails2[tag].modelsLive > 0) valid.push(tag);\n        }\n        renderMenTags(sortTags2(valid), groupTitles2[alias]);\n    });\n\n    ['tagLanguage', 'subculture'].forEach(function(prefix) {\n        var tags = [];\n        for (var tag in tagDetails2) {\n            if (tag.indexOf(prefix) === 0 && tag.indexOf('-') === -1 && tagDetails2[tag].modelsLive > 0) tags.push(tag);\n        }\n        renderMenTags(sortTags2(tags), prefix === 'tagLanguage' ? '🌐 语言分类' : '🎭 亚文化');\n    });\n\n    var allGroup2 = findGroup2('allTags');\n    var actionTags2 = [], bodyTags2 = [], perfTags2 = [];\n    var perfKeywords = ['striptease', 'eroticDance', 'twerk', 'oilShow', 'shower', 'topless', 'flashing', 'upskirt'];\n    if (allGroup2) {\n        var allTags2 = allGroup2.tags || [];\n        for (var i = 0; i < allTags2.length; i++) {\n            var tag = allTags2[i];\n            if (!tagDetails2[tag] || tagDetails2[tag].modelsLive <= 0) continue;\n            if (tag.indexOf('do') === 0) actionTags2.push(tag);\n            else if (tag.indexOf('specific') === 0) bodyTags2.push(tag);\n            for (var k = 0; k < perfKeywords.length; k++) {\n                if (tag.indexOf(perfKeywords[k]) !== -1) { perfTags2.push(tag); break; }\n            }\n        }\n    }\n    renderMenTags(sortTags2(actionTags2), '🎬 活动分类');\n    renderMenTags(sortTags2(bodyTags2), '🔍 身体特征');\n    renderMenTags(sortTags2(perfTags2), '💃 表演类型');\n\n    renderManualMen(['doStrapon','doAnalToys','autoTagInteractiveToy','doDildoOrVibrator','fuckMachine','doNippleToys','doSexToys','autoTagKiiroo','autoTagLovense'], '📱 设备分类');\n    renderManualMen(['doSmoking','subcultureCuckold','specificsPiercing','cockRating','heels','corset','doFootFetish','specificJeans','subcultureBdsm','leather','subcultureMistresses','latex','nylon','specificsTattoos','specificPregnant','specificSportGear'], '🖤 恋物癖');\n}\n\n\/\/ ============================================================\n\/\/ trans 频道\n\/\/ ============================================================\nfunction buildTrans() {\n    currentPrimaryTag = 'trans';\n    var data3 = JSON.parse(java.ajax('https:\/\/zh.virtualtaboo.live\/api\/front\/models\/liveTags?primaryTag=trans&withMixedTags=true&sac=true'));\n    var tagGroups3 = data3.liveTagGroups || [];\n    var tagDetails3 = data3.liveTagDetails || {};\n\n    function renderTransTags(tags, title) {\n        if (!tags || !tags.length) return;\n        push('❤️ ' + title + ' ❤️', null, 1);\n        for (var i = 0; i < tags.length; i++) {\n            var tag = tags[i];\n            if (!tag) continue;\n            var count = tagDetails3[tag] ? tagDetails3[tag].modelsLive || 0 : 0;\n            push(getDisplay(tag) + (count > 0 ? count + '人' : ''), buildUrl(tag), 0.29);\n        }\n    }\n\n    function findGroup3(alias) {\n        for (var i = 0; i < tagGroups3.length; i++) {\n            if (tagGroups3[i].alias === alias) return tagGroups3[i];\n        }\n        return null;\n    }\n\n    function sortTags3(tags) {\n        tags.sort(function(a, b) {\n            var ca = tagDetails3[a] ? tagDetails3[a].modelsLive || 0 : 0;\n            var cb = tagDetails3[b] ? tagDetails3[b].modelsLive || 0 : 0;\n            return cb - ca;\n        });\n        return tags;\n    }\n\n    function renderManualTrans(list, title) {\n        var valid = [];\n        for (var i = 0; i < list.length; i++) {\n            var tag = list[i];\n            if (tagDetails3[tag] && tagDetails3[tag].modelsLive > 0) valid.push(tag);\n        }\n        renderTransTags(sortTags3(valid), title);\n    }\n\n    push('⚧️ 跨性别专区 ⚧️', null, 1);\n\n    var groupTitles3 = {\n        'specials': '🔥 特别推荐',\n        'age': '🎂 年龄',\n        'ethnicity': '🌍 人种',\n        'bodyType': '💪 体型',\n        'hairColor': '💇 发色',\n        'privatePrice': '💰 价格'\n    };\n    ['specials', 'age', 'ethnicity', 'bodyType', 'hairColor', 'privatePrice'].forEach(function(alias) {\n        var group = findGroup3(alias);\n        if (!group) return;\n        var valid = [];\n        var tags = group.tags || [];\n        for (var i = 0; i < tags.length; i++) {\n            var tag = tags[i];\n            if (tagDetails3[tag] && tagDetails3[tag].modelsLive > 0) valid.push(tag);\n        }\n        renderTransTags(sortTags3(valid), groupTitles3[alias]);\n    });\n\n    ['tagLanguage', 'subculture'].forEach(function(prefix) {\n        var tags = [];\n        for (var tag in tagDetails3) {\n            if (tag.indexOf(prefix) === 0 && tag.indexOf('-') === -1 && tagDetails3[tag].modelsLive > 0) tags.push(tag);\n        }\n        renderTransTags(sortTags3(tags), prefix === 'tagLanguage' ? '🌐 语言分类' : '🎭 亚文化');\n    });\n\n    var allGroup3 = findGroup3('allTags');\n    var actionTags3 = [], bodyTags3 = [], perfTags3 = [];\n    var perfKeywords = ['striptease', 'eroticDance', 'twerk', 'oilShow', 'shower', 'topless', 'flashing', 'upskirt'];\n    if (allGroup3) {\n        var allTags3 = allGroup3.tags || [];\n        for (var i = 0; i < allTags3.length; i++) {\n            var tag = allTags3[i];\n            if (!tagDetails3[tag] || tagDetails3[tag].modelsLive <= 0) continue;\n            if (tag.indexOf('do') === 0) actionTags3.push(tag);\n            else if (tag.indexOf('specific') === 0) bodyTags3.push(tag);\n            for (var k = 0; k < perfKeywords.length; k++) {\n                if (tag.indexOf(perfKeywords[k]) !== -1) { perfTags3.push(tag); break; }\n            }\n        }\n    }\n    renderTransTags(sortTags3(actionTags3), '🎬 活动分类');\n    renderTransTags(sortTags3(bodyTags3), '🔍 身体特征');\n    renderTransTags(sortTags3(perfTags3), '💃 表演类型');\n\n    renderManualTrans(['doStrapon','doAnalToys','autoTagInteractiveToy','doDildoOrVibrator','fuckMachine','doNippleToys','doSexToys','autoTagKiiroo','autoTagLovense'], '📱 设备分类');\n    renderManualTrans(['doSmoking','subcultureCuckold','specificsPiercing','cockRating','heels','corset','doFootFetish','specificJeans','subcultureBdsm','leather','subcultureMistresses','latex','nylon','specificsTattoos','specificPregnant','specificSportGear'], '🖤 恋物癖');\n}\n\n\/\/ ============================================================\n\/\/ 执行所有频道\n\/\/ ============================================================\nbuildCouples();\nbuildMen();\nbuildTrans();\n\nJSON.stringify(sort);",
    "header": "{\"User-Agent\": \"Mozilla\/5.0 (Android)\"}",
    "lastUpdateTime": "1787711886134",
    "respondTime": 151,
    "ruleBookInfo": {
        "author": "{{$.user.user.name}}",
        "coverUrl": "https:\/\/img.doppiocdn.com\/thumbs\/{{$.user.user.snapshotTimestamp}}\/{{$.cam.streamName}}_webp",
        "name": "{{$.user.user.username}}",
        "tocUrl": "https:\/\/zh.virtualtaboo.live\/api\/front\/v2\/broadcasts\/{{$.user.user.id}}?uniq=ix9yufd20we8bscq"
    },
    "ruleContent": {},
    "ruleExplore": {
        "bookList": "$.blocks..models[*]||$.models[*]",
        "bookUrl": "https:\/\/zh.virtualtaboo.live\/api\/front\/v2\/models\/{{$.id}}\/cam?timezoneOffset=-480&triggerRequest=loadCam&primaryTag=girls&withRecentShow=1&skipTipMenu=1&uniq=ix9yufd20we8bscq",
        "coverUrl": "@js:result.snapshotTimestamp && result.streamName ? 'https:\/\/img.doppiocdn.com\/thumbs\/' + result.snapshotTimestamp + '\/' + result.streamName + '_webp' : result.snapshotUrl",
        "kind": "@js:var s={'public':'免费','groupShow':'付费'}[result.status]||'离线';var c=result.country?result.country.toUpperCase()+' ':'未知';c+' | '+(s)+(result.isLive?(' | '+(result.viewersCount||0)+'在看'):'')",
        "name": "@js:\nif (\"{{$.status}}\"==\"public\"){result=\"{{$.username}}\"}else{result=\"\"}"
    },
    "ruleSearch": {
        "author": "$.streamName",
        "bookList": "$.models[*]",
        "bookUrl": "https:\/\/zh.virtualtaboo.live\/api\/front\/v2\/models\/{{$.id}}\/cam?timezoneOffset=-480&triggerRequest=loadCam&primaryTag=girls&withRecentShow=1&skipTipMenu=1&uniq=ix9yufd20we8bscq",
        "checkKeyWord": "bao",
        "coverUrl": "@js:try{var sn=result.streamName;var ts=result.snapshotTimestamp;if(sn&&ts){'https:\/\/img.doppiocdn.live\/thumbs\/'+ts+'\/'+sn+'_webp'}else if(result.previewUrl){result.previewUrl}else if(result.previewUrlThumbBig){result.previewUrlThumbBig}else if(result.previewUrlThumbSmall){result.previewUrlThumbSmall}else if(result.avatarUrl){result.avatarUrl}else{''}}catch(e){''}",
        "intro": "$.groupShowTopic",
        "kind": "@js:var s={'public':'免费','groupShow':'付费'}[result.status]||'离线';var c=result.country?result.country.toUpperCase()+' ':'未知';c+' | '+s+' | '+(result.viewersCount||0)+'在看'",
        "name": "@js:\nif (\"{{$.status}}\"==\"public\"){result=\"{{$.username}}\"}else{result=\"\"}"
    },
    "ruleToc": {
        "chapterList": "$..item",
        "chapterName": "@js: ( ({ 'true': '在线', 'false': '离线' }[result.isLive] || result.isLive)+({ 'public': '免费', 'groupShow': '收费', 'p2p': '一对一','off':' ' }[result.status] || result.status) )",
        "chapterUrl": "@js: 'https:\/\/edge-hls.doppiocdn.live\/hls\/'+result.modelId+'\/master\/'+result.modelId+'_'+({ 'public': 'auto', 'groupShow': '160p_blurred', 'p2p': '160p_blurred','off':' ' }[result.status] || result.status)+'.m3u8?pkey=bXorqTB5ZhP5FcpX'\n\/\/卡顿就换掉上面域名"
    },
    "searchUrl": "https:\/\/zh.virtualtaboo.live\/api\/front\/v4\/models\/search\/group\/username?query={{key}}&limit=500&offset={{(page-1)*500}}&primaryTag=girls&uniq=",
    "weight": 0
}
广告