package main import ( "encoding/json" "fmt" "io" "net/http" "os" "path/filepath" "regexp" "strings" ) const defaultManifestURL = "https://drive.google.com/file/d/1lRmHIy_0nXEy_LTwn0NzIqoJ4s9_JmxO/view?usp=drive_link" type ManifestEntry struct { Filename string `json:"filename"` URL string `json:"url"` Description string `json:"description,omitempty"` } var reGDriveFileID = regexp.MustCompile(`/file/d/([a-zA-Z0-9_-]+)`) var reGDriveIDParam = regexp.MustCompile(`[?&]id=([a-zA-Z0-9_-]+)`) func gdriveToDirectURL(rawURL string) string { if m := reGDriveFileID.FindStringSubmatch(rawURL); m != nil { return "https://drive.google.com/uc?export=download&id=" + m[1] } if m := reGDriveIDParam.FindStringSubmatch(rawURL); m != nil { return "https://drive.google.com/uc?export=download&id=" + m[1] } return rawURL } func fetchManifest(manifestURL string) ([]ManifestEntry, error) { req, err := http.NewRequest("GET", gdriveToDirectURL(manifestURL), nil) if err != nil { return nil, err } req.Header.Set("User-Agent", "Mozilla/5.0") resp, err := http.DefaultClient.Do(req) if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("HTTP %d %s", resp.StatusCode, resp.Status) } var entries []ManifestEntry if err := json.NewDecoder(resp.Body).Decode(&entries); err != nil { return nil, fmt.Errorf("failed to parse manifest JSON: %w", err) } filtered := entries[:0] for _, e := range entries { if e.Filename != "" && e.URL != "" { filtered = append(filtered, e) } } return filtered, nil } func downloadManifestFile(rawURL, destPath string) error { req, err := http.NewRequest("GET", gdriveToDirectURL(rawURL), nil) if err != nil { return err } req.Header.Set("User-Agent", "Mozilla/5.0") resp, err := http.DefaultClient.Do(req) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("HTTP %d %s", resp.StatusCode, resp.Status) } body, err := io.ReadAll(resp.Body) if err != nil { return err } ct := resp.Header.Get("Content-Type") ext := strings.ToLower(filepath.Ext(destPath)) if strings.Contains(ct, "text/html") && ext != ".html" && ext != ".htm" { return fmt.Errorf("got an HTML page instead of a file — make sure the Google Drive file is set to \"Anyone with the link can view\"") } return os.WriteFile(destPath, body, 0644) } func getManifestURL() string { cfg := LoadConfig() if cfg.ProjectInitManifestURL != "" { return cfg.ProjectInitManifestURL } return defaultManifestURL } func ProjectInitPage(w http.ResponseWriter, r *http.Request) { body := `

Initialize Project

Fetches the shared file list from your team manifest and downloads selected files into the chosen folder.

Files

Download folder

` w.Header().Set("Content-Type", "text/html; charset=utf-8") _, _ = w.Write([]byte(Page("/project-init", "Initialize Project", body))) } func htmlEscape(s string) string { s = strings.ReplaceAll(s, "&", "&") s = strings.ReplaceAll(s, `"`, """) s = strings.ReplaceAll(s, "<", "<") s = strings.ReplaceAll(s, ">", ">") return s } func ProjectInitManifestEndpoint(w http.ResponseWriter, r *http.Request) { manifestURL := getManifestURL() entries, err := fetchManifest(manifestURL) if err != nil { writeJSON(w, map[string]any{"error": err.Error()}) return } writeJSON(w, map[string]any{"files": entries, "manifestUrl": manifestURL}) } func ProjectInitPickFolderEndpoint(w http.ResponseWriter, r *http.Request) { cfg := LoadConfig() folder := PickFolder("Select Destination Folder", cfg.LastPickDir) if folder == "" { writeJSON(w, map[string]any{"path": ""}) return } cfg.LastPickDir = folder _ = SaveConfig(cfg) writeJSON(w, map[string]any{"path": folder}) } func ProjectInitSetManifestURLEndpoint(w http.ResponseWriter, r *http.Request) { var req struct { URL string `json:"url"` } if err := json.NewDecoder(r.Body).Decode(&req); err != nil { writeJSON(w, map[string]any{"ok": false, "error": err.Error()}) return } cfg := LoadConfig() cfg.ProjectInitManifestURL = strings.TrimSpace(req.URL) if err := SaveConfig(cfg); err != nil { writeJSON(w, map[string]any{"ok": false, "error": err.Error()}) return } writeJSON(w, map[string]any{"ok": true}) } func ProjectInitDownloadEndpoint(w http.ResponseWriter, r *http.Request) { var req struct { Files []ManifestEntry `json:"files"` DestFolder string `json:"destFolder"` } if err := json.NewDecoder(r.Body).Decode(&req); err != nil { writeJSON(w, map[string]any{"ok": false, "message": "Invalid request: " + err.Error()}) return } if req.DestFolder == "" { writeJSON(w, map[string]any{"ok": false, "message": "No destination folder specified."}) return } var errs []string for _, f := range req.Files { if err := downloadManifestFile(f.URL, filepath.Join(req.DestFolder, f.Filename)); err != nil { errs = append(errs, f.Filename+": "+err.Error()) } } total := len(req.Files) if len(errs) > 0 { writeJSON(w, map[string]any{ "ok": false, "message": fmt.Sprintf("%d/%d downloaded.\n\nErrors:\n%s", total-len(errs), total, strings.Join(errs, "\n")), }) } else { writeJSON(w, map[string]any{ "ok": true, "message": fmt.Sprintf("Done! %d file%s downloaded to: %s", total, pluralS(total), req.DestFolder), }) } }