mirror of
https://github.com/imputnet/cobalt.git
synced 2025-07-10 07:18:30 +00:00
feat: duitang support
This commit is contained in:
parent
14b9a590d9
commit
4b5bf5e556
@ -104,6 +104,7 @@ export default function({
|
|||||||
case "snapchat":
|
case "snapchat":
|
||||||
case "bsky":
|
case "bsky":
|
||||||
case "xiaohongshu":
|
case "xiaohongshu":
|
||||||
|
case "duitang":
|
||||||
params = { picker: r.picker };
|
params = { picker: r.picker };
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ import loom from "./services/loom.js";
|
|||||||
import facebook from "./services/facebook.js";
|
import facebook from "./services/facebook.js";
|
||||||
import bluesky from "./services/bluesky.js";
|
import bluesky from "./services/bluesky.js";
|
||||||
import xiaohongshu from "./services/xiaohongshu.js";
|
import xiaohongshu from "./services/xiaohongshu.js";
|
||||||
|
import duitang from "./services/duitang.js";
|
||||||
|
|
||||||
let freebind;
|
let freebind;
|
||||||
|
|
||||||
@ -267,6 +268,13 @@ export default async function({ host, patternMatch, params, authType }) {
|
|||||||
dispatcher,
|
dispatcher,
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "duitang":
|
||||||
|
r = await duitang({
|
||||||
|
id: patternMatch.id,
|
||||||
|
type: patternMatch.type,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return createResponse("error", {
|
return createResponse("error", {
|
||||||
|
@ -22,6 +22,10 @@ export const services = {
|
|||||||
dailymotion: {
|
dailymotion: {
|
||||||
patterns: ["video/:id"],
|
patterns: ["video/:id"],
|
||||||
},
|
},
|
||||||
|
duitang: {
|
||||||
|
patterns: [ ":type?id=:id" ],
|
||||||
|
subdomains: ["m"]
|
||||||
|
},
|
||||||
facebook: {
|
facebook: {
|
||||||
patterns: [
|
patterns: [
|
||||||
"_shortLink/:shortLink",
|
"_shortLink/:shortLink",
|
||||||
@ -213,7 +217,7 @@ export const services = {
|
|||||||
"v/:id"
|
"v/:id"
|
||||||
],
|
],
|
||||||
subdomains: ["music", "m"],
|
subdomains: ["music", "m"],
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
Object.values(services).forEach(service => {
|
Object.values(services).forEach(service => {
|
||||||
|
@ -5,6 +5,10 @@ export const testers = {
|
|||||||
|
|
||||||
"dailymotion": pattern => pattern.id?.length <= 32,
|
"dailymotion": pattern => pattern.id?.length <= 32,
|
||||||
|
|
||||||
|
"duitang": pattern =>
|
||||||
|
(pattern.type == 'blog' || pattern.type == 'atlas') &&
|
||||||
|
pattern.id?.length <= 10,
|
||||||
|
|
||||||
"instagram": pattern =>
|
"instagram": pattern =>
|
||||||
pattern.postId?.length <= 48
|
pattern.postId?.length <= 48
|
||||||
|| pattern.shareId?.length <= 16
|
|| pattern.shareId?.length <= 16
|
||||||
|
84
api/src/processing/services/duitang.js
Normal file
84
api/src/processing/services/duitang.js
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
import { genericUserAgent, env } from "../../config.js";
|
||||||
|
import { createStream } from "../../stream/manage.js"
|
||||||
|
|
||||||
|
export default async function(post) {
|
||||||
|
let filenameBase = `duitang_${post.id}`
|
||||||
|
|
||||||
|
if (post.type == 'blog') {
|
||||||
|
let req = await fetch(`https://www.duitang.com/napi/blog/detail/?blog_id=${post.id}`, {
|
||||||
|
headers: {
|
||||||
|
'User-Agent': genericUserAgent,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(request => request.text())
|
||||||
|
.catch(() => {});
|
||||||
|
|
||||||
|
if (!req) return { error: 'fetch.fail' };
|
||||||
|
|
||||||
|
let json;
|
||||||
|
try {
|
||||||
|
json = JSON.parse(req);
|
||||||
|
} catch { return { error: 'fetch.empty' }; }
|
||||||
|
|
||||||
|
let originalUrl = json.data.photo.path.toString();
|
||||||
|
const image = {
|
||||||
|
// always proxy here because of headers
|
||||||
|
type: "photo",
|
||||||
|
url: createStream({
|
||||||
|
service: "duitang",
|
||||||
|
type: "proxy",
|
||||||
|
url: originalUrl,
|
||||||
|
filename: `${filenameBase}_photo.jpg`,
|
||||||
|
headers: {
|
||||||
|
'Host': 'c-ssl.dtstatic.com',
|
||||||
|
'Referer': 'https://duitang.com'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
picker: [image]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (post.type == 'atlas') {
|
||||||
|
let req = await fetch(`https://www.duitang.com/napi/vienna/atlas/detail/?atlas_id=${post.id}`, {
|
||||||
|
headers: {
|
||||||
|
'User-Agent': genericUserAgent,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(request => request.text())
|
||||||
|
.catch(() => {});
|
||||||
|
|
||||||
|
if (!req) return { error: 'fetch.fail' };
|
||||||
|
|
||||||
|
let json;
|
||||||
|
try {
|
||||||
|
json = JSON.parse(req);
|
||||||
|
} catch { return { error: 'fetch.empty' }; }
|
||||||
|
|
||||||
|
let imageLinks = json.data.blogs
|
||||||
|
.map(blog => blog.photo?.path)
|
||||||
|
.map((url, i) => {
|
||||||
|
// always proxy here because of headers
|
||||||
|
url = createStream({
|
||||||
|
service: "duitang",
|
||||||
|
type: "proxy",
|
||||||
|
url: url,
|
||||||
|
filename: `${filenameBase}_photo_${i + 1}.jpg`,
|
||||||
|
headers: {
|
||||||
|
'Host': 'c-ssl.dtstatic.com',
|
||||||
|
'Referer': 'https://duitang.com'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
type: "photo",
|
||||||
|
url
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
picker: imageLinks
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -134,6 +134,11 @@ function cleanURL(url) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (host) {
|
switch (host) {
|
||||||
|
case "duitang":
|
||||||
|
if (url.searchParams.get('id')) {
|
||||||
|
limitQuery('id');
|
||||||
|
}
|
||||||
|
break;
|
||||||
case "pinterest":
|
case "pinterest":
|
||||||
url.hostname = 'pinterest.com';
|
url.hostname = 'pinterest.com';
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user