aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorwabilin <[email protected]>2020-07-31 20:15:19 +0900
committerwabilin <[email protected]>2020-07-31 20:15:19 +0900
commitdf2b1e4012dc50b56141bf9012d8e367a3d08fdf (patch)
treef1876fbd2ecceaeef2e6757818987c0474bca46e /src
parentadd jsdom (diff)
downloadholo-schedule-df2b1e4012dc50b56141bf9012d8e367a3d08fdf.tar.xz
holo-schedule-df2b1e4012dc50b56141bf9012d8e367a3d08fdf.zip
get datas without date
Diffstat (limited to 'src')
-rw-r--r--src/example.ts12
-rw-r--r--src/getScheduleHtml.ts37
-rw-r--r--src/parseScheduleHtml.ts37
-rw-r--r--src/util.ts11
4 files changed, 97 insertions, 0 deletions
diff --git a/src/example.ts b/src/example.ts
new file mode 100644
index 0000000..394b220
--- /dev/null
+++ b/src/example.ts
@@ -0,0 +1,12 @@
+import getScheduleHtml from './getScheduleHtml'
+import parse from './parseScheduleHtml'
+
+async function main() {
+ const html = await getScheduleHtml();
+ const parsed = parse(html)
+
+ // console.log(html.split('\n'))
+ console.log(parsed)
+}
+
+main().catch(e => { console.error(e) })
diff --git a/src/getScheduleHtml.ts b/src/getScheduleHtml.ts
new file mode 100644
index 0000000..66df92e
--- /dev/null
+++ b/src/getScheduleHtml.ts
@@ -0,0 +1,37 @@
+import https from 'https'
+
+
+const OPTIONS = {
+ hostname: 'schedule.hololive.tv',
+ port: 443,
+ path: '/',
+ method: 'GET',
+ headers: {
+ Cookie: 'timezone=Asia/Tokyo'
+ }
+}
+
+function getScheduleHtml(): Promise<string> {
+ const chunks: Uint8Array[] = [];
+
+ return new Promise((resolve, reject) => {
+ const req = https.request(OPTIONS, res => {
+ res.on('data', chunk => {
+ chunks.push(chunk)
+ })
+
+ res.on('end', () => {
+ const html = Buffer.concat(chunks).toString('utf-8')
+ resolve(html)
+ })
+ })
+
+ req.on('error', error => {
+ reject(error)
+ })
+
+ req.end()
+ })
+}
+
+export default getScheduleHtml
diff --git a/src/parseScheduleHtml.ts b/src/parseScheduleHtml.ts
new file mode 100644
index 0000000..8177eee
--- /dev/null
+++ b/src/parseScheduleHtml.ts
@@ -0,0 +1,37 @@
+import { JSDOM } from "jsdom";
+import { mapNodeList } from "./util";
+
+function selectTrimTextContent(ele: Element, selector: string): string {
+ return ele.querySelector(selector)?.textContent?.replace(/\s+/g, "") || "";
+}
+
+function dataFromAThumbnail(thumb: Element) {
+ const time = selectTrimTextContent(thumb, ".datetime")
+ const name = selectTrimTextContent(thumb, ".name")
+
+ const images = mapNodeList(
+ thumb.querySelectorAll("img"),
+ (img) => img.src
+ )
+ .filter((src) => src.startsWith("https://yt3.ggpht.com"));
+
+ return {
+ time,
+ name,
+ images,
+ };
+}
+
+function parseScheduleHtml(html: string | Buffer) {
+ const { window } = new JSDOM(html);
+ const { document } = window;
+
+ const allThumbnail = document.querySelectorAll("a.thumbnail");
+ const data = mapNodeList(allThumbnail, dataFromAThumbnail);
+
+ console.log(data);
+
+ return "";
+}
+
+export default parseScheduleHtml;
diff --git a/src/util.ts b/src/util.ts
new file mode 100644
index 0000000..fbe87bb
--- /dev/null
+++ b/src/util.ts
@@ -0,0 +1,11 @@
+export function mapNodeList<E extends Element, T>(
+ list: NodeListOf<E>,
+ mapper: (ele: E) => T
+): T[] {
+ const ary: T[] = [];
+ list.forEach((node) => {
+ ary.push(mapper(node));
+ });
+
+ return ary;
+}