Action

Add Film to GitHub Action

Posted by thechelsuk, Last update 22 days ago

UPDATES

22 days ago

fix title

show all updates...

22 days ago

fix title

22 days ago

fix description format

About

Given an IMDbcode, Date and Rating this triggers a GitHub Action workflow which populates the data into a Yaml file.

Draft Template output format:

// Line 1: [[Date]]
// Line 1: Film IMDB Code
// Line 2: Rating (integer 1-10)

Note: Uses credentials for repo owner, repo name, PAT posts to GitHub API

Tip

If you find this useful and want to support me, you can tip at ko-fi.com/thechelsuk and check out Links for apps, tools, and more

Steps

  • script

    /*
     * @title: Film to GitHub Actions
     * @author: thechelsuk
     * @notes: Runs a github action to
     * process which adds a film to a yaml
     * datastore. Uses GitHub API to trigger
     */
    
    // === CHECK DRAFT FIRST ===
    if (draft.content && draft.content.trim() !== "") {
        // === GET CREDENTIALS ===
        let credential = Credential.create(
            "GitHub Film Tracker",
            "Enter your GitHub details",
        );
        credential.addTextField("GH_USER", "GitHub Username");
        credential.addTextField("GH_REPO", "Repository Name");
        credential.addPasswordField("GH_PAT", "Personal Access Token");
        credential.authorize();
    
        const GH_USER = credential.getValue("GH_USER");
        const GH_REPO = credential.getValue("GH_REPO");
        const GH_PAT = credential.getValue("GH_PAT");
        const GH_WORKFLOW = "add-film.yml";
    
        // === PARSE DRAFT ===
        let lines = draft.content.split("\n");
    
        let imdbId = null;
        let rating = null;
    
        // Parse each line looking for IMDb: (or IMDb_ID:) and Rating:
        for (let line of lines) {
            line = line.trim();
    
            // Skip empty lines and the # Film header
            if (!line || line.startsWith("#")) {
                continue;
            }
    
            // Extract IMDb ID
            if (line.toLowerCase().startsWith("imdb:")) {
                imdbId = line.substring(5).trim();
            }
    
            if (line.toLowerCase().startsWith("imdb_id:")) {
                imdbId = line.substring(8).trim();
            }
    
            // Extract rating
            if (line.toLowerCase().startsWith("rating:")) {
                rating = line.substring(7).trim();
            }
        }
    
        // Validate we found both IMDb ID and rating
        if (imdbId && rating) {
            // Validate IMDb ID format tt followed by digits
            const imdbPattern = /^tt\d+$/i;
            if (!imdbPattern.test(imdbId)) {
                app.displayErrorMessage("IMDb must be in format tt1234567");
                context.cancel();
            }
    
            // Validate rating is an integer between 1-10
            let ratingNum = parseInt(rating);
            if (
                !isNaN(ratingNum) &&
                ratingNum >= 1 &&
                ratingNum <= 10 &&
                rating === ratingNum.toString()
            ) {
                // Build API URL
                const BASE_URL = "https://api.github.com";
                const API_URL = `${BASE_URL}/repos/${GH_USER}/${GH_REPO}/actions/workflows/${GH_WORKFLOW}/dispatches`;
    
                // Prepare request
                let http = HTTP.create();
    
                let requestData = {
                    ref: "main",
                    inputs: {
                        imdb_id: imdbId,
                        rating: rating,
                    },
                };
    
                let response = http.request({
                    url: API_URL,
                    method: "POST",
                    headers: {
                        Accept: "application/vnd.github+json",
                        Authorization: "Bearer " + GH_PAT,
                        "X-GitHub-Api-Version": "2022-11-28",
                        "Content-Type": "application/json",
                    },
                    data: requestData,
                });
    
                // Check response
                if (response.success && response.statusCode === 204) {
                    app.displaySuccessMessage(
                        "Film added: " + imdbId + " (" + rating + ")",
                    );
    
                    // Archive the draft after successful submission
                    draft.isArchived = true;
                    draft.update();
                } else {
                    app.displayErrorMessage(
                        "GitHub API error: " + response.statusCode,
                    );
                    console.log("Response: " + JSON.stringify(response));
                    context.fail();
                }
            } else {
                app.displayErrorMessage(
                    "Rating must be an integer between 1 and 10",
                );
                context.cancel();
            }
        } else {
            let missing = [];
            if (!imdbId) missing.push("IMDb");
            if (!rating) missing.push("Rating");
            app.displayErrorMessage("Missing: " + missing.join(" and "));
            context.cancel();
        }
    } else {
        app.displayErrorMessage("Draft is empty. Add an IMDb ID and rating first.");
        context.cancel();
    }
    

Options

  • After Success Archive
    Notification Info
    Log Level Info
Items available in the Drafts Directory are uploaded by community members. Use appropriate caution reviewing downloaded items before use.