Add EasyEDA Pro EPRO2 source ingestion (3/5 batch test)

打通 oshwhub origin=pro 现代 Pro 3.x 工程的 EPRO2 源抓取链路。3/5
modern Pro 项目完整解出(共 8423 docs / 542 MB plain):

- X86 主板        7374 docs / 481 MB plain (chain=85, editor=3.2.15)
- 220V 桌面电源     771 docs /  26 MB plain (chain=28, editor=3.2.69)
- ESP-VoCat       278 docs / 7.5 MB plain (chain=12, editor=3.2.91)

剩余 2/5 是 legacy Pro 2.x(立创泰山派 RK3566、梁山派),项目 meta
返回 branch_uuid=null + editorVersion="2.1.40",没有 git-style chain
模型,文档直接挂在 boards[].sch/pcb 字段上,访问端点暂未挖通;元
数据落库 metadata.json,source/ 留空。

实现要点:
- fetch_pro_source(): 4 步流程(project → branch HEAD → structures
  → /branches/<B>/histories/<HEAD> 即返完整 chain,无需 ?limit 批量
  端点)+ 逐 history 走 AES-128-GCM 解密(16 字节 IV,pycryptodome
  原生支持)+ gunzip + 按 DOCHEAD 切 per-doc EPRO2 流
- EPRO2 解析坑:行末单 `|` 是行终止符不是字段分隔符,必须先
  rstrip("|") 再 split("||"),否则 payload JSON 解析失败 silently
  swallow 导致 cur_doc 不设 → 第一轮 X86 板 7374 docs 抽出来只剩 2 个
- docType 实测远不止 BOARD/PCB/SCH/SCH_PAGE,还含 SYMBOL /
  FOOTPRINT / DEVICE / BLOB / FONT / CONFIG —— Pro 把组件库快照也
  随项目存到 history,下游做 EPRO2→KiCad 转换时必须先把这些 lib
  doc 加载进 symbol cache
- Pro 2.x vs 3.x 是不同存储模型 —— 3.x 走 branch 模型(已打通),
  2.x 走 boards[] 直链(未打通);判别条件:project meta 的
  branch_uuid 是否为 null

CLI 新增 --with-pro-source / --backfill-pro-source / --pro-cookie /
--origin(按 origin 字段服务端过滤 listing API),crawl_one() 按
origin=pro 自动 dispatch 到 Pro fetcher。

schema:docType 类型从 integer 放宽到 [integer, string, null]
(兼容 Std 的 1/3 + Pro 的 BOARD/SCH 等),新增 message_count 字段。

License 注意:本批 5 个项目全是 NC-SA / GPL,未达 Pro source doc
§4.2 Forge 白名单(MIT/BSD/Apache/CC0/CC-BY/CERN-OHL-P/Unlicense)。
按 CLAUDE.md "研究用、不再分发" 原则 raw 入库无碍;Forge 投影时
另过白名单。

详细技术细节见 docs/sources/easyeda_pro_source.md rev 3 + log.md。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-28 21:45:52 +08:00
parent d874278bc5
commit 3282a028c4
8455 changed files with 2275248 additions and 36 deletions

View File

