From 71e469a61ae95bbd28d481caf8456273c196cf4b Mon Sep 17 00:00:00 2001 From: ci7lus <7887955+ci7lus@users.noreply.github.com> Date: Sat, 1 Oct 2022 23:41:29 +0900 Subject: [PATCH] =?UTF-8?q?:art:=20[annict]=20arm=E3=81=AB=E3=81=AA?= =?UTF-8?q?=E3=81=84=E3=83=87=E3=83=BC=E3=82=BF=E3=81=A7=E3=82=82=E5=A4=A7?= =?UTF-8?q?=E3=81=BE=E3=81=8B=E3=81=AB=E5=BC=95=E3=81=A3=E5=BC=B5=E3=82=89?= =?UTF-8?q?=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/miraktest-annict/annictAPI.ts | 16 ++++++++++ src/miraktest-annict/constants.ts | 2 +- src/miraktest-annict/findWork.ts | 42 +++++++++++++++++++++++++ src/miraktest-annict/syobocalAPI.ts | 49 +++++++++++++++++++++++++++++ 4 files changed, 108 insertions(+), 1 deletion(-) diff --git a/src/miraktest-annict/annictAPI.ts b/src/miraktest-annict/annictAPI.ts index cb0a80e..5c187fc 100644 --- a/src/miraktest-annict/annictAPI.ts +++ b/src/miraktest-annict/annictAPI.ts @@ -1,5 +1,6 @@ import axios from "axios" import { MeProgramsGetRequestQuery } from "./annict.js/types/me/programs" +import { WorksGetRequestQuery } from "./annict.js/types/works" import { getSdk } from "./gql" import { GraphQLClient } from "./graphqlRequestLoader" @@ -15,6 +16,21 @@ export class AnnictRESTAPI { }) } + async getWorks(params: Partial) { + return this.client.get<{ + works: { + id: number + title: string + }[] + }>("works", { + params: { + ...params, + filter_title: params.filter_title?.join(","), + filter_season: params.filter_season?.join(","), + }, + }) + } + async getMyPrograms(params: MeProgramsGetRequestQuery) { return this.client.get<{ next_page: 2 diff --git a/src/miraktest-annict/constants.ts b/src/miraktest-annict/constants.ts index b98af27..6b2f84a 100644 --- a/src/miraktest-annict/constants.ts +++ b/src/miraktest-annict/constants.ts @@ -36,7 +36,7 @@ export const ANNICT_META = { id: ANNICT_PLUGIN_ID, name: "Annict", author: "ci7lus", - version: "0.3.5", + version: "0.3.6", description: "視聴中の番組をAnnictで記録する", authorUrl: "https://github.com/ci7lus", url: "https://github.com/ci7lus/miraktest-plugins/tree/master/src/miraktest-annict", diff --git a/src/miraktest-annict/findWork.ts b/src/miraktest-annict/findWork.ts index 76c02ac..4eabdd3 100644 --- a/src/miraktest-annict/findWork.ts +++ b/src/miraktest-annict/findWork.ts @@ -10,6 +10,18 @@ import { ARM } from "./types" dayjs.extend(isSameOrAfter) dayjs.extend(isSameOrBefore) +export const getAnnictSeasonByMonth = (n: number) => { + if (n <= 3) { + return "winter" + } else if (n <= 6) { + return "spring" + } else if (n <= 9) { + return "summer" + } else { + return "autumn" + } +} + export const detectProgramInfo = async ({ rest, channel, @@ -65,6 +77,36 @@ export const detectProgramInfo = async ({ number: syobocalProgram.Count, }, } + } else { + const workReq = await SyobocalAPI.TitleLookup({ + TID: syobocalProgram.TID.toString(), + }) + const syobocalWork = workReq.slice(0).shift() + if (!syobocalWork) { + return + } + const season = getAnnictSeasonByMonth(syobocalWork.FirstMonth) + for (const term of [ + syobocalWork.Title, + syobocalWork.TitleYomi, + syobocalWork.ShortTitle, + syobocalWork.TitleEN, + ].filter((s): s is string => !!s)) { + const annictWorkSearchReq = await rest.getWorks({ + filter_title: [term], + filter_season: [`${syobocalWork.FirstYear}-${season}`], + }) + const annictWork = annictWorkSearchReq.data.works.slice(0).shift() + if (annictWork) { + return { + annictId: annictWork.id, + episode: { + title: syobocalProgram.SubTitle, + number: syobocalProgram.Count, + }, + } + } + } } } else { console.warn("番組が見つかりませんでした") diff --git a/src/miraktest-annict/syobocalAPI.ts b/src/miraktest-annict/syobocalAPI.ts index 1feb8f8..e4e3d5a 100644 --- a/src/miraktest-annict/syobocalAPI.ts +++ b/src/miraktest-annict/syobocalAPI.ts @@ -44,6 +44,35 @@ type ProgLookupResponse = } } +type TitleItem = { + Title: string + ShortTitle?: string + TitleYomi?: string + TitleEN?: string + FirstYear: number + FirstMonth: number +} + +type TitleLookupResponse = + | { + TitleItems: { + TitleItem: TitleItem[] + } + Result: { + Code: 200 + Message: "" + } + } + | { + TitleItems: { + TitleItem: TitleItem[] + } + Result: { + Code: 404 + Message: "条件に一致するデータは存在しません" + } + } + export class SyobocalAPI { static async ProgLookup(params: { TID?: string @@ -72,4 +101,24 @@ export class SyobocalAPI { return [ProgLookupResponse.ProgItems.ProgItem].flat() }) } + static async TitleLookup(params: { TID?: string }) { + return client + .get("db.php", { + params: { + Command: "TitleLookup", + ...params, + }, + }) + .then((r) => { + const { + TitleLookupResponse, + }: { + TitleLookupResponse: TitleLookupResponse + } = new XMLParser().parse(r.data) + if (TitleLookupResponse.Result.Code === 404) { + return [] + } + return [TitleLookupResponse.TitleItems.TitleItem].flat() + }) + } }