diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..4c98fd9 Binary files /dev/null and b/.DS_Store differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..37d7e73 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +.env diff --git a/Book Lookup/index.html b/Book Lookup/index.html index 527ad7e..7d0eea3 100644 --- a/Book Lookup/index.html +++ b/Book Lookup/index.html @@ -18,6 +18,7 @@
  • Book List Generator
  • Not At All Chores
  • Book Lookup
  • +
  • Christmas Image Generator
  • diff --git a/Book-List-Generator.html b/Book-List-Generator.html index b10ee1d..8222c38 100644 --- a/Book-List-Generator.html +++ b/Book-List-Generator.html @@ -22,6 +22,7 @@
  • Book List Generator
  • Not At All Chores
  • Book Lookup
  • +
  • Christmas Image Generator
  • Library Book HTML Generator

    diff --git a/Not at all chores.html b/Not at all chores.html index 45b4987..d7947e8 100644 --- a/Not at all chores.html +++ b/Not at all chores.html @@ -4,7 +4,7 @@ Random Song generator - + -
    - Pixel art beard man shrugs + Pixel art beard man shrugs
    @@ -75,7 +76,7 @@

    Random Task Generator

    "Burn and Release", "Ropongi", "Feelin' Fine (Fear)", - "WBirds of a Feather", + "Birds of a Feather", "Learn to live without you", "Best Dressed", "Be Mild", @@ -94,11 +95,19 @@

    Random Task Generator

    "Lilly Rose", "Vicious Rumours", "Women Strange", - "Year of OUr Lord 2012", + "Year of Our Lord 2012", "The Colour is Red", "the Surfer", "Long is the Road", - "the Cukhold's Lament" + "the Cukhold's Lament", + "All your Bass", + "Black Irish", + "Gillards Hill", + "Home - Ben's Song", + "Five Eyes", + "Heart Bleeds Red", + "I'm Aware", + ]; const generateBtn = document.getElementById('generateBtn'); diff --git a/Random Task Generator.html b/Random Task Generator.html index e62eca9..bf165cf 100644 --- a/Random Task Generator.html +++ b/Random Task Generator.html @@ -53,6 +53,7 @@
  • Book List Generator
  • Not At All Chores
  • Book Lookup
  • +
  • Christmas Image Generator
  • Random Task Generator

    diff --git a/api/generate-image.js b/api/generate-image.js new file mode 100644 index 0000000..444f5c2 --- /dev/null +++ b/api/generate-image.js @@ -0,0 +1,33 @@ +const OpenAI = require('openai'); +const formidable = require('formidable'); +const fs = require('fs'); + +module.exports = async (req, res) => { + const openai = new OpenAI({ + apiKey: process.env.OPENAI_API_KEY, + }); + + const form = new formidable.IncomingForm(); + form.parse(req, async (err, fields, files) => { + if (err) { + res.status(500).json({ error: 'Error parsing form data' }); + return; + } + + const imageFile = files.image; + + try { + const image = await openai.images.edit({ + image: fs.createReadStream(imageFile.path), + prompt: 'Add a santa hat to the person in the image', + n: 1, + size: '1024x1024', + }); + + res.status(200).json({ imageUrl: image.data[0].url }); + } catch (error) { + console.error('Error from OpenAI:', error); + res.status(500).json({ error: 'Error generating image' }); + } + }); +}; diff --git a/assets/css/xmasstyle.css b/assets/css/xmasstyle.css new file mode 100644 index 0000000..6e14a72 --- /dev/null +++ b/assets/css/xmasstyle.css @@ -0,0 +1,32 @@ +body { + background-color: #f0f8ff; +} + +h1 { + color: #333; +} + +#video { + border: 3px solid #ccc; + display: block; + margin: 0 auto; +} + +#snap { + display: block; + margin: 10px auto; + padding: 10px 20px; + background-color: #4CAF50; + color: white; + border: none; + cursor: pointer; +} + +#canvas { + display: none; +} + +#image-container { + margin-top: 20px; + text-align: center; +} diff --git a/index.html b/index.html index 6081a84..a0bc8b9 100644 --- a/index.html +++ b/index.html @@ -15,6 +15,7 @@
  • Book List Generator
  • Not At All Chores
  • Book Lookup
  • +
  • Christmas Image Generator
  • diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c1fec1c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,107 @@ +{ + "name": "app", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "app", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "formidable": "^3.5.4", + "openai": "^6.10.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/formidable": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openai": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-6.10.0.tgz", + "integrity": "sha512-ITxOGo7rO3XRMiKA5l7tQ43iNNu+iXGFAcf2t+aWVzzqRaS0i7m1K2BhxNdaveB+5eENhO0VY1FkiZzhBk4v3A==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d30f62c --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "app", + "version": "1.0.0", + "description": "I'm Will I like making things, mostly music and photography but as of today code. Yum Yum code give me all the code I design educational programs(activities) at libraries. Pronouns:He/Him willisaverb@gmail.com", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/willisaverb/Library-Tool-Box.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", + "bugs": { + "url": "https://github.com/willisaverb/Library-Tool-Box/issues" + }, + "homepage": "https://github.com/willisaverb/Library-Tool-Box#readme", + "dependencies": { + "formidable": "^3.5.4", + "openai": "^6.10.0" + } +} diff --git a/xmas-image-generator/.DS_Store b/xmas-image-generator/.DS_Store new file mode 100644 index 0000000..6a1f401 Binary files /dev/null and b/xmas-image-generator/.DS_Store differ diff --git a/xmas-image-generator/christmas-project/.DS_Store b/xmas-image-generator/christmas-project/.DS_Store new file mode 100644 index 0000000..9be7398 Binary files /dev/null and b/xmas-image-generator/christmas-project/.DS_Store differ diff --git a/xmas-image-generator/christmas-project/index.html b/xmas-image-generator/christmas-project/index.html new file mode 100644 index 0000000..d99eee3 --- /dev/null +++ b/xmas-image-generator/christmas-project/index.html @@ -0,0 +1,69 @@ + + + + 🎄 Christmas Webcam Generator + + + +

    🎄 Christmas Webcam Generator

    + + + +
    + + +
    + + +
    Ready to create Christmas magic! 🎅
    + + + + diff --git a/xmas-image-generator/netlify/.DS_Store b/xmas-image-generator/netlify/.DS_Store new file mode 100644 index 0000000..f837cbb Binary files /dev/null and b/xmas-image-generator/netlify/.DS_Store differ diff --git a/xmas-image-generator/netlify/functions/generate-christmas.js b/xmas-image-generator/netlify/functions/generate-christmas.js new file mode 100644 index 0000000..978fc9d --- /dev/null +++ b/xmas-image-generator/netlify/functions/generate-christmas.js @@ -0,0 +1,105 @@ +const https = require('https'); + +exports.handler = async (event, context) => { + // Handle preflight requests + if (event.httpMethod === 'OPTIONS') { + return { + statusCode: 200, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Headers': 'Content-Type', + 'Access-Control-Allow-Methods': 'POST, OPTIONS' + } + }; + } + + try { + const { prompt } = JSON.parse(event.body); + + // Simple working prompt for testing + const christmasPrompt = "christmas scene, santa hat, christmas tree, snow, festive decorations, warm lights, high quality, detailed painting"; + + // Call Hugging Face API + const hfResponse = await new Promise((resolve, reject) => { + const postData = JSON.stringify({ + inputs: christmasPrompt, + parameters: { wait_for_model: true } + }); + + const options = { + hostname: 'api-inference.huggingface.co', + port: 443, + path: '/models/prompthero/openjourney', + method: 'POST', + headers: { + 'Authorization': `Bearer ${process.env.HF_API_KEY}`, + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(postData) + } + }; + + const req = https.request(options, (res) => { + let data = ''; + + res.on('data', (chunk) => { + data += chunk; + }); + + res.on('end', () => { + if (res.statusCode === 200) { + resolve({ + statusCode: 200, + headers: res.headers, + body: data, + isBinary: true + }); + } else { + try { + const errorData = JSON.parse(data); + reject(new Error(`HF API Error: ${JSON.stringify(errorData)}`)); + } catch { + reject(new Error(`HTTP ${res.statusCode}: ${data}`)); + } + } + }); + }); + + req.on('error', (error) => { + reject(error); + }); + + req.write(postData); + req.end(); + }); + + // Convert binary image data to base64 + const imageBuffer = Buffer.from(hfResponse.body, 'binary'); + const base64Image = imageBuffer.toString('base64'); + + return { + statusCode: 200, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + success: true, + imageUrl: `data:image/jpeg;base64,${base64Image}` + }) + }; + + } catch (error) { + console.error('Function error:', error); + return { + statusCode: 500, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + success: false, + error: error.message + }) + }; + } +}; diff --git a/xmas-image-generator/package.json b/xmas-image-generator/package.json new file mode 100644 index 0000000..e01d396 --- /dev/null +++ b/xmas-image-generator/package.json @@ -0,0 +1,7 @@ +{ + "name": "christmas-generator", + "version": "1.0.0", + "dependencies": { + "node-fetch": "^2.6.1" + } +}