From b8e6180b35a9e0a325a93cff7c5af6e0a574cc4a Mon Sep 17 00:00:00 2001 From: joren Date: Wed, 11 Mar 2026 19:56:37 +0100 Subject: [PATCH] add numbering --- cmd/canvasarchiver/main.go | 11 ++++++----- internal/canvas/client.go | 15 +++++++++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/cmd/canvasarchiver/main.go b/cmd/canvasarchiver/main.go index d2ce549..18b3c87 100644 --- a/cmd/canvasarchiver/main.go +++ b/cmd/canvasarchiver/main.go @@ -15,6 +15,7 @@ import ( func main() { filesOnly := flag.Bool("fo", false, "Files only mode - download all files to a single directory without module structure") me := flag.Bool("me", false, "Download all enrolled courses") + moduleNumbers := flag.Bool("n", false, "Prefix modules with order numbers [1], [2], etc.") flag.Parse() httpClient := &http.Client{} @@ -27,7 +28,7 @@ func main() { } if *me { - canvasClient := canvas.NewClient(httpClient, accessToken, "", *filesOnly) + canvasClient := canvas.NewClient(httpClient, accessToken, "", *filesOnly, *moduleNumbers) courses, err := canvasClient.GetEnrolledCourses() if err != nil { fmt.Printf("Error fetching courses: %v\n", err) @@ -37,7 +38,7 @@ func main() { fmt.Printf("[+] Found %d enrolled courses\n", len(courses)) for _, course := range courses { fmt.Printf(" -> Downloading: %s (ID: %d)\n", course.Name, course.ID) - downloadCourse(httpClient, accessToken, fmt.Sprintf("%d", course.ID), *filesOnly) + downloadCourse(httpClient, accessToken, fmt.Sprintf("%d", course.ID), *filesOnly, *moduleNumbers) } return } @@ -46,11 +47,11 @@ func main() { fmt.Print("Enter Course ID: ") fmt.Scanln(&courseID) - downloadCourse(httpClient, accessToken, courseID, *filesOnly) + downloadCourse(httpClient, accessToken, courseID, *filesOnly, *moduleNumbers) } -func downloadCourse(httpClient *http.Client, accessToken, courseID string, filesOnly bool) { - canvasClient := canvas.NewClient(httpClient, accessToken, courseID, filesOnly) +func downloadCourse(httpClient *http.Client, accessToken, courseID string, filesOnly, moduleNumbers bool) { + canvasClient := canvas.NewClient(httpClient, accessToken, courseID, filesOnly, moduleNumbers) if err := canvasClient.GetCourseInfo(); err != nil { fmt.Printf("Error: %v\n", err) diff --git a/internal/canvas/client.go b/internal/canvas/client.go index ad2b1c2..e0fe885 100644 --- a/internal/canvas/client.go +++ b/internal/canvas/client.go @@ -22,15 +22,17 @@ type Client struct { CourseID string CourseName string FilesOnly bool + ModuleNumbers bool downloadedFiles map[string]bool } -func NewClient(httpClient *http.Client, accessToken, courseID string, filesOnly bool) *Client { +func NewClient(httpClient *http.Client, accessToken, courseID string, filesOnly, moduleNumbers bool) *Client { return &Client{ HTTPClient: httpClient, AccessToken: accessToken, CourseID: courseID, FilesOnly: filesOnly, + ModuleNumbers: moduleNumbers, downloadedFiles: make(map[string]bool), } } @@ -152,15 +154,20 @@ func (c *Client) DownloadModules(courseRoot string) { json.NewDecoder(resp.Body).Decode(&modules) resp.Body.Close() - for _, mod := range modules { + for i, mod := range modules { + modName := mod.Name + if c.ModuleNumbers { + modName = fmt.Sprintf("[%d] %s", i+1, mod.Name) + } + modBaseDir := courseRoot if !c.FilesOnly { - modBaseDir = filepath.Join(courseRoot, "Modules", utils.Sanitize(mod.Name)) + modBaseDir = filepath.Join(courseRoot, "Modules", utils.Sanitize(modName)) } os.MkdirAll(modBaseDir, 0o755) if !c.FilesOnly { - fmt.Printf("\n[Module] %s\n", mod.Name) + fmt.Printf("\n[Module] %s\n", modName) } subHeaderStack := []string{}