diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..7694d37 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +# data/raw///files/ 下是原始附件,一律走 LFS(不管后缀)。 +# 元数据(metadata.json / description.md / _urls.json / cover.*)留在普通 git。 +data/raw/**/files/** filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index 19592fc..43ef8b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,11 @@ -# Data outputs (大文件不入库,走 LFS 或外部存储) -# 忽略目录内容,保留目录本身(靠 .gitkeep 占位) -data/raw/* +# Derivative 数据(可从 raw 重建),不入库 data/processed/* data/state/* -!data/raw/.gitkeep !data/processed/.gitkeep !data/state/.gitkeep +# data/raw 入库(工程二进制走 LFS,见 .gitattributes) + # Python __pycache__/ *.py[cod] diff --git a/crawlers/__init__.py b/crawlers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/crawlers/oshwhub/__init__.py b/crawlers/oshwhub/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/crawlers/oshwhub/__main__.py b/crawlers/oshwhub/__main__.py new file mode 100644 index 0000000..a4a3b13 --- /dev/null +++ b/crawlers/oshwhub/__main__.py @@ -0,0 +1,4 @@ +from .crawler import main + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/crawlers/oshwhub/crawler.py b/crawlers/oshwhub/crawler.py new file mode 100644 index 0000000..f0c05e6 --- /dev/null +++ b/crawlers/oshwhub/crawler.py @@ -0,0 +1,436 @@ +"""oshwhub.com crawler — MVP. + +Usage: + uv run python -m crawlers.oshwhub \ + --out data/raw/oshwhub \ + --top 10 --min-likes 50 --min-grade 4 + +Or with explicit UUID list: + uv run python -m crawlers.oshwhub \ + --uuids 298873b7fdbe44f8ba0e7351e023bc2c,7b6a398811f14eba9a952b8d2ddd7ace \ + --out data/raw/oshwhub +""" + +from __future__ import annotations + +import argparse +import dataclasses as dc +import hashlib +import html as _html +import json +import re +import sys +import time +import urllib.parse +from datetime import datetime, timezone +from pathlib import Path +from typing import Iterator + +import httpx + +API_LIST = "https://oshwhub.com/api/project" +BASE = "https://oshwhub.com" +IMG_CDN = "https://image.lceda.cn" +UA = "FacereDataset/0.1 (+https://git.deepknow.site/Facere/FacereDataset)" +SLEEP_BETWEEN = 2.0 # seconds between detail-page / file fetches + + +# --------------------------------------------------------------------------- +# HTTP +# --------------------------------------------------------------------------- + +def make_client(timeout: float = 30.0) -> httpx.Client: + return httpx.Client( + http2=True, + timeout=timeout, + headers={"User-Agent": UA, "Accept": "text/html,application/json;q=0.9,*/*;q=0.8"}, + follow_redirects=True, + ) + + +def polite_sleep() -> None: + time.sleep(SLEEP_BETWEEN) + + +# --------------------------------------------------------------------------- +# Listing +# --------------------------------------------------------------------------- + +def list_projects( + client: httpx.Client, + page: int = 1, + page_size: int = 30, + sort: str = "hot", +) -> dict: + r = client.get(API_LIST, params={"page": page, "pageSize": page_size, "sort": sort}) + r.raise_for_status() + data = r.json() + if not data.get("success"): + raise RuntimeError(f"list API failed: {data}") + return data["result"] + + +def rank_score(item: dict) -> float: + """Composite quality score: favor projects with broad engagement.""" + c = item["count"] + return ( + c["like"] * 3 + + c["star"] * 1 + + c["fork"] * 2 + + c["views"] / 100 + + item["comments_count"] * 2 + + (item.get("grade") or 0) * 50 + ) + + +def pick_top( + items: list[dict], + n: int, + min_likes: int, + min_grade: int, + exclude_copies: bool = True, +) -> list[dict]: + filtered = [] + for it in items: + if exclude_copies and "_copy" in it["path"]: + continue + if it["count"]["like"] < min_likes: + continue + if (it.get("grade") or 0) < min_grade: + continue + filtered.append(it) + filtered.sort(key=rank_score, reverse=True) + return filtered[:n] + + +# --------------------------------------------------------------------------- +# Detail page parsing +# --------------------------------------------------------------------------- + +RE_ATTACH_BLOCK = re.compile(r'\\"attachments\\":\[', re.DOTALL) +RE_LICENSE = re.compile(r'\\"license\\":\\"([^\\"]+)\\"') +RE_META_DESC = re.compile( + r'([^<]+)", re.IGNORECASE) + + +def _find_balanced_bracket(s: str, start: int, open_ch: str = "[", close_ch: str = "]") -> int: + """Return index after the matching close bracket. start must point at open_ch.""" + assert s[start] == open_ch + depth = 0 + for i in range(start, len(s)): + ch = s[i] + if ch == open_ch: + depth += 1 + elif ch == close_ch: + depth -= 1 + if depth == 0: + return i + 1 + raise ValueError("unbalanced") + + +def parse_detail_html(h: str) -> dict: + """Extract attachments, license, title, description from SSR HTML.""" + out: dict = { + "title": None, + "description_meta": None, + "license": None, + "attachments": [], + } + + m = RE_TITLE.search(h) + if m: + # HTML entities + suffix stripping + title = _html.unescape(m.group(1)).strip() + for sfx in ( + " - 立创开源硬件平台 - 深圳创电优选科技有限公司", + " - 立创开源硬件平台", + ): + if title.endswith(sfx): + title = title[: -len(sfx)] + out["title"] = title + + m = RE_META_DESC.search(h) + if m: + out["description_meta"] = _html.unescape(m.group(1)) + + m = RE_LICENSE.search(h) + if m: + out["license"] = m.group(1) + + m = RE_ATTACH_BLOCK.search(h) + if m: + arr_start = m.end() - 1 # point at '[' + arr_end = _find_balanced_bracket(h, arr_start) + block = h[arr_start:arr_end] + clean = block.replace('\\"', '"').replace("\\\\", "\\") + try: + out["attachments"] = json.loads(clean) + except json.JSONDecodeError as e: + # Keep raw for debugging; skip attachments silently. Caller can log. + out["_attachments_parse_error"] = str(e) + + return out + + +# --------------------------------------------------------------------------- +# Download helpers +# --------------------------------------------------------------------------- + +def download_to(client: httpx.Client, url: str, dest: Path) -> tuple[int, str]: + """Stream-download url to dest. Returns (size, sha256).""" + dest.parent.mkdir(parents=True, exist_ok=True) + h = hashlib.sha256() + size = 0 + with client.stream("GET", url) as r: + r.raise_for_status() + with open(dest, "wb") as f: + for chunk in r.iter_bytes(1 << 15): + f.write(chunk) + h.update(chunk) + size += len(chunk) + return size, h.hexdigest() + + +# --------------------------------------------------------------------------- +# Single-project crawl +# --------------------------------------------------------------------------- + +@dc.dataclass +class CrawlResult: + project_id: str + out_dir: Path + files_count: int + bytes_total: int + skipped_files: list[str] + + +def crawl_one( + client: httpx.Client, + list_item: dict, + out_root: Path, + fetch_files: bool = True, +) -> CrawlResult: + uuid = list_item["uuid"] + path = list_item["path"] + proj_dir = out_root / uuid + proj_dir.mkdir(parents=True, exist_ok=True) + + # 1. Fetch detail HTML + detail_url = f"{BASE}/{path}" + r = client.get(detail_url) + r.raise_for_status() + detail = parse_detail_html(r.text) + polite_sleep() + + # 2. Cover image + thumb_url = list_item["thumb"] + if thumb_url.startswith("//"): + thumb_url = "https:" + thumb_url + cover_rel = None + if thumb_url: + ext = Path(urllib.parse.urlparse(thumb_url).path).suffix or ".jpg" + cover_rel = f"cover{ext}" + try: + download_to(client, thumb_url, proj_dir / cover_rel) + except httpx.HTTPError as e: + print(f" cover failed: {e}", file=sys.stderr) + cover_rel = None + polite_sleep() + + # 3. Description markdown (combine meta + introduction) + desc_md_parts = [f"# {list_item['name']}\n"] + if detail.get("description_meta"): + desc_md_parts.append(detail["description_meta"].strip()) + elif list_item.get("introduction"): + desc_md_parts.append(list_item["introduction"].strip()) + desc_md_parts.append( + f"\n---\n" + f"- Source: {detail_url}\n" + f"- Author: {list_item['owner'].get('nickname')} " + f"({list_item['owner'].get('username')})\n" + f"- License: {detail.get('license') or 'unknown'}\n" + f"- Published: {list_item.get('oshwhub_publish_at')}\n" + ) + (proj_dir / "description.md").write_text("\n".join(desc_md_parts), encoding="utf-8") + + # 4. Files + files_meta: list[dict] = [] + skipped: list[str] = [] + bytes_total = 0 + for a in detail.get("attachments", []): + src = a.get("src") or "" + if not src: + continue + file_url = IMG_CDN + src if src.startswith("/") else src + name = a.get("name") or Path(src).name + safe_name = re.sub(r'[/\\:*?"<>|]', "_", name) + local_rel = f"files/{safe_name}" + local_path = proj_dir / local_rel + + entry: dict = { + "name": name, + "url": file_url, + "original_id": a.get("uuid"), + "ext": a.get("ext"), + "mime": a.get("mime"), + "size": a.get("size"), + "md5": a.get("md5"), + } + if fetch_files: + try: + size, sha = download_to(client, file_url, local_path) + entry["path"] = local_rel + entry["sha256"] = sha + if entry.get("size") and entry["size"] != size: + entry["size_actual"] = size + else: + entry["size"] = size + bytes_total += size + except httpx.HTTPError as e: + skipped.append(f"{name}: {e}") + print(f" file skipped {name}: {e}", file=sys.stderr) + polite_sleep() + files_meta.append(entry) + + # 5. URL manifest (for files we couldn't download or for future re-download) + urls_manifest = { + "detail_url": detail_url, + "cover_url": thumb_url, + "attachments": [ + {"name": f["name"], "url": f["url"], "original_id": f.get("original_id")} + for f in files_meta + ], + } + (proj_dir / "_urls.json").write_text( + json.dumps(urls_manifest, ensure_ascii=False, indent=2), encoding="utf-8" + ) + + # 6. Unified metadata + meta = { + "source": "oshwhub", + "source_url": detail_url, + "project_id": uuid, + "title": detail.get("title") or list_item["name"], + "description_short": list_item.get("introduction") or "", + "description_path": "description.md", + "author": { + "username": list_item["owner"]["username"], + "display_name": list_item["owner"].get("nickname"), + "user_id": list_item["owner"].get("uuid"), + }, + "license": detail.get("license") or "unknown", + "tags": list_item.get("tags") or [], + "created_at": list_item.get("created_at"), + "updated_at": list_item.get("updated_at"), + "published_at": list_item.get("oshwhub_publish_at"), + "crawled_at": datetime.now(timezone.utc).isoformat(), + "metrics": { + "likes": list_item["count"]["like"], + "stars": list_item["count"]["star"], + "forks": list_item["count"]["fork"], + "views": list_item["count"]["views"], + "watch": list_item["count"].get("watch", 0), + "comments": list_item.get("comments_count", 0), + }, + "cover": {"url": thumb_url, "path": cover_rel} if thumb_url else None, + "files": files_meta, + "raw_fields": { + "path": list_item["path"], + "grade": list_item.get("grade"), + "origin": list_item.get("origin"), + "public": list_item.get("public"), + "publish": list_item.get("publish"), + "skipped_files": skipped, + }, + } + (proj_dir / "metadata.json").write_text( + json.dumps(meta, ensure_ascii=False, indent=2), encoding="utf-8" + ) + + return CrawlResult( + project_id=uuid, + out_dir=proj_dir, + files_count=len(files_meta), + bytes_total=bytes_total, + skipped_files=skipped, + ) + + +# --------------------------------------------------------------------------- +# CLI +# --------------------------------------------------------------------------- + +def iter_candidates( + client: httpx.Client, + pages: int, + page_size: int, + sort: str, +) -> Iterator[dict]: + for p in range(1, pages + 1): + res = list_projects(client, page=p, page_size=page_size, sort=sort) + for it in res["lists"]: + yield it + polite_sleep() + + +def main(argv: list[str] | None = None) -> int: + ap = argparse.ArgumentParser(description="oshwhub MVP crawler") + ap.add_argument("--out", type=Path, default=Path("data/raw/oshwhub")) + ap.add_argument("--top", type=int, default=10, help="number of projects to crawl") + ap.add_argument("--min-likes", type=int, default=50) + ap.add_argument("--min-grade", type=int, default=4) + ap.add_argument("--pages", type=int, default=3, help="list API pages to scan") + ap.add_argument("--page-size", type=int, default=30) + ap.add_argument("--sort", default="hot") + ap.add_argument("--uuids", type=str, default=None, help="comma-separated explicit UUID list") + ap.add_argument("--no-files", action="store_true", help="do not download attachments") + ap.add_argument("--limit", type=int, default=None, help="override --top, same effect") + args = ap.parse_args(argv) + + n_target = args.limit if args.limit is not None else args.top + args.out.mkdir(parents=True, exist_ok=True) + + with make_client() as client: + # Build list of items to crawl + if args.uuids: + wanted = set(args.uuids.split(",")) + items: list[dict] = [] + for it in iter_candidates(client, args.pages, args.page_size, args.sort): + if it["uuid"] in wanted: + items.append(it) + if len(items) == len(wanted): + break + if len(items) < len(wanted): + missing = wanted - {i["uuid"] for i in items} + print(f"WARN: missing uuids (not in top pages): {missing}", file=sys.stderr) + else: + pool = list(iter_candidates(client, args.pages, args.page_size, args.sort)) + items = pick_top( + pool, n=n_target, min_likes=args.min_likes, min_grade=args.min_grade + ) + if len(items) < n_target: + print( + f"WARN: only {len(items)} items passed filters " + f"(wanted {n_target})", + file=sys.stderr, + ) + + print(f"Crawling {len(items)} projects -> {args.out}") + for i, it in enumerate(items, 1): + print(f"[{i}/{len(items)}] {it['path']} ({it['name']})") + try: + r = crawl_one(client, it, args.out, fetch_files=not args.no_files) + print( + f" OK: {r.files_count} files, {r.bytes_total / 1024 / 1024:.1f} MB " + f"(skipped: {len(r.skipped_files)})" + ) + except Exception as e: + print(f" FAIL: {e}", file=sys.stderr) + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/_urls.json b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/_urls.json new file mode 100644 index 0000000..9c6b5b0 --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/_urls.json @@ -0,0 +1,71 @@ +{ + "detail_url": "https://oshwhub.com/qaxslk/dai-PD-QCyou-pian-jian-ce-yi-ji-", + "cover_url": "https://image.lceda.cn/pullimage/Xl5EY8fMBTiXzXkTPdbza8bTdtaqEHzKjVZyI5rF.jpeg", + "attachments": [ + { + "name": "pd诱骗、检测&emarker读取演示.mp4", + "url": "https://image.lceda.cn/attachments/2022/7/uTn5lxDhfdtLIUHzLAJQlfdEqtf59MNG1ct1xOwv.mp4", + "original_id": "8227d8f1af9942ada85c34c0bae46520" + }, + { + "name": "电流监测及功能演示.mp4", + "url": "https://image.lceda.cn/attachments/2022/7/Hrxaxo9kD6biCRjTHRPz9lihZPDspQxTyUOmj0ZP.mp4", + "original_id": "5a38d4a5c90c4c929ee6afd90685c54a" + }, + { + "name": "qc诱骗演示.mp4", + "url": "https://image.lceda.cn/attachments/2022/7/TPVFa8A5CZUYDDcjwqLqGh2CasxOhQuwJwCrTUoV.mp4", + "original_id": "8ec5c15c8a884581b93ea7c92e0fd537" + }, + { + "name": "flash_download_tool_3.9.2_0.zip", + "url": "https://image.lceda.cn/attachments/2022/8/zxKZnl7dstHkJzcCJsSCZH8Z3h4xv3r0dJ9pz4OR.zip", + "original_id": "4ebd8bd9cdc04174a33eabde9ad178b6" + }, + { + "name": "iic测试.bin", + "url": "https://image.lceda.cn/attachments/2022/8/vry47jDECDC6Oi580rjR3A8kPBqxUEqrua6CyTHJ.bin", + "original_id": "62f50e21b4794a849019abf339cb0a87" + }, + { + "name": "BOM清单.csv", + "url": "https://image.lceda.cn/attachments/2022/8/bgFVrW1VricnDvTBz3teVuMEZHn5p01utREdg1fB.txt", + "original_id": "1bf37839d71245baa542e5edd2c87c51" + }, + { + "name": "IBOM焊接图.zip", + "url": "https://image.lceda.cn/attachments/2022/9/AMssLlo7nElKEtewGB5MR9CCltg0o1ANYHcLHIlc.zip", + "original_id": "9510dc61265243f691828f76ed24eb0c" + }, + { + "name": "新版本直通监测,主界面,PD监测抓包,Emarker读取演示.mp4", + "url": "https://image.lceda.cn/attachments/2023/3/ml3J4ndhkWtv85i37YK1bXUyl8ss2Me00izGjSPv.mp4", + "original_id": "aacf4846545f4b26a2ca90355e51ead3" + }, + { + "name": "新版本PD,PPS诱骗,PD抓包,Emarker读取演示.mp4", + "url": "https://image.lceda.cn/attachments/2023/3/UoNgPZVjkgceMl8H1AlPv0HGYMX0cGpSjz71rCzO.mp4", + "original_id": "323305b48e6a4fd99de89d4892f2b8ca" + }, + { + "name": "新版本QC,QC3诱骗演示.mp4", + "url": "https://image.lceda.cn/attachments/2023/3/GVI4oTGtFn7v7M97a0wCk713lRsC0FI9gtSBtemK.mp4", + "original_id": "c4a07773431643e28aa45a3d523e7869" + }, + { + "name": "新版本设置项等其它功能演示.mp4", + "url": "https://image.lceda.cn/attachments/2023/3/okBYwyFpliRTbS0WjOq3nDOd8VArZNrienxnYOd5.mp4", + "original_id": "cfe67e3dd4bb44bea05a6b07fa396618" + }, + { + "name": "TTL1.2.3 免注册.bin", + "url": "https://image.lceda.cn/oshwhub/project/attachments/3c8beccc8bb645d7900f78ff8b5bd511.bin", + "original_id": "44872f72038747a8b42ad88b812a3443" + }, + { + "name": "OTA1.2.3 免注册.bin", + "url": "https://image.lceda.cn/oshwhub/project/attachments/72261283c1a44d9d9c48e1a3a7c332b4.bin", + "original_id": "2172e76f1d4d42ccb4d89d2a27d7be5f" + } + ] +} \ No newline at end of file diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/cover.jpeg b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/cover.jpeg new file mode 100644 index 0000000..4cee70a Binary files /dev/null and b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/cover.jpeg differ diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/description.md b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/description.md new file mode 100644 index 0000000..8a8dafc --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/description.md @@ -0,0 +1,9 @@ +# 支持PD3.1/米PPS与Emarker读取的USB电压电流表 + +基于ESP32-PICO-D4的USB功率计,实现了PD3.1/PPS/QC的监测与诱骗,支持米私有诱骗、Emarker读取以及诸多其他功能,具体功能可看项目功能介绍。 + +--- +- Source: https://oshwhub.com/qaxslk/dai-PD-QCyou-pian-jian-ce-yi-ji- +- Author: qaxslk (qaxslk) +- License: CC BY-NC-SA 4.0 +- Published: 2024-06-07T01:11:10.000Z diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/BOM清单.csv b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/BOM清单.csv new file mode 100644 index 0000000..3741fb0 --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/BOM清单.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b8a51addcda633de81d5d18e5b4e708304a45b8e2814c64ee17d7ce6339fd11 +size 12530 diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/IBOM焊接图.zip b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/IBOM焊接图.zip new file mode 100644 index 0000000..661d6a1 --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/IBOM焊接图.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eadc67396a41531c691454dcaa1597c99988975d498a3a19bdf93cb2354bd1d3 +size 107801 diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/OTA1.2.3 免注册.bin b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/OTA1.2.3 免注册.bin new file mode 100644 index 0000000..c163338 --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/OTA1.2.3 免注册.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7d6bb3ae33ec3809c69ef26c3af19a0c57c775f2ce36af4a18c6d5136b24693 +size 1454944 diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/TTL1.2.3 免注册.bin b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/TTL1.2.3 免注册.bin new file mode 100644 index 0000000..228d72b --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/TTL1.2.3 免注册.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c7a4e934b296944b462e3a511795b5e17c58319a6ee2d3f630ff8a3c5af9c44 +size 1520480 diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/flash_download_tool_3.9.2_0.zip b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/flash_download_tool_3.9.2_0.zip new file mode 100644 index 0000000..f22e4e7 --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/flash_download_tool_3.9.2_0.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3cfc172dad907b1aa24a5424b3d682ff26d5786fb8bc6bbd58c0138ce012c32 +size 32734744 diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/iic测试.bin b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/iic测试.bin new file mode 100644 index 0000000..50cc454 --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/iic测试.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7419ef6b09267c66925ccb5caf599115c9d147c12336080423bb90fc0d12ac2b +size 285584 diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/pd诱骗、检测&emarker读取演示.mp4 b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/pd诱骗、检测&emarker读取演示.mp4 new file mode 100644 index 0000000..1e30289 --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/pd诱骗、检测&emarker读取演示.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ddb738a0acc396f9f7bc7d7a37d62f4874f113442fdccffe98b7d11f8d4d16e +size 42014963 diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/qc诱骗演示.mp4 b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/qc诱骗演示.mp4 new file mode 100644 index 0000000..d27a9d8 --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/qc诱骗演示.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6752cefab7403f0964fce635e87d3efc0915f0dbc95799c8cd8235ca3ad8152d +size 43307009 diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/新版本PD,PPS诱骗,PD抓包,Emarker读取演示.mp4 b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/新版本PD,PPS诱骗,PD抓包,Emarker读取演示.mp4 new file mode 100644 index 0000000..b0247b8 --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/新版本PD,PPS诱骗,PD抓包,Emarker读取演示.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b764917ab6b04766fdcb8ce41f96c065ad1bbe4e34cb2ece4a94044aa8865a1 +size 16394310 diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/新版本QC,QC3诱骗演示.mp4 b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/新版本QC,QC3诱骗演示.mp4 new file mode 100644 index 0000000..a54a1a3 --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/新版本QC,QC3诱骗演示.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9d8108ab0701b02a36e5384a9b046a6c7dfb8b0d0aaceb0c8766fda2fb5366d +size 9525550 diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/新版本直通监测,主界面,PD监测抓包,Emarker读取演示.mp4 b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/新版本直通监测,主界面,PD监测抓包,Emarker读取演示.mp4 new file mode 100644 index 0000000..2beda18 --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/新版本直通监测,主界面,PD监测抓包,Emarker读取演示.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abe0194ae357a4b381648abe774e48a02c94d12305f1d6dee2e7dfe95f8a5fae +size 21536979 diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/新版本设置项等其它功能演示.mp4 b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/新版本设置项等其它功能演示.mp4 new file mode 100644 index 0000000..fa8ddba --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/新版本设置项等其它功能演示.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71249c098d89e07e224556818875c9c821f5356137c578576b52e1d6d418d55d +size 14885852 diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/电流监测及功能演示.mp4 b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/电流监测及功能演示.mp4 new file mode 100644 index 0000000..2285e6d --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/files/电流监测及功能演示.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62ea7eb1b512dc89326f222148903247389e6d1e1d1d06a86d01411b941fc78b +size 30663097 diff --git a/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/metadata.json b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/metadata.json new file mode 100644 index 0000000..250bfd5 --- /dev/null +++ b/data/raw/oshwhub/1a1e865568d04db59a5a140dd3f13581/metadata.json @@ -0,0 +1,184 @@ +{ + "source": "oshwhub", + "source_url": "https://oshwhub.com/qaxslk/dai-PD-QCyou-pian-jian-ce-yi-ji-", + "project_id": "1a1e865568d04db59a5a140dd3f13581", + "title": "支持PD3.1/米PPS与Emarker读取的USB电压电流表", + "description_short": "基于ESP32-PICO-D4的USB功率计,实现了PD3.1/PPS/QC的监测与诱骗,支持米私有诱骗、Emarker读取以及诸多其他功能,具体功能可看项目功能介绍。", + "description_path": "description.md", + "author": { + "username": "qaxslk", + "display_name": "qaxslk", + "user_id": "5ff188711e4342099df5e500bc5a464c" + }, + "license": "CC BY-NC-SA 4.0", + "tags": [], + "created_at": "2022-07-13T15:55:26.000Z", + "updated_at": "2025-12-24T02:04:01.000Z", + "published_at": "2024-06-07T01:11:10.000Z", + "crawled_at": "2026-04-23T11:30:39.860358+00:00", + "metrics": { + "likes": 1215, + "stars": 2695, + "forks": 1146, + "views": 306681, + "watch": 0, + "comments": 448 + }, + "cover": { + "url": "https://image.lceda.cn/pullimage/Xl5EY8fMBTiXzXkTPdbza8bTdtaqEHzKjVZyI5rF.jpeg", + "path": "cover.jpeg" + }, + "files": [ + { + "name": "pd诱骗、检测&emarker读取演示.mp4", + "url": "https://image.lceda.cn/attachments/2022/7/uTn5lxDhfdtLIUHzLAJQlfdEqtf59MNG1ct1xOwv.mp4", + "original_id": "8227d8f1af9942ada85c34c0bae46520", + "ext": "mp4", + "mime": "video/mp4", + "size": 42014963, + "md5": "27b4c853705de1e2c8f3dbacbe932c06", + "path": "files/pd诱骗、检测&emarker读取演示.mp4", + "sha256": "7ddb738a0acc396f9f7bc7d7a37d62f4874f113442fdccffe98b7d11f8d4d16e" + }, + { + "name": "电流监测及功能演示.mp4", + "url": "https://image.lceda.cn/attachments/2022/7/Hrxaxo9kD6biCRjTHRPz9lihZPDspQxTyUOmj0ZP.mp4", + "original_id": "5a38d4a5c90c4c929ee6afd90685c54a", + "ext": "mp4", + "mime": "video/mp4", + "size": 30663097, + "md5": "ce92545afce40853be91a4b35fd31a74", + "path": "files/电流监测及功能演示.mp4", + "sha256": "62ea7eb1b512dc89326f222148903247389e6d1e1d1d06a86d01411b941fc78b" + }, + { + "name": "qc诱骗演示.mp4", + "url": "https://image.lceda.cn/attachments/2022/7/TPVFa8A5CZUYDDcjwqLqGh2CasxOhQuwJwCrTUoV.mp4", + "original_id": "8ec5c15c8a884581b93ea7c92e0fd537", + "ext": "mp4", + "mime": "video/mp4", + "size": 43307009, + "md5": "f2645fc0c007df8a76a687a34fe1e9c5", + "path": "files/qc诱骗演示.mp4", + "sha256": "6752cefab7403f0964fce635e87d3efc0915f0dbc95799c8cd8235ca3ad8152d" + }, + { + "name": "flash_download_tool_3.9.2_0.zip", + "url": "https://image.lceda.cn/attachments/2022/8/zxKZnl7dstHkJzcCJsSCZH8Z3h4xv3r0dJ9pz4OR.zip", + "original_id": "4ebd8bd9cdc04174a33eabde9ad178b6", + "ext": "zip", + "mime": "application/x-zip-compressed", + "size": 32734744, + "md5": "4f493dae92337d5b2a91735e9243a551", + "path": "files/flash_download_tool_3.9.2_0.zip", + "sha256": "b3cfc172dad907b1aa24a5424b3d682ff26d5786fb8bc6bbd58c0138ce012c32" + }, + { + "name": "iic测试.bin", + "url": "https://image.lceda.cn/attachments/2022/8/vry47jDECDC6Oi580rjR3A8kPBqxUEqrua6CyTHJ.bin", + "original_id": "62f50e21b4794a849019abf339cb0a87", + "ext": "bin", + "mime": "application/octet-stream", + "size": 285584, + "md5": "e62c5dcadbbb36a066a4f98fea76c2d1", + "path": "files/iic测试.bin", + "sha256": "7419ef6b09267c66925ccb5caf599115c9d147c12336080423bb90fc0d12ac2b" + }, + { + "name": "BOM清单.csv", + "url": "https://image.lceda.cn/attachments/2022/8/bgFVrW1VricnDvTBz3teVuMEZHn5p01utREdg1fB.txt", + "original_id": "1bf37839d71245baa542e5edd2c87c51", + "ext": "txt", + "mime": "application/octet-stream", + "size": 12530, + "md5": "025fc254292a1a2985695e9634a3bdbc", + "path": "files/BOM清单.csv", + "sha256": "0b8a51addcda633de81d5d18e5b4e708304a45b8e2814c64ee17d7ce6339fd11" + }, + { + "name": "IBOM焊接图.zip", + "url": "https://image.lceda.cn/attachments/2022/9/AMssLlo7nElKEtewGB5MR9CCltg0o1ANYHcLHIlc.zip", + "original_id": "9510dc61265243f691828f76ed24eb0c", + "ext": "zip", + "mime": "application/x-zip-compressed", + "size": 107801, + "md5": "dd51ef36f5cfb614d81b94742e0bf527", + "path": "files/IBOM焊接图.zip", + "sha256": "eadc67396a41531c691454dcaa1597c99988975d498a3a19bdf93cb2354bd1d3" + }, + { + "name": "新版本直通监测,主界面,PD监测抓包,Emarker读取演示.mp4", + "url": "https://image.lceda.cn/attachments/2023/3/ml3J4ndhkWtv85i37YK1bXUyl8ss2Me00izGjSPv.mp4", + "original_id": "aacf4846545f4b26a2ca90355e51ead3", + "ext": "mp4", + "mime": "video/mp4", + "size": 21536979, + "md5": "c68d8d5d2e8794c0a0242773c0d6784c", + "path": "files/新版本直通监测,主界面,PD监测抓包,Emarker读取演示.mp4", + "sha256": "abe0194ae357a4b381648abe774e48a02c94d12305f1d6dee2e7dfe95f8a5fae" + }, + { + "name": "新版本PD,PPS诱骗,PD抓包,Emarker读取演示.mp4", + "url": "https://image.lceda.cn/attachments/2023/3/UoNgPZVjkgceMl8H1AlPv0HGYMX0cGpSjz71rCzO.mp4", + "original_id": "323305b48e6a4fd99de89d4892f2b8ca", + "ext": "mp4", + "mime": "video/mp4", + "size": 16394310, + "md5": "93991863eeb592c0c661e5871d247e14", + "path": "files/新版本PD,PPS诱骗,PD抓包,Emarker读取演示.mp4", + "sha256": "9b764917ab6b04766fdcb8ce41f96c065ad1bbe4e34cb2ece4a94044aa8865a1" + }, + { + "name": "新版本QC,QC3诱骗演示.mp4", + "url": "https://image.lceda.cn/attachments/2023/3/GVI4oTGtFn7v7M97a0wCk713lRsC0FI9gtSBtemK.mp4", + "original_id": "c4a07773431643e28aa45a3d523e7869", + "ext": "mp4", + "mime": "video/mp4", + "size": 9525550, + "md5": "d79bd2e739cfd4569f7550cb2cb166d0", + "path": "files/新版本QC,QC3诱骗演示.mp4", + "sha256": "a9d8108ab0701b02a36e5384a9b046a6c7dfb8b0d0aaceb0c8766fda2fb5366d" + }, + { + "name": "新版本设置项等其它功能演示.mp4", + "url": "https://image.lceda.cn/attachments/2023/3/okBYwyFpliRTbS0WjOq3nDOd8VArZNrienxnYOd5.mp4", + "original_id": "cfe67e3dd4bb44bea05a6b07fa396618", + "ext": "mp4", + "mime": "video/mp4", + "size": 14885852, + "md5": "aa0ad712586d956f96061cac9af9579a", + "path": "files/新版本设置项等其它功能演示.mp4", + "sha256": "71249c098d89e07e224556818875c9c821f5356137c578576b52e1d6d418d55d" + }, + { + "name": "TTL1.2.3 免注册.bin", + "url": "https://image.lceda.cn/oshwhub/project/attachments/3c8beccc8bb645d7900f78ff8b5bd511.bin", + "original_id": "44872f72038747a8b42ad88b812a3443", + "ext": "bin", + "mime": "application/octet-stream", + "size": 1520480, + "md5": "dbd936ed6a9b9120a610a7f9ca67efe8", + "path": "files/TTL1.2.3 免注册.bin", + "sha256": "1c7a4e934b296944b462e3a511795b5e17c58319a6ee2d3f630ff8a3c5af9c44" + }, + { + "name": "OTA1.2.3 免注册.bin", + "url": "https://image.lceda.cn/oshwhub/project/attachments/72261283c1a44d9d9c48e1a3a7c332b4.bin", + "original_id": "2172e76f1d4d42ccb4d89d2a27d7be5f", + "ext": "bin", + "mime": "application/octet-stream", + "size": 1454944, + "md5": "25b84659cd5224d89232935b3d1a4d47", + "path": "files/OTA1.2.3 免注册.bin", + "sha256": "b7d6bb3ae33ec3809c69ef26c3af19a0c57c775f2ce36af4a18c6d5136b24693" + } + ], + "raw_fields": { + "path": "qaxslk/dai-PD-QCyou-pian-jian-ce-yi-ji-", + "grade": 4, + "origin": "std", + "public": true, + "publish": true, + "skipped_files": [] + } +} \ No newline at end of file diff --git a/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/_urls.json b/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/_urls.json new file mode 100644 index 0000000..193026f --- /dev/null +++ b/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/_urls.json @@ -0,0 +1,16 @@ +{ + "detail_url": "https://oshwhub.com/wesd/h7b0-re-cheng-xiang", + "cover_url": "https://image.lceda.cn/pullimage/t7auihPq2yo15qct0rCwUXUdBubfIkMhOd1UqaJ1.jpeg", + "attachments": [ + { + "name": "1.zip", + "url": "https://image.lceda.cn/attachments/2022/10/aWLQlbeyYn7SOVykc2x9OWuHpCi5TpXJZfzuQVXS.zip", + "original_id": "ad6720dbc62a4152aa6267e24621a700" + }, + { + "name": "H7B0_IRCAM.rar", + "url": "https://image.lceda.cn/attachments/2023/11/40UrslRfPUk0LUDL5UzA1d8QLzSKrn8lZS41hpxk.rar", + "original_id": "516214a3934d43e1a8395923f923a777" + } + ] +} \ No newline at end of file diff --git a/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/cover.jpeg b/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/cover.jpeg new file mode 100644 index 0000000..8405ede Binary files /dev/null and b/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/cover.jpeg differ diff --git a/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/description.md b/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/description.md new file mode 100644 index 0000000..d684f71 --- /dev/null +++ b/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/description.md @@ -0,0 +1,9 @@ +# 手持红外热成像 + +MLX90640+STM32H7B0的红外热成像,外加一颗ov7670摄像头做辅助显示,最高可做到32HZ的刷新率。 + +--- +- Source: https://oshwhub.com/wesd/h7b0-re-cheng-xiang +- Author: wesd (wesd) +- License: CERN Open Hardware License +- Published: 2023-11-08T01:25:18.000Z diff --git a/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/files/1.zip b/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/files/1.zip new file mode 100644 index 0000000..e8fcd7a --- /dev/null +++ b/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/files/1.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9210315e8660a91932567dafac2959fc31f20bb05e8992363bad44d422144f1d +size 524804 diff --git a/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/files/H7B0_IRCAM.rar b/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/files/H7B0_IRCAM.rar new file mode 100644 index 0000000..8caab43 --- /dev/null +++ b/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/files/H7B0_IRCAM.rar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6de1749d1fc88b637d06dced7e6da14610c5f44c3879bdbbbb5c66f73b81652 +size 2968329 diff --git a/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/metadata.json b/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/metadata.json new file mode 100644 index 0000000..1142ea7 --- /dev/null +++ b/data/raw/oshwhub/1b09581d66d34438a1e6513e457e0532/metadata.json @@ -0,0 +1,63 @@ +{ + "source": "oshwhub", + "source_url": "https://oshwhub.com/wesd/h7b0-re-cheng-xiang", + "project_id": "1b09581d66d34438a1e6513e457e0532", + "title": "手持红外热成像", + "description_short": "MLX90640+STM32H7B0的红外热成像,外加一颗ov7670摄像头做辅助显示,最高可做到32HZ的刷新率。", + "description_path": "description.md", + "author": { + "username": "wesd", + "display_name": "wesd", + "user_id": "b3f7b33189a14088aa30416e034eca7f" + }, + "license": "CERN Open Hardware License", + "tags": [], + "created_at": "2022-09-06T13:54:54.000Z", + "updated_at": "2025-07-16T04:50:13.000Z", + "published_at": "2023-11-08T01:25:18.000Z", + "crawled_at": "2026-04-23T11:31:34.277837+00:00", + "metrics": { + "likes": 247, + "stars": 646, + "forks": 175, + "views": 73081, + "watch": 0, + "comments": 266 + }, + "cover": { + "url": "https://image.lceda.cn/pullimage/t7auihPq2yo15qct0rCwUXUdBubfIkMhOd1UqaJ1.jpeg", + "path": "cover.jpeg" + }, + "files": [ + { + "name": "1.zip", + "url": "https://image.lceda.cn/attachments/2022/10/aWLQlbeyYn7SOVykc2x9OWuHpCi5TpXJZfzuQVXS.zip", + "original_id": "ad6720dbc62a4152aa6267e24621a700", + "ext": "zip", + "mime": "application/x-zip-compressed", + "size": 524804, + "md5": "7b5d94829be2e562228791a3ce9041ec", + "path": "files/1.zip", + "sha256": "9210315e8660a91932567dafac2959fc31f20bb05e8992363bad44d422144f1d" + }, + { + "name": "H7B0_IRCAM.rar", + "url": "https://image.lceda.cn/attachments/2023/11/40UrslRfPUk0LUDL5UzA1d8QLzSKrn8lZS41hpxk.rar", + "original_id": "516214a3934d43e1a8395923f923a777", + "ext": "rar", + "mime": "application/octet-stream", + "size": 2968329, + "md5": "ba10570948bc2e24abb66bce0b7231e0", + "path": "files/H7B0_IRCAM.rar", + "sha256": "c6de1749d1fc88b637d06dced7e6da14610c5f44c3879bdbbbb5c66f73b81652" + } + ], + "raw_fields": { + "path": "wesd/h7b0-re-cheng-xiang", + "grade": 4, + "origin": "std", + "public": true, + "publish": true, + "skipped_files": [] + } +} \ No newline at end of file diff --git a/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/_urls.json b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/_urls.json new file mode 100644 index 0000000..3a207fe --- /dev/null +++ b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/_urls.json @@ -0,0 +1,41 @@ +{ + "detail_url": "https://oshwhub.com/CYIIOT/ST_LINK-V2_1", + "cover_url": "https://image.lceda.cn/avatars/2020/7/QGOICt1FmLQGlyFeTCShZUHzaN0thIW2Xhv0nmSs.jpeg", + "attachments": [ + { + "name": "ST-Link V2.1官方图纸.pdf", + "url": "https://image.lceda.cn/attachments/2020/7/mRn5hQZRhmx5r4usGxFmy8BXsCIHw5QoAT5HaLGC.pdf", + "original_id": "83ade303f9824d67b189378f9068648e" + }, + { + "name": "STLinkV2.J16.S4_固件.zip", + "url": "https://image.lceda.cn/attachments/2020/7/TSTPA8NInE8TfdNLjAVjBkcnXvFEhQ8RoA5SUzn4.zip", + "original_id": "aff1059cee92438d8d50f5c9937e31e0" + }, + { + "name": "STLinkV2.J28.M18_固件.zip", + "url": "https://image.lceda.cn/attachments/2020/7/qnbaX4ArFPq1kC6rNr5PCqaKPr6XdvfX27ZRGpFn.zip", + "original_id": "faa5cc219eb145a5a43c66dc4ad55cbc" + }, + { + "name": "【发行公告】RN0093-firmware-upgrade-for-stlink-stlinkv2-stlinkv21-and-stlinkv3-boards-stmicroelectronics.pdf", + "url": "https://image.lceda.cn/attachments/2020/7/j1hsq6ByuWAiMHckonVoLGNqa3z47mp7D5w5n7e7.pdf", + "original_id": "80ede3877efd4cdabcc6fae174046452" + }, + { + "name": "【技术说明】TN1235 Overview of ST-LINK derivatives.pdf", + "url": "https://image.lceda.cn/attachments/2020/7/dVO0hjpKz38q7ZtvFtEviPmVF60BIJDfScdnK9sB.pdf", + "original_id": "ce58b59a45464ed58475c1c7e191570a" + }, + { + "name": "ST-LINK V2-1 固件烧录.mp4", + "url": "https://image.lceda.cn/attachments/2020/7/5ZfKD020NJcGs5mQ7H9MGh1WwSvy4RHY7TeTObfv.mp4", + "original_id": "1a443f96ecd849648278b2b6d2e7f670" + }, + { + "name": "en.stsw-link007_V2-37-26.zip", + "url": "https://image.lceda.cn/attachments/2021/6/ZZO5tNxsae0LKhQ2aQ2VkZl0l0B94PSaFeVsmdqQ.zip", + "original_id": "7b431bd72f1c4f3d87d8dba98c171175" + } + ] +} \ No newline at end of file diff --git a/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/cover.jpeg b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/cover.jpeg new file mode 100644 index 0000000..09e6883 Binary files /dev/null and b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/cover.jpeg differ diff --git a/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/description.md b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/description.md new file mode 100644 index 0000000..e930aa1 --- /dev/null +++ b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/description.md @@ -0,0 +1,9 @@ +# 自制ST-LINK V2-1(开源版本) + +最近迷上了攻城狮工具的制作,因手头有个潘多拉开发板,板载一个STLINK/V2.1,这玩意支持STM32调试,还带了一个虚拟串口和虚拟U盘下载,所以用立创EDA打造了一个小巧的STLINK/V2.1 + +--- +- Source: https://oshwhub.com/CYIIOT/ST_LINK-V2_1 +- Author: 攻城狮神木 (CYIIOT) +- License: GPL 3.0 +- Published: 2025-12-01T02:55:40.000Z diff --git a/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/ST-LINK V2-1 固件烧录.mp4 b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/ST-LINK V2-1 固件烧录.mp4 new file mode 100644 index 0000000..797ac04 --- /dev/null +++ b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/ST-LINK V2-1 固件烧录.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31e81fadb0f3c67064dd87e8a269b76abcb2660a574c1f0c384ff1509b95fe73 +size 18953976 diff --git a/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/ST-Link V2.1官方图纸.pdf b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/ST-Link V2.1官方图纸.pdf new file mode 100644 index 0000000..3ab3b87 --- /dev/null +++ b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/ST-Link V2.1官方图纸.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a73fdfe732b60d4c7482a09fc4464460bac7b4afcfdca014a9d33f8099b126cd +size 183323 diff --git a/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/STLinkV2.J16.S4_固件.zip b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/STLinkV2.J16.S4_固件.zip new file mode 100644 index 0000000..5cc8e54 --- /dev/null +++ b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/STLinkV2.J16.S4_固件.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c20db3e7512df2afc60dbad3bffeb8a743ea1ff7d160b877874c66d7fcb97bfb +size 31004 diff --git a/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/STLinkV2.J28.M18_固件.zip b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/STLinkV2.J28.M18_固件.zip new file mode 100644 index 0000000..eb90917 --- /dev/null +++ b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/STLinkV2.J28.M18_固件.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b58d6ee8ee51098868a1aae30fcf5ea104f2be6005d10a14858ee2f546eae607 +size 42906 diff --git a/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/en.stsw-link007_V2-37-26.zip b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/en.stsw-link007_V2-37-26.zip new file mode 100644 index 0000000..3b20b17 --- /dev/null +++ b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/en.stsw-link007_V2-37-26.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef6a58b366c6004553ce2bf45bed934f17f88e6b87da1df30d56956c65aa2c3b +size 1597918 diff --git a/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/【发行公告】RN0093-firmware-upgrade-for-stlink-stlinkv2-stlinkv21-and-stlinkv3-boards-stmicroelectronics.pdf b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/【发行公告】RN0093-firmware-upgrade-for-stlink-stlinkv2-stlinkv21-and-stlinkv3-boards-stmicroelectronics.pdf new file mode 100644 index 0000000..302ceaf --- /dev/null +++ b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/【发行公告】RN0093-firmware-upgrade-for-stlink-stlinkv2-stlinkv21-and-stlinkv3-boards-stmicroelectronics.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9536752ee47a63f86a17b68a99abe3e1e9238370d63dfe602e44b386a2c49342 +size 226423 diff --git a/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/【技术说明】TN1235 Overview of ST-LINK derivatives.pdf b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/【技术说明】TN1235 Overview of ST-LINK derivatives.pdf new file mode 100644 index 0000000..679d851 --- /dev/null +++ b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/files/【技术说明】TN1235 Overview of ST-LINK derivatives.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03db2b7a4a4161160f697c84f49ad61401a09dca77b8e9b7ae8bfca5d1995cf7 +size 876773 diff --git a/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/metadata.json b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/metadata.json new file mode 100644 index 0000000..f1f508a --- /dev/null +++ b/data/raw/oshwhub/298873b7fdbe44f8ba0e7351e023bc2c/metadata.json @@ -0,0 +1,118 @@ +{ + "source": "oshwhub", + "source_url": "https://oshwhub.com/CYIIOT/ST_LINK-V2_1", + "project_id": "298873b7fdbe44f8ba0e7351e023bc2c", + "title": "自制ST-LINK V2-1(开源版本)", + "description_short": "最近迷上了攻城狮工具的制作,因手头有个潘多拉开发板,板载一个STLINK/V2.1,这玩意支持STM32调试,还带了一个虚拟串口和虚拟U盘下载,所以用立创EDA打造了一个小巧的STLINK/V2.1", + "description_path": "description.md", + "author": { + "username": "CYIIOT", + "display_name": "攻城狮神木", + "user_id": "367b6ee2c2114a459898e14b1268a641" + }, + "license": "GPL 3.0", + "tags": [], + "created_at": "2020-07-21T08:18:03.000Z", + "updated_at": "2026-04-15T07:42:15.000Z", + "published_at": "2025-12-01T02:55:40.000Z", + "crawled_at": "2026-04-23T11:25:21.265012+00:00", + "metrics": { + "likes": 863, + "stars": 1947, + "forks": 996, + "views": 239671, + "watch": 0, + "comments": 369 + }, + "cover": { + "url": "https://image.lceda.cn/avatars/2020/7/QGOICt1FmLQGlyFeTCShZUHzaN0thIW2Xhv0nmSs.jpeg", + "path": "cover.jpeg" + }, + "files": [ + { + "name": "ST-Link V2.1官方图纸.pdf", + "url": "https://image.lceda.cn/attachments/2020/7/mRn5hQZRhmx5r4usGxFmy8BXsCIHw5QoAT5HaLGC.pdf", + "original_id": "83ade303f9824d67b189378f9068648e", + "ext": "pdf", + "mime": "application/pdf", + "size": 183323, + "md5": "bdb976690426a0e3216ad3aacd9878cc", + "path": "files/ST-Link V2.1官方图纸.pdf", + "sha256": "a73fdfe732b60d4c7482a09fc4464460bac7b4afcfdca014a9d33f8099b126cd" + }, + { + "name": "STLinkV2.J16.S4_固件.zip", + "url": "https://image.lceda.cn/attachments/2020/7/TSTPA8NInE8TfdNLjAVjBkcnXvFEhQ8RoA5SUzn4.zip", + "original_id": "aff1059cee92438d8d50f5c9937e31e0", + "ext": "zip", + "mime": "application/x-zip-compressed", + "size": 31004, + "md5": "d84a96b7110a61e77e479eb8501ec270", + "path": "files/STLinkV2.J16.S4_固件.zip", + "sha256": "c20db3e7512df2afc60dbad3bffeb8a743ea1ff7d160b877874c66d7fcb97bfb" + }, + { + "name": "STLinkV2.J28.M18_固件.zip", + "url": "https://image.lceda.cn/attachments/2020/7/qnbaX4ArFPq1kC6rNr5PCqaKPr6XdvfX27ZRGpFn.zip", + "original_id": "faa5cc219eb145a5a43c66dc4ad55cbc", + "ext": "zip", + "mime": "application/x-zip-compressed", + "size": 42906, + "md5": "5904682016ab096c16b06f5cf232dbc5", + "path": "files/STLinkV2.J28.M18_固件.zip", + "sha256": "b58d6ee8ee51098868a1aae30fcf5ea104f2be6005d10a14858ee2f546eae607" + }, + { + "name": "【发行公告】RN0093-firmware-upgrade-for-stlink-stlinkv2-stlinkv21-and-stlinkv3-boards-stmicroelectronics.pdf", + "url": "https://image.lceda.cn/attachments/2020/7/j1hsq6ByuWAiMHckonVoLGNqa3z47mp7D5w5n7e7.pdf", + "original_id": "80ede3877efd4cdabcc6fae174046452", + "ext": "pdf", + "mime": "application/pdf", + "size": 226423, + "md5": "cde4dedc62b84959b8084a04881443da", + "path": "files/【发行公告】RN0093-firmware-upgrade-for-stlink-stlinkv2-stlinkv21-and-stlinkv3-boards-stmicroelectronics.pdf", + "sha256": "9536752ee47a63f86a17b68a99abe3e1e9238370d63dfe602e44b386a2c49342" + }, + { + "name": "【技术说明】TN1235 Overview of ST-LINK derivatives.pdf", + "url": "https://image.lceda.cn/attachments/2020/7/dVO0hjpKz38q7ZtvFtEviPmVF60BIJDfScdnK9sB.pdf", + "original_id": "ce58b59a45464ed58475c1c7e191570a", + "ext": "pdf", + "mime": "application/pdf", + "size": 876773, + "md5": "6c737c2d8ed697011f9de862f5df3857", + "path": "files/【技术说明】TN1235 Overview of ST-LINK derivatives.pdf", + "sha256": "03db2b7a4a4161160f697c84f49ad61401a09dca77b8e9b7ae8bfca5d1995cf7" + }, + { + "name": "ST-LINK V2-1 固件烧录.mp4", + "url": "https://image.lceda.cn/attachments/2020/7/5ZfKD020NJcGs5mQ7H9MGh1WwSvy4RHY7TeTObfv.mp4", + "original_id": "1a443f96ecd849648278b2b6d2e7f670", + "ext": "mp4", + "mime": "video/mp4", + "size": 18953976, + "md5": "f8547b0850763aed60dde607578c6005", + "path": "files/ST-LINK V2-1 固件烧录.mp4", + "sha256": "31e81fadb0f3c67064dd87e8a269b76abcb2660a574c1f0c384ff1509b95fe73" + }, + { + "name": "en.stsw-link007_V2-37-26.zip", + "url": "https://image.lceda.cn/attachments/2021/6/ZZO5tNxsae0LKhQ2aQ2VkZl0l0B94PSaFeVsmdqQ.zip", + "original_id": "7b431bd72f1c4f3d87d8dba98c171175", + "ext": "zip", + "mime": "application/x-zip-compressed", + "size": 1597918, + "md5": "2fb1abb4c30ef4537743cb837af402d1", + "path": "files/en.stsw-link007_V2-37-26.zip", + "sha256": "ef6a58b366c6004553ce2bf45bed934f17f88e6b87da1df30d56956c65aa2c3b" + } + ], + "raw_fields": { + "path": "CYIIOT/ST_LINK-V2_1", + "grade": 4, + "origin": "std", + "public": true, + "publish": true, + "skipped_files": [] + } +} \ No newline at end of file diff --git a/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/_urls.json b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/_urls.json new file mode 100644 index 0000000..0a86b83 --- /dev/null +++ b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/_urls.json @@ -0,0 +1,41 @@ +{ + "detail_url": "https://oshwhub.com/mojinyinhu/t12858-tong-yong-han-tai", + "cover_url": "https://image.lceda.cn/pullimage/X7qQwpTwtIeTBm2FkJfDZCo0K0tv4ZyyQCrgYJGQ.jpeg", + "attachments": [ + { + "name": "F1-T12-858D-master4.07.zip", + "url": "https://image.lceda.cn/attachments/2022/4/jxFVtEW6XG1wB6AjK8ykfSwqUVDV9OpKiaHqqb51.zip", + "original_id": "456c6c6a13b64483be969f93637e7255" + }, + { + "name": "固件在解压缩后在BINARY文件夹,选取适合自己屏幕固件烧录.txt", + "url": "https://image.lceda.cn/attachments/2022/4/GREMfysm2sIMw6hOBfAwTvzjMdCPXCTAz5oq1jpd.txt", + "original_id": "f25fdd81e5134335a2f56b39da71c501" + }, + { + "name": "校准.txt", + "url": "https://image.lceda.cn/attachments/2022/4/TBGObPjIQG0Z7h9bBrfZdZRKqdfgC9hAiCtaU6G7.txt", + "original_id": "4d9c148dafc64ad6b27dbefed3e8ec2e" + }, + { + "name": "F1_T12+858D编译视频教程.rar", + "url": "https://image.lceda.cn/attachments/2022/4/oIV5aPj2dyXrwODr0PpF9VH16w98TuJmggWB3lJ4.rar", + "original_id": "70d67505c93242a4a3bc7fb91fa7c80d" + }, + { + "name": "T12+858焊台BOM表.xlsx", + "url": "https://image.lceda.cn/attachments/2022/6/y6f0JXE1jHDbcoMVx9prMqU1VQODyNyCggeZFRY3.xlsx", + "original_id": "be2b2cce0ee24fe8838805cacd53ccd0" + }, + { + "name": "PCB_小板合一拼版(二层板)自行导入力创导出gerber.json", + "url": "https://image.lceda.cn/attachments/2022/6/BMkqLsDhiJo2t8op8Ejvwwc8TaKqaooxSzg8a4rQ.txt", + "original_id": "eaba63442d404070b930639390eef369" + }, + { + "name": "PCB_功率板+控制板(四层板)自行导入力创导出_2022-08-21.json", + "url": "https://image.lceda.cn/attachments/2022/8/4LRvXx6WH6DD8V8GPZQEegxSCThDMkr1w4qbe1FT.txt", + "original_id": "ae9d73994d534fd499a456fd9d2f7b40" + } + ] +} \ No newline at end of file diff --git a/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/cover.jpeg b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/cover.jpeg new file mode 100644 index 0000000..07f924c Binary files /dev/null and b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/cover.jpeg differ diff --git a/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/description.md b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/description.md new file mode 100644 index 0000000..59c7dfd --- /dev/null +++ b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/description.md @@ -0,0 +1,9 @@ +# t12-858d烙铁热风枪通用焊台二合一 + +基于开源t12 858设计,重绘电路板到88*38*120铝外壳,最小体积,预留1.4寸TFT SPI接口和iic接口,上到彩屏,也可修改到jbc245来使用,预留了丰富的自定义空间 + +--- +- Source: https://oshwhub.com/mojinyinhu/t12858-tong-yong-han-tai +- Author: mojinyinhu (mojinyinhu) +- License: GPL 3.0 +- Published: 2024-07-26T08:17:03.000Z diff --git a/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/F1-T12-858D-master4.07.zip b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/F1-T12-858D-master4.07.zip new file mode 100644 index 0000000..53c76ff --- /dev/null +++ b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/F1-T12-858D-master4.07.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b01b044b3f370ff17c66a2fe455312876a2b6d61ff818283c2ea747127786c95 +size 33224795 diff --git a/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/F1_T12+858D编译视频教程.rar b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/F1_T12+858D编译视频教程.rar new file mode 100644 index 0000000..4977701 --- /dev/null +++ b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/F1_T12+858D编译视频教程.rar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9da0b74d3757d08493811d888baebd466383126ce241dbe3b6d5f48d9d8b6c08 +size 10367841 diff --git a/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/PCB_功率板+控制板(四层板)自行导入力创导出_2022-08-21.json b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/PCB_功率板+控制板(四层板)自行导入力创导出_2022-08-21.json new file mode 100644 index 0000000..fb1fc1f --- /dev/null +++ b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/PCB_功率板+控制板(四层板)自行导入力创导出_2022-08-21.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7238e5752f2aa763ba4900bac2cff07c8bcfb6b3a316c3809fc5da79ef04ad9 +size 1825835 diff --git a/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/PCB_小板合一拼版(二层板)自行导入力创导出gerber.json b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/PCB_小板合一拼版(二层板)自行导入力创导出gerber.json new file mode 100644 index 0000000..ed57939 --- /dev/null +++ b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/PCB_小板合一拼版(二层板)自行导入力创导出gerber.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f42a140b9183d242da25bdec5b861c4ade79033ddb1a8b39a71690fcd9c09646 +size 780139 diff --git a/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/T12+858焊台BOM表.xlsx b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/T12+858焊台BOM表.xlsx new file mode 100644 index 0000000..bae9770 --- /dev/null +++ b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/T12+858焊台BOM表.xlsx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80b8d57ef1a0615e1b01ba237f906e7063f870e67ccaa966e2ced3bcf3524a10 +size 15738 diff --git a/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/固件在解压缩后在BINARY文件夹,选取适合自己屏幕固件烧录.txt b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/固件在解压缩后在BINARY文件夹,选取适合自己屏幕固件烧录.txt new file mode 100644 index 0000000..413b5c2 --- /dev/null +++ b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/固件在解压缩后在BINARY文件夹,选取适合自己屏幕固件烧录.txt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abe44c2443bdc11876e750df1a927d2365318e20a978ed80ee6461e8ecbab05b +size 84 diff --git a/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/校准.txt b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/校准.txt new file mode 100644 index 0000000..9d075cd --- /dev/null +++ b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/files/校准.txt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9fd2af841a84b6a27dd6c13d81c208d45a02e959a73094efb0b1fa4586f71215 +size 1058 diff --git a/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/metadata.json b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/metadata.json new file mode 100644 index 0000000..f50bf62 --- /dev/null +++ b/data/raw/oshwhub/3e2f893d74664e01b755ccf2582792de/metadata.json @@ -0,0 +1,118 @@ +{ + "source": "oshwhub", + "source_url": "https://oshwhub.com/mojinyinhu/t12858-tong-yong-han-tai", + "project_id": "3e2f893d74664e01b755ccf2582792de", + "title": "t12-858d烙铁热风枪通用焊台二合一", + "description_short": "基于开源t12 858设计,重绘电路板到88*38*120铝外壳,最小体积,预留1.4寸TFT SPI接口和iic接口,上到彩屏,也可修改到jbc245来使用,预留了丰富的自定义空间", + "description_path": "description.md", + "author": { + "username": "mojinyinhu", + "display_name": "mojinyinhu", + "user_id": "2158788da2584d3893fcb09344aa7085" + }, + "license": "GPL 3.0", + "tags": [], + "created_at": "2021-07-08T03:05:48.000Z", + "updated_at": "2026-04-20T02:02:25.000Z", + "published_at": "2024-07-26T08:17:03.000Z", + "crawled_at": "2026-04-23T11:27:21.695580+00:00", + "metrics": { + "likes": 483, + "stars": 1013, + "forks": 395, + "views": 133220, + "watch": 0, + "comments": 293 + }, + "cover": { + "url": "https://image.lceda.cn/pullimage/X7qQwpTwtIeTBm2FkJfDZCo0K0tv4ZyyQCrgYJGQ.jpeg", + "path": "cover.jpeg" + }, + "files": [ + { + "name": "F1-T12-858D-master4.07.zip", + "url": "https://image.lceda.cn/attachments/2022/4/jxFVtEW6XG1wB6AjK8ykfSwqUVDV9OpKiaHqqb51.zip", + "original_id": "456c6c6a13b64483be969f93637e7255", + "ext": "zip", + "mime": "application/x-zip-compressed", + "size": 33224795, + "md5": "2f69640add7a8b42c9b835fe682de26c", + "path": "files/F1-T12-858D-master4.07.zip", + "sha256": "b01b044b3f370ff17c66a2fe455312876a2b6d61ff818283c2ea747127786c95" + }, + { + "name": "固件在解压缩后在BINARY文件夹,选取适合自己屏幕固件烧录.txt", + "url": "https://image.lceda.cn/attachments/2022/4/GREMfysm2sIMw6hOBfAwTvzjMdCPXCTAz5oq1jpd.txt", + "original_id": "f25fdd81e5134335a2f56b39da71c501", + "ext": "txt", + "mime": "text/plain", + "size": 84, + "md5": "aa10d20f9601588d99dc697c4e573e49", + "path": "files/固件在解压缩后在BINARY文件夹,选取适合自己屏幕固件烧录.txt", + "sha256": "abe44c2443bdc11876e750df1a927d2365318e20a978ed80ee6461e8ecbab05b" + }, + { + "name": "校准.txt", + "url": "https://image.lceda.cn/attachments/2022/4/TBGObPjIQG0Z7h9bBrfZdZRKqdfgC9hAiCtaU6G7.txt", + "original_id": "4d9c148dafc64ad6b27dbefed3e8ec2e", + "ext": "txt", + "mime": "text/plain", + "size": 1058, + "md5": "167921cdc21b13a6c85abdb42f2ffba2", + "path": "files/校准.txt", + "sha256": "9fd2af841a84b6a27dd6c13d81c208d45a02e959a73094efb0b1fa4586f71215" + }, + { + "name": "F1_T12+858D编译视频教程.rar", + "url": "https://image.lceda.cn/attachments/2022/4/oIV5aPj2dyXrwODr0PpF9VH16w98TuJmggWB3lJ4.rar", + "original_id": "70d67505c93242a4a3bc7fb91fa7c80d", + "ext": "rar", + "mime": "application/octet-stream", + "size": 10367841, + "md5": "0bbdb68ff491bba65004cbc507a0bb36", + "path": "files/F1_T12+858D编译视频教程.rar", + "sha256": "9da0b74d3757d08493811d888baebd466383126ce241dbe3b6d5f48d9d8b6c08" + }, + { + "name": "T12+858焊台BOM表.xlsx", + "url": "https://image.lceda.cn/attachments/2022/6/y6f0JXE1jHDbcoMVx9prMqU1VQODyNyCggeZFRY3.xlsx", + "original_id": "be2b2cce0ee24fe8838805cacd53ccd0", + "ext": "xlsx", + "mime": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "size": 15738, + "md5": "6f60ccf1daf9f6441f0910827f3476ce", + "path": "files/T12+858焊台BOM表.xlsx", + "sha256": "80b8d57ef1a0615e1b01ba237f906e7063f870e67ccaa966e2ced3bcf3524a10" + }, + { + "name": "PCB_小板合一拼版(二层板)自行导入力创导出gerber.json", + "url": "https://image.lceda.cn/attachments/2022/6/BMkqLsDhiJo2t8op8Ejvwwc8TaKqaooxSzg8a4rQ.txt", + "original_id": "eaba63442d404070b930639390eef369", + "ext": "txt", + "mime": "application/json", + "size": 780139, + "md5": "0298cf1a0e505b3cebcf9f8c0c18adc9", + "path": "files/PCB_小板合一拼版(二层板)自行导入力创导出gerber.json", + "sha256": "f42a140b9183d242da25bdec5b861c4ade79033ddb1a8b39a71690fcd9c09646" + }, + { + "name": "PCB_功率板+控制板(四层板)自行导入力创导出_2022-08-21.json", + "url": "https://image.lceda.cn/attachments/2022/8/4LRvXx6WH6DD8V8GPZQEegxSCThDMkr1w4qbe1FT.txt", + "original_id": "ae9d73994d534fd499a456fd9d2f7b40", + "ext": "txt", + "mime": "application/json", + "size": 1825835, + "md5": "9e4a2e722f2d57539add8750f9e27ff3", + "path": "files/PCB_功率板+控制板(四层板)自行导入力创导出_2022-08-21.json", + "sha256": "e7238e5752f2aa763ba4900bac2cff07c8bcfb6b3a316c3809fc5da79ef04ad9" + } + ], + "raw_fields": { + "path": "mojinyinhu/t12858-tong-yong-han-tai", + "grade": 4, + "origin": "std", + "public": true, + "publish": true, + "skipped_files": [] + } +} \ No newline at end of file diff --git a/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/_urls.json b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/_urls.json new file mode 100644 index 0000000..2f70d17 --- /dev/null +++ b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/_urls.json @@ -0,0 +1,26 @@ +{ + "detail_url": "https://oshwhub.com/sheep_finder/pcb-heng-wen-jia-re-tai", + "cover_url": "https://image.lceda.cn/avatars/2022/10/q3e5mInHcWPvP4K2wqCpzB0dJr8n0tCHj4OJb4Wh.png", + "attachments": [ + { + "name": "加热台量产计划.zip", + "url": "https://image.lceda.cn/attachments/2023/3/3D63VEzSSgu7tMjN4RTiEbDSiqmlo1Yiv6uvNWXk.zip", + "original_id": "bebc0475e03e43199806c4dfc78847b1" + }, + { + "name": "焊接烧录指引v2.pdf", + "url": "https://image.lceda.cn/attachments/2023/4/2AhHlXehkZO4nC0zGTVH5TKH50X0IHZtmacdlfWq.pdf", + "original_id": "3bd33eb9d73b4b4db05820c9fbfccbc1" + }, + { + "name": "加热台Q&A.docx", + "url": "https://image.lceda.cn/attachments/2023/4/RwQkCsS9xv2UWoZ3JbVPgKa7IULczPGBFyk9tWLm.bin", + "original_id": "e5f6f384fb11489f99e27e8aebf06ffb" + }, + { + "name": "2023-2-7 焊接编码器教程.pdf", + "url": "https://image.lceda.cn/attachments/2023/4/8cflSrzwHsuPme258lpLoQLVym2YisHLNzmWsgly.pdf", + "original_id": "21963ef73c534309b1754bd2ce452a2f" + } + ] +} \ No newline at end of file diff --git a/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/cover.png b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/cover.png new file mode 100644 index 0000000..8705f27 Binary files /dev/null and b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/cover.png differ diff --git a/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/description.md b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/description.md new file mode 100644 index 0000000..cba54ce --- /dev/null +++ b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/description.md @@ -0,0 +1,10 @@ +# 加热台量产计划 + +基于启凡科创的物联网加热台优化而来。 +对应启凡科创v2.0版本作出适配 + +--- +- Source: https://oshwhub.com/sheep_finder/pcb-heng-wen-jia-re-tai +- Author: sheep_finder (sheep_finder) +- License: Public Domain +- Published: 2025-11-10T02:35:05.000Z diff --git a/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/files/2023-2-7 焊接编码器教程.pdf b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/files/2023-2-7 焊接编码器教程.pdf new file mode 100644 index 0000000..d6a2d9d --- /dev/null +++ b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/files/2023-2-7 焊接编码器教程.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:933b1d40e5c8a1c80b3499931c002b7d30a408dc2dc9fa1ba8954b772fdd3961 +size 857188 diff --git a/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/files/加热台Q&A.docx b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/files/加热台Q&A.docx new file mode 100644 index 0000000..7be90f2 --- /dev/null +++ b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/files/加热台Q&A.docx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b048901d8851b75257305865f2a9bbf97239756d2c4f0d9ab3b09d1828d95263 +size 13592 diff --git a/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/files/加热台量产计划.zip b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/files/加热台量产计划.zip new file mode 100644 index 0000000..ab7f785 --- /dev/null +++ b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/files/加热台量产计划.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:900f4c61e72a1ab22a113f0d55525244cd5eb072858cb0c4e5c950a7b647ad2e +size 21328814 diff --git a/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/files/焊接烧录指引v2.pdf b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/files/焊接烧录指引v2.pdf new file mode 100644 index 0000000..624de26 --- /dev/null +++ b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/files/焊接烧录指引v2.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1551906d358b75a1ac070a3c13341761d55c0cd378697a90edc4a419ad6c195f +size 1869778 diff --git a/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/metadata.json b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/metadata.json new file mode 100644 index 0000000..a42e53b --- /dev/null +++ b/data/raw/oshwhub/7b6a398811f14eba9a952b8d2ddd7ace/metadata.json @@ -0,0 +1,85 @@ +{ + "source": "oshwhub", + "source_url": "https://oshwhub.com/sheep_finder/pcb-heng-wen-jia-re-tai", + "project_id": "7b6a398811f14eba9a952b8d2ddd7ace", + "title": "加热台量产计划", + "description_short": "基于启凡科创的物联网加热台优化而来。\n对应启凡科创v2.0版本作出适配", + "description_path": "description.md", + "author": { + "username": "sheep_finder", + "display_name": "sheep_finder", + "user_id": "dc43748f38a9490396e4969820abff90" + }, + "license": "Public Domain", + "tags": [], + "created_at": "2022-10-03T04:28:21.000Z", + "updated_at": "2026-04-03T01:41:07.000Z", + "published_at": "2025-11-10T02:35:05.000Z", + "crawled_at": "2026-04-23T11:25:46.651730+00:00", + "metrics": { + "likes": 1447, + "stars": 3293, + "forks": 3939, + "views": 347329, + "watch": 0, + "comments": 383 + }, + "cover": { + "url": "https://image.lceda.cn/avatars/2022/10/q3e5mInHcWPvP4K2wqCpzB0dJr8n0tCHj4OJb4Wh.png", + "path": "cover.png" + }, + "files": [ + { + "name": "加热台量产计划.zip", + "url": "https://image.lceda.cn/attachments/2023/3/3D63VEzSSgu7tMjN4RTiEbDSiqmlo1Yiv6uvNWXk.zip", + "original_id": "bebc0475e03e43199806c4dfc78847b1", + "ext": "zip", + "mime": "application/x-zip-compressed", + "size": 21328814, + "md5": "6502c95eaf49092d463ea14be07d1cf9", + "path": "files/加热台量产计划.zip", + "sha256": "900f4c61e72a1ab22a113f0d55525244cd5eb072858cb0c4e5c950a7b647ad2e" + }, + { + "name": "焊接烧录指引v2.pdf", + "url": "https://image.lceda.cn/attachments/2023/4/2AhHlXehkZO4nC0zGTVH5TKH50X0IHZtmacdlfWq.pdf", + "original_id": "3bd33eb9d73b4b4db05820c9fbfccbc1", + "ext": "pdf", + "mime": "application/pdf", + "size": 1869778, + "md5": "bbcd571e21e230aec83af6909c453a80", + "path": "files/焊接烧录指引v2.pdf", + "sha256": "1551906d358b75a1ac070a3c13341761d55c0cd378697a90edc4a419ad6c195f" + }, + { + "name": "加热台Q&A.docx", + "url": "https://image.lceda.cn/attachments/2023/4/RwQkCsS9xv2UWoZ3JbVPgKa7IULczPGBFyk9tWLm.bin", + "original_id": "e5f6f384fb11489f99e27e8aebf06ffb", + "ext": "bin", + "mime": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "size": 13592, + "md5": "e3f6675ec77f862d15250075e888838d", + "path": "files/加热台Q&A.docx", + "sha256": "b048901d8851b75257305865f2a9bbf97239756d2c4f0d9ab3b09d1828d95263" + }, + { + "name": "2023-2-7 焊接编码器教程.pdf", + "url": "https://image.lceda.cn/attachments/2023/4/8cflSrzwHsuPme258lpLoQLVym2YisHLNzmWsgly.pdf", + "original_id": "21963ef73c534309b1754bd2ce452a2f", + "ext": "pdf", + "mime": "application/pdf", + "size": 857188, + "md5": "0bbf490c7d06fb733f88ddd3715d5a7d", + "path": "files/2023-2-7 焊接编码器教程.pdf", + "sha256": "933b1d40e5c8a1c80b3499931c002b7d30a408dc2dc9fa1ba8954b772fdd3961" + } + ], + "raw_fields": { + "path": "sheep_finder/pcb-heng-wen-jia-re-tai", + "grade": 4, + "origin": "std", + "public": true, + "publish": true, + "skipped_files": [] + } +} \ No newline at end of file diff --git a/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/_urls.json b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/_urls.json new file mode 100644 index 0000000..10c29cb --- /dev/null +++ b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/_urls.json @@ -0,0 +1,36 @@ +{ + "detail_url": "https://oshwhub.com/dhx233/esp32_s3_watch", + "cover_url": "https://image.lceda.cn/oshwhub/e65c8dd8b85f426ebded1acf94084b55.jpg", + "attachments": [ + { + "name": "演示视频V1_0_2.mp4", + "url": "https://image.lceda.cn/attachments/2023/5/rjPzo9rb32stS2uMtOYyQHB1Mzsku2jIpfkxS0u6.mp4", + "original_id": "9e3b1b0aab4e4077bba58e9b99072752" + }, + { + "name": "QF_ZERO_V2_V1_0_3.zip", + "url": "https://image.lceda.cn/attachments/2023/5/a07O0dN3bNwNohLe4TFmCeNc9OPFYHyo3p4GWagW.zip", + "original_id": "ec260479deae4829992fe4e87f0e461a" + }, + { + "name": "lvgl_demo_watch_code_blocks.zip", + "url": "https://image.lceda.cn/attachments/2023/6/vEqACjU5pj8DZUYTFlMSquYiTrT05KqWEXKtwtle.zip", + "original_id": "511fcfd7fd0743c98b5d05bb2919c778" + }, + { + "name": "V1.2外壳打螺丝版本.zip", + "url": "https://image.lceda.cn/attachments/2023/6/Y4R4DRQgYSDp7qdF3Jti2NYUpFlRpGXvEr1EcDpW.zip", + "original_id": "27d5835a26824d0ab7666ebe7a1d679b" + }, + { + "name": "wx_camera_1697969384939.mp4", + "url": "https://image.lceda.cn/attachments/2023/10/FiNBQGrRzqux6SvmFD2ZRxvEV8hgRpW2bpF08zKj.mp4", + "original_id": "bd456ad1f21a40b2a84492eab943fb08" + }, + { + "name": "qf_zero_v2_firmeware_V1.0.9_app.bin", + "url": "https://image.lceda.cn/oshwhub/project/attachments/4d91cd61c2374105bb43e92a619b4efa.bin", + "original_id": "f4b04d62ddc5451ca1fd77675d75cf53" + } + ] +} \ No newline at end of file diff --git a/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/cover.jpg b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/cover.jpg new file mode 100644 index 0000000..af64a2e Binary files /dev/null and b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/cover.jpg differ diff --git a/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/description.md b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/description.md new file mode 100644 index 0000000..1207dc4 --- /dev/null +++ b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/description.md @@ -0,0 +1,9 @@ +# QF ZERO V2 智能手表终端V1.0.9-24-6-29 + +QF ZERO V2 ,基于ESP32-S3的智能手表 + +--- +- Source: https://oshwhub.com/dhx233/esp32_s3_watch +- Author: 启凡科创 (dhx233) +- License: Public Domain +- Published: 2024-07-01T02:04:33.000Z diff --git a/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/QF_ZERO_V2_V1_0_3.zip b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/QF_ZERO_V2_V1_0_3.zip new file mode 100644 index 0000000..d208741 --- /dev/null +++ b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/QF_ZERO_V2_V1_0_3.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:689b73069c915c7897e0de328152b571cabd1d874740a4e1e887604ae9ae899e +size 26411463 diff --git a/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/V1.2外壳打螺丝版本.zip b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/V1.2外壳打螺丝版本.zip new file mode 100644 index 0000000..c1cf02c --- /dev/null +++ b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/V1.2外壳打螺丝版本.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48930d21ca6c51da2b656c7602a89dd0a628470dbea5b0623ae5678b17215b20 +size 283522 diff --git a/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/lvgl_demo_watch_code_blocks.zip b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/lvgl_demo_watch_code_blocks.zip new file mode 100644 index 0000000..9fb29f0 --- /dev/null +++ b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/lvgl_demo_watch_code_blocks.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ac73ef2b6959643a36f33a55b508fb7d7b813d61fc1b51f821533914b971abb +size 52281875 diff --git a/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/qf_zero_v2_firmeware_V1.0.9_app.bin b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/qf_zero_v2_firmeware_V1.0.9_app.bin new file mode 100644 index 0000000..1ed6ee3 --- /dev/null +++ b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/qf_zero_v2_firmeware_V1.0.9_app.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d319ce5ad9787381cfe67977f99c1246af3ba8b4de65dbeb5bad42a29cac8df0 +size 2130880 diff --git a/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/wx_camera_1697969384939.mp4 b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/wx_camera_1697969384939.mp4 new file mode 100644 index 0000000..6db6bd5 --- /dev/null +++ b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/wx_camera_1697969384939.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cdf1df59f95baac8374244c786e6cf72ed264caf5ca1ed4a8a3b1c42ffb3c87e +size 22640916 diff --git a/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/演示视频V1_0_2.mp4 b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/演示视频V1_0_2.mp4 new file mode 100644 index 0000000..538cda5 --- /dev/null +++ b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/files/演示视频V1_0_2.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cece75aa3cad558c25147c3b3591c2876cf764be3ff2e54e028c9648c7be1ba0 +size 14702117 diff --git a/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/metadata.json b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/metadata.json new file mode 100644 index 0000000..6427211 --- /dev/null +++ b/data/raw/oshwhub/892dbc4ebca74227ac6269a1693380d8/metadata.json @@ -0,0 +1,107 @@ +{ + "source": "oshwhub", + "source_url": "https://oshwhub.com/dhx233/esp32_s3_watch", + "project_id": "892dbc4ebca74227ac6269a1693380d8", + "title": "QF ZERO V2 智能手表终端V1.0.9-24-6-29", + "description_short": "QF ZERO V2 ,基于ESP32-S3的智能手表", + "description_path": "description.md", + "author": { + "username": "dhx233", + "display_name": "启凡科创", + "user_id": "80fcee0f22fe42998cec371bbcdff7a2" + }, + "license": "Public Domain", + "tags": [], + "created_at": "2022-09-15T13:21:36.000Z", + "updated_at": "2025-10-27T07:11:41.000Z", + "published_at": "2024-07-01T02:04:33.000Z", + "crawled_at": "2026-04-23T11:28:24.308080+00:00", + "metrics": { + "likes": 774, + "stars": 1737, + "forks": 643, + "views": 175969, + "watch": 0, + "comments": 164 + }, + "cover": { + "url": "https://image.lceda.cn/oshwhub/e65c8dd8b85f426ebded1acf94084b55.jpg", + "path": "cover.jpg" + }, + "files": [ + { + "name": "演示视频V1_0_2.mp4", + "url": "https://image.lceda.cn/attachments/2023/5/rjPzo9rb32stS2uMtOYyQHB1Mzsku2jIpfkxS0u6.mp4", + "original_id": "9e3b1b0aab4e4077bba58e9b99072752", + "ext": "mp4", + "mime": "video/mp4", + "size": 14702117, + "md5": "7b9779bb0cedd761d73eda999f0d96cb", + "path": "files/演示视频V1_0_2.mp4", + "sha256": "cece75aa3cad558c25147c3b3591c2876cf764be3ff2e54e028c9648c7be1ba0" + }, + { + "name": "QF_ZERO_V2_V1_0_3.zip", + "url": "https://image.lceda.cn/attachments/2023/5/a07O0dN3bNwNohLe4TFmCeNc9OPFYHyo3p4GWagW.zip", + "original_id": "ec260479deae4829992fe4e87f0e461a", + "ext": "zip", + "mime": "application/x-zip-compressed", + "size": 26411463, + "md5": "8b3f107973b5ac8185afe09ee29a82a0", + "path": "files/QF_ZERO_V2_V1_0_3.zip", + "sha256": "689b73069c915c7897e0de328152b571cabd1d874740a4e1e887604ae9ae899e" + }, + { + "name": "lvgl_demo_watch_code_blocks.zip", + "url": "https://image.lceda.cn/attachments/2023/6/vEqACjU5pj8DZUYTFlMSquYiTrT05KqWEXKtwtle.zip", + "original_id": "511fcfd7fd0743c98b5d05bb2919c778", + "ext": "zip", + "mime": "application/x-zip-compressed", + "size": 52281875, + "md5": "f1a563c71d4d28bad47edb99b80575aa", + "path": "files/lvgl_demo_watch_code_blocks.zip", + "sha256": "3ac73ef2b6959643a36f33a55b508fb7d7b813d61fc1b51f821533914b971abb" + }, + { + "name": "V1.2外壳打螺丝版本.zip", + "url": "https://image.lceda.cn/attachments/2023/6/Y4R4DRQgYSDp7qdF3Jti2NYUpFlRpGXvEr1EcDpW.zip", + "original_id": "27d5835a26824d0ab7666ebe7a1d679b", + "ext": "zip", + "mime": "application/x-zip-compressed", + "size": 283522, + "md5": "4189e693d7ef28528442a09dab456a4a", + "path": "files/V1.2外壳打螺丝版本.zip", + "sha256": "48930d21ca6c51da2b656c7602a89dd0a628470dbea5b0623ae5678b17215b20" + }, + { + "name": "wx_camera_1697969384939.mp4", + "url": "https://image.lceda.cn/attachments/2023/10/FiNBQGrRzqux6SvmFD2ZRxvEV8hgRpW2bpF08zKj.mp4", + "original_id": "bd456ad1f21a40b2a84492eab943fb08", + "ext": "mp4", + "mime": "video/mp4", + "size": 22640916, + "md5": "d2ecd4237f611ba495b1fb75e924fc78", + "path": "files/wx_camera_1697969384939.mp4", + "sha256": "cdf1df59f95baac8374244c786e6cf72ed264caf5ca1ed4a8a3b1c42ffb3c87e" + }, + { + "name": "qf_zero_v2_firmeware_V1.0.9_app.bin", + "url": "https://image.lceda.cn/oshwhub/project/attachments/4d91cd61c2374105bb43e92a619b4efa.bin", + "original_id": "f4b04d62ddc5451ca1fd77675d75cf53", + "ext": "bin", + "mime": "application/octet-stream", + "size": 2130880, + "md5": "cf09c83d912765f054c72c07f2651e95", + "path": "files/qf_zero_v2_firmeware_V1.0.9_app.bin", + "sha256": "d319ce5ad9787381cfe67977f99c1246af3ba8b4de65dbeb5bad42a29cac8df0" + } + ], + "raw_fields": { + "path": "dhx233/esp32_s3_watch", + "grade": 4, + "origin": "std", + "public": true, + "publish": true, + "skipped_files": [] + } +} \ No newline at end of file diff --git a/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/_urls.json b/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/_urls.json new file mode 100644 index 0000000..000ac12 --- /dev/null +++ b/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/_urls.json @@ -0,0 +1,16 @@ +{ + "detail_url": "https://oshwhub.com/XACT/rt300-mkv", + "cover_url": "https://image.lceda.cn/pullimage/G0Yvb3LsUUqWspquWfqe3ray1cucrfmoPvXxT7H2.jpeg", + "attachments": [ + { + "name": "video_20240608_002422.mp4", + "url": "https://image.lceda.cn/oshwhub/project/attachments/1fdcbde12c2f4a6faf8c519be4e72984.mp4", + "original_id": "d76ad6faae0240518eb7640ba8fc02cc" + }, + { + "name": "RT300-MKV UserManual_24JUL25.pdf", + "url": "https://image.lceda.cn/oshwhub/project/attachments/a57ca3d5e7b54417aae014e2f12f17fa.pdf", + "original_id": "5dc0b16067344ed6bfc15471f2a3bd2a" + } + ] +} \ No newline at end of file diff --git a/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/cover.jpeg b/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/cover.jpeg new file mode 100644 index 0000000..6703592 Binary files /dev/null and b/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/cover.jpeg differ diff --git a/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/description.md b/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/description.md new file mode 100644 index 0000000..d6b50d9 --- /dev/null +++ b/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/description.md @@ -0,0 +1,9 @@ +# RT300-MKV 250W 数控升降压桌面可调电源 + +RT300-MKV-EXTREME 同步混合功率级自动范围升降压型数控可调电源 + +--- +- Source: https://oshwhub.com/XACT/rt300-mkv +- Author: XACT (XACT) +- License: CC BY-NC-SA 4.0 +- Published: 2024-08-01T01:03:58.000Z diff --git a/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/files/RT300-MKV UserManual_24JUL25.pdf b/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/files/RT300-MKV UserManual_24JUL25.pdf new file mode 100644 index 0000000..bc7d6b0 --- /dev/null +++ b/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/files/RT300-MKV UserManual_24JUL25.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19eacef139ed672806a7bf492668b3f09e729d8c6eac6d2e5ed79aca8704685e +size 3320936 diff --git a/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/files/video_20240608_002422.mp4 b/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/files/video_20240608_002422.mp4 new file mode 100644 index 0000000..93f3e51 --- /dev/null +++ b/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/files/video_20240608_002422.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06864530d9ef794927c8826b7e2e5bd7349587f9b6035e76606331bcba25fbd3 +size 81553791 diff --git a/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/metadata.json b/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/metadata.json new file mode 100644 index 0000000..e69fe45 --- /dev/null +++ b/data/raw/oshwhub/91206ca73e96455f946bfcdd73e814fd/metadata.json @@ -0,0 +1,63 @@ +{ + "source": "oshwhub", + "source_url": "https://oshwhub.com/XACT/rt300-mkv", + "project_id": "91206ca73e96455f946bfcdd73e814fd", + "title": "RT300-MKV 250W 数控升降压桌面可调电源", + "description_short": "RT300-MKV-EXTREME 同步混合功率级自动范围升降压型数控可调电源", + "description_path": "description.md", + "author": { + "username": "XACT", + "display_name": "XACT", + "user_id": "e622ba5d959740ed90f4845a433def3a" + }, + "license": "CC BY-NC-SA 4.0", + "tags": [], + "created_at": "2020-12-25T06:25:11.000Z", + "updated_at": "2025-12-19T01:07:55.000Z", + "published_at": "2024-08-01T01:03:58.000Z", + "crawled_at": "2026-04-23T11:26:39.736414+00:00", + "metrics": { + "likes": 867, + "stars": 1735, + "forks": 782, + "views": 185523, + "watch": 0, + "comments": 231 + }, + "cover": { + "url": "https://image.lceda.cn/pullimage/G0Yvb3LsUUqWspquWfqe3ray1cucrfmoPvXxT7H2.jpeg", + "path": "cover.jpeg" + }, + "files": [ + { + "name": "video_20240608_002422.mp4", + "url": "https://image.lceda.cn/oshwhub/project/attachments/1fdcbde12c2f4a6faf8c519be4e72984.mp4", + "original_id": "d76ad6faae0240518eb7640ba8fc02cc", + "ext": "mp4", + "mime": "video/mp4", + "size": 81553791, + "md5": "becffa3b615f415101f85d18b9bbfcf9", + "path": "files/video_20240608_002422.mp4", + "sha256": "06864530d9ef794927c8826b7e2e5bd7349587f9b6035e76606331bcba25fbd3" + }, + { + "name": "RT300-MKV UserManual_24JUL25.pdf", + "url": "https://image.lceda.cn/oshwhub/project/attachments/a57ca3d5e7b54417aae014e2f12f17fa.pdf", + "original_id": "5dc0b16067344ed6bfc15471f2a3bd2a", + "ext": "pdf", + "mime": "application/pdf", + "size": 3320936, + "md5": "7f97a35fda72a0462ec8401d739ffd41", + "path": "files/RT300-MKV UserManual_24JUL25.pdf", + "sha256": "19eacef139ed672806a7bf492668b3f09e729d8c6eac6d2e5ed79aca8704685e" + } + ], + "raw_fields": { + "path": "XACT/rt300-mkv", + "grade": 4, + "origin": "std", + "public": true, + "publish": true, + "skipped_files": [] + } +} \ No newline at end of file diff --git a/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/_urls.json b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/_urls.json new file mode 100644 index 0000000..445de5f --- /dev/null +++ b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/_urls.json @@ -0,0 +1,41 @@ +{ + "detail_url": "https://oshwhub.com/armbian-pythoniot/yuzumaix-v831", + "cover_url": "https://image.lceda.cn/avatars/2023/4/DMgC3qzd0rQukGEieLTb377RTu3umnk2aRgvzuYv.png", + "attachments": [ + { + "name": "WeChat_20230922093205.mp4", + "url": "https://image.lceda.cn/attachments/2023/9/oCmEMfVHeHKJDlGiDBulF9Xs8hR9zVpuNoIfKx3H.mp4", + "original_id": "997cfe92995946f6ab89a61a5dd07503" + }, + { + "name": "大镜头.mp4", + "url": "https://image.lceda.cn/attachments/2023/9/02cMoTHflBm7R2xW3BIy1CzsgS9EZXuNOb5kBya6.mp4", + "original_id": "de14cc7868254108a76250bf22d1466a" + }, + { + "name": "40a45ea8a5b9683f2bc5940dd0f03fc5.mp4", + "url": "https://image.lceda.cn/attachments/2023/11/RzUKJ9vGR07UX5NAov3fkU5qBc7Lm7l7YpnpBKam.mp4", + "original_id": "166a052b60cc47c881d6151c8f50e087" + }, + { + "name": "d77c8f40aaf2ebf198d2ffe4ff9bde63.mp4", + "url": "https://image.lceda.cn/attachments/2023/11/qb0tziZO0kWitZlTOQ37tqFDFr48m4gGLnPPQnHs.mp4", + "original_id": "c36c4817224c4cbc89a8c57f692e34be" + }, + { + "name": "WeChat_20231124121438.mp4", + "url": "https://image.lceda.cn/attachments/2023/11/ckssTsthpECXfdRpgjCxV9QyzRBvDjzh0ft6X4kI.mp4", + "original_id": "f668d7f08b2b40daa7bb04a58a49e2df" + }, + { + "name": "WeChat_20231124121418.mp4", + "url": "https://image.lceda.cn/attachments/2023/11/T4kDKWugOAp5R2FPKQgNf4u5ymTOtlmla7xm5ZcG.mp4", + "original_id": "b16233f0eb624fc4a44fc0280f631f6e" + }, + { + "name": "WeChat_20231124121403.mp4", + "url": "https://image.lceda.cn/attachments/2023/11/Qio2QOYXM8CBoofNaqbKRAaqQ3RZMgXNPhzuEgvL.mp4", + "original_id": "30129b0c66e14549926aa79f381afb2b" + } + ] +} \ No newline at end of file diff --git a/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/cover.png b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/cover.png new file mode 100644 index 0000000..f6dcd40 Binary files /dev/null and b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/cover.png differ diff --git a/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/description.md b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/description.md new file mode 100644 index 0000000..fe1447d --- /dev/null +++ b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/description.md @@ -0,0 +1,9 @@ +# 柚子爱AI相机-YuzuAI-YuzuMaix-AIoT-V831开发板 + +基于V831的一个AI开源相机, 硬件来自YuzukiIRC, 固件和软件套用M2Dock和MaixPy3, 原名YuzuMaix柚木麦被吐槽,改名YuzuAI柚子爱。 + +--- +- Source: https://oshwhub.com/armbian-pythoniot/yuzumaix-v831 +- Author: Armbian-PythonIot (armbian-pythoniot) +- License: CC BY-NC-SA 3.0 +- Published: 2023-12-14T01:58:46.000Z diff --git a/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/40a45ea8a5b9683f2bc5940dd0f03fc5.mp4 b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/40a45ea8a5b9683f2bc5940dd0f03fc5.mp4 new file mode 100644 index 0000000..5a06489 --- /dev/null +++ b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/40a45ea8a5b9683f2bc5940dd0f03fc5.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:981d9d210fee2435d40aad25c9727435708993785d4d7abd11a99afe88f498b6 +size 1252241 diff --git a/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/WeChat_20230922093205.mp4 b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/WeChat_20230922093205.mp4 new file mode 100644 index 0000000..890c8f3 --- /dev/null +++ b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/WeChat_20230922093205.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48f1d30c36ee2cf70307a59f11e78249d763f379d513fc131b33c98ae9290844 +size 1145966 diff --git a/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/WeChat_20231124121403.mp4 b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/WeChat_20231124121403.mp4 new file mode 100644 index 0000000..ef0bbe6 --- /dev/null +++ b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/WeChat_20231124121403.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39eb70b17270d179c5325ef77fe46ed79b84a9ba98fa9595ad7f8b74697f9c07 +size 1915277 diff --git a/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/WeChat_20231124121418.mp4 b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/WeChat_20231124121418.mp4 new file mode 100644 index 0000000..2165c32 --- /dev/null +++ b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/WeChat_20231124121418.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aecfc2970d8a4a0f5d2fd4484beb8b7e91321b564aa9e5a5bcca8a8dd5dbd41f +size 773127 diff --git a/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/WeChat_20231124121438.mp4 b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/WeChat_20231124121438.mp4 new file mode 100644 index 0000000..95bbc96 --- /dev/null +++ b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/WeChat_20231124121438.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5000ec0973b1f5d72fa1904f25061ab9eae49a05d9e4dbbff239066102bad412 +size 1831997 diff --git a/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/d77c8f40aaf2ebf198d2ffe4ff9bde63.mp4 b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/d77c8f40aaf2ebf198d2ffe4ff9bde63.mp4 new file mode 100644 index 0000000..606683f --- /dev/null +++ b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/d77c8f40aaf2ebf198d2ffe4ff9bde63.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89bd79ebae84dadad9fc6e78e7662c1f0d4aeeb526cb4b64c79450c92772bb88 +size 964054 diff --git a/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/大镜头.mp4 b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/大镜头.mp4 new file mode 100644 index 0000000..77110b0 --- /dev/null +++ b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/files/大镜头.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:054610980b91c2dac2629b3c33cb3ffdabcda332a3cc44c8e027221979dd6c36 +size 829241 diff --git a/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/metadata.json b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/metadata.json new file mode 100644 index 0000000..3386d68 --- /dev/null +++ b/data/raw/oshwhub/922c1f3a9b9a43ff98998f476e7946ca/metadata.json @@ -0,0 +1,118 @@ +{ + "source": "oshwhub", + "source_url": "https://oshwhub.com/armbian-pythoniot/yuzumaix-v831", + "project_id": "922c1f3a9b9a43ff98998f476e7946ca", + "title": "柚子爱AI相机-YuzuAI-YuzuMaix-AIoT-V831开发板", + "description_short": "基于V831的一个AI开源相机, 硬件来自YuzukiIRC, 固件和软件套用M2Dock和MaixPy3, 原名YuzuMaix柚木麦被吐槽,改名YuzuAI柚子爱。", + "description_path": "description.md", + "author": { + "username": "armbian-pythoniot", + "display_name": "Armbian-PythonIot", + "user_id": "5b6e6dc2413245cb9d41eb504949b13a" + }, + "license": "CC BY-NC-SA 3.0", + "tags": [], + "created_at": "2023-04-05T04:08:23.000Z", + "updated_at": "2023-12-14T01:54:51.000Z", + "published_at": "2023-12-14T01:58:46.000Z", + "crawled_at": "2026-04-23T11:31:21.045637+00:00", + "metrics": { + "likes": 129, + "stars": 236, + "forks": 96, + "views": 45128, + "watch": 0, + "comments": 93 + }, + "cover": { + "url": "https://image.lceda.cn/avatars/2023/4/DMgC3qzd0rQukGEieLTb377RTu3umnk2aRgvzuYv.png", + "path": "cover.png" + }, + "files": [ + { + "name": "WeChat_20230922093205.mp4", + "url": "https://image.lceda.cn/attachments/2023/9/oCmEMfVHeHKJDlGiDBulF9Xs8hR9zVpuNoIfKx3H.mp4", + "original_id": "997cfe92995946f6ab89a61a5dd07503", + "ext": "mp4", + "mime": "video/mp4", + "size": 1145966, + "md5": "fc02f72d812662607b6430b9123e4110", + "path": "files/WeChat_20230922093205.mp4", + "sha256": "48f1d30c36ee2cf70307a59f11e78249d763f379d513fc131b33c98ae9290844" + }, + { + "name": "大镜头.mp4", + "url": "https://image.lceda.cn/attachments/2023/9/02cMoTHflBm7R2xW3BIy1CzsgS9EZXuNOb5kBya6.mp4", + "original_id": "de14cc7868254108a76250bf22d1466a", + "ext": "mp4", + "mime": "video/mp4", + "size": 829241, + "md5": "b73514619c4ee6fe8e76bc7b32e6fa99", + "path": "files/大镜头.mp4", + "sha256": "054610980b91c2dac2629b3c33cb3ffdabcda332a3cc44c8e027221979dd6c36" + }, + { + "name": "40a45ea8a5b9683f2bc5940dd0f03fc5.mp4", + "url": "https://image.lceda.cn/attachments/2023/11/RzUKJ9vGR07UX5NAov3fkU5qBc7Lm7l7YpnpBKam.mp4", + "original_id": "166a052b60cc47c881d6151c8f50e087", + "ext": "mp4", + "mime": "video/mp4", + "size": 1252241, + "md5": "153e88446ba95cb78997c0924c6477bd", + "path": "files/40a45ea8a5b9683f2bc5940dd0f03fc5.mp4", + "sha256": "981d9d210fee2435d40aad25c9727435708993785d4d7abd11a99afe88f498b6" + }, + { + "name": "d77c8f40aaf2ebf198d2ffe4ff9bde63.mp4", + "url": "https://image.lceda.cn/attachments/2023/11/qb0tziZO0kWitZlTOQ37tqFDFr48m4gGLnPPQnHs.mp4", + "original_id": "c36c4817224c4cbc89a8c57f692e34be", + "ext": "mp4", + "mime": "video/mp4", + "size": 964054, + "md5": "3412f63de246108e328f32f424ccdd73", + "path": "files/d77c8f40aaf2ebf198d2ffe4ff9bde63.mp4", + "sha256": "89bd79ebae84dadad9fc6e78e7662c1f0d4aeeb526cb4b64c79450c92772bb88" + }, + { + "name": "WeChat_20231124121438.mp4", + "url": "https://image.lceda.cn/attachments/2023/11/ckssTsthpECXfdRpgjCxV9QyzRBvDjzh0ft6X4kI.mp4", + "original_id": "f668d7f08b2b40daa7bb04a58a49e2df", + "ext": "mp4", + "mime": "video/mp4", + "size": 1831997, + "md5": "5d0b710833cde01ced97e311b9ffb002", + "path": "files/WeChat_20231124121438.mp4", + "sha256": "5000ec0973b1f5d72fa1904f25061ab9eae49a05d9e4dbbff239066102bad412" + }, + { + "name": "WeChat_20231124121418.mp4", + "url": "https://image.lceda.cn/attachments/2023/11/T4kDKWugOAp5R2FPKQgNf4u5ymTOtlmla7xm5ZcG.mp4", + "original_id": "b16233f0eb624fc4a44fc0280f631f6e", + "ext": "mp4", + "mime": "video/mp4", + "size": 773127, + "md5": "970584d4b75eb818ec144b1b6fbe49a5", + "path": "files/WeChat_20231124121418.mp4", + "sha256": "aecfc2970d8a4a0f5d2fd4484beb8b7e91321b564aa9e5a5bcca8a8dd5dbd41f" + }, + { + "name": "WeChat_20231124121403.mp4", + "url": "https://image.lceda.cn/attachments/2023/11/Qio2QOYXM8CBoofNaqbKRAaqQ3RZMgXNPhzuEgvL.mp4", + "original_id": "30129b0c66e14549926aa79f381afb2b", + "ext": "mp4", + "mime": "video/mp4", + "size": 1915277, + "md5": "b26d9c91ab5abac4d16e2b084eca4040", + "path": "files/WeChat_20231124121403.mp4", + "sha256": "39eb70b17270d179c5325ef77fe46ed79b84a9ba98fa9595ad7f8b74697f9c07" + } + ], + "raw_fields": { + "path": "armbian-pythoniot/yuzumaix-v831", + "grade": 4, + "origin": "std", + "public": true, + "publish": true, + "skipped_files": [] + } +} \ No newline at end of file diff --git a/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/_urls.json b/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/_urls.json new file mode 100644 index 0000000..299f093 --- /dev/null +++ b/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/_urls.json @@ -0,0 +1,16 @@ +{ + "detail_url": "https://oshwhub.com/yanranxiaoxi/Multi-adaptation-Wi-Fi-Geiger-Counter-Double-Tube-Type", + "cover_url": "https://image.lceda.cn/pullimage/Z4KOXBgwtmwMIUpJC8ZSyFWeY6hBg2899oPP5UeZ.jpeg", + "attachments": [ + { + "name": "3D打印外壳与电池版改装.zip", + "url": "https://image.lceda.cn/attachments/2023/9/Ps19TA0QecWL9XXjgOxNhHxRj8FvpO7kttXqF8KI.zip", + "original_id": "de773a049b1149ea8f5b885277d839ac" + }, + { + "name": "MWGC-Firmware_v0.1.3.20241125a.bin", + "url": "https://image.lceda.cn/oshwhub/project/attachments/f59327bb7a8f4180851468b9dee83944.bin", + "original_id": "df5c50cf692548afb2ee27096178c282" + } + ] +} \ No newline at end of file diff --git a/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/cover.jpeg b/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/cover.jpeg new file mode 100644 index 0000000..1e78ca6 Binary files /dev/null and b/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/cover.jpeg differ diff --git a/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/description.md b/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/description.md new file mode 100644 index 0000000..2b63294 --- /dev/null +++ b/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/description.md @@ -0,0 +1,9 @@ +# 小汐 & 阿曈 -> 盖革计数器(MWGC-2T) + +⭐ 中文固件多管型 Wi-Fi 盖革计数器(MWGC-2T) ⭐ + +--- +- Source: https://oshwhub.com/yanranxiaoxi/Multi-adaptation-Wi-Fi-Geiger-Counter-Double-Tube-Type +- Author: 久治明千树汐 (yanranxiaoxi) +- License: CC BY-SA 4.0 +- Published: 2024-11-25T01:38:14.000Z diff --git a/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/files/3D打印外壳与电池版改装.zip b/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/files/3D打印外壳与电池版改装.zip new file mode 100644 index 0000000..37d00af --- /dev/null +++ b/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/files/3D打印外壳与电池版改装.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e23537c79e44be7dadb89ba82fb3b195ae2436d8200c62659f31a87093f6fd7e +size 3798995 diff --git a/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/files/MWGC-Firmware_v0.1.3.20241125a.bin b/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/files/MWGC-Firmware_v0.1.3.20241125a.bin new file mode 100644 index 0000000..c88d92b --- /dev/null +++ b/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/files/MWGC-Firmware_v0.1.3.20241125a.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87bf7129731121ebaead85278e9aad8f8b2ea0ff3f5f9b3d46ed29e65f82d577 +size 428496 diff --git a/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/metadata.json b/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/metadata.json new file mode 100644 index 0000000..608cafa --- /dev/null +++ b/data/raw/oshwhub/b077573dfb764e95b1d27faba49cca65/metadata.json @@ -0,0 +1,63 @@ +{ + "source": "oshwhub", + "source_url": "https://oshwhub.com/yanranxiaoxi/Multi-adaptation-Wi-Fi-Geiger-Counter-Double-Tube-Type", + "project_id": "b077573dfb764e95b1d27faba49cca65", + "title": "小汐 & 阿曈 -> 盖革计数器(MWGC-2T)", + "description_short": "⭐ 中文固件多管型 Wi-Fi 盖革计数器(MWGC-2T) ⭐", + "description_path": "description.md", + "author": { + "username": "yanranxiaoxi", + "display_name": "久治明千树汐", + "user_id": "eac388b086064c2087f67a10b524a911" + }, + "license": "CC BY-SA 4.0", + "tags": [], + "created_at": "2023-03-11T16:40:16.000Z", + "updated_at": "2026-01-30T13:13:39.000Z", + "published_at": "2024-11-25T01:38:14.000Z", + "crawled_at": "2026-04-23T11:26:00.127742+00:00", + "metrics": { + "likes": 212, + "stars": 365, + "forks": 189, + "views": 49755, + "watch": 0, + "comments": 168 + }, + "cover": { + "url": "https://image.lceda.cn/pullimage/Z4KOXBgwtmwMIUpJC8ZSyFWeY6hBg2899oPP5UeZ.jpeg", + "path": "cover.jpeg" + }, + "files": [ + { + "name": "3D打印外壳与电池版改装.zip", + "url": "https://image.lceda.cn/attachments/2023/9/Ps19TA0QecWL9XXjgOxNhHxRj8FvpO7kttXqF8KI.zip", + "original_id": "de773a049b1149ea8f5b885277d839ac", + "ext": "zip", + "mime": "application/x-zip-compressed", + "size": 3798995, + "md5": "3ec71e545b0f0b70f93b58599c8d1c7e", + "path": "files/3D打印外壳与电池版改装.zip", + "sha256": "e23537c79e44be7dadb89ba82fb3b195ae2436d8200c62659f31a87093f6fd7e" + }, + { + "name": "MWGC-Firmware_v0.1.3.20241125a.bin", + "url": "https://image.lceda.cn/oshwhub/project/attachments/f59327bb7a8f4180851468b9dee83944.bin", + "original_id": "df5c50cf692548afb2ee27096178c282", + "ext": "bin", + "mime": "application/octet-stream", + "size": 428496, + "md5": "7bd953b6a41c5ad621b7df5f47c3e6ed", + "path": "files/MWGC-Firmware_v0.1.3.20241125a.bin", + "sha256": "87bf7129731121ebaead85278e9aad8f8b2ea0ff3f5f9b3d46ed29e65f82d577" + } + ], + "raw_fields": { + "path": "yanranxiaoxi/Multi-adaptation-Wi-Fi-Geiger-Counter-Double-Tube-Type", + "grade": 4, + "origin": "std", + "public": true, + "publish": true, + "skipped_files": [] + } +} \ No newline at end of file diff --git a/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/_urls.json b/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/_urls.json new file mode 100644 index 0000000..b4002b8 --- /dev/null +++ b/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/_urls.json @@ -0,0 +1,16 @@ +{ + "detail_url": "https://oshwhub.com/diy17102800/tu-teng-zvs", + "cover_url": "https://image.lceda.cn/pullimage/Qf1Gu6y5cpQQQ5YzNoFf4gqZYwNCOzKYlO9eerXB.jpeg", + "attachments": [ + { + "name": "测试视频.mp4", + "url": "https://image.lceda.cn/attachments/2023/3/hcSO16Po6ZKhmHnR3M2UJ2ttbc4jNDE0FthmsFE0.mp4", + "original_id": "e0ef95cfceb04edc9076a4e8f5ebd9dd" + }, + { + "name": "1133.mp4", + "url": "https://image.lceda.cn/attachments/2024/5/BiyaOevIDxQtW4RbBjuS1FZ3P2cDsGBB1M5mf2aN.mp4", + "original_id": "40cab71898a7457b92f5e6ef7c8a8bd5" + } + ] +} \ No newline at end of file diff --git a/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/cover.jpeg b/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/cover.jpeg new file mode 100644 index 0000000..0d8ff3b Binary files /dev/null and b/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/cover.jpeg differ diff --git a/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/description.md b/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/description.md new file mode 100644 index 0000000..1f81b47 --- /dev/null +++ b/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/description.md @@ -0,0 +1,9 @@ +# 大功率感应加热2500W 增强型ZVS + +测试已成功 + +--- +- Source: https://oshwhub.com/diy17102800/tu-teng-zvs +- Author: 金石之声 (diy17102800) +- License: TAPR Open Hardware License +- Published: 2024-05-20T02:40:14.000Z diff --git a/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/files/1133.mp4 b/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/files/1133.mp4 new file mode 100644 index 0000000..0490573 --- /dev/null +++ b/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/files/1133.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a707feb0a82435b59439552f211075dafeab39aa5d490e5195d861f75515126 +size 1100753 diff --git a/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/files/测试视频.mp4 b/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/files/测试视频.mp4 new file mode 100644 index 0000000..66aaec4 --- /dev/null +++ b/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/files/测试视频.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:613b326cb8c3c222c955c259968b4fac5dd31daa5a93e85e53a55b24ef30c320 +size 8101940 diff --git a/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/metadata.json b/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/metadata.json new file mode 100644 index 0000000..d3806b6 --- /dev/null +++ b/data/raw/oshwhub/f974b06d9c01470bb319e7df6d4512c9/metadata.json @@ -0,0 +1,63 @@ +{ + "source": "oshwhub", + "source_url": "https://oshwhub.com/diy17102800/tu-teng-zvs", + "project_id": "f974b06d9c01470bb319e7df6d4512c9", + "title": "大功率感应加热2500W 增强型ZVS", + "description_short": "测试已成功", + "description_path": "description.md", + "author": { + "username": "diy17102800", + "display_name": "金石之声", + "user_id": "de940107caa34d989e9485cc41026732" + }, + "license": "TAPR Open Hardware License", + "tags": [], + "created_at": "2023-02-14T16:30:50.000Z", + "updated_at": "2025-10-27T07:11:41.000Z", + "published_at": "2024-05-20T02:40:14.000Z", + "crawled_at": "2026-04-23T11:30:55.186691+00:00", + "metrics": { + "likes": 355, + "stars": 708, + "forks": 378, + "views": 61550, + "watch": 0, + "comments": 265 + }, + "cover": { + "url": "https://image.lceda.cn/pullimage/Qf1Gu6y5cpQQQ5YzNoFf4gqZYwNCOzKYlO9eerXB.jpeg", + "path": "cover.jpeg" + }, + "files": [ + { + "name": "测试视频.mp4", + "url": "https://image.lceda.cn/attachments/2023/3/hcSO16Po6ZKhmHnR3M2UJ2ttbc4jNDE0FthmsFE0.mp4", + "original_id": "e0ef95cfceb04edc9076a4e8f5ebd9dd", + "ext": "mp4", + "mime": "video/mp4", + "size": 8101940, + "md5": "229f35937d3b13a0a862b7d47654eb0f", + "path": "files/测试视频.mp4", + "sha256": "613b326cb8c3c222c955c259968b4fac5dd31daa5a93e85e53a55b24ef30c320" + }, + { + "name": "1133.mp4", + "url": "https://image.lceda.cn/attachments/2024/5/BiyaOevIDxQtW4RbBjuS1FZ3P2cDsGBB1M5mf2aN.mp4", + "original_id": "40cab71898a7457b92f5e6ef7c8a8bd5", + "ext": "mp4", + "mime": "video/mp4", + "size": 1100753, + "md5": "3dc3d5f4c556e3c057eede3cfbcefb83", + "path": "files/1133.mp4", + "sha256": "7a707feb0a82435b59439552f211075dafeab39aa5d490e5195d861f75515126" + } + ], + "raw_fields": { + "path": "diy17102800/tu-teng-zvs", + "grade": 4, + "origin": "std", + "public": true, + "publish": true, + "skipped_files": [] + } +} \ No newline at end of file diff --git a/docs/sources/oshwhub.md b/docs/sources/oshwhub.md new file mode 100644 index 0000000..58d8067 --- /dev/null +++ b/docs/sources/oshwhub.md @@ -0,0 +1,92 @@ +# oshwhub.com 数据源调研 + +**平台**:立创开源硬件平台(嘉立创 EDA / 深圳创电优选科技有限公司) +**URL**:https://oshwhub.com +**调研日期**:2026-04-23 + +## 站点架构 + +- Next.js App Router SPA;详情页 `/detail/` 和 `//` 均 SSR(HTML 内含完整元数据 + attachments 数组) +- axios baseURL 为 `https://oshwhub.com`(见 `/_next/static/chunks/8661-*.js`) +- 首页 / explore 列表数据靠客户端 fetch 渲染(首屏 HTML 里没有卡片 DOM) + +## robots.txt + +``` +User-agent: * +Disallow: /posts +Sitemap: https://oshwhub.com/sitemap.xml +``` + +详情页、explore、API 均允许抓取。 + +## 可用 API(无需鉴权) + +### 项目列表 +`GET https://oshwhub.com/api/project?page=N&pageSize=M&sort=hot` + +- `sort`:`hot`(默认,按热度)/`like`/`new` 等 +- `pageSize`:最大 50 可用,试过 100 返回空 +- 返回:`{success, code, result:{page, pageSize, total, totalPage, lists:[...]}}` +- total ≈ 12493(2026-04 快照) + +每条 list item 字段: +- `uuid`, `name`, `introduction`, `path`(= `/`) +- `owner`:`{uuid, username, nickname, avatar, team}` +- `count`:`{fork, star, like, views, watch}` +- `grade`(1-4,4 是精品徽章) +- `thumb`(封面 URL,`image.lceda.cn` 或 `//image.lceda.cn` 前缀) +- `created_at`, `updated_at`, `oshwhub_publish_at` +- `tags`, `public`, `publish`, `comments_count` + +### 项目详情(HTML 解析) +`GET https://oshwhub.com/` 或 `/detail/` + +HTML 内嵌 escaped JSON,关键字段: +- `\"license\":\"GPL 3.0\"` 等(许可证) +- `\"creator\":{\"uuid\":\"...\"}` +- `\"attachments\":[{ name, src, mime, ext, size, md5, download_count, uuid }, ...]` +- `` 含项目名;`<meta name="description">` 含 introduction + +### 文件下载 +- **附件** (`attachments[].src`):`https://image.lceda.cn{src}` + - 例:`/attachments/2020/7/mRn5hQZRhmx5r4usGxFmy8BXsCIHw5QoAT5HaLGC.pdf` + - 已验证 HTTP 200,无鉴权 + - 覆盖 PDF / ZIP / MP4 等 +- **工程源文件** (`fs-web-stream.jlc.com/fs-web-stream/file-operation/download/<snowflake-id>`) + - HTML 里出现,但能否直接下载未测试 + - 优先级:P1;v0.1 先不抓 + +### 未找到 / 留作后续 +- EasyEDA 工程源 JSON(schematic/PCB 的真正源):推测在 `u.lceda.cn` 下,需登录 +- 项目详情 JSON API:`/api/project/<uuid>` 返回 `{"code":104001,"success":false}`(试过 GET/POST/路径形式均失败,疑似此端点需 session) + +## 已知字段与 schema 映射 + +| 本项目 schema 字段 | oshwhub 来源 | +|-----|-----| +| `source` | 常量 `"oshwhub"` | +| `source_url` | `https://oshwhub.com/<path>` | +| `project_id` | `uuid` | +| `title` | `name` | +| `description` | HTML `<meta description>` + 长描述(HTML 正文截取) | +| `author` | `owner.nickname` / `owner.username` | +| `license` | HTML 嵌入 JSON 的 `license` 字段 | +| `created_at` / `updated_at` | 列表 API 同名字段 | +| `crawled_at` | 运行时写入 | +| `tags` | 列表 API `tags` | +| `files[]` | `attachments[]` 映射 | +| `metrics` | `count.{like,star,fork,views}` + `grade` | + +## 速率与礼貌 + +- 列表 API:空载实测 < 300ms,无限流 +- 详情页 HTML:~500KB/个,建议 QPS ≤ 0.5 +- 附件:CDN `image.lceda.cn`,无需限流但建议 1s 间隔 + +## 陷阱 / 待确认 + +1. `fs-web-stream.jlc.com` 下载是否需 referer / cookie,未测 +2. 长描述(含图片、表格)的 HTML 提取保真度,可能需要保留原 HTML +3. `license` 字段取值集合未枚举完(已见:`GPL 3.0` / `CC-BY-SA`...需全量跑后统计) +4. `grade=4` 大概率是精品徽章但文档未说明具体判据 diff --git a/log.md b/log.md index 68eddd9..42d1b00 100644 --- a/log.md +++ b/log.md @@ -4,6 +4,63 @@ --- +## 2026-04-23 19:30 Phase 1 MVP:10 个高质量 oshwhub 项目入库 + +**Claude 会话**:承接仓库初始化 + +### API 调研结论 + +- 列表 API:`GET https://oshwhub.com/api/project?page=N&pageSize=M&sort=hot`,无鉴权,返回 12493 个项目元数据(含 grade / likes / stars / views / forks) +- 详情:`GET https://oshwhub.com/<path>` 是 SSR HTML,嵌入 escaped JSON,含 `license` + `attachments[]`(每个带 name / src / size / md5 / ext / mime / download_count) +- 附件 CDN:`https://image.lceda.cn{src}` — 已验证无鉴权直接下载 +- EasyEDA 工程源 JSON(`u.lceda.cn`)需登录,v0.1 不抓 +- 详细调研见 `docs/sources/oshwhub.md` + +### 选 10 个高质量项目 + +判据:`grade == 4`(平台精品徽章) + `likes ≥ 100` + 应用领域多样(避免同类堆叠)+ 排除 `_copy` 派生仓。 + +10 个项目覆盖:调试器、加热台、盖革计数器、可调电源、焊台、智能手表、USB 测电流、ZVS 感应加热、AI 开发板、红外热成像。 + +### MVP 爬虫 + +位置:`crawlers/oshwhub/crawler.py` + +- `list_projects()` — 列表 API 分页 +- `pick_top()` — 按 like×3 + star + fork×2 + views/100 + comments×2 + grade×50 排序 +- `parse_detail_html()` — 从 SSR HTML 提取 title / license / description / attachments +- `crawl_one()` — 每项目产出:`metadata.json` / `description.md` / `cover.*` / `files/*` / `_urls.json` +- QPS ≤ 0.5(`SLEEP_BETWEEN = 2.0`),UA 显式声明 `FacereDataset/0.1` + +### 抓取与入库 + +- 10/10 成功,52 个附件,**524 MB** +- Gitea LFS(v25.4.3 原生支持)+ 本地 `git-lfs 3.5.1`(用户态二进制装在 `~/.local/bin/`) +- `.gitattributes` 规则:`data/raw/**/files/**` 一律走 LFS;元数据(metadata.json / description.md / \_urls.json / cover.\*)走普通 git +- 每项目目录结构: + ``` + data/raw/oshwhub/<uuid>/ + ├── metadata.json # 按 schemas/project.schema.json + ├── description.md + ├── cover.{jpg,png,jpeg} + ├── _urls.json # 所有原始 URL 清单 + └── files/* # 原始附件(LFS) + ``` + +### 改动汇总 + +- 新增:`crawlers/oshwhub/{__init__,__main__,crawler}.py`、`schemas/project.schema.json`、`docs/sources/oshwhub.md`、`pyproject.toml` +- 修改:`.gitattributes`(缩窄到 `data/raw/**/files/**`)、`.gitignore`(移除 `data/raw/*` 排除) + +### 下一步建议给 Charles + +1. 验收 10 个项目元数据质量(随机抽 2-3 条对照原站) +2. 决定 Phase 1.4 放量目标(50?500?全量 12493?) +3. 未解决:`fs-web-stream.jlc.com` 下载(工程源?)、`u.lceda.cn` 登录态抓工程 JSON +4. Phase 2 准备:GitHub KiCad repo 调研 + +--- + ## 2026-04-23 18:50 仓库初始化 & 数据源调研 **Claude 会话**:初始化 diff --git a/plan.md b/plan.md index fefc155..debef90 100644 --- a/plan.md +++ b/plan.md @@ -21,45 +21,46 @@ - [x] `README.md` / `CLAUDE.md` / `plan.md` / `log.md` - [x] 目录骨架 `crawlers/ schemas/ scripts/ data/ docs/` -- [x] `.gitignore`(排除 `data/raw` `data/processed` `data/state` `venv` `__pycache__`) +- [x] `.gitignore`(排除 derivative 目录)/ `.gitattributes`(LFS 规则) - [x] 初始提交并推送 --- -## Phase 1 — 立创开源平台(oshwhub.com)MVP +## Phase 1 — 立创开源平台(oshwhub.com)MVP ✅ 首批完成 **目标**:跑通 10 个项目的完整抓取,验证 schema。 -**预计工期**:2-3 天(人+Claude 协作) +**实际**:10/10 成功,52 附件,524 MB 入 LFS。 -### 1.1 调研(0.5 天) +### 1.1 调研 ✅ -- [ ] 确认 API 入口:Next.js SPA,首页 800KB HTML 里内联了首屏 props,但翻页/详情靠 `/_next/data/<buildId>/...json` 或 XHR。需要: - - 打开浏览器 DevTools,录一段 explore → 详情 → 下载的 network trace,提取 API endpoints(推荐 `chrome-devtools` MCP) - - 核对 `sitemap.xml` 作为项目 URL 源(已确认存在) -- [ ] 许可证字段位置:详情页有"开源协议"显示,确认对应 JSON key -- [ ] 确认 sitemap 完整性:是否覆盖全部公开项目;若否,fallback 用 `/explore?sort=hot&page=N` +- [x] 列表 API `/api/project?page=N&pageSize=M&sort=hot`(无鉴权) +- [x] 详情页 SSR HTML 嵌入 escaped JSON,含 attachments 数组与 license +- [x] 附件 CDN `image.lceda.cn/{src}` 直连 +- [x] `docs/sources/oshwhub.md` 调研笔记 -### 1.2 爬虫 MVP(1 天) +### 1.2 爬虫 MVP ✅ -`crawlers/oshwhub/`: +`crawlers/oshwhub/crawler.py`: -- [ ] `discover.py` — 从 sitemap + explore 列表产出项目 ID stream(去重、断点续) -- [ ] `fetch.py` — 单项目抓取:详情 JSON、预览图、可下载文件(原理图 JSON / 工程压缩包) -- [ ] `normalize.py` — 映射到统一 schema,写 `data/processed/oshwhub/projects.jsonl` -- [ ] `__main__.py` — CLI:`--limit N --since DATE --resume` -- [ ] 速率:默认 QPS 0.5,遇 429/5xx 指数退避 +- [x] 列表分页 + 质量打分排序 +- [x] HTML 解析:title / description / license / attachments +- [x] 每项目目录:metadata / description / cover / files / _urls +- [x] QPS ≤ 0.5,UA 真实声明 -### 1.3 验收(0.5 天) +### 1.3 验收 ⏳ -- [ ] 跑 `--limit 10` 成功,10 条 jsonl 通过 schema 校验(`scripts/validate.py`) -- [ ] 抽查 3 条人工确认字段正确 -- [ ] 产出 `docs/sources/oshwhub.md` 调研笔记 +- [x] 10/10 成功,产出符合 `schemas/project.schema.json` +- [ ] **待 Charles**:随机抽查 2-3 条对照原站 +- [ ] `scripts/validate.py` 自动 schema 校验(未写,后续补) -### 1.4 放量(视情况) +### 1.4 放量(待决策) -- [ ] 估算全量规模(项目数 × 平均附件大小) -- [ ] 跟 Charles 对齐存储方案(LFS vs S3 vs 单机盘) -- [ ] 分批跑(每批 1-5 万项目),产出进度报告 +- [ ] Charles 定目标规模:50 / 500 / 5000 / 全量 12493 +- [ ] 估算存储:52 附件 / 10 项目 ≈ 52MB/项目 → 全量约 **650GB**(Gitea LFS 需评估) +- [ ] 未解决: + - `fs-web-stream.jlc.com` 工程源下载路径(未测) + - `u.lceda.cn` EasyEDA 工程 JSON(需登录,v0.1 跳过) + - 增量更新:`updated_at` 变动检测 + LFS prune 策略 --- diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..2e0a246 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,15 @@ +[project] +name = "facere-dataset" +version = "0.0.1" +description = "Open hardware design dataset for Facere." +requires-python = ">=3.11" +dependencies = [ + "httpx[http2]>=0.27", +] + +[tool.ruff] +line-length = 100 +target-version = "py311" + +[tool.uv] +package = false diff --git a/schemas/project.schema.json b/schemas/project.schema.json new file mode 100644 index 0000000..5191e67 --- /dev/null +++ b/schemas/project.schema.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://git.deepknow.site/Facere/FacereDataset/schemas/project.schema.json", + "title": "FacereDataset Project", + "description": "统一项目记录。跨源(oshwhub / hackaday / github / ...)通用。", + "type": "object", + "required": [ + "source", + "source_url", + "project_id", + "title", + "author", + "license", + "crawled_at", + "files" + ], + "properties": { + "source": { + "type": "string", + "description": "数据源标识,如 'oshwhub'、'hackaday'、'github'", + "enum": ["oshwhub", "hackaday", "github", "cern_ohr", "wikifactory", "other"] + }, + "source_url": { "type": "string", "format": "uri" }, + "project_id": { + "type": "string", + "description": "源站点内部 ID(oshwhub 用 uuid)" + }, + "title": { "type": "string" }, + "description_short": { + "type": "string", + "description": "简介(< 200 chars)" + }, + "description_path": { + "type": "string", + "description": "长描述 markdown 相对本项目目录的路径,如 'description.md'" + }, + "author": { + "type": "object", + "required": ["username"], + "properties": { + "username": { "type": "string" }, + "display_name": { "type": "string" }, + "user_id": { "type": "string" } + } + }, + "license": { + "type": "string", + "description": "原始许可证字符串;下游做规范化映射。未知标 'unknown'" + }, + "tags": { + "type": "array", + "items": { "type": "string" } + }, + "created_at": { "type": "string", "format": "date-time" }, + "updated_at": { "type": "string", "format": "date-time" }, + "published_at": { "type": "string", "format": "date-time" }, + "crawled_at": { "type": "string", "format": "date-time" }, + "metrics": { + "type": "object", + "additionalProperties": true, + "description": "任意源站点统计:likes/stars/views/forks 等" + }, + "cover": { + "type": "object", + "properties": { + "url": { "type": "string", "format": "uri" }, + "path": { "type": "string", "description": "本地相对路径,如 'cover.png'" } + } + }, + "files": { + "type": "array", + "items": { + "type": "object", + "required": ["name", "url"], + "properties": { + "name": { "type": "string" }, + "url": { "type": "string", "format": "uri" }, + "path": { "type": "string", "description": "本地相对路径,如 'files/xxx.pdf'。缺省表示只保留 URL" }, + "size": { "type": "integer" }, + "md5": { "type": "string" }, + "sha256": { "type": "string" }, + "ext": { "type": "string" }, + "mime": { "type": "string" }, + "original_id": { "type": "string", "description": "源站点内部文件 ID" } + } + } + }, + "raw_fields": { + "type": "object", + "description": "不易规范化但想保留的源站原始字段(grade、download_count 等)", + "additionalProperties": true + } + }, + "additionalProperties": false +}