@@ -0,0 +1,49 @@
{"type":"DOCHEAD","ticket":1065}||{"docType":"FOOTPRINT","client":"5796efe0-71be-4764-a7be-8620972bb90b","uuid":"cb15ebcf86ec4355b8a73639e004ce92","updateTime":1736051603000,"version":"1649598688","user":{"uuid":"f6d958b048194965970a097419f0f68a","nickname":"重庆枫叶","username":"cqlcp","avatar":"//image.lceda.cn/avatars/2026/1/FneZQD4JKfDDm92UUIa483axw2OD9PF1E07L9Aby.webp"}}|
{"type":"DOCHEAD","ticket":1066}||{"docType":"FOOTPRINT","client":"5796efe0-71be-4764-a7be-8620972bb90b","uuid":"cb15ebcf86ec4355b8a73639e004ce92","updateTime":1736051603000,"version":"1649598688","user":{"uuid":"f6d958b048194965970a097419f0f68a","nickname":"重庆枫叶","username":"cqlcp","avatar":"//image.lceda.cn/avatars/2026/1/FneZQD4JKfDDm92UUIa483axw2OD9PF1E07L9Aby.webp"}}|
{"type":"META","ticket":1067,"id":"META"}||{"title":"SOT-89_L4.5-W2.5-P1.50-LS4.2-BR","description":";SOT-89;SOT-89-3;SOT-89(SOT-89-3);SOT-89_L4.5-W2.5-P1.50-LS4.2-B;SOT-89_L4.5-W2.5-P1.50-LS4.2-BR;ASM3.3V;SOT-89-3L","tags":[],"source":"3e5eee5e08a24397aa1363645c584ed5|0819f05c4eef4c71ace90d822a990e87"}|
{"type":"DOCHEAD"}||{"docType":"FOOTPRINT","client":"4cadbb93f1f928a1","uuid":"cb15ebcf86ec4355b8a73639e004ce92","updateTime":1736051603000,"version":"1649598688","user":{"uuid":"f6d958b048194965970a097419f0f68a","nickname":"重庆枫叶","username":"cqlcp","avatar":"//image.lceda.cn/avatars/2026/1/FneZQD4JKfDDm92UUIa483axw2OD9PF1E07L9Aby.webp"}}|
{"type":"LAYER","ticket":1,"id":"[\"LAYER\",1]"}||{"layerType":"TOP","layerName":"Top Layer","use":true,"show":true,"locked":false,"activeColor":"#FF0000","activateTransparency":1,"inactiveColor":"#7F0000","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":2,"id":"[\"LAYER\",2]"}||{"layerType":"BOTTOM","layerName":"Bottom Layer","use":true,"show":true,"locked":false,"activeColor":"#0000FF","activateTransparency":1,"inactiveColor":"#00007F","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":3,"id":"[\"LAYER\",3]"}||{"layerType":"TOP_SILK","layerName":"Top Silkscreen Layer","use":true,"show":true,"locked":false,"activeColor":"#FFCC00","activateTransparency":1,"inactiveColor":"#7F6600","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":4,"id":"[\"LAYER\",4]"}||{"layerType":"BOT_SILK","layerName":"Bottom Silkscreen Layer","use":true,"show":true,"locked":false,"activeColor":"#66CC33","activateTransparency":1,"inactiveColor":"#336619","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":5,"id":"[\"LAYER\",7]"}||{"layerType":"TOP_PASTE_MASK","layerName":"Top Paste Mask Layer","use":true,"show":true,"locked":false,"activeColor":"#808080","activateTransparency":1,"inactiveColor":"#404040","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":6,"id":"[\"LAYER\",8]"}||{"layerType":"BOT_PASTE_MASK","layerName":"Bottom Paste Mask Layer","use":true,"show":true,"locked":false,"activeColor":"#800000","activateTransparency":1,"inactiveColor":"#400000","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":7,"id":"[\"LAYER\",5]"}||{"layerType":"TOP_SOLDER_MASK","layerName":"Top Solder Mask Layer","use":true,"show":true,"locked":false,"activeColor":"#800080","activateTransparency":1,"inactiveColor":"#400040","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":8,"id":"[\"LAYER\",6]"}||{"layerType":"BOT_SOLDER_MASK","layerName":"Bottom Solder Mask Layer","use":true,"show":true,"locked":false,"activeColor":"#AA00FF","activateTransparency":1,"inactiveColor":"#55007F","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":9,"id":"[\"LAYER\",13]"}||{"layerType":"DOCUMENT","layerName":"Document Layer","use":true,"show":true,"locked":false,"activeColor":"#FFFFFF","activateTransparency":1,"inactiveColor":"#7F7F7F","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":10,"id":"[\"LAYER\",11]"}||{"layerType":"OUTLINE","layerName":"Board Outline Layer","use":true,"show":true,"locked":false,"activeColor":"#FF00FF","activateTransparency":1,"inactiveColor":"#7F007F","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":11,"id":"[\"LAYER\",12]"}||{"layerType":"MULTI","layerName":"Multi-Layer","use":true,"show":true,"locked":false,"activeColor":"#C0C0C0","activateTransparency":1,"inactiveColor":"#606060","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":12,"id":"[\"LAYER\",9]"}||{"layerType":"TOP_ASSEMBLY","layerName":"Top Assembly Layer","use":true,"show":true,"locked":false,"activeColor":"#33CC99","activateTransparency":1,"inactiveColor":"#19664C","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":13,"id":"[\"LAYER\",10]"}||{"layerType":"BOT_ASSEMBLY","layerName":"Bottom Assembly Layer","use":true,"show":true,"locked":false,"activeColor":"#5555FF","activateTransparency":1,"inactiveColor":"#2A2A7F","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":14,"id":"[\"LAYER\",14]"}||{"layerType":"MECHANICAL","layerName":"Mechanical Layer","use":true,"show":true,"locked":false,"activeColor":"#F022F0","activateTransparency":1,"inactiveColor":"#781178","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":15,"id":"[\"LAYER\",52]"}||{"layerType":"COMPONENT_MODEL","layerName":"Component Model Layer","use":true,"show":true,"locked":false,"activeColor":"#FFFFFF","activateTransparency":1,"inactiveColor":"#7F7F7F","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":16,"id":"[\"LAYER\",48]"}||{"layerType":"COMPONENT_SHAPE","layerName":"Component Shape Layer","use":true,"show":true,"locked":false,"activeColor":"#00CCCC","activateTransparency":1,"inactiveColor":"#006666","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":17,"id":"[\"LAYER\",51]"}||{"layerType":"PIN_FLOATING","layerName":"Pin Floating Layer","use":true,"show":true,"locked":false,"activeColor":"#FF99FF","activateTransparency":1,"inactiveColor":"#7F4C7F","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":18,"id":"[\"LAYER\",49]"}||{"layerType":"COMPONENT_MARKING","layerName":"Component Marking Layer","use":true,"show":true,"locked":false,"activeColor":"#66FFCC","activateTransparency":1,"inactiveColor":"#337F66","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":19,"id":"[\"LAYER\",47]"}||{"layerType":"HOLE","layerName":"Hole Layer","use":true,"show":true,"locked":false,"activeColor":"#222222","activateTransparency":1,"inactiveColor":"#111111","inactiveTransparency":0.5}|
{"type":"LAYER","ticket":20,"id":"[\"LAYER\",50]"}||{"layerType":"PIN_SOLDERING","layerName":"Pin Soldering Layer","use":true,"show":true,"locked":false,"activeColor":"#CC9999","activateTransparency":1,"inactiveColor":"#664C4C","inactiveTransparency":0.5}|
{"type":"ACTIVE_LAYER","ticket":21,"id":"ACTIVE_LAYER"}||{"layerId":1}|
{"type":"ACTIVE_LAYER","ticket":22,"id":"ACTIVE_LAYER"}||{"layerId":1}|
{"type":"CANVAS","ticket":23,"id":"CANVAS"}||{"originX":0,"originY":0,"unit":"mm","gridXSize":10,"gridYSize":10,"snapXSize":0.03937,"snapYSize":0.03937,"gridType":"NONE","multiGridType":"NONE","highlightValue":0.5}|
{"type":"ELE_PLACEHOLDER","ticket":24,"id":"placeholder1"}||{"dataType":"FILL","max":1}|
{"type":"FILL","ticket":25,"id":"e1"}||{"groupId":0,"netName":"","layerId":49,"width":0.2,"fillStyle":"SOLID","path":[["CIRCLE",68.064,-88.578,2.362]],"locked":false,"zIndex":1,"isBridgingCopper":false,"networkList":[],"refs":[]}|
{"type":"ELE_PLACEHOLDER","ticket":26,"id":"placeholder2"}||{"dataType":"FILL","max":1}|
{"type":"FILL","ticket":27,"id":"e3"}||{"groupId":0,"netName":"","layerId":50,"width":0.2,"fillStyle":"SOLID","path":[17.275,-10.236,"L",67.876,-10.236,67.876,10.236,17.275,10.236,-5.363,33.962,-70.718,33.962,-93.355,11.324,-93.355,-11.314,-70.718,-33.952,-5.363,-33.952,17.275,-10.236],"locked":false,"zIndex":3,"isBridgingCopper":false,"networkList":[],"refs":[]}|
{"type":"FILL","ticket":28,"id":"e4"}||{"groupId":0,"netName":"","layerId":50,"width":0.2,"fillStyle":"SOLID","path":[20.82,-49.207,"L",68.064,-49.207,68.064,-68.893,20.82,-68.893,20.82,-49.207],"locked":false,"zIndex":4,"isBridgingCopper":false,"networkList":[],"refs":[]}|
{"type":"FILL","ticket":29,"id":"e5"}||{"groupId":0,"netName":"","layerId":50,"width":0.2,"fillStyle":"SOLID","path":[20.82,68.903,"L",68.064,68.903,68.064,49.217,20.82,49.217,20.82,68.903],"locked":false,"zIndex":5,"isBridgingCopper":false,"networkList":[],"refs":[]}|
{"type":"ELE_PLACEHOLDER","ticket":30,"id":"placeholder3"}||{"dataType":"POLY","max":2}|
{"type":"POLY","ticket":31,"id":"e2"}||{"groupId":0,"netName":"","layerId":13,"width":11.811,"path":["CIRCLE",90.005,-60,5.91],"locked":false,"zIndex":2,"polyType":"NORMAL"}|
{"type":"ELE_PLACEHOLDER","ticket":32,"id":"placeholder4"}||{"dataType":"POLY","max":3}|
{"type":"POLY","ticket":33,"id":"e6"}||{"groupId":0,"netName":"","layerId":48,"width":2,"path":[-73.669,-88.578,"L",-73.669,88.588,24.757,88.588,24.757,-88.578,-73.669,-88.578],"locked":false,"zIndex":6,"polyType":"NORMAL"}|
{"type":"ELE_PLACEHOLDER","ticket":34,"id":"placeholder5"}||{"dataType":"POLY","max":3}|
{"type":"POLY","ticket":35,"id":"e10"}||{"groupId":0,"netName":"","layerId":3,"width":6,"path":[30.755,-91.577,"L",-73.669,-91.577],"locked":false,"zIndex":10,"polyType":"NORMAL"}|
{"type":"POLY","ticket":36,"id":"e11"}||{"groupId":0,"netName":"","layerId":3,"width":6,"path":[-73.669,-91.577,"L",-73.669,-46.348],"locked":false,"zIndex":11,"polyType":"NORMAL"}|
{"type":"POLY","ticket":37,"id":"e12"}||{"groupId":0,"netName":"","layerId":3,"width":6,"path":[30.755,91.587,"L",-73.669,91.587],"locked":false,"zIndex":12,"polyType":"NORMAL"}|
{"type":"POLY","ticket":38,"id":"e13"}||{"groupId":0,"netName":"","layerId":3,"width":6,"path":[-73.669,91.587,"L",-73.669,46.358],"locked":false,"zIndex":13,"polyType":"NORMAL"}|
{"type":"ELE_PLACEHOLDER","ticket":39,"id":"placeholder6"}||{"dataType":"PAD","max":7}|
{"type":"PAD","ticket":40,"id":"e7"}||{"groupId":0,"netName":"","layerId":1,"num":"2","centerX":-53.395,"centerY":0.34,"padAngle":0,"hole":null,"defaultPad":{"padType":"POLYGON","path":[-89.891,37.749,"L",-16.891,37.749,-15.138,37.707,-13.389,37.584,-11.647,37.379,-9.917,37.093,-8.202,36.725,-6.507,36.278,-4.834,35.752,-3.188,35.148,-1.572,34.467,0.011,33.712,1.556,32.883,3.061,31.982,4.522,31.012,5.936,29.975,7.299,28.873,8.61,27.707,9.864,26.482,11.06,25.199,12.194,23.862,13.264,22.473,14.268,21.035,15.203,19.552,16.068,18.026,16.861,16.462,17.579,13.34,84.403,13.34,84.403,-12.644,17.579,-12.644,16.861,-15.768,16.068,-17.332,15.203,-18.858,14.268,-20.341,13.264,-21.779,12.194,-23.168,11.06,-24.505,9.864,-25.788,8.61,-27.013,7.299,-28.179,5.936,-29.281,4.522,-30.318,3.061,-31.288,1.556,-32.189,0.011,-33.018,-1.572,-33.773,-3.188,-34.454,-4.834,-35.058,-6.507,-35.584,-8.202,-36.031,-9.917,-36.399,-11.647,-36.685,-13.389,-36.89,-15.138,-37.013,-16.891,-37.055,-89.891,-37.055,-91.644,-37.013,-93.393,-36.89,-95.135,-36.685,-96.865,-36.399,-98.58,-36.031,-100.275,-35.584,-101.948,-35.058,-103.594,-34.454,-105.21,-33.773,-106.793,-33.018,-108.338,-32.189,-109.843,-31.288,-111.304,-30.318,-112.718,-29.281,-114.081,-28.179,-115.392,-27.013,-116.646,-25.788,-117.842,-24.505,-118.976,-23.168,-120.046,-21.779,-121.05,-20.341,-121.985,-18.858,-122.85,-17.332,-123.643,-15.768,-124.361,-14.168,-125.004,-12.537,-125.569,-10.877,-126.056,-9.192,-126.463,-7.486,-126.79,-5.764,-127.036,-4.027,-127.2,-2.281,-127.282,-0.53,-127.282,1.224,-127.2,2.975,-127.036,4.721,-126.79,6.458,-126.463,8.18,-126.056,9.886,-125.569,11.571,-125.004,13.231,-124.361,14.862,-123.643,16.462,-122.85,18.026,-121.985,19.552,-121.05,21.035,-120.046,22.473,-118.976,23.862,-117.842,25.199,-116.646,26.482,-115.392,27.707,-114.081,28.873,-112.718,29.975,-111.304,31.012,-109.843,31.982,-108.338,32.883,-106.793,33.712,-105.21,34.467,-103.594,35.148,-101.948,35.752,-100.275,36.278,-98.58,36.725,-96.865,37.093,-95.135,37.379,-93.393,37.584,-91.644,37.707,-89.891,37.749]},"specialPad":[],"padOffsetX":0.003,"padOffsetY":0.008,"relativeAngle":0,"plated":true,"padType":"NORMAL","topSolderExpansion":1.9689999999999999,"bottomSolderExpansion":1.9689999999999999,"topPasteExpansion":0,"bottomPasteExpansion":0,"locked":false,"zIndex":7,"connectMode":null,"spokeSpace":null,"spokeWidth":null,"spokeAngle":null,"padLen":0}|
{"type":"PAD","ticket":41,"id":"e8"}||{"groupId":0,"netName":"","layerId":1,"num":"3","centerX":53.395,"centerY":59.06,"padAngle":0,"hole":null,"defaultPad":{"padType":"RECT","width":62.008,"height":26.457,"radius":0},"specialPad":[],"padOffsetX":0.002,"padOffsetY":0,"relativeAngle":0,"plated":true,"padType":"NORMAL","topSolderExpansion":null,"bottomSolderExpansion":null,"topPasteExpansion":null,"bottomPasteExpansion":null,"locked":false,"zIndex":8,"connectMode":null,"spokeSpace":null,"spokeWidth":null,"spokeAngle":null,"padLen":0}|
{"type":"PAD","ticket":42,"id":"e9"}||{"groupId":0,"netName":"","layerId":1,"num":"1","centerX":53.395,"centerY":-59.05,"padAngle":0,"hole":null,"defaultPad":{"padType":"RECT","width":62.008,"height":26.457,"radius":0},"specialPad":[],"padOffsetX":0.002,"padOffsetY":0,"relativeAngle":0,"plated":true,"padType":"NORMAL","topSolderExpansion":null,"bottomSolderExpansion":null,"topPasteExpansion":null,"bottomPasteExpansion":null,"locked":false,"zIndex":9,"connectMode":null,"spokeSpace":null,"spokeWidth":null,"spokeAngle":null,"padLen":0}|
{"type":"ELE_PLACEHOLDER","ticket":43,"id":"placeholder7"}||{"dataType":"ATTR","max":14}|
{"type":"ATTR","ticket":44,"id":"e14"}||{"groupId":0,"parentId":"","layerId":3,"x":null,"y":null,"key":"Footprint","value":"SOT-89_L4.5-W2.5-P1.50-LS4.2-BR","keyVisible":false,"valueVisible":false,"fontFamily":"default","fontSize":67.5,"strokeWidth":6,"bold":false,"italic":false,"origin":"LEFT_BOTTOM","angle":0,"reverse":false,"expansion":0,"mirror":false,"locked":false,"zIndex":14}|
{"type":"ATTR","ticket":45,"id":"e15"}||{"groupId":0,"parentId":"","layerId":3,"x":null,"y":null,"key":"Designator","value":"U?","keyVisible":false,"valueVisible":false,"fontFamily":"default","fontSize":67.5,"strokeWidth":6,"bold":false,"italic":false,"origin":"LEFT_BOTTOM","angle":0,"reverse":false,"expansion":0,"mirror":false,"locked":false,"zIndex":15}|