File size: 2,893 Bytes
11fcc5a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import { genericUserAgent } from "../../config.js";

const getVideo = async ({ id, quality }) => {
    const json = await fetch(`https://www.newgrounds.com/portal/video/${id}`, {
        headers: {
            "User-Agent": genericUserAgent,
            "X-Requested-With": "XMLHttpRequest", // required to get the JSON response
        }
    })
    .then(r => r.json())
    .catch(() => {});

    if (!json) return { error: "fetch.empty" };

    const videoSources = json.sources;
    const videoQualities = Object.keys(videoSources);

    if (videoQualities.length === 0) {
        return { error: "fetch.empty" };
    }

    const bestVideo = videoSources[videoQualities[0]]?.[0],
          userQuality = quality === "2160" ? "4k" : `${quality}p`,
          preferredVideo = videoSources[userQuality]?.[0],
          video = preferredVideo || bestVideo,
          videoQuality = preferredVideo ? userQuality : videoQualities[0];

    if (!bestVideo || !video.type.includes("mp4")) {
        return { error: "fetch.empty" };
    }

    const fileMetadata = {
        title: decodeURIComponent(json.title),
        artist: decodeURIComponent(json.author),
    }

    return {
        urls: video.src,
        filenameAttributes: {
            service: "newgrounds",
            id,
            title: fileMetadata.title,
            author: fileMetadata.artist,
            extension: "mp4",
            qualityLabel: videoQuality,
            resolution: videoQuality,
        },
        fileMetadata,
    }
}

const getMusic = async ({ id }) => {
    const html = await fetch(`https://www.newgrounds.com/audio/listen/${id}`, {
        headers: {
            "User-Agent": genericUserAgent,
        }
    })
    .then(r => r.text())
    .catch(() => {});

    if (!html) return { error: "fetch.fail" };

    const params = JSON.parse(
        `{${html.split(',"params":{')[1]?.split(',"images":')[0]}}`
    );
    if (!params) return { error: "fetch.empty" };

    if (!params.name || !params.artist || !params.filename || !params.icon) {
        return { error: "fetch.empty" };
    }

    const fileMetadata = {
        title: decodeURIComponent(params.name),
        artist: decodeURIComponent(params.artist),
    }

    return {
        urls: params.filename,
        filenameAttributes: {
            service: "newgrounds",
            id,
            title: fileMetadata.title,
            author: fileMetadata.artist,
        },
        fileMetadata,
        cover:
            params.icon.includes(".png?") || params.icon.includes(".jpg?")
                ? params.icon
                : undefined,
        isAudioOnly: true,
        bestAudio: "mp3",
    }
}

export default function({ id, audioId, quality }) {
    if (id) {
        return getVideo({ id, quality });
    } else if (audioId) {
        return getMusic({ id: audioId });
    }

    return { error: "fetch.empty" };
}