@mo7yw4ng/openape 1.0.2 → 1.0.3
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 +8 -5
- package/esm/deno.js +1 -1
- package/esm/src/commands/auth.d.ts +1 -1
- package/esm/src/commands/auth.d.ts.map +1 -1
- package/esm/src/commands/auth.js +3 -7
- package/esm/src/commands/forums.d.ts.map +1 -1
- package/esm/src/commands/forums.js +11 -16
- package/esm/src/commands/materials.d.ts.map +1 -1
- package/esm/src/commands/materials.js +171 -11
- package/esm/src/commands/videos.d.ts.map +1 -1
- package/esm/src/commands/videos.js +108 -75
- package/esm/src/index.js +2 -2
- package/esm/src/lib/moodle.d.ts +47 -1
- package/esm/src/lib/moodle.d.ts.map +1 -1
- package/esm/src/lib/moodle.js +169 -26
- package/esm/src/lib/types.d.ts +1 -0
- package/esm/src/lib/types.d.ts.map +1 -1
- package/esm/src/lib/utils.d.ts +20 -0
- package/esm/src/lib/utils.d.ts.map +1 -1
- package/esm/src/lib/utils.js +34 -3
- package/package.json +1 -2
- package/script/deno.js +1 -1
- package/script/src/commands/auth.d.ts +1 -1
- package/script/src/commands/auth.d.ts.map +1 -1
- package/script/src/commands/auth.js +4 -8
- package/script/src/commands/forums.d.ts.map +1 -1
- package/script/src/commands/forums.js +11 -16
- package/script/src/commands/materials.d.ts.map +1 -1
- package/script/src/commands/materials.js +173 -13
- package/script/src/commands/videos.d.ts.map +1 -1
- package/script/src/commands/videos.js +109 -76
- package/script/src/index.js +1 -1
- package/script/src/lib/moodle.d.ts +47 -1
- package/script/src/lib/moodle.d.ts.map +1 -1
- package/script/src/lib/moodle.js +172 -26
- package/script/src/lib/types.d.ts +1 -0
- package/script/src/lib/types.d.ts.map +1 -1
- package/script/src/lib/utils.d.ts +20 -0
- package/script/src/lib/utils.d.ts.map +1 -1
- package/script/src/lib/utils.js +37 -3
- package/skills/openape/SKILL.md +6 -26
package/esm/src/lib/moodle.d.ts
CHANGED
|
@@ -54,6 +54,7 @@ export declare function getForumsApi(session: {
|
|
|
54
54
|
cmid: number;
|
|
55
55
|
name: string;
|
|
56
56
|
courseid: number;
|
|
57
|
+
timemodified: number;
|
|
57
58
|
}>>;
|
|
58
59
|
/**
|
|
59
60
|
* Get discussions in a forum via WS API (no browser required).
|
|
@@ -108,6 +109,10 @@ export declare function getCourseGradesApi(session: {
|
|
|
108
109
|
/**
|
|
109
110
|
* Visit a SuperVideo activity page and extract view_id + duration.
|
|
110
111
|
*/
|
|
112
|
+
/**
|
|
113
|
+
* Optimized video metadata extraction - minimal page load overhead.
|
|
114
|
+
* Blocks images, fonts, stylesheets to speed up viewId extraction.
|
|
115
|
+
*/
|
|
111
116
|
export declare function getVideoMetadata(page: Page, activityUrl: string, log: Logger): Promise<{
|
|
112
117
|
name: string;
|
|
113
118
|
url: string;
|
|
@@ -132,7 +137,25 @@ export declare function downloadVideo(page: Page, metadata: {
|
|
|
132
137
|
type?: string;
|
|
133
138
|
}>;
|
|
134
139
|
/**
|
|
135
|
-
* Complete a video
|
|
140
|
+
* Complete a video using WS API (mobile service only).
|
|
141
|
+
* Uses mod_supervideo_progress_save_mobile which is accessible via moodle_mobile_app service token.
|
|
142
|
+
*/
|
|
143
|
+
export declare function completeVideoApi(session: {
|
|
144
|
+
wsToken: string;
|
|
145
|
+
moodleBaseUrl: string;
|
|
146
|
+
}, video: {
|
|
147
|
+
viewId: number;
|
|
148
|
+
duration: number;
|
|
149
|
+
url: string;
|
|
150
|
+
cmid?: string;
|
|
151
|
+
}): Promise<{
|
|
152
|
+
success: boolean;
|
|
153
|
+
error?: string;
|
|
154
|
+
result?: any;
|
|
155
|
+
}>;
|
|
156
|
+
/**
|
|
157
|
+
* Complete a video by forging progress AJAX call (legacy, requires browser).
|
|
158
|
+
* Note: This uses sesskey-based AJAX which works for mod_supervideo_progress_save.
|
|
136
159
|
*/
|
|
137
160
|
export declare function completeVideo(page: Page, session: SessionInfo, video: {
|
|
138
161
|
viewId: number;
|
|
@@ -140,8 +163,17 @@ export declare function completeVideo(page: Page, session: SessionInfo, video: {
|
|
|
140
163
|
url: string;
|
|
141
164
|
cmid?: string;
|
|
142
165
|
}, log: Logger): Promise<boolean>;
|
|
166
|
+
/**
|
|
167
|
+
* Update activity completion status manually via WS API.
|
|
168
|
+
* Used for marking resources as complete/incomplete.
|
|
169
|
+
*/
|
|
170
|
+
export declare function updateActivityCompletionStatusManually(session: {
|
|
171
|
+
wsToken: string;
|
|
172
|
+
moodleBaseUrl: string;
|
|
173
|
+
}, cmid: number, completed: boolean): Promise<boolean>;
|
|
143
174
|
/**
|
|
144
175
|
* Get site info including current user ID via pure WS API.
|
|
176
|
+
* Results are cached for 5 minutes to avoid redundant calls.
|
|
145
177
|
*/
|
|
146
178
|
export declare function getSiteInfoApi(session: {
|
|
147
179
|
wsToken: string;
|
|
@@ -152,6 +184,20 @@ export declare function getSiteInfoApi(session: {
|
|
|
152
184
|
fullname: string;
|
|
153
185
|
sitename: string;
|
|
154
186
|
}>;
|
|
187
|
+
/**
|
|
188
|
+
* Get incomplete supervideos with completion tracking enabled via WS API.
|
|
189
|
+
* Uses core_completion_get_activities_completion_status to get only videos that:
|
|
190
|
+
* 1. Have completion tracking enabled (hascompletion: true)
|
|
191
|
+
* 2. Are not yet completed (isoverallcomplete: false or state !== 1)
|
|
192
|
+
*/
|
|
193
|
+
export declare function getIncompleteVideosApi(session: {
|
|
194
|
+
wsToken: string;
|
|
195
|
+
moodleBaseUrl: string;
|
|
196
|
+
}, courseId: number): Promise<Array<{
|
|
197
|
+
cmid: number;
|
|
198
|
+
name: string;
|
|
199
|
+
url: string;
|
|
200
|
+
}>>;
|
|
155
201
|
/**
|
|
156
202
|
* Get course contents and filter for SuperVideo modules via pure WS API.
|
|
157
203
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"moodle.d.ts","sourceRoot":"","sources":["../../../src/src/lib/moodle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"moodle.d.ts","sourceRoot":"","sources":["../../../src/src/lib/moodle.ts"],"names":[],"mappings":"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"}
|
package/esm/src/lib/moodle.js
CHANGED
|
@@ -1,15 +1,5 @@
|
|
|
1
1
|
import * as dntShim from "../../_dnt.shims.js";
|
|
2
|
-
import { parse } from "node-html-parser";
|
|
3
2
|
import { stripHtmlTags, extractCourseName } from "./utils.js";
|
|
4
|
-
// ── HTML Parsing Helpers ──────────────────────────────────────────────────
|
|
5
|
-
/**
|
|
6
|
-
* Get the HTML content of a page and parse it.
|
|
7
|
-
*/
|
|
8
|
-
async function fetchAndParse(page, url) {
|
|
9
|
-
await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 });
|
|
10
|
-
const content = await page.content();
|
|
11
|
-
return parse(content);
|
|
12
|
-
}
|
|
13
3
|
// ── Core Moodle AJAX Wrapper ───────────────────────────────────────────
|
|
14
4
|
/**
|
|
15
5
|
* Moodle WS API functions that are known to work via /webservice/rest/server.php
|
|
@@ -22,6 +12,12 @@ const WS_API_FUNCTIONS = new Set([
|
|
|
22
12
|
"gradereport_user_get_grade_items",
|
|
23
13
|
"core_calendar_get_calendar_events",
|
|
24
14
|
"core_course_get_contents",
|
|
15
|
+
"core_course_get_course_module",
|
|
16
|
+
"core_completion_get_activities_completion_status",
|
|
17
|
+
"core_completion_update_activity_completion_status_manually",
|
|
18
|
+
"mod_supervideo_progress_save",
|
|
19
|
+
"mod_supervideo_progress_save_mobile",
|
|
20
|
+
"mod_supervideo_view_supervideo",
|
|
25
21
|
"mod_quiz_get_quizzes_by_courses",
|
|
26
22
|
"mod_resource_get_resources_by_courses",
|
|
27
23
|
"core_message_get_messages",
|
|
@@ -195,15 +191,17 @@ export async function getCourseState(page, session, courseId) {
|
|
|
195
191
|
export async function getSupervideosInCourse(page, session, courseId, log, options = {}) {
|
|
196
192
|
const state = await getCourseState(page, session, courseId);
|
|
197
193
|
const cms = state?.cm ?? [];
|
|
198
|
-
log.debug(` Course state returned ${cms.length} modules`);
|
|
199
|
-
// Debug: log first few modules
|
|
200
|
-
for (let i = 0; i < Math.min(3, cms.length); i++) {
|
|
201
|
-
log.debug(` Module ${i}: ${JSON.stringify(cms[i])}`);
|
|
202
|
-
}
|
|
203
194
|
const allSupervideos = cms.filter((cm) => cm.module === "supervideo" || cm.modname === "supervideo");
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
195
|
+
// Filter: Only include videos with completion tracking enabled (have completionstate field)
|
|
196
|
+
// and are not yet completed (completionstate != 1 or isoverallcomplete != true)
|
|
197
|
+
const incomplete = allSupervideos.filter((cm) => {
|
|
198
|
+
// Has completionstate field = completion tracking is enabled for this video
|
|
199
|
+
const hasCompletionTracking = "completionstate" in cm;
|
|
200
|
+
// Is not yet completed
|
|
201
|
+
const isIncomplete = cm.completionstate !== 1 && cm.isoverallcomplete !== true;
|
|
202
|
+
return hasCompletionTracking && isIncomplete;
|
|
203
|
+
});
|
|
204
|
+
log.debug(` SuperVideo: ${allSupervideos.length} total, ${incomplete.length} incomplete (with completion enabled)`);
|
|
207
205
|
// Return only incomplete if requested, otherwise return all
|
|
208
206
|
const videos = options.incompleteOnly ? incomplete : allSupervideos;
|
|
209
207
|
return videos.map((cm) => ({
|
|
@@ -225,6 +223,7 @@ export async function getForumsApi(session, courseIds) {
|
|
|
225
223
|
cmid: f.cmid,
|
|
226
224
|
name: f.name,
|
|
227
225
|
courseid: f.course, // API returns 'course' not 'courseid'
|
|
226
|
+
timemodified: f.timemodified,
|
|
228
227
|
}));
|
|
229
228
|
}
|
|
230
229
|
/**
|
|
@@ -372,7 +371,13 @@ export async function getCourseGradesApi(session, courseId) {
|
|
|
372
371
|
/**
|
|
373
372
|
* Visit a SuperVideo activity page and extract view_id + duration.
|
|
374
373
|
*/
|
|
374
|
+
/**
|
|
375
|
+
* Optimized video metadata extraction - minimal page load overhead.
|
|
376
|
+
* Blocks images, fonts, stylesheets to speed up viewId extraction.
|
|
377
|
+
*/
|
|
375
378
|
export async function getVideoMetadata(page, activityUrl, log) {
|
|
379
|
+
// Block unnecessary resources for faster loading
|
|
380
|
+
await page.route("**/*.{png,jpg,jpeg,gif,webp,svg,ico,woff,woff2,ttf,css}", (route) => route.abort());
|
|
376
381
|
await page.goto(activityUrl, { waitUntil: "domcontentloaded", timeout: 20000 });
|
|
377
382
|
const name = await page.title();
|
|
378
383
|
const pageSource = await page.content();
|
|
@@ -519,7 +524,7 @@ export async function downloadVideo(page, metadata, outputPath, log) {
|
|
|
519
524
|
// Get array buffer and convert to Uint8Array
|
|
520
525
|
const arrayBuffer = await response.arrayBuffer();
|
|
521
526
|
const uint8Array = new Uint8Array(arrayBuffer);
|
|
522
|
-
// Write to file
|
|
527
|
+
// Write to file
|
|
523
528
|
await dntShim.Deno.writeFile(outputPath, uint8Array);
|
|
524
529
|
return { success: true, path: outputPath, type: "direct" };
|
|
525
530
|
}
|
|
@@ -554,21 +559,55 @@ export async function downloadVideo(page, metadata, outputPath, log) {
|
|
|
554
559
|
}
|
|
555
560
|
// ── Progress Completion (from original progress.ts) ───────────────────────
|
|
556
561
|
/**
|
|
557
|
-
*
|
|
562
|
+
* Build duration map array for video progress tracking.
|
|
563
|
+
* Cached and scaled per duration to avoid repeated allocations.
|
|
558
564
|
*/
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
// Build duration map array (required by Moodle)
|
|
565
|
+
function buildDurationMap(duration) {
|
|
566
|
+
// Build the map array (0% to 100% in 1% increments)
|
|
562
567
|
const map = Array.from({ length: 100 }, (_, i) => ({
|
|
563
568
|
time: Math.round((duration * i) / 100),
|
|
564
569
|
percent: i,
|
|
565
570
|
}));
|
|
571
|
+
return JSON.stringify(map);
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* Complete a video using WS API (mobile service only).
|
|
575
|
+
* Uses mod_supervideo_progress_save_mobile which is accessible via moodle_mobile_app service token.
|
|
576
|
+
*/
|
|
577
|
+
export async function completeVideoApi(session, video) {
|
|
578
|
+
const { viewId, duration } = video;
|
|
579
|
+
try {
|
|
580
|
+
const result = await moodleApiCall(session, "mod_supervideo_progress_save_mobile", // Use mobile service specific function
|
|
581
|
+
{
|
|
582
|
+
view_id: viewId,
|
|
583
|
+
currenttime: duration,
|
|
584
|
+
duration: duration,
|
|
585
|
+
percent: 100,
|
|
586
|
+
mapa: buildDurationMap(duration),
|
|
587
|
+
});
|
|
588
|
+
// Debug: log the full result
|
|
589
|
+
console.debug(`completeVideoApi result:`, JSON.stringify(result));
|
|
590
|
+
const success = result?.[0]?.success === true || result?.success === true;
|
|
591
|
+
return { success, error: success ? undefined : `API returned success=false, result=${JSON.stringify(result)}`, result };
|
|
592
|
+
}
|
|
593
|
+
catch (err) {
|
|
594
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
595
|
+
console.debug(`completeVideoApi error: ${msg}`);
|
|
596
|
+
return { success: false, error: msg };
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Complete a video by forging progress AJAX call (legacy, requires browser).
|
|
601
|
+
* Note: This uses sesskey-based AJAX which works for mod_supervideo_progress_save.
|
|
602
|
+
*/
|
|
603
|
+
export async function completeVideo(page, session, video, log) {
|
|
604
|
+
const { viewId, duration } = video;
|
|
566
605
|
const payload = {
|
|
567
606
|
view_id: viewId,
|
|
568
607
|
currenttime: duration,
|
|
569
608
|
duration: duration,
|
|
570
609
|
percent: 100,
|
|
571
|
-
mapa:
|
|
610
|
+
mapa: buildDurationMap(duration),
|
|
572
611
|
};
|
|
573
612
|
const url = `${session.moodleBaseUrl}/lib/ajax/service.php?sesskey=${session.sesskey}&info=mod_supervideo_progress_save`;
|
|
574
613
|
const ajaxPayload = [{ index: 0, methodname: "mod_supervideo_progress_save", args: payload }];
|
|
@@ -592,18 +631,94 @@ export async function completeVideo(page, session, video, log) {
|
|
|
592
631
|
return false;
|
|
593
632
|
}
|
|
594
633
|
}
|
|
634
|
+
/**
|
|
635
|
+
* Update activity completion status manually via WS API.
|
|
636
|
+
* Used for marking resources as complete/incomplete.
|
|
637
|
+
*/
|
|
638
|
+
export async function updateActivityCompletionStatusManually(session, cmid, completed) {
|
|
639
|
+
try {
|
|
640
|
+
const result = await moodleApiCall(session, "core_completion_update_activity_completion_status_manually", {
|
|
641
|
+
cmid: cmid,
|
|
642
|
+
completed: completed ? 1 : 0,
|
|
643
|
+
});
|
|
644
|
+
return result.status === true;
|
|
645
|
+
}
|
|
646
|
+
catch (e) {
|
|
647
|
+
console.debug(`Failed to update completion status for cmid ${cmid}: ${e}`);
|
|
648
|
+
return false;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
595
651
|
// ── Site Info (Get User ID) ───────────────────────────────────────────────────
|
|
652
|
+
/** Cache for site info to avoid redundant API calls */
|
|
653
|
+
let siteInfoCache = null;
|
|
654
|
+
let siteInfoCacheTime = 0;
|
|
655
|
+
const SITE_INFO_CACHE_TTL = 5 * 60 * 1000; // 5 minutes
|
|
596
656
|
/**
|
|
597
657
|
* Get site info including current user ID via pure WS API.
|
|
658
|
+
* Results are cached for 5 minutes to avoid redundant calls.
|
|
598
659
|
*/
|
|
599
660
|
export async function getSiteInfoApi(session) {
|
|
661
|
+
const now = Date.now();
|
|
662
|
+
if (siteInfoCache && (now - siteInfoCacheTime) < SITE_INFO_CACHE_TTL) {
|
|
663
|
+
return siteInfoCache;
|
|
664
|
+
}
|
|
600
665
|
const data = await moodleApiCall(session, "core_webservice_get_site_info", {});
|
|
601
|
-
|
|
666
|
+
siteInfoCache = {
|
|
602
667
|
userid: data.userid,
|
|
603
668
|
username: data.username,
|
|
604
669
|
fullname: data.fullname,
|
|
605
670
|
sitename: data.sitename,
|
|
606
671
|
};
|
|
672
|
+
siteInfoCacheTime = now;
|
|
673
|
+
return siteInfoCache;
|
|
674
|
+
}
|
|
675
|
+
/**
|
|
676
|
+
* Get incomplete supervideos with completion tracking enabled via WS API.
|
|
677
|
+
* Uses core_completion_get_activities_completion_status to get only videos that:
|
|
678
|
+
* 1. Have completion tracking enabled (hascompletion: true)
|
|
679
|
+
* 2. Are not yet completed (isoverallcomplete: false or state !== 1)
|
|
680
|
+
*/
|
|
681
|
+
export async function getIncompleteVideosApi(session, courseId) {
|
|
682
|
+
// Get user ID
|
|
683
|
+
const siteInfo = await getSiteInfoApi(session);
|
|
684
|
+
// Get completion status for all activities
|
|
685
|
+
const completionData = await moodleApiCall(session, "core_completion_get_activities_completion_status", { courseid: courseId, userid: siteInfo.userid });
|
|
686
|
+
if (!completionData?.statuses) {
|
|
687
|
+
return [];
|
|
688
|
+
}
|
|
689
|
+
// Get course contents to get URLs
|
|
690
|
+
const contentsData = await moodleApiCall(session, "core_course_get_contents", { courseid: courseId });
|
|
691
|
+
// Create a map of cmid to URL
|
|
692
|
+
const urlMap = new Map();
|
|
693
|
+
for (const section of contentsData || []) {
|
|
694
|
+
if (!section.modules)
|
|
695
|
+
continue;
|
|
696
|
+
for (const module of section.modules) {
|
|
697
|
+
if (module.id) {
|
|
698
|
+
urlMap.set(module.id, module.url);
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
// Filter for incomplete supervideos with completion tracking enabled
|
|
703
|
+
const incompleteVideos = [];
|
|
704
|
+
for (const status of completionData.statuses) {
|
|
705
|
+
// Only supervideo modules
|
|
706
|
+
if (status.modname !== "supervideo")
|
|
707
|
+
continue;
|
|
708
|
+
// Must have completion enabled
|
|
709
|
+
if (!status.hascompletion)
|
|
710
|
+
continue;
|
|
711
|
+
// Must be incomplete
|
|
712
|
+
if (status.isoverallcomplete === true || status.state === 1)
|
|
713
|
+
continue;
|
|
714
|
+
const url = urlMap.get(status.cmid) || "";
|
|
715
|
+
incompleteVideos.push({
|
|
716
|
+
cmid: status.cmid,
|
|
717
|
+
name: status.name,
|
|
718
|
+
url,
|
|
719
|
+
});
|
|
720
|
+
}
|
|
721
|
+
return incompleteVideos;
|
|
607
722
|
}
|
|
608
723
|
// ── Videos via WS API ─────────────────────────────────────────────────────────
|
|
609
724
|
/**
|
|
@@ -624,11 +739,39 @@ export async function getSupervideosInCourseApi(session, courseId) {
|
|
|
624
739
|
cmid: module.id.toString(),
|
|
625
740
|
name: module.name,
|
|
626
741
|
url: module.url,
|
|
627
|
-
|
|
742
|
+
instance: module.instance, // supervideo instance id (not cmid!)
|
|
743
|
+
isComplete: false, // Will be updated from completion API
|
|
628
744
|
});
|
|
629
745
|
}
|
|
630
746
|
}
|
|
631
747
|
}
|
|
748
|
+
// Get completion status using core_completion_get_activities_completion_status
|
|
749
|
+
try {
|
|
750
|
+
// First get user ID
|
|
751
|
+
const siteInfo = await getSiteInfoApi(session);
|
|
752
|
+
const completionData = await moodleApiCall(session, "core_completion_get_activities_completion_status", { courseid: courseId, userid: siteInfo.userid });
|
|
753
|
+
// Create a map of cmid to completion status
|
|
754
|
+
const completionMap = new Map();
|
|
755
|
+
if (completionData?.statuses) {
|
|
756
|
+
for (const status of completionData.statuses) {
|
|
757
|
+
// Only include modules that have completion enabled
|
|
758
|
+
if (status.hascompletion) {
|
|
759
|
+
completionMap.set(status.cmid, status.isoverallcomplete === true);
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
// Update isComplete based on completion data
|
|
764
|
+
for (const video of videos) {
|
|
765
|
+
const cmid = parseInt(video.cmid, 10);
|
|
766
|
+
if (completionMap.has(cmid)) {
|
|
767
|
+
video.isComplete = completionMap.get(cmid) ?? false;
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
catch (e) {
|
|
772
|
+
// If completion API fails, continue with isComplete=false
|
|
773
|
+
console.debug(`Failed to get completion status: ${e}`);
|
|
774
|
+
}
|
|
632
775
|
return videos;
|
|
633
776
|
}
|
|
634
777
|
/**
|
package/esm/src/lib/types.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/lib/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/lib/types.ts"],"names":[],"mappings":"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"}
|
package/esm/src/lib/utils.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { OutputFormat } from "./types.js";
|
|
1
2
|
/**
|
|
2
3
|
* Returns the base directory for config/storage resolving.
|
|
3
4
|
* Handles both Deno (raw/compiled) and Node.js (npx).
|
|
@@ -14,4 +15,23 @@ export declare function stripHtmlTags(html: string): string;
|
|
|
14
15
|
* Example: "{mlang zh-tw}1142爵士樂賞析(遠距)-楊曊恩..." -> "爵士樂賞析"
|
|
15
16
|
*/
|
|
16
17
|
export declare function extractCourseName(fullname: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Get output format from command options (global or local).
|
|
20
|
+
* Defaults to "json" if not specified.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getOutputFormat(command: {
|
|
23
|
+
optsWithGlobals(): {
|
|
24
|
+
output?: OutputFormat;
|
|
25
|
+
};
|
|
26
|
+
}): OutputFormat;
|
|
27
|
+
/**
|
|
28
|
+
* Determine if logs should be silenced based on output format and verbosity.
|
|
29
|
+
* JSON output without verbose flag silences logs.
|
|
30
|
+
*/
|
|
31
|
+
export declare function shouldSilenceLogs(outputFormat: OutputFormat, verbose?: boolean): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Sanitize filename by removing invalid characters and limiting length.
|
|
34
|
+
* Replaces invalid characters with underscores and limits to maxLength.
|
|
35
|
+
*/
|
|
36
|
+
export declare function sanitizeFilename(name: string, maxLength?: number): string;
|
|
17
37
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/src/lib/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/src/lib/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAcnC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAelD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO1D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE;IAAE,eAAe,IAAI;QAAE,MAAM,CAAC,EAAE,YAAY,CAAA;KAAE,CAAA;CAAE,GAAG,YAAY,CAGvG;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAExF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,CAK9E"}
|
package/esm/src/lib/utils.js
CHANGED
|
@@ -7,9 +7,15 @@ import { dirname } from "node:path";
|
|
|
7
7
|
export function getBaseDir() {
|
|
8
8
|
// @ts-ignore - Deno global is available in Deno
|
|
9
9
|
if (typeof dntShim.Deno !== "undefined" && typeof dntShim.Deno.execPath === "function") {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
try {
|
|
11
|
+
// @ts-ignore
|
|
12
|
+
const exeDir = dirname(dntShim.Deno.execPath());
|
|
13
|
+
return exeDir.includes("deno") ? process.cwd() : exeDir;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Deno shim (dnt) or Deno not installed
|
|
17
|
+
return process.cwd();
|
|
18
|
+
}
|
|
13
19
|
}
|
|
14
20
|
// Node.js or dnt runtime
|
|
15
21
|
return process.cwd();
|
|
@@ -49,3 +55,28 @@ export function extractCourseName(fullname) {
|
|
|
49
55
|
const match = cleaned.match(/\d{4,}([^([-]+)/);
|
|
50
56
|
return match ? match[1].trim() : fullname;
|
|
51
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Get output format from command options (global or local).
|
|
60
|
+
* Defaults to "json" if not specified.
|
|
61
|
+
*/
|
|
62
|
+
export function getOutputFormat(command) {
|
|
63
|
+
const opts = command.optsWithGlobals();
|
|
64
|
+
return opts.output || "json";
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Determine if logs should be silenced based on output format and verbosity.
|
|
68
|
+
* JSON output without verbose flag silences logs.
|
|
69
|
+
*/
|
|
70
|
+
export function shouldSilenceLogs(outputFormat, verbose) {
|
|
71
|
+
return outputFormat === "json" && !verbose;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Sanitize filename by removing invalid characters and limiting length.
|
|
75
|
+
* Replaces invalid characters with underscores and limits to maxLength.
|
|
76
|
+
*/
|
|
77
|
+
export function sanitizeFilename(name, maxLength = 200) {
|
|
78
|
+
return name
|
|
79
|
+
.replace(/[<>:"/\\|?*]/g, "_")
|
|
80
|
+
.replace(/\s+/g, "_")
|
|
81
|
+
.substring(0, maxLength);
|
|
82
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mo7yw4ng/openape",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "CLI tool for CYCU i-Learning platform",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ilearning",
|
|
@@ -27,7 +27,6 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"commander": "^12.1.0",
|
|
30
|
-
"node-html-parser": "^6.1.13",
|
|
31
30
|
"playwright-core": "^1.48.0",
|
|
32
31
|
"@deno/shim-deno": "~0.18.0"
|
|
33
32
|
},
|
package/script/deno.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.default = {
|
|
4
4
|
"name": "@openape/openape",
|
|
5
|
-
"version": "1.0.
|
|
5
|
+
"version": "1.0.3",
|
|
6
6
|
"description": "CLI tool for CYCU i-Learning platform",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"exports": "./src/index.ts",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/src/commands/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/src/commands/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoQtD"}
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.registerCommand = registerCommand;
|
|
7
7
|
const utils_js_1 = require("../lib/utils.js");
|
|
8
8
|
const playwright_core_1 = require("playwright-core");
|
|
9
9
|
const logger_js_1 = require("../lib/logger.js");
|
|
@@ -11,10 +11,7 @@ const auth_js_1 = require("../lib/auth.js");
|
|
|
11
11
|
const token_js_1 = require("../lib/token.js");
|
|
12
12
|
const node_path_1 = __importDefault(require("node:path"));
|
|
13
13
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
14
|
-
function
|
|
15
|
-
const authCmd = program.command("auth");
|
|
16
|
-
authCmd.description("Authentication commands");
|
|
17
|
-
// Register login directly on program (not under auth subcommand)
|
|
14
|
+
function registerCommand(program) {
|
|
18
15
|
program
|
|
19
16
|
.command("login")
|
|
20
17
|
.description("Login to iLearning manually and save session")
|
|
@@ -192,8 +189,7 @@ function registerAuthCommand(program) {
|
|
|
192
189
|
await new Promise(resolve => setTimeout(resolve, 500));
|
|
193
190
|
}
|
|
194
191
|
});
|
|
195
|
-
|
|
196
|
-
authCmd
|
|
192
|
+
program
|
|
197
193
|
.command("status")
|
|
198
194
|
.description("Check session status")
|
|
199
195
|
.option("--session <path>", "Session file path", ".auth/storage-state.json")
|
|
@@ -242,7 +238,7 @@ function registerAuthCommand(program) {
|
|
|
242
238
|
console.log(JSON.stringify(result, null, 2));
|
|
243
239
|
}
|
|
244
240
|
});
|
|
245
|
-
|
|
241
|
+
program
|
|
246
242
|
.command("logout")
|
|
247
243
|
.description("Remove saved session")
|
|
248
244
|
.option("--session <path>", "Session file path", ".auth/storage-state.json")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forums.d.ts","sourceRoot":"","sources":["../../../src/src/commands/forums.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"forums.d.ts","sourceRoot":"","sources":["../../../src/src/commands/forums.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6P5D"}
|