From e12308e8bbc106089bca2c845966cef71fdfba14 Mon Sep 17 00:00:00 2001 From: Suvodip Date: Sat, 15 Mar 2025 16:26:42 +0530 Subject: [PATCH] game screenshot --- src/routes/api/takeSnap.js | 167 +++++++++++++++++++++++++++---------- src/routes/v1/api.route.js | 2 +- 2 files changed, 123 insertions(+), 46 deletions(-) diff --git a/src/routes/api/takeSnap.js b/src/routes/api/takeSnap.js index 7957537..280469e 100644 --- a/src/routes/api/takeSnap.js +++ b/src/routes/api/takeSnap.js @@ -1,52 +1,129 @@ -const puppeteer = require("puppeteer"); -const axios = require("axios"); +// const { execSync } = require('child_process'); + +// const gameIds = [ +// '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', +// '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', +// '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', +// '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100', '101', +// '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', '115', '116', +// '117', '118', '119', '120', '121', '122', '123', '124', '125', '126', '127', '128', '129', '130', '131', +// '132', '133', '134', '135', '136', '137', '138', '139', '140', '141', '142', '143', '144', '145', '146', +// '147', '148', '149', '150', '152', '153', '154', '155', '156', '157', '158', '159', '160', '161', '162', +// '163', '164', '165', '166', '167', '168', '169', '170', '171', '172', '173', '174', '175', '176', '177', +// '178', '179', '180', '181', '182', '183', '184', '185', '186', '187', '188', '189', '190', '191', '192', +// '193', '194', '195', '196', '197', '198', '199', '200', '201', '202', '203', '204', '205', '206', '207', +// '208', '209', '210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '220', '221', '222', +// '223', '224', '225', '226', '227', '228', '229', '230', '231', '232', '233', '234', '235', '236', '237', +// '238', '239', '240', '241', '242', '243', '244', '245', '246', '247', '248', '249', '250', '251', '252', +// '253', '254', '255', '256', '257', '258', '259', '260', '261', '262', '263', '264', '265', '266', '267', +// '268', '269', '270', '271', '272', '273', '274', '275', '276', '277', '278', '279', '280', '281', '282', +// '283', '284', '285', '286', '287', '288', '289', '290', '291', '292', '293', '294', '295', '296', '297', +// '298', '299', '300', '301', '302', '303', '304', '305', '306', '307', '308', '309', '310', '311', '312', +// '313', '314', '315', '316', '317', '318', '319', '320', '321', '322', '323', '324', '325', '326', '327', +// '328', '329', '330', '331', '332', '333', '334', '335', '336', '337', '338', '339', '340', '341', '342', +// '343', '344', '345', '346', '347', '348', '349', '350', '351', '352', '353', '354', '355', '356', '357', +// '358', '359', '360', '361', '362', '363', '364', '365', '366', '367', '368', '369', '370', '371', '372', +// '373', '374', '375', '376', '377', '378', '379', '380', '381', '382', '383', '384', '385', '386', '387', +// '388', '389', '390', '391', '392', '393', '394', '395', '396', '397', '398', '399', '400', '401', '402', +// '403', '404', '405', '406', '407', '408', '409', '410', '411', '412', '413', '414', '415', '416', '417', +// '418', '419', '420', '421', '422', '423', '424', '425', '426', '427', '428', '429', '430', '431', '432', +// '433', '434', '435', '436', '437', '438', '439', '440', '441', '442', '443', '444', '445', '446', '447', +// '448', '449', '450', '451', '452', '453', '454', '455', '456', '457', '458', '459', '460', '461', '462', +// '463', '464', '465', '466', '467', '468', '469', '470', '471', '472', '473', '474', '475', '476', '477', +// '478', '479', '480', '481', '482', '483', '484', '485', '486', '487', '488', '489', '490', '491', '492', +// '493', '494', '495', '496', '497', '498', '499', '500', '501', '502', '503', '504', '505', '506', '507', +// '508', '509', '510', '511', '512', '513', '514', '515', '516', '517', '518', '519', '520', '521', '522', +// '524', '525', '526', '527', '528', '529', '530', '531', '532', '533', '534', '535', '536', '537', '538', +// '539', '540', '541', '542', '543', '544', '545', '546', '547', '548', '549', '550', '551', '552', '553', +// '554', '555', '556', '557', '558', '559', '560', '561', '562', '563', '564', '565', '566', '567', '568', +// '903', '904', '905', '906', '907', '908', '909', '910', '911', '912', '913', '914', '915', '916', '917', +// '918', '919' +// ]; + +const { execSync } = require("child_process"); const fs = require("fs"); -const FormData = require("form-data"); const path = require("path"); +const axios = require("axios"); -const takeSnap = async (req, res) => { - try { - const { url, itemId } = req.body; - if (!url || !itemId) { - return res.status(400).json({ error: "URL and itemId are required" }); +const gameIds = ["26", "27"]; + +const SCREENSHOT_FOLDER = path.join(__dirname, "game-screen/drawing"); +if (!fs.existsSync(SCREENSHOT_FOLDER)) { + fs.mkdirSync(SCREENSHOT_FOLDER, { recursive: true }); +} + +const DIRECTUS_API_URL = "https://game-du.teachertrainingkolkata.in/files"; + +async function takeSnap(req, res) { + for (const id of gameIds) { + try { + const url = `https://interaktogames.beanstalkedu.com/drawing?id=${id}`; + console.log(`📸 Taking screenshot for Game ID: ${id}`); + const command = `url2jpg ${url}`; + execSync(command, { stdio: "inherit", shell: true }); + const files = fs.readdirSync(process.cwd()).filter(f => f.endsWith(".jpg")); + if (files.length === 0) throw new Error("No screenshot found!"); + + const latestFile = files.reduce((a, b) => + fs.statSync(b).mtimeMs > fs.statSync(a).mtimeMs ? b : a + ); + const newPath = path.join(SCREENSHOT_FOLDER, `${id}.jpg`); + fs.renameSync(latestFile, newPath); + console.log(`✅ Screenshot saved: ${newPath}`); + const fileId = await uploadToDirectus(newPath); + if (fileId) { + console.log(`📤 Uploaded to Directus. File ID: ${fileId}`); + await updateThumbnail(id, fileId); + } + } catch (error) { + console.error(`❌ Error processing Game ID ${id}:`, error.message); } - - // 1️⃣ Take Screenshot - const browser = await puppeteer.launch({ headless: "new" }); - const page = await browser.newPage(); - await page.goto(url, { waitUntil: "networkidle2" }); - - const screenshotPath = path.join(__dirname, "screenshot.png"); - await page.screenshot({ path: screenshotPath, fullPage: true }); - await browser.close(); - - // 2️⃣ Upload Screenshot to Directus (No Authorization Required) - const formData = new FormData(); - formData.append("file", fs.createReadStream(screenshotPath)); - - const uploadResponse = await axios.post( - "https://game-du.teachertrainingkolkata.in/files", - formData, - { headers: { ...formData.getHeaders() } } // No Authorization needed - ); - - const fileId = uploadResponse.data.data.id; - console.log("File uploaded to Directus with ID:", fileId); - - // 3️⃣ Update Directus Collection (No Authorization Required) - await axios.patch( - `https://game-du.teachertrainingkolkata.in/items/game_drawing_v3/${itemId}`, - { thumbnail: fileId } - ); - - // Delete local file after upload - fs.unlinkSync(screenshotPath); - - res.json({ success: true, fileId, message: "Screenshot taken and uploaded successfully!" }); - } catch (error) { - console.error("Error taking screenshot:", error); - res.status(500).json({ error: "Failed to take screenshot" }); } -}; + + res.json({ message: "All screenshots processed successfully!" }); +} + +async function uploadToDirectus(filePath) { + try { + const fileData = fs.createReadStream(filePath); + + const response = await axios.post( + DIRECTUS_API_URL, + { file: fileData }, + { + headers: { "Content-Type": "multipart/form-data" }, + } + ); + return response.data.data.id; + } catch (error) { + console.error("❌ Failed to upload screenshot to Directus:", error.message); + return null; + } +} + + +async function updateThumbnail(gameId, fileId) { + const UPDATE_THUMBNAIL_URL = "https://game-du.teachertrainingkolkata.in/items/game_drawing/"; + try { + const response = await axios.patch( + `${UPDATE_THUMBNAIL_URL}${gameId}`, + { thumbnail: fileId }, // ✅ No need for "data" wrapper in REST API + { headers: { "Content-Type": "application/json" } } + ); + console.log(`✅ Thumbnail updated for Game ID ${gameId}:`, response.data); + } catch (error) { + console.error(`❌ Failed to update thumbnail for Game ID ${gameId}`); + if (error.response) { + console.error("Response Data:", error.response.data); + console.error("Status Code:", error.response.status); + } else { + console.error("Error Message:", error.message); + } + } +} + + + + module.exports = takeSnap; diff --git a/src/routes/v1/api.route.js b/src/routes/v1/api.route.js index 653cc53..96b5f21 100644 --- a/src/routes/v1/api.route.js +++ b/src/routes/v1/api.route.js @@ -215,7 +215,7 @@ router.get("/ping", (req, res) => { getGameData(req, res); }); - router.post("/takeSnap", (req, res) => { + router.get("/takeSnap", (req, res) => { takeSnap(req, res); });