@opentabs-dev/opentabs-plugin-netflix 0.0.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +159 -0
- package/dist/adapter.iife.js +15328 -0
- package/dist/adapter.iife.js.map +7 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/netflix-api.d.ts +13 -0
- package/dist/netflix-api.d.ts.map +1 -0
- package/dist/netflix-api.js +59 -0
- package/dist/netflix-api.js.map +1 -0
- package/dist/tools/add-to-my-list.d.ts +7 -0
- package/dist/tools/add-to-my-list.d.ts.map +1 -0
- package/dist/tools/add-to-my-list.js +26 -0
- package/dist/tools/add-to-my-list.js.map +1 -0
- package/dist/tools/get-current-user.d.ts +15 -0
- package/dist/tools/get-current-user.d.ts.map +1 -0
- package/dist/tools/get-current-user.js +22 -0
- package/dist/tools/get-current-user.js.map +1 -0
- package/dist/tools/get-notifications.d.ts +12 -0
- package/dist/tools/get-notifications.d.ts.map +1 -0
- package/dist/tools/get-notifications.js +33 -0
- package/dist/tools/get-notifications.js.map +1 -0
- package/dist/tools/get-seasons.d.ts +23 -0
- package/dist/tools/get-seasons.d.ts.map +1 -0
- package/dist/tools/get-seasons.js +96 -0
- package/dist/tools/get-seasons.js.map +1 -0
- package/dist/tools/get-title-details.d.ts +27 -0
- package/dist/tools/get-title-details.d.ts.map +1 -0
- package/dist/tools/get-title-details.js +91 -0
- package/dist/tools/get-title-details.js.map +1 -0
- package/dist/tools/get-title.d.ts +22 -0
- package/dist/tools/get-title.d.ts.map +1 -0
- package/dist/tools/get-title.js +40 -0
- package/dist/tools/get-title.js.map +1 -0
- package/dist/tools/get-watch-history.d.ts +15 -0
- package/dist/tools/get-watch-history.d.ts.map +1 -0
- package/dist/tools/get-watch-history.js +57 -0
- package/dist/tools/get-watch-history.js.map +1 -0
- package/dist/tools/list-continue-watching.d.ts +22 -0
- package/dist/tools/list-continue-watching.d.ts.map +1 -0
- package/dist/tools/list-continue-watching.js +52 -0
- package/dist/tools/list-continue-watching.js.map +1 -0
- package/dist/tools/list-genre-titles.d.ts +23 -0
- package/dist/tools/list-genre-titles.d.ts.map +1 -0
- package/dist/tools/list-genre-titles.js +52 -0
- package/dist/tools/list-genre-titles.js.map +1 -0
- package/dist/tools/list-my-list.d.ts +22 -0
- package/dist/tools/list-my-list.d.ts.map +1 -0
- package/dist/tools/list-my-list.js +55 -0
- package/dist/tools/list-my-list.js.map +1 -0
- package/dist/tools/list-profiles.d.ts +11 -0
- package/dist/tools/list-profiles.d.ts.map +1 -0
- package/dist/tools/list-profiles.js +67 -0
- package/dist/tools/list-profiles.js.map +1 -0
- package/dist/tools/list-top-10.d.ts +27 -0
- package/dist/tools/list-top-10.d.ts.map +1 -0
- package/dist/tools/list-top-10.js +65 -0
- package/dist/tools/list-top-10.js.map +1 -0
- package/dist/tools/list-trending.d.ts +22 -0
- package/dist/tools/list-trending.d.ts.map +1 -0
- package/dist/tools/list-trending.js +51 -0
- package/dist/tools/list-trending.js.map +1 -0
- package/dist/tools/navigate-to-genre.d.ts +8 -0
- package/dist/tools/navigate-to-genre.d.ts.map +1 -0
- package/dist/tools/navigate-to-genre.js +23 -0
- package/dist/tools/navigate-to-genre.js.map +1 -0
- package/dist/tools/navigate-to-title.d.ts +8 -0
- package/dist/tools/navigate-to-title.d.ts.map +1 -0
- package/dist/tools/navigate-to-title.js +23 -0
- package/dist/tools/navigate-to-title.js.map +1 -0
- package/dist/tools/play-title.d.ts +8 -0
- package/dist/tools/play-title.d.ts.map +1 -0
- package/dist/tools/play-title.js +23 -0
- package/dist/tools/play-title.js.map +1 -0
- package/dist/tools/rate-title.d.ts +13 -0
- package/dist/tools/rate-title.d.ts.map +1 -0
- package/dist/tools/rate-title.js +36 -0
- package/dist/tools/rate-title.js.map +1 -0
- package/dist/tools/remove-from-my-list.d.ts +7 -0
- package/dist/tools/remove-from-my-list.d.ts.map +1 -0
- package/dist/tools/remove-from-my-list.js +26 -0
- package/dist/tools/remove-from-my-list.js.map +1 -0
- package/dist/tools/schemas.d.ts +185 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +163 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools/search-titles.d.ts +29 -0
- package/dist/tools/search-titles.d.ts.map +1 -0
- package/dist/tools/search-titles.js +75 -0
- package/dist/tools/search-titles.js.map +1 -0
- package/dist/tools.json +1648 -0
- package/package.json +54 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import type { ToolDefinition } from '@opentabs-dev/plugin-sdk';
|
|
3
|
+
declare class NetflixPlugin extends OpenTabsPlugin {
|
|
4
|
+
readonly name = "netflix";
|
|
5
|
+
readonly description = "OpenTabs plugin for Netflix";
|
|
6
|
+
readonly displayName = "Netflix";
|
|
7
|
+
readonly urlPatterns: string[];
|
|
8
|
+
readonly homepage = "https://www.netflix.com/browse";
|
|
9
|
+
readonly tools: ToolDefinition[];
|
|
10
|
+
isReady(): Promise<boolean>;
|
|
11
|
+
}
|
|
12
|
+
declare const _default: NetflixPlugin;
|
|
13
|
+
export default _default;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAsB/D,cAAM,aAAc,SAAQ,cAAc;IACxC,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,iCAAiC;IACrD,SAAkB,WAAW,aAAa;IAC1C,QAAQ,CAAC,WAAW,WAA2B;IAC/C,SAAkB,QAAQ,oCAAoC;IAC9D,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CAoB9B;IAEI,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAIlC;;AAED,wBAAmC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { isAuthenticated, waitForNetflixAuth } from './netflix-api.js';
|
|
3
|
+
import { addToMyList } from './tools/add-to-my-list.js';
|
|
4
|
+
import { getCurrentUser } from './tools/get-current-user.js';
|
|
5
|
+
import { getNotifications } from './tools/get-notifications.js';
|
|
6
|
+
import { getSeasons } from './tools/get-seasons.js';
|
|
7
|
+
import { getTitleDetails } from './tools/get-title-details.js';
|
|
8
|
+
import { getTitle } from './tools/get-title.js';
|
|
9
|
+
import { getWatchHistory } from './tools/get-watch-history.js';
|
|
10
|
+
import { listContinueWatching } from './tools/list-continue-watching.js';
|
|
11
|
+
import { listGenreTitles } from './tools/list-genre-titles.js';
|
|
12
|
+
import { listMyList } from './tools/list-my-list.js';
|
|
13
|
+
import { listProfiles } from './tools/list-profiles.js';
|
|
14
|
+
import { listTop10 } from './tools/list-top-10.js';
|
|
15
|
+
import { listTrending } from './tools/list-trending.js';
|
|
16
|
+
import { navigateToGenre } from './tools/navigate-to-genre.js';
|
|
17
|
+
import { navigateToTitle } from './tools/navigate-to-title.js';
|
|
18
|
+
import { playTitle } from './tools/play-title.js';
|
|
19
|
+
import { rateTitle } from './tools/rate-title.js';
|
|
20
|
+
import { removeFromMyList } from './tools/remove-from-my-list.js';
|
|
21
|
+
import { searchTitles } from './tools/search-titles.js';
|
|
22
|
+
class NetflixPlugin extends OpenTabsPlugin {
|
|
23
|
+
name = 'netflix';
|
|
24
|
+
description = 'OpenTabs plugin for Netflix';
|
|
25
|
+
displayName = 'Netflix';
|
|
26
|
+
urlPatterns = ['*://*.netflix.com/*'];
|
|
27
|
+
homepage = 'https://www.netflix.com/browse';
|
|
28
|
+
tools = [
|
|
29
|
+
getCurrentUser,
|
|
30
|
+
searchTitles,
|
|
31
|
+
getTitle,
|
|
32
|
+
getTitleDetails,
|
|
33
|
+
getSeasons,
|
|
34
|
+
listMyList,
|
|
35
|
+
addToMyList,
|
|
36
|
+
removeFromMyList,
|
|
37
|
+
listContinueWatching,
|
|
38
|
+
getWatchHistory,
|
|
39
|
+
listTrending,
|
|
40
|
+
listTop10,
|
|
41
|
+
listGenreTitles,
|
|
42
|
+
rateTitle,
|
|
43
|
+
listProfiles,
|
|
44
|
+
getNotifications,
|
|
45
|
+
navigateToTitle,
|
|
46
|
+
navigateToGenre,
|
|
47
|
+
playTitle,
|
|
48
|
+
];
|
|
49
|
+
async isReady() {
|
|
50
|
+
if (isAuthenticated())
|
|
51
|
+
return true;
|
|
52
|
+
return waitForNetflixAuth();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export default new NetflixPlugin();
|
|
56
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,aAAc,SAAQ,cAAc;IAC/B,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAAG,6BAA6B,CAAC;IACnC,WAAW,GAAG,SAAS,CAAC;IACjC,WAAW,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC7B,QAAQ,GAAG,gCAAgC,CAAC;IACrD,KAAK,GAAqB;QACjC,cAAc;QACd,YAAY;QACZ,QAAQ;QACR,eAAe;QACf,UAAU;QACV,UAAU;QACV,WAAW;QACX,gBAAgB;QAChB,oBAAoB;QACpB,eAAe;QACf,YAAY;QACZ,SAAS;QACT,eAAe;QACf,SAAS;QACT,YAAY;QACZ,gBAAgB;QAChB,eAAe;QACf,eAAe;QACf,SAAS;KACV,CAAC;IAEF,KAAK,CAAC,OAAO;QACX,IAAI,eAAe,EAAE;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,kBAAkB,EAAE,CAAC;IAC9B,CAAC;CACF;AAED,eAAe,IAAI,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const isAuthenticated: () => boolean;
|
|
2
|
+
export declare const waitForNetflixAuth: () => Promise<boolean>;
|
|
3
|
+
/**
|
|
4
|
+
* Read a title (Movie or Show) from the Apollo Client cache by video ID.
|
|
5
|
+
* The Apollo cache stores titles with keys like `Movie:{"videoId":12345}`
|
|
6
|
+
* or `Show:{"videoId":12345}`. Returns null if not cached.
|
|
7
|
+
*/
|
|
8
|
+
export declare const readApolloTitle: (videoId: number) => Record<string, unknown> | null;
|
|
9
|
+
/**
|
|
10
|
+
* Get the authenticated user's profile info from page globals.
|
|
11
|
+
*/
|
|
12
|
+
export declare const getUserInfo: () => Record<string, unknown> | null;
|
|
13
|
+
//# sourceMappingURL=netflix-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"netflix-api.d.ts","sourceRoot":"","sources":["../src/netflix-api.ts"],"names":[],"mappings":"AA0CA,eAAO,MAAM,eAAe,QAAO,OAA6B,CAAC;AAEjE,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC,OAAO,CAO1D,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAS3E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,QAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAExD,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { getAuthCache, getPageGlobal, setAuthCache, waitUntil } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Extract auth from `window.netflix.reactContext.models.memberContext.data.userInfo`.
|
|
4
|
+
* Netflix uses HttpOnly session cookies for API requests. The authURL token from
|
|
5
|
+
* the page global is used by the SPA's Falcor pathEvaluator model internally.
|
|
6
|
+
*/
|
|
7
|
+
const getAuth = () => {
|
|
8
|
+
const cached = getAuthCache('netflix');
|
|
9
|
+
if (cached?.authURL && cached?.guid)
|
|
10
|
+
return cached;
|
|
11
|
+
const userInfo = getPageGlobal('netflix.reactContext.models.memberContext.data.userInfo');
|
|
12
|
+
if (!userInfo)
|
|
13
|
+
return null;
|
|
14
|
+
const authURL = userInfo.authURL;
|
|
15
|
+
const guid = (userInfo.guid ?? userInfo.userGuid);
|
|
16
|
+
if (!authURL || !guid)
|
|
17
|
+
return null;
|
|
18
|
+
const membershipStatus = userInfo.membershipStatus ?? '';
|
|
19
|
+
if (membershipStatus !== 'CURRENT_MEMBER')
|
|
20
|
+
return null;
|
|
21
|
+
const auth = {
|
|
22
|
+
authURL,
|
|
23
|
+
guid,
|
|
24
|
+
name: userInfo.name ?? '',
|
|
25
|
+
membershipStatus,
|
|
26
|
+
};
|
|
27
|
+
setAuthCache('netflix', auth);
|
|
28
|
+
return auth;
|
|
29
|
+
};
|
|
30
|
+
export const isAuthenticated = () => getAuth() !== null;
|
|
31
|
+
export const waitForNetflixAuth = async () => {
|
|
32
|
+
try {
|
|
33
|
+
await waitUntil(() => isAuthenticated(), { interval: 500, timeout: 5000 });
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
// --- Apollo Cache Reader ---
|
|
41
|
+
/**
|
|
42
|
+
* Read a title (Movie or Show) from the Apollo Client cache by video ID.
|
|
43
|
+
* The Apollo cache stores titles with keys like `Movie:{"videoId":12345}`
|
|
44
|
+
* or `Show:{"videoId":12345}`. Returns null if not cached.
|
|
45
|
+
*/
|
|
46
|
+
export const readApolloTitle = (videoId) => {
|
|
47
|
+
const client = getPageGlobal('netflix.appContext.state.graphqlClient');
|
|
48
|
+
if (!client?.cache)
|
|
49
|
+
return null;
|
|
50
|
+
const cache = client.cache.extract();
|
|
51
|
+
return cache[`Movie:{"videoId":${videoId}}`] ?? cache[`Show:{"videoId":${videoId}}`] ?? null;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Get the authenticated user's profile info from page globals.
|
|
55
|
+
*/
|
|
56
|
+
export const getUserInfo = () => {
|
|
57
|
+
return getPageGlobal('netflix.reactContext.models.memberContext.data.userInfo') ?? null;
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=netflix-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"netflix-api.js","sourceRoot":"","sources":["../src/netflix-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAWhG;;;;GAIG;AACH,MAAM,OAAO,GAAG,GAAuB,EAAE;IACvC,MAAM,MAAM,GAAG,YAAY,CAAc,SAAS,CAAC,CAAC;IACpD,IAAI,MAAM,EAAE,OAAO,IAAI,MAAM,EAAE,IAAI;QAAE,OAAO,MAAM,CAAC;IAEnD,MAAM,QAAQ,GAAG,aAAa,CAAC,yDAAyD,CAE3E,CAAC;IACd,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAA6B,CAAC;IACvD,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAuB,CAAC;IACxE,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,gBAAgB,GAAI,QAAQ,CAAC,gBAAuC,IAAI,EAAE,CAAC;IACjF,IAAI,gBAAgB,KAAK,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAEvD,MAAM,IAAI,GAAgB;QACxB,OAAO;QACP,IAAI;QACJ,IAAI,EAAG,QAAQ,CAAC,IAA2B,IAAI,EAAE;QACjD,gBAAgB;KACjB,CAAC;IACF,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAY,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC;AAEjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,IAAsB,EAAE;IAC7D,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,8BAA8B;AAE9B;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAe,EAAkC,EAAE;IACjF,MAAM,MAAM,GAAG,aAAa,CAAC,wCAAwC,CAE7D,CAAC;IAET,IAAI,CAAC,MAAM,EAAE,KAAK;QAAE,OAAO,IAAI,CAAC;IAEhC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,oBAAoB,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,mBAAmB,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC;AAC/F,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAmC,EAAE;IAC9D,OAAQ,aAAa,CAAC,yDAAyD,CAA6B,IAAI,IAAI,CAAC;AACvH,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const addToMyList: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
video_id: z.ZodNumber;
|
|
4
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
5
|
+
success: z.ZodBoolean;
|
|
6
|
+
}, z.core.$strip>>;
|
|
7
|
+
//# sourceMappingURL=add-to-my-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-to-my-list.d.ts","sourceRoot":"","sources":["../../src/tools/add-to-my-list.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,WAAW;;;;kBA2BtB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ToolError, getPageGlobal } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
export const addToMyList = defineTool({
|
|
5
|
+
name: 'add_to_my_list',
|
|
6
|
+
displayName: 'Add to My List',
|
|
7
|
+
description: 'Add a movie or TV show to the current Netflix profile\'s "My List". Use search_titles or get_title to find the video ID first.',
|
|
8
|
+
summary: 'Save a title to My List',
|
|
9
|
+
icon: 'bookmark-plus',
|
|
10
|
+
group: 'Library',
|
|
11
|
+
input: z.object({
|
|
12
|
+
video_id: z.number().int().describe('Netflix video ID to add'),
|
|
13
|
+
}),
|
|
14
|
+
output: z.object({
|
|
15
|
+
success: z.boolean().describe('Whether the operation succeeded'),
|
|
16
|
+
}),
|
|
17
|
+
handle: async (params) => {
|
|
18
|
+
const pe = getPageGlobal('netflix.appContext.state.pathEvaluator');
|
|
19
|
+
if (!pe?.call) {
|
|
20
|
+
throw ToolError.internal('Netflix pathEvaluator not available on page.');
|
|
21
|
+
}
|
|
22
|
+
await pe.call.bind(pe)(['lolomos', 'addToList'], [params.video_id], []);
|
|
23
|
+
return { success: true };
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=add-to-my-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-to-my-list.js","sourceRoot":"","sources":["../../src/tools/add-to-my-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;IACpC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EACT,gIAAgI;IAClI,OAAO,EAAE,yBAAyB;IAClC,IAAI,EAAE,eAAe;IACrB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KAC/D,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;KACjE,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,EAAE,GAAG,aAAa,CAAC,wCAAwC,CAEzD,CAAC;QAET,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;YACd,MAAM,SAAS,CAAC,QAAQ,CAAC,8CAA8C,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QAExE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getCurrentUser: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
|
|
3
|
+
user: z.ZodObject<{
|
|
4
|
+
guid: z.ZodString;
|
|
5
|
+
name: z.ZodString;
|
|
6
|
+
email: z.ZodString;
|
|
7
|
+
member_since: z.ZodString;
|
|
8
|
+
membership_status: z.ZodString;
|
|
9
|
+
country: z.ZodString;
|
|
10
|
+
num_profiles: z.ZodNumber;
|
|
11
|
+
maturity_level: z.ZodNumber;
|
|
12
|
+
can_playback: z.ZodBoolean;
|
|
13
|
+
}, z.core.$strip>;
|
|
14
|
+
}, z.core.$strip>>;
|
|
15
|
+
//# sourceMappingURL=get-current-user.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-current-user.d.ts","sourceRoot":"","sources":["../../src/tools/get-current-user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,cAAc;;;;;;;;;;;;kBAiBzB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getUserInfo } from '../netflix-api.js';
|
|
4
|
+
import { mapUserInfo, userInfoSchema } from './schemas.js';
|
|
5
|
+
export const getCurrentUser = defineTool({
|
|
6
|
+
name: 'get_current_user',
|
|
7
|
+
displayName: 'Get Current User',
|
|
8
|
+
description: 'Get the currently logged-in Netflix user profile information including account name, membership status, country, maturity level, and playback permissions.',
|
|
9
|
+
summary: 'Get current Netflix user info',
|
|
10
|
+
icon: 'user',
|
|
11
|
+
group: 'Account',
|
|
12
|
+
input: z.object({}),
|
|
13
|
+
output: z.object({ user: userInfoSchema }),
|
|
14
|
+
handle: async () => {
|
|
15
|
+
const data = getUserInfo();
|
|
16
|
+
if (!data) {
|
|
17
|
+
return { user: mapUserInfo({}) };
|
|
18
|
+
}
|
|
19
|
+
return { user: mapUserInfo(data) };
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=get-current-user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-current-user.js","sourceRoot":"","sources":["../../src/tools/get-current-user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAoB,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE7E,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACvC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,kBAAkB;IAC/B,WAAW,EACT,4JAA4J;IAC9J,OAAO,EAAE,+BAA+B;IACxC,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IAC1C,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;QACnC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,IAAmB,CAAC,EAAE,CAAC;IACpD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getNotifications: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
|
|
3
|
+
notifications: z.ZodArray<z.ZodObject<{
|
|
4
|
+
type: z.ZodString;
|
|
5
|
+
title: z.ZodString;
|
|
6
|
+
message: z.ZodString;
|
|
7
|
+
image_url: z.ZodString;
|
|
8
|
+
video_id: z.ZodNumber;
|
|
9
|
+
}, z.core.$strip>>;
|
|
10
|
+
unread_count: z.ZodNumber;
|
|
11
|
+
}, z.core.$strip>>;
|
|
12
|
+
//# sourceMappingURL=get-notifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-notifications.d.ts","sourceRoot":"","sources":["../../src/tools/get-notifications.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,eAAO,MAAM,gBAAgB;;;;;;;;;kBA+B3B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { getPageGlobal } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
const notificationSchema = z.object({
|
|
5
|
+
type: z.string().describe('Notification type'),
|
|
6
|
+
title: z.string().describe('Notification title text'),
|
|
7
|
+
message: z.string().describe('Notification message body'),
|
|
8
|
+
image_url: z.string().describe('Notification image URL'),
|
|
9
|
+
video_id: z.number().int().describe('Related video ID (0 if none)'),
|
|
10
|
+
});
|
|
11
|
+
export const getNotifications = defineTool({
|
|
12
|
+
name: 'get_notifications',
|
|
13
|
+
displayName: 'Get Notifications',
|
|
14
|
+
description: 'Get the Netflix notification list for the current profile. Returns new release notifications, recommendations, and other alerts. Also returns the unread count.',
|
|
15
|
+
summary: 'Get Netflix notifications',
|
|
16
|
+
icon: 'bell',
|
|
17
|
+
group: 'Account',
|
|
18
|
+
input: z.object({}),
|
|
19
|
+
output: z.object({
|
|
20
|
+
notifications: z.array(notificationSchema).describe('Notification entries'),
|
|
21
|
+
unread_count: z.number().int().describe('Number of unread notifications'),
|
|
22
|
+
}),
|
|
23
|
+
handle: async () => {
|
|
24
|
+
// Read unread count from the Falcor cache via page global
|
|
25
|
+
const unreadCount = getPageGlobal('netflix.falcorCache.notifications.unreadCount') ?? 0;
|
|
26
|
+
const count = typeof unreadCount === 'object' ? (unreadCount.value ?? 0) : unreadCount;
|
|
27
|
+
// Falcor cache notification data requires complex reference resolution,
|
|
28
|
+
// so we return an empty list and the unread count only
|
|
29
|
+
const notifications = [];
|
|
30
|
+
return { notifications, unread_count: count };
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=get-notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-notifications.js","sourceRoot":"","sources":["../../src/tools/get-notifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IAC9C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACrD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACzD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IACxD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;CACpE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;IACzC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,mBAAmB;IAChC,WAAW,EACT,iKAAiK;IACnK,OAAO,EAAE,2BAA2B;IACpC,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC3E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KAC1E,CAAC;IACF,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,0DAA0D;QAC1D,MAAM,WAAW,GACd,aAAa,CAAC,+CAA+C,CAA6C,IAAI,CAAC,CAAC;QACnH,MAAM,KAAK,GAAG,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QAEvF,wEAAwE;QACxE,uDAAuD;QACvD,MAAM,aAAa,GAMd,EAAE,CAAC;QAER,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getSeasons: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
video_id: z.ZodNumber;
|
|
4
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
5
|
+
seasons: z.ZodArray<z.ZodObject<{
|
|
6
|
+
video_id: z.ZodNumber;
|
|
7
|
+
season_number: z.ZodNumber;
|
|
8
|
+
title: z.ZodString;
|
|
9
|
+
episode_count: z.ZodNumber;
|
|
10
|
+
episodes: z.ZodArray<z.ZodObject<{
|
|
11
|
+
video_id: z.ZodNumber;
|
|
12
|
+
title: z.ZodString;
|
|
13
|
+
episode_number: z.ZodNumber;
|
|
14
|
+
season_number: z.ZodNumber;
|
|
15
|
+
synopsis: z.ZodString;
|
|
16
|
+
runtime_minutes: z.ZodNumber;
|
|
17
|
+
watch_status: z.ZodString;
|
|
18
|
+
bookmark_position_seconds: z.ZodNumber;
|
|
19
|
+
image_url: z.ZodString;
|
|
20
|
+
}, z.core.$strip>>;
|
|
21
|
+
}, z.core.$strip>>;
|
|
22
|
+
}, z.core.$strip>>;
|
|
23
|
+
//# sourceMappingURL=get-seasons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-seasons.d.ts","sourceRoot":"","sources":["../../src/tools/get-seasons.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;kBAiHrB,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { ToolError, getPageGlobal } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { episodeSchema, mapEpisode, mapSeason, seasonSchema } from './schemas.js';
|
|
5
|
+
export const getSeasons = defineTool({
|
|
6
|
+
name: 'get_seasons',
|
|
7
|
+
displayName: 'Get Seasons',
|
|
8
|
+
description: 'Get the season and episode list for a Netflix TV show. Returns all seasons with their episodes, including episode titles, runtimes, and watch progress. Only works for TV shows (not movies).',
|
|
9
|
+
summary: 'Get seasons and episodes for a show',
|
|
10
|
+
icon: 'list-video',
|
|
11
|
+
group: 'Browse',
|
|
12
|
+
input: z.object({
|
|
13
|
+
video_id: z.number().int().describe('Netflix video ID of the TV show'),
|
|
14
|
+
}),
|
|
15
|
+
output: z.object({
|
|
16
|
+
seasons: z.array(seasonSchema.extend({
|
|
17
|
+
episodes: z.array(episodeSchema).describe('Episodes in this season'),
|
|
18
|
+
})),
|
|
19
|
+
}),
|
|
20
|
+
handle: async (params) => {
|
|
21
|
+
const pe = getPageGlobal('netflix.appContext.state.pathEvaluator');
|
|
22
|
+
if (!pe?.get) {
|
|
23
|
+
throw ToolError.internal('Netflix pathEvaluator not available on page.');
|
|
24
|
+
}
|
|
25
|
+
// First get the season list for this show
|
|
26
|
+
const seasonPaths = [
|
|
27
|
+
['videos', params.video_id, 'seasonList', { from: 0, to: 19 }, 'summary'],
|
|
28
|
+
['videos', params.video_id, 'seasonList', 'summary'],
|
|
29
|
+
];
|
|
30
|
+
const seasonResult = (await pe.get.bind(pe)(...seasonPaths));
|
|
31
|
+
const seasonData = seasonResult?.json ?? {};
|
|
32
|
+
const videoData = seasonData?.videos?.[String(params.video_id)];
|
|
33
|
+
const seasonListData = videoData?.seasonList;
|
|
34
|
+
if (!seasonListData) {
|
|
35
|
+
return { seasons: [] };
|
|
36
|
+
}
|
|
37
|
+
// Collect season IDs
|
|
38
|
+
const seasonIds = [];
|
|
39
|
+
for (const [key, entry] of Object.entries(seasonListData)) {
|
|
40
|
+
if (key === 'summary' || key === '$__path' || key === 'length')
|
|
41
|
+
continue;
|
|
42
|
+
const seasonEntry = entry;
|
|
43
|
+
const summary = seasonEntry?.summary;
|
|
44
|
+
const id = summary?.id;
|
|
45
|
+
if (id)
|
|
46
|
+
seasonIds.push(id);
|
|
47
|
+
}
|
|
48
|
+
if (seasonIds.length === 0) {
|
|
49
|
+
return { seasons: [] };
|
|
50
|
+
}
|
|
51
|
+
// Fetch episodes for each season
|
|
52
|
+
const episodePaths = seasonIds.flatMap(seasonId => [
|
|
53
|
+
['seasons', seasonId, 'episodes', { from: 0, to: 49 }, ['summary', 'title', 'runtime', 'bookmark']],
|
|
54
|
+
['seasons', seasonId, 'episodes', 'summary'],
|
|
55
|
+
['seasons', seasonId, 'summary'],
|
|
56
|
+
]);
|
|
57
|
+
const episodeResult = (await pe.get.bind(pe)(...episodePaths));
|
|
58
|
+
const episodeData = episodeResult?.json ?? {};
|
|
59
|
+
const seasonsObj = episodeData?.seasons;
|
|
60
|
+
const seasons = [];
|
|
61
|
+
for (let i = 0; i < seasonIds.length; i++) {
|
|
62
|
+
const seasonId = seasonIds[i];
|
|
63
|
+
if (seasonId === undefined)
|
|
64
|
+
continue;
|
|
65
|
+
const sData = seasonsObj?.[String(seasonId)];
|
|
66
|
+
if (!sData)
|
|
67
|
+
continue;
|
|
68
|
+
const sSummary = sData.summary;
|
|
69
|
+
const season = mapSeason({
|
|
70
|
+
videoId: seasonId,
|
|
71
|
+
seasonNumber: sSummary?.seasonNumber ?? i + 1,
|
|
72
|
+
title: sSummary?.name ?? `Season ${i + 1}`,
|
|
73
|
+
});
|
|
74
|
+
const episodesObj = sData.episodes;
|
|
75
|
+
const episodes = [];
|
|
76
|
+
if (episodesObj) {
|
|
77
|
+
for (const [eKey, eEntry] of Object.entries(episodesObj)) {
|
|
78
|
+
if (eKey === 'summary' || eKey === '$__path' || eKey === 'length')
|
|
79
|
+
continue;
|
|
80
|
+
const ep = eEntry;
|
|
81
|
+
const epSummary = ep?.summary;
|
|
82
|
+
episodes.push(mapEpisode({
|
|
83
|
+
videoId: epSummary?.id,
|
|
84
|
+
title: ep?.title ?? '',
|
|
85
|
+
number: epSummary?.episode,
|
|
86
|
+
runtimeSec: ep?.runtime,
|
|
87
|
+
bookmark: ep?.bookmark,
|
|
88
|
+
}, season.season_number));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
seasons.push({ ...season, episodes });
|
|
92
|
+
}
|
|
93
|
+
return { seasons };
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=get-seasons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-seasons.js","sourceRoot":"","sources":["../../src/tools/get-seasons.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getTitleDetails: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
video_id: z.ZodNumber;
|
|
4
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
5
|
+
title: z.ZodObject<{
|
|
6
|
+
video_id: z.ZodNumber;
|
|
7
|
+
title: z.ZodString;
|
|
8
|
+
type: z.ZodString;
|
|
9
|
+
year: z.ZodNumber;
|
|
10
|
+
synopsis: z.ZodString;
|
|
11
|
+
maturity_rating: z.ZodString;
|
|
12
|
+
maturity_description: z.ZodString;
|
|
13
|
+
content_reasons: z.ZodArray<z.ZodString>;
|
|
14
|
+
genres: z.ZodString;
|
|
15
|
+
cast: z.ZodArray<z.ZodString>;
|
|
16
|
+
creators: z.ZodArray<z.ZodString>;
|
|
17
|
+
is_original: z.ZodBoolean;
|
|
18
|
+
playback_badges: z.ZodArray<z.ZodString>;
|
|
19
|
+
watch_status: z.ZodString;
|
|
20
|
+
is_in_my_list: z.ZodBoolean;
|
|
21
|
+
thumb_rating: z.ZodString;
|
|
22
|
+
runtime_minutes: z.ZodNumber;
|
|
23
|
+
num_seasons: z.ZodString;
|
|
24
|
+
image_url: z.ZodString;
|
|
25
|
+
}, z.core.$strip>;
|
|
26
|
+
}, z.core.$strip>>;
|
|
27
|
+
//# sourceMappingURL=get-title-details.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-title-details.d.ts","sourceRoot":"","sources":["../../src/tools/get-title-details.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAyBxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;kBAiF1B,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { getPageGlobal } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { readApolloTitle } from '../netflix-api.js';
|
|
5
|
+
const titleDetailsSchema = z.object({
|
|
6
|
+
video_id: z.number().int().describe('Netflix video ID'),
|
|
7
|
+
title: z.string().describe('Title name'),
|
|
8
|
+
type: z.string().describe('Content type: movie, show, or supplemental'),
|
|
9
|
+
year: z.number().int().describe('Release year'),
|
|
10
|
+
synopsis: z.string().describe('Full synopsis'),
|
|
11
|
+
maturity_rating: z.string().describe('Content rating (e.g., TV-MA, PG-13)'),
|
|
12
|
+
maturity_description: z.string().describe('Description of the maturity rating'),
|
|
13
|
+
content_reasons: z.array(z.string()).describe('Content advisory reasons (e.g., "violence", "language")'),
|
|
14
|
+
genres: z.string().describe('Genre tags'),
|
|
15
|
+
cast: z.array(z.string()).describe('Cast member names'),
|
|
16
|
+
creators: z.array(z.string()).describe('Creator/director names'),
|
|
17
|
+
is_original: z.boolean().describe('Whether this is a Netflix Original'),
|
|
18
|
+
playback_badges: z.array(z.string()).describe('Quality badges (e.g., VIDEO_ULTRA_HD, AUDIO_FIVE_DOT_ONE)'),
|
|
19
|
+
watch_status: z.string().describe('Watch status'),
|
|
20
|
+
is_in_my_list: z.boolean().describe('Whether the title is in My List'),
|
|
21
|
+
thumb_rating: z.string().describe('User thumb rating (THUMBS_UP, THUMBS_DOWN, THUMBS_WAY_UP, or THUMBS_UNRATED)'),
|
|
22
|
+
runtime_minutes: z.number().describe('Runtime in minutes (for movies)'),
|
|
23
|
+
num_seasons: z.string().describe('Number of seasons (for shows)'),
|
|
24
|
+
image_url: z.string().describe('Title artwork URL'),
|
|
25
|
+
});
|
|
26
|
+
export const getTitleDetails = defineTool({
|
|
27
|
+
name: 'get_title_details',
|
|
28
|
+
displayName: 'Get Title Details',
|
|
29
|
+
description: 'Get comprehensive details about a Netflix title including cast, creators, content advisory, quality badges, and user rating. More detailed than get_title — use this when you need cast/crew information or content advisories.',
|
|
30
|
+
summary: 'Get full details including cast and crew',
|
|
31
|
+
icon: 'info',
|
|
32
|
+
group: 'Browse',
|
|
33
|
+
input: z.object({
|
|
34
|
+
video_id: z.number().int().describe('Netflix video ID'),
|
|
35
|
+
}),
|
|
36
|
+
output: z.object({ title: titleDetailsSchema }),
|
|
37
|
+
handle: async (params) => {
|
|
38
|
+
const videoId = String(params.video_id);
|
|
39
|
+
// Try reading from Apollo cache first for rich data
|
|
40
|
+
const apolloClient = getPageGlobal('netflix.appContext.state.graphqlClient');
|
|
41
|
+
let apolloData = null;
|
|
42
|
+
if (apolloClient?.cache) {
|
|
43
|
+
const cacheData = apolloClient.cache.extract();
|
|
44
|
+
apolloData = cacheData[`Movie:{"videoId":${videoId}}`] ?? cacheData[`Show:{"videoId":${videoId}}`] ?? null;
|
|
45
|
+
}
|
|
46
|
+
// Also read from Apollo cache by video ID
|
|
47
|
+
if (!apolloData) {
|
|
48
|
+
apolloData = readApolloTitle(params.video_id);
|
|
49
|
+
}
|
|
50
|
+
const titleVal = apolloData?.title ?? '';
|
|
51
|
+
if (!apolloData && !titleVal) {
|
|
52
|
+
// Fetch via pathEvaluator to populate the cache
|
|
53
|
+
const pe = getPageGlobal('netflix.appContext.state.pathEvaluator');
|
|
54
|
+
if (pe?.get) {
|
|
55
|
+
const paths = [
|
|
56
|
+
['videos', params.video_id, ['title', 'summary', 'queue', 'inRemindMeList', 'runtime', 'current']],
|
|
57
|
+
];
|
|
58
|
+
await pe.get.bind(pe)(...paths);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Build the response from available data sources
|
|
62
|
+
const contentAdvisory = apolloData?.contentAdvisory;
|
|
63
|
+
const reasons = contentAdvisory?.reasons ?? [];
|
|
64
|
+
const playbackBadges = apolloData?.playbackBadges ?? [];
|
|
65
|
+
const textEvidence = apolloData?.[Object.keys(apolloData).find(k => k.startsWith('textEvidence')) ?? ''];
|
|
66
|
+
return {
|
|
67
|
+
title: {
|
|
68
|
+
video_id: params.video_id,
|
|
69
|
+
title: apolloData?.title ?? titleVal ?? '',
|
|
70
|
+
type: apolloData?.__typename?.toLowerCase() ?? '',
|
|
71
|
+
year: apolloData?.latestYear ?? 0,
|
|
72
|
+
synopsis: textEvidence?.[0]?.text ?? '',
|
|
73
|
+
maturity_rating: contentAdvisory?.certificationValue ?? '',
|
|
74
|
+
maturity_description: contentAdvisory?.maturityDescription ?? '',
|
|
75
|
+
content_reasons: reasons.map(r => r.text ?? '').filter(Boolean),
|
|
76
|
+
genres: textEvidence?.[0]?.text ?? '',
|
|
77
|
+
cast: [],
|
|
78
|
+
creators: [],
|
|
79
|
+
is_original: false,
|
|
80
|
+
playback_badges: playbackBadges,
|
|
81
|
+
watch_status: apolloData?.watchStatus ?? 'NOT_WATCHED',
|
|
82
|
+
is_in_my_list: apolloData?.isInPlaylist ?? false,
|
|
83
|
+
thumb_rating: apolloData?.thumbRatingV2 ?? 'THUMBS_UNRATED',
|
|
84
|
+
runtime_minutes: Math.round(((apolloData?.displayRuntimeSec ?? apolloData?.runtimeSec) ?? 0) / 60),
|
|
85
|
+
num_seasons: apolloData?.numSeasonsLabel ?? '',
|
|
86
|
+
image_url: '',
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=get-title-details.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-title-details.js","sourceRoot":"","sources":["../../src/tools/get-title-details.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getTitle: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
video_id: z.ZodNumber;
|
|
4
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
5
|
+
title: z.ZodObject<{
|
|
6
|
+
video_id: z.ZodNumber;
|
|
7
|
+
title: z.ZodString;
|
|
8
|
+
type: z.ZodString;
|
|
9
|
+
year: z.ZodNumber;
|
|
10
|
+
is_original: z.ZodBoolean;
|
|
11
|
+
maturity_rating: z.ZodString;
|
|
12
|
+
maturity_description: z.ZodString;
|
|
13
|
+
synopsis: z.ZodString;
|
|
14
|
+
genres: z.ZodString;
|
|
15
|
+
watch_status: z.ZodString;
|
|
16
|
+
is_in_my_list: z.ZodBoolean;
|
|
17
|
+
runtime_minutes: z.ZodNumber;
|
|
18
|
+
num_seasons: z.ZodString;
|
|
19
|
+
image_url: z.ZodString;
|
|
20
|
+
}, z.core.$strip>;
|
|
21
|
+
}, z.core.$strip>>;
|
|
22
|
+
//# sourceMappingURL=get-title.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-title.d.ts","sourceRoot":"","sources":["../../src/tools/get-title.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;kBA0CnB,CAAC"}
|