[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6PBK906SHEVTSTFYX7PHBNM":3,"skill-same:01M6PBK906SHEVTSTFYX7PHBNM":72},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":13,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":51,"install":52,"resources":65},"01M6PBK906SHEVTSTFYX7PHBNM","photopea-embedded-editor",null,"Embed Photopea in web apps using photopea.js. Covers embedding, file I\u002FO, scripting, exporting, layers, text, filters, and the full Photoshop-compatible API.","duc-duy-1612\u002FOnline-Delivery-Systems-Web","duc-duy-1612","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F192231384?v=4","01M6NSDKQQDKVTHZ8DZMZ1VYY6","01M6NSDKW8DDVTQHBT1HBDDJPT",0,"MIT","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fphotopea-embedded-editor\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"photopea embedded editor","editor","embedded","text","layers","embedding","embed","apps","community","master","filters","safe","Photoshop","api","scripting","file","https","license","web","github","2026-11-10 10:12:30",false,"---\nname: photopea-embedded-editor\ndescription: Embed Photopea in web apps using photopea.js. Covers embedding, file I\u002FO, scripting, exporting, layers, text, filters, and the full Photoshop-compatible API.\nrisk: safe\nsource: community\nsource_repo: yikuansun\u002FPhotopeaAPI\nsource_type: community\nlicense: MIT\nlicense_source: \"https:\u002F\u002Fgithub.com\u002Fyikuansun\u002FPhotopeaAPI\u002Fblob\u002Fmaster\u002FLICENSE\"\ndate_added: 2026-05-20\n---\n\n# Photopea Embedded Editor Skill\n\n## Detailed Guide\n\nRead [the detailed guide](references\u002Fdetailed-guide.md) before executing this skill. It retains the complete procedure and reference material. Treat its safety, prerequisites, and validation requirements as mandatory. For focused work, load the relevant sections; for end-to-end work, read the guide completely.\n\n## When to Use This Skill\n\nUse this skill for **every task** that involves:\n- Embedding Photopea as an image editor inside a webpage or web app\n- Controlling an embedded Photopea instance from your JavaScript code\n- Automating image editing workflows from a host page (open files, run scripts, export results)\n- Building an image editing feature into your product using Photopea as the engine\n- Writing scripts to manipulate documents, layers, text, selections, filters, colors, and paths\n\n**Do NOT** use raw `postMessage` wiring — always use `photopea.js` as the wrapper.\n\n---\n\n## Complete Practical Script Examples\n\n### 1. Rename all text layers based on their contents\n```js\napp.preferences.rulerUnits = Units.PIXELS;\nvar doc = app.activeDocument;\n\nfunction processLayers(parent) {\n  for (var i = 0; i \u003C parent.layers.length; i++) {\n    var l = parent.layers[i];\n    if (l.typename === \"LayerSet\") processLayers(l);\n    else if (l.kind === LayerKind.TEXT) {\n      l.name = l.textItem.contents.substring(0, 30);\n    }\n  }\n}\nprocessLayers(doc);\napp.echoToOE(\"done\");\n```\n\n### 2. Export each layer as a separate PNG\n```js\napp.preferences.rulerUnits = Units.PIXELS;\nvar doc = app.activeDocument;\n\nfor (var i = 0; i \u003C doc.layers.length; i++) {\n  \u002F\u002F Hide all layers\n  for (var j = 0; j \u003C doc.layers.length; j++) doc.layers[j].visible = false;\n  \u002F\u002F Show only this layer\n  doc.layers[i].visible = true;\n  \u002F\u002F Export\n  var opts = new ExportOptionsSaveForWeb();\n  opts.format  = SaveDocumentType.PNG;\n  opts.PNG8    = false;\n  opts.quality = 100;\n  doc.exportDocument(\n    new File(\"\u002F\" + doc.layers[i].name + \".png\"),\n    ExportType.SAVEFORWEB, opts\n  );\n}\n\n\u002F\u002F Restore visibility\nfor (var i = 0; i \u003C doc.layers.length; i++) doc.layers[i].visible = true;\n```\n\n### 3. Find and replace text across all text layers\n```js\nvar searchText   = \"2024\";\nvar replaceText  = \"2025\";\n\nfunction findReplaceText(parent) {\n  for (var i = 0; i \u003C parent.layers.length; i++) {\n    var l = parent.layers[i];\n    if (l.typename === \"LayerSet\") findReplaceText(l);\n    else if (l.kind === LayerKind.TEXT) {\n      var t = l.textItem;\n      if (t.contents.indexOf(searchText) !== -1) {\n        t.contents = t.contents.split(searchText).join(replaceText);\n      }\n    }\n  }\n}\nfindReplaceText(app.activeDocument);\napp.echoToOE(\"Find & Replace complete\");\n```\n\n### 4. Grid of duplicate layers\n```js\napp.preferences.rulerUnits = Units.PIXELS;\nvar doc   = app.activeDocument;\nvar layer = doc.activeLayer;\nvar cols  = 4, rows = 3;\nvar padX  = 20, padY = 20;\nvar w = layer.bounds[2] - layer.bounds[0];\nvar h = layer.bounds[3] - layer.bounds[1];\n\nfor (var r = 0; r \u003C rows; r++) {\n  for (var c = 0; c \u003C cols; c++) {\n    if (r === 0 && c === 0) continue; \u002F\u002F skip original\n    var copy = layer.duplicate();\n    var targetX = layer.bounds[0] + c * (w + padX);\n    var targetY = layer.bounds[1] + r * (h + padY);\n    copy.translate(targetX - copy.bounds[0], targetY - copy.bounds[1]);\n    copy.opacity = 100 - (r * cols + c) * 5;\n  }\n}\n```\n\n### 5. Apply watermark from URL\n```js\napp.preferences.rulerUnits = Units.PIXELS;\nvar doc = app.activeDocument;\n\n\u002F\u002F Open watermark as smart object layer\napp.open(\"https:\u002F\u002Fexample.com\u002Fwatermark.png\", null, true);\nvar wm = doc.activeLayer;\n\n\u002F\u002F Resize to 20% of document width\nvar wmW = wm.bounds[2] - wm.bounds[0];\nvar targetW = doc.width * 0.2;\nvar scalePct = (targetW \u002F wmW) * 100;\nwm.resize(scalePct, scalePct, AnchorPosition.TOPLEFT);\n\n\u002F\u002F Move to bottom-right with 20px margin\nvar wmNewW = wm.bounds[2] - wm.bounds[0];\nvar wmNewH = wm.bounds[3] - wm.bounds[1];\nwm.translate(\n  doc.width  - wmNewW - 20 - wm.bounds[0],\n  doc.height - wmNewH - 20 - wm.bounds[1]\n);\nwm.opacity = 60;\napp.echoToOE(\"watermark applied\");\n```\n\n### 6. Get all layer info as JSON\n```js\nfunction getLayerInfo(parent, depth) {\n  depth = depth || 0;\n  var result = [];\n  for (var i = 0; i \u003C parent.layers.length; i++) {\n    var l = parent.layers[i];\n    var info = {\n      name:    l.name,\n      type:    l.typename,\n      visible: l.visible,\n      opacity: l.opacity,\n      depth:   depth\n    };\n    if (l.typename === \"ArtLayer\") {\n      info.kind   = l.kind.toString();\n      info.bounds = [l.bounds[0], l.bounds[1], l.bounds[2], l.bounds[3]];\n      if (l.kind === LayerKind.TEXT) {\n        info.text = l.textItem.contents;\n        info.font = l.textItem.font;\n        info.size = l.textItem.size;\n      }\n    } else if (l.typename === \"LayerSet\") {\n      info.children = getLayerInfo(l, depth + 1);\n    }\n    result.push(info);\n  }\n  return result;\n}\napp.echoToOE(JSON.stringify(getLayerInfo(app.activeDocument)));\n```\n\n---\n\n## Limitations\n\n- This skill covers host-page integration patterns; it does not replace Photopea's own terms, API documentation, or licensing guidance.\n- Remote URL loading depends on browser CORS behavior, network availability, and the user's Photopea account\u002Fsession state.\n- `runScript` executes scripts inside the embedded Photopea document context. Only run scripts you understand and only with user-approved files.\n- Serialize dynamic values with `JSON.stringify` before embedding them in a `runScript` string. Never concatenate user-provided URLs, layer names, or text directly into Photopea script source.\n- Export behavior can vary by document size, browser memory limits, and the formats supported by the active Photopea runtime.\n\n---\n","# Photopea Embedded Editor Skill\n\n## Detailed Guide\n\nRead [the detailed guide](references\u002Fdetailed-guide.md) before executing this skill. It retains the complete procedure and reference material. Treat its safety, prerequisites, and validation requirements as mandatory. For focused work, load the relevant sections; for end-to-end work, read the guide completely.\n\n## When to Use This Skill\n\nUse this skill for **every task** that involves:\n- Embedding Photopea as an image editor inside a webpage or web app\n- Controlling an embedded Photopea instance from your JavaScript code\n- Automating image editing workflows from a host page (open files, run scripts, export results)\n- Building an image editing feature into your product using Photopea as the engine\n- Writing scripts to manipulate documents, layers, text, selections, filters, colors, and paths\n\n**Do NOT** use raw `postMessage` wiring — always use `photopea.js` as the wrapper.\n\n---\n\n## Complete Practical Script Examples\n\n### 1. Rename all text layers based on their contents\n```js\napp.preferences.rulerUnits = Units.PIXELS;\nvar doc = app.activeDocument;\n\nfunction processLayers(parent) {\n  for (var i = 0; i \u003C parent.layers.length; i++) {\n    var l = parent.layers[i];\n    if (l.typename === \"LayerSet\") processLayers(l);\n    else if (l.kind === LayerKind.TEXT) {\n      l.name = l.textItem.contents.substring(0, 30);\n    }\n  }\n}\nprocessLayers(doc);\napp.echoToOE(\"done\");\n```\n\n### 2. Export each layer as a separate PNG\n```js\napp.preferences.rulerUnits = Units.PIXELS;\nvar doc = app.activeDocument;\n\nfor (var i = 0; i \u003C doc.layers.length; i++) {\n  \u002F\u002F Hide all layers\n  for (var j = 0; j \u003C doc.layers.length; j++) doc.layers[j].visible = false;\n  \u002F\u002F Show only this layer\n  doc.layers[i].visible = true;\n  \u002F\u002F Export\n  var opts = new ExportOptionsSaveForWeb();\n  opts.format  = SaveDocumentType.PNG;\n  opts.PNG8    = false;\n  opts.quality = 100;\n  doc.exportDocument(\n    new File(\"\u002F\" + doc.layers[i].name + \".png\"),\n    ExportType.SAVEFORWEB, opts\n  );\n}\n\n\u002F\u002F Restore visibility\nfor (var i = 0; i \u003C doc.layers.length; i++) doc.layers[i].visible = true;\n```\n\n### 3. Find and replace text across all text layers\n```js\nvar searchText   = \"2024\";\nvar replaceText  = \"2025\";\n\nfunction findReplaceText(parent) {\n  for (var i = 0; i \u003C parent.layers.length; i++) {\n    var l = parent.layers[i];\n    if (l.typename === \"LayerSet\") findReplaceText(l);\n    else if (l.kind === LayerKind.TEXT) {\n      var t = l.textItem;\n      if (t.contents.indexOf(searchText) !== -1) {\n        t.contents = t.contents.split(searchText).join(replaceText);\n      }\n    }\n  }\n}\nfindReplaceText(app.activeDocument);\napp.echoToOE(\"Find & Replace complete\");\n```\n\n### 4. Grid of duplicate layers\n```js\napp.preferences.rulerUnits = Units.PIXELS;\nvar doc   = app.activeDocument;\nvar layer = doc.activeLayer;\nvar cols  = 4, rows = 3;\nvar padX  = 20, padY = 20;\nvar w = layer.bounds[2] - layer.bounds[0];\nvar h = layer.bounds[3] - layer.bounds[1];\n\nfor (var r = 0; r \u003C rows; r++) {\n  for (var c = 0; c \u003C cols; c++) {\n    if (r === 0 && c === 0) continue; \u002F\u002F skip original\n    var copy = layer.duplicate();\n    var targetX = layer.bounds[0] + c * (w + padX);\n    var targetY = layer.bounds[1] + r * (h + padY);\n    copy.translate(targetX - copy.bounds[0], targetY - copy.bounds[1]);\n    copy.opacity = 100 - (r * cols + c) * 5;\n  }\n}\n```\n\n### 5. Apply watermark from URL\n```js\napp.preferences.rulerUnits = Units.PIXELS;\nvar doc = app.activeDocument;\n\n\u002F\u002F Open watermark as smart object layer\napp.open(\"https:\u002F\u002Fexample.com\u002Fwatermark.png\", null, true);\nvar wm = doc.activeLayer;\n\n\u002F\u002F Resize to 20% of document width\nvar wmW = wm.bounds[2] - wm.bounds[0];\nvar targetW = doc.width * 0.2;\nvar scalePct = (targetW \u002F wmW) * 100;\nwm.resize(scalePct, scalePct, AnchorPosition.TOPLEFT);\n\n\u002F\u002F Move to bottom-right with 20px margin\nvar wmNewW = wm.bounds[2] - wm.bounds[0];\nvar wmNewH = wm.bounds[3] - wm.bounds[1];\nwm.translate(\n  doc.width  - wmNewW - 20 - wm.bounds[0],\n  doc.height - wmNewH - 20 - wm.bounds[1]\n);\nwm.opacity = 60;\napp.echoToOE(\"watermark applied\");\n```\n\n### 6. Get all layer info as JSON\n```js\nfunction getLayerInfo(parent, depth) {\n  depth = depth || 0;\n  var result = [];\n  for (var i = 0; i \u003C parent.layers.length; i++) {\n    var l = parent.layers[i];\n    var info = {\n      name:    l.name,\n      type:    l.typename,\n      visible: l.visible,\n      opacity: l.opacity,\n      depth:   depth\n    };\n    if (l.typename === \"ArtLayer\") {\n      info.kind   = l.kind.toString();\n      info.bounds = [l.bounds[0], l.bounds[1], l.bounds[2], l.bounds[3]];\n      if (l.kind === LayerKind.TEXT) {\n        info.text = l.textItem.contents;\n        info.font = l.textItem.font;\n        info.size = l.textItem.size;\n      }\n    } else if (l.typename === \"LayerSet\") {\n      info.children = getLayerInfo(l, depth + 1);\n    }\n    result.push(info);\n  }\n  return result;\n}\napp.echoToOE(JSON.stringify(getLayerInfo(app.activeDocument)));\n```\n\n---\n\n## Limitations\n\n- This skill covers host-page integration patterns; it does not replace Photopea's own terms, API documentation, or licensing guidance.\n- Remote URL loading depends on browser CORS behavior, network availability, and the user's Photopea account\u002Fsession state.\n- `runScript` executes scripts inside the embedded Photopea document context. Only run scripts you understand and only with user-approved files.\n- Serialize dynamic values with `JSON.stringify` before embedding them in a `runScript` string. Never concatenate user-provided URLs, layer names, or text directly into Photopea script source.\n- Export behavior can vary by document size, browser memory limits, and the formats supported by the active Photopea runtime.\n\n---\n",{"name":5,"risk":29,"source":26,"license":14,"date_added":43,"description":7,"source_repo":44,"source_type":26,"license_source":45},1779235200000,"yikuansun\u002FPhotopeaAPI","https:\u002F\u002Fgithub.com\u002Fyikuansun\u002FPhotopeaAPI\u002Fblob\u002Fmaster\u002FLICENSE","main","f3312ba749561b6159f477dbfc9313c875d40a56",".agents\u002Fskills_archive\u002Fphotopea-embedded-editor","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612","2026-10-25 23:50:58",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add duc-duy-1612\u002FOnline-Delivery-Systems-Web --skill photopea-embedded-editor",{"tool":58,"command":59},"bunx","bunx skills add duc-duy-1612\u002FOnline-Delivery-Systems-Web --skill photopea-embedded-editor",{"tool":61,"command":62},"pnpm","pnpm dlx skills add duc-duy-1612\u002FOnline-Delivery-Systems-Web --skill photopea-embedded-editor","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fphotopea-embedded-editor\u002FSKILL.md",true,[66],{"path":67,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":70,"sourceHtmlUrl":71},"references\u002Fdetailed-guide.md","REFERENCE","参考文档",45237,"https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fphotopea-embedded-editor\u002Freferences\u002Fdetailed-guide.md",[73,102,126,146,173,197],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":84,"publishedAt":38},"01M6Q0FA5FZ410Z33Z3TFQ4DBA","zero-trust","Implement zero-trust network architecture. Configure identity-based access, micro-segmentation, and continuous verification. Use when implementing modern security architectures.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fzero-trust\u002FSKILL.md",[79],{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[85,86,87,88,89,90,75,91,92,93,94,95,26,46,96,97,98,99,100,101],"ZeRO","trust","zero trust","architecture","assessment","verification","segmentation","devops-security","access","configure","only","active","critical","scope","scripts","relevant","implementing",{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":108,"publishedAt":38},"01M6Q0F1YZJW3KX5FBKEVZ8CV4","zcode-delegate","Delegate coding tasks to the Z.AI ZCode CLI only when the user explicitly requests it, while the orchestrator retains review and landing responsibility.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fzcode-delegate\u002FSKILL.md",[],[109,110,111,112,113,114,115,116,117,118,119,120,121,95,122,26,123,124,97,125],"delegate","zcode","zcode delegate","review","cli","orchestration","tasks","run","Bash","model","node","read","orchestrator","files","desktop app","app","agent-orchestration",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":38},"01M6Q0ETK41VGNMYEXW0T00AJN","youtube-transcript","Fetch YouTube transcripts through DeepAPI or local fallback tooling and save clean text output.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-transcript\u002FSKILL.md",[],[133,134,135,29,37,136,137,35,34,21,138,139,140,26,46,141,142,143,144,145],"transcript","youtube transcript","youtube","codex","research","fetch","tooling","clean","local","output","deepapi","youtube transcripts","blob",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":163,"publishedAt":38},"01M6Q0EPPH2PVMDW40017F8WX0","youtube-transcript-skills","Fetch YouTube video transcripts, search videos\u002Fchannels, browse channels, and extract playlists via the getyoutubetranscript.com API - free tier, no card required.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-transcript-skills\u002FSKILL.md",[152,155,158],{"categoryNo":153,"categoryName":154,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":156,"categoryName":157,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":159,"categoryName":160,"taxonomyType":161,"taxonomyTypeDesc":162},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[133,134,135,164,29,165,37,136,35,166,31,167,168,138,169,26,46,170,171,172],"youtube transcript skills","gemini","search","Video","browse","api-integration","free","card","channels",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":183,"publishedAt":38},"01M6Q0EAB96PX83W5PTE8A0R8D","youtube-notetaker","Turn YouTube talks into local study notes with slides, transcripts, editable annotations, and a markdown-backed viewer.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-notetaker\u002FSKILL.md",[179,182],{"categoryNo":180,"categoryName":181,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":156,"categoryName":157,"taxonomyType":82,"taxonomyTypeDesc":83},[135,184,185,113,29,186,187,188,189,35,167,190,191,192,193,46,194,141,195,196],"youtube notetaker","notetaker","workflow","official","notes","code","markdown","slides","annotations","README","study","dair-academy","viewer",{"skillNo":198,"name":199,"nameZh":6,"description":200,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":201,"categories":202,"keywords":204,"publishedAt":38},"01M6Q0E55F0GW5MX48V8HXS8B5","youtube-full","Fetch YouTube transcripts, search videos, browse channels, and extract playlists via TranscriptAPI — no yt-dlp, no Google API key, works from any cloud server.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-full\u002FSKILL.md",[203],{"categoryNo":153,"categoryName":154,"taxonomyType":82,"taxonomyTypeDesc":83},[205,135,206,207,29,165,166,208,209,31,167,168,138,210,169,26,46,170,211,144],"youtube full","full","google","server","dlp","credits","automatic"]