diff --git a/.gitignore b/.gitignore index 4e51f93..dc3ebae 100644 --- a/.gitignore +++ b/.gitignore @@ -58,4 +58,9 @@ fp-info-cache # Cache files project.kicad_sym fp-lib-table -sym-lib-table \ No newline at end of file +fabrication-toolkit-options.json +EWS.pdf +EWS.step + +# Ignore venv directory +tools/venv/ \ No newline at end of file diff --git a/CHANGELOG.de.md b/CHANGELOG.de.md index a5a5336..f23b26f 100644 --- a/CHANGELOG.de.md +++ b/CHANGELOG.de.md @@ -9,6 +9,9 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/). ## [Unreleased] +### Hinzugefügt +- **Dokumentation:** Datenblätter für alle Komponenten mit einer LCSC-Teilenummer in `doc/datasheets` hinzugefügt. + ### Behoben - **USB-Hub-Controller (U401/CH334):** Pin 4 (XO) auf GND gelegt, um den Betrieb ohne Kristall zu ermöglichen - **DC/DC-Wandler (U202/XR76208):** Enable-Beschaltung von Spannungsteiler auf Zenerdiode geändert, um 12V-Betrieb zu ermöglichen diff --git a/CHANGELOG.md b/CHANGELOG.md index c2dafea..4b0eb7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/). ## [Unreleased] +### Added +- **Documentation:** Added datasheets for all components with an LCSC part number in `doc/datasheets`. + ### Fixed - **USB Hub Controller (U401/CH334):** Pin 4 (XO) connected to GND to enable operation without crystal - **DC/DC Converter (U202/XR76208):** Enable circuit changed from voltage divider to Zener diode to enable 12V operation diff --git a/README.de.md b/README.de.md index 098a967..bc2ef04 100644 --- a/README.de.md +++ b/README.de.md @@ -230,6 +230,7 @@ sensor_mcu: hat ## 📚 Weitere Ressourcen +- [Bauteil-Datenblätter](doc/datasheets/README.md) - [Klipper Dokumentation](https://www.klipper3d.org/Config_Reference.html) - [CAN-Bus Setup Guide](https://www.klipper3d.org/CANBUS.html) - [Voron Documentation](https://docs.vorondesign.com/) diff --git a/README.md b/README.md index 73dc024..4ecfac9 100644 --- a/README.md +++ b/README.md @@ -230,6 +230,7 @@ sensor_mcu: hat ## 📚 Additional Resources +- [Component Datasheets](doc/datasheets/README.md) - [Klipper Documentation](https://www.klipper3d.org/Config_Reference.html) - [CAN-Bus Setup Guide](https://www.klipper3d.org/CANBUS.html) - [Voron Documentation](https://docs.vorondesign.com/) diff --git a/doc/datasheets/0402B102K500NT.pdf b/doc/datasheets/0402B102K500NT.pdf new file mode 100644 index 0000000..74b2926 --- /dev/null +++ b/doc/datasheets/0402B102K500NT.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6df3d1f341ba30358717fac8bc95719e3c5630d7cc7bccc16f469958906ac4bf +size 1006630 diff --git a/doc/datasheets/0402WGF1001TCE.pdf b/doc/datasheets/0402WGF1001TCE.pdf new file mode 120000 index 0000000..7a27543 --- /dev/null +++ b/doc/datasheets/0402WGF1001TCE.pdf @@ -0,0 +1 @@ +0402WGF5101TCE.pdf \ No newline at end of file diff --git a/doc/datasheets/0402WGF1002TCE.pdf b/doc/datasheets/0402WGF1002TCE.pdf new file mode 120000 index 0000000..7a27543 --- /dev/null +++ b/doc/datasheets/0402WGF1002TCE.pdf @@ -0,0 +1 @@ +0402WGF5101TCE.pdf \ No newline at end of file diff --git a/doc/datasheets/0402WGF1502TCE.pdf b/doc/datasheets/0402WGF1502TCE.pdf new file mode 120000 index 0000000..7a27543 --- /dev/null +++ b/doc/datasheets/0402WGF1502TCE.pdf @@ -0,0 +1 @@ +0402WGF5101TCE.pdf \ No newline at end of file diff --git a/doc/datasheets/0402WGF2001TCE.pdf b/doc/datasheets/0402WGF2001TCE.pdf new file mode 120000 index 0000000..7a27543 --- /dev/null +++ b/doc/datasheets/0402WGF2001TCE.pdf @@ -0,0 +1 @@ +0402WGF5101TCE.pdf \ No newline at end of file diff --git a/doc/datasheets/0402WGF2201TCE.pdf b/doc/datasheets/0402WGF2201TCE.pdf new file mode 120000 index 0000000..7a27543 --- /dev/null +++ b/doc/datasheets/0402WGF2201TCE.pdf @@ -0,0 +1 @@ +0402WGF5101TCE.pdf \ No newline at end of file diff --git a/doc/datasheets/0402WGF2202TCE.pdf b/doc/datasheets/0402WGF2202TCE.pdf new file mode 120000 index 0000000..7a27543 --- /dev/null +++ b/doc/datasheets/0402WGF2202TCE.pdf @@ -0,0 +1 @@ +0402WGF5101TCE.pdf \ No newline at end of file diff --git a/doc/datasheets/0402WGF3300TCE.pdf b/doc/datasheets/0402WGF3300TCE.pdf new file mode 120000 index 0000000..7a27543 --- /dev/null +++ b/doc/datasheets/0402WGF3300TCE.pdf @@ -0,0 +1 @@ +0402WGF5101TCE.pdf \ No newline at end of file diff --git a/doc/datasheets/0402WGF3302TCE.pdf b/doc/datasheets/0402WGF3302TCE.pdf new file mode 120000 index 0000000..7a27543 --- /dev/null +++ b/doc/datasheets/0402WGF3302TCE.pdf @@ -0,0 +1 @@ +0402WGF5101TCE.pdf \ No newline at end of file diff --git a/doc/datasheets/0402WGF5101TCE.pdf b/doc/datasheets/0402WGF5101TCE.pdf new file mode 100644 index 0000000..e69cb88 --- /dev/null +++ b/doc/datasheets/0402WGF5101TCE.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11cd644d5d8a34a6d12775afb80bf58d8fc11f0c3b700dbd0f7a59942ceaa5ef +size 467557 diff --git a/doc/datasheets/0603WAF100KT5E.pdf b/doc/datasheets/0603WAF100KT5E.pdf new file mode 120000 index 0000000..7a27543 --- /dev/null +++ b/doc/datasheets/0603WAF100KT5E.pdf @@ -0,0 +1 @@ +0402WGF5101TCE.pdf \ No newline at end of file diff --git a/doc/datasheets/0603WAF1200T5E.pdf b/doc/datasheets/0603WAF1200T5E.pdf new file mode 120000 index 0000000..7a27543 --- /dev/null +++ b/doc/datasheets/0603WAF1200T5E.pdf @@ -0,0 +1 @@ +0402WGF5101TCE.pdf \ No newline at end of file diff --git a/doc/datasheets/0603WAF6802T5E.pdf b/doc/datasheets/0603WAF6802T5E.pdf new file mode 120000 index 0000000..7a27543 --- /dev/null +++ b/doc/datasheets/0603WAF6802T5E.pdf @@ -0,0 +1 @@ +0402WGF5101TCE.pdf \ No newline at end of file diff --git a/doc/datasheets/1N5819WS.pdf b/doc/datasheets/1N5819WS.pdf new file mode 100644 index 0000000..d746dd9 --- /dev/null +++ b/doc/datasheets/1N5819WS.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:609a5bc2fcd5bbb36f47f802b11102f1e140eae519c74b067cb615b4d52d0a4f +size 1157833 diff --git a/doc/datasheets/AO3400A.pdf b/doc/datasheets/AO3400A.pdf new file mode 100644 index 0000000..e8e5f57 --- /dev/null +++ b/doc/datasheets/AO3400A.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5bfeef6cd3aa209f2e191ba42d5616259e8e7143ff01ed6c532b8ec3b13ab73 +size 491520 diff --git a/doc/datasheets/BX-TYPE-A-MCC4P.pdf b/doc/datasheets/BX-TYPE-A-MCC4P.pdf new file mode 100644 index 0000000..dfb5641 --- /dev/null +++ b/doc/datasheets/BX-TYPE-A-MCC4P.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:969bd10047fc43cca9228c9f50411b39a6817939e2453d5141e03908fd8b814c +size 526514 diff --git a/doc/datasheets/BZT52C15S.pdf b/doc/datasheets/BZT52C15S.pdf new file mode 100644 index 0000000..fc846c4 --- /dev/null +++ b/doc/datasheets/BZT52C15S.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c891bcb9942c24c6dc683f2bea3f88e073d17982290319eb2c11f1af51d8ef91 +size 227083 diff --git a/doc/datasheets/BZT52C4V7.pdf b/doc/datasheets/BZT52C4V7.pdf new file mode 100644 index 0000000..d456a24 --- /dev/null +++ b/doc/datasheets/BZT52C4V7.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c66d1a4354d67a86200f0764e0b71641731b67985e0618cf7cd05147392799a +size 232345 diff --git a/doc/datasheets/CFS12V3T3R00.pdf b/doc/datasheets/CFS12V3T3R00.pdf new file mode 100644 index 0000000..db0a253 --- /dev/null +++ b/doc/datasheets/CFS12V3T3R00.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13678171757b8e0a5fc96fe15aeef81f7a1d9213469003efbd4cd59db4d90a78 +size 1026910 diff --git a/doc/datasheets/CFS12V3T5R0.pdf b/doc/datasheets/CFS12V3T5R0.pdf new file mode 100644 index 0000000..cfe0134 --- /dev/null +++ b/doc/datasheets/CFS12V3T5R0.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d75fd88e2724b80de5bcae1e090e5143c883398617ac67395f79495123ed0210 +size 1040329 diff --git a/doc/datasheets/CH334F.pdf b/doc/datasheets/CH334F.pdf new file mode 100644 index 0000000..d17c7f4 --- /dev/null +++ b/doc/datasheets/CH334F.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e465af73c8572a1c0c774404b704953f1179d72fdfd817c0975d54ee2b73f08 +size 488258 diff --git a/doc/datasheets/CJAC70P06.pdf b/doc/datasheets/CJAC70P06.pdf new file mode 100644 index 0000000..a5fe4a9 --- /dev/null +++ b/doc/datasheets/CJAC70P06.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ce08038e33c558c10fa169bd5bc56843926b5825d3dfd0b801bdab604383bfa +size 1090766 diff --git a/doc/datasheets/CL05A105KA5NQNC.pdf b/doc/datasheets/CL05A105KA5NQNC.pdf new file mode 120000 index 0000000..24de425 --- /dev/null +++ b/doc/datasheets/CL05A105KA5NQNC.pdf @@ -0,0 +1 @@ +CL05A475MP5NRNC.pdf \ No newline at end of file diff --git a/doc/datasheets/CL05A475MP5NRNC.pdf b/doc/datasheets/CL05A475MP5NRNC.pdf new file mode 100644 index 0000000..1428412 --- /dev/null +++ b/doc/datasheets/CL05A475MP5NRNC.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96baebe4bd0ce363e87be28b5b003f511f1502e084a6fc4f02333ded56c808f6 +size 7856403 diff --git a/doc/datasheets/CL05B104KB54PNC.pdf b/doc/datasheets/CL05B104KB54PNC.pdf new file mode 120000 index 0000000..24de425 --- /dev/null +++ b/doc/datasheets/CL05B104KB54PNC.pdf @@ -0,0 +1 @@ +CL05A475MP5NRNC.pdf \ No newline at end of file diff --git a/doc/datasheets/CL10A106MA8NRNC.pdf b/doc/datasheets/CL10A106MA8NRNC.pdf new file mode 100644 index 0000000..a925c0d --- /dev/null +++ b/doc/datasheets/CL10A106MA8NRNC.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20cd04b602d5cbe31f33d7c9f41463a27bb408c611a7376b08f7b8cec023580b +size 1279320 diff --git a/doc/datasheets/CL10B221KB8NNNC.pdf b/doc/datasheets/CL10B221KB8NNNC.pdf new file mode 120000 index 0000000..24de425 --- /dev/null +++ b/doc/datasheets/CL10B221KB8NNNC.pdf @@ -0,0 +1 @@ +CL05A475MP5NRNC.pdf \ No newline at end of file diff --git a/doc/datasheets/CL31A106KBHNNNE.pdf b/doc/datasheets/CL31A106KBHNNNE.pdf new file mode 120000 index 0000000..24de425 --- /dev/null +++ b/doc/datasheets/CL31A106KBHNNNE.pdf @@ -0,0 +1 @@ +CL05A475MP5NRNC.pdf \ No newline at end of file diff --git a/doc/datasheets/CL31A226KAHNNNE.pdf b/doc/datasheets/CL31A226KAHNNNE.pdf new file mode 120000 index 0000000..24de425 --- /dev/null +++ b/doc/datasheets/CL31A226KAHNNNE.pdf @@ -0,0 +1 @@ +CL05A475MP5NRNC.pdf \ No newline at end of file diff --git a/doc/datasheets/KT-0805G.pdf b/doc/datasheets/KT-0805G.pdf new file mode 100644 index 0000000..a3b7fce --- /dev/null +++ b/doc/datasheets/KT-0805G.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:853e6752f600e247475ba548092207fa4fc707a3f8a0b1562a834bc9a901a8d9 +size 595189 diff --git a/doc/datasheets/KT-0805Y.pdf b/doc/datasheets/KT-0805Y.pdf new file mode 100644 index 0000000..6dfeb15 --- /dev/null +++ b/doc/datasheets/KT-0805Y.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8a2b8369f288161dcff4afa195ea47335d87a620086e1a2aa5c1f197573c972 +size 630767 diff --git a/doc/datasheets/MDA1050-3R3M.pdf b/doc/datasheets/MDA1050-3R3M.pdf new file mode 100644 index 0000000..8ec8bb5 --- /dev/null +++ b/doc/datasheets/MDA1050-3R3M.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2bf58529f90383e44df909c3f31c1710c733434d9e59d692cc5affa5798cb9f +size 795297 diff --git a/doc/datasheets/PESD1CAN.pdf b/doc/datasheets/PESD1CAN.pdf new file mode 100644 index 0000000..3987f45 --- /dev/null +++ b/doc/datasheets/PESD1CAN.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f448873123b144f61ee8440ad04884aad3b32f74f44103534f1c4853f47b1a13 +size 1942706 diff --git a/doc/datasheets/README.md b/doc/datasheets/README.md new file mode 100644 index 0000000..f8022e4 --- /dev/null +++ b/doc/datasheets/README.md @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e735baa97439c59561e06198f5ed4a51b49cf418a032778c07352388fcc0ffff +size 1119 diff --git a/doc/datasheets/RVT1H101M0607.pdf b/doc/datasheets/RVT1H101M0607.pdf new file mode 100644 index 0000000..cbefa0f --- /dev/null +++ b/doc/datasheets/RVT1H101M0607.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b20f848ff9dba17d5a7e0217922d176d46ce5738eefe5dea6f84eccf9f7a6ea2 +size 631381 diff --git a/doc/datasheets/SMAJ26A.pdf b/doc/datasheets/SMAJ26A.pdf new file mode 100644 index 0000000..732cd43 --- /dev/null +++ b/doc/datasheets/SMAJ26A.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b0d998152fca669eb71cd6a2955bfc20ba522e3086bff02b560bea903e03035 +size 289035 diff --git a/doc/datasheets/SS56C.pdf b/doc/datasheets/SS56C.pdf new file mode 100644 index 0000000..d930f74 --- /dev/null +++ b/doc/datasheets/SS56C.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32b2a5cc51a31cae0cf86a9da36d930bcc034057deebb43e00892102520b9d4c +size 1606209 diff --git a/doc/datasheets/STM32G0B1KBU6.pdf b/doc/datasheets/STM32G0B1KBU6.pdf new file mode 100644 index 0000000..acde163 --- /dev/null +++ b/doc/datasheets/STM32G0B1KBU6.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19ad77934ee0849dbf613999149675086b13912adbafca09b8c37b8bfa76b053 +size 2632513 diff --git a/doc/datasheets/TS-1088-AR02016.pdf b/doc/datasheets/TS-1088-AR02016.pdf new file mode 100644 index 0000000..89232c7 --- /dev/null +++ b/doc/datasheets/TS-1088-AR02016.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:368d4cc2c26b08cb63e1b67193f671d0860b6d3fb2e6b9f2696ffade401afc30 +size 123213 diff --git a/doc/datasheets/TYPE-C 16PIN 2MD(073).pdf b/doc/datasheets/TYPE-C 16PIN 2MD(073).pdf new file mode 100644 index 0000000..a790a03 --- /dev/null +++ b/doc/datasheets/TYPE-C 16PIN 2MD(073).pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe10da58945c9782ffe489b2079893a9baf90ff234efa4906e5e02744735e8f5 +size 1584275 diff --git a/doc/datasheets/USBLC6-2SC6.pdf b/doc/datasheets/USBLC6-2SC6.pdf new file mode 100644 index 0000000..fefdd34 --- /dev/null +++ b/doc/datasheets/USBLC6-2SC6.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:973ea7520f3cd820e2c9326fcf3ee3ca5239cff491d6f42de057573942dcdf83 +size 229314 diff --git a/doc/datasheets/XC6206P332MR-G.pdf b/doc/datasheets/XC6206P332MR-G.pdf new file mode 100644 index 0000000..fa57ad4 --- /dev/null +++ b/doc/datasheets/XC6206P332MR-G.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8fda1e40ea3e7c17178353aceba9c9a9794e56a1960d02b105c576429ce418ed +size 1049127 diff --git a/doc/datasheets/XR76208ELTR-F.pdf b/doc/datasheets/XR76208ELTR-F.pdf new file mode 100644 index 0000000..7091730 --- /dev/null +++ b/doc/datasheets/XR76208ELTR-F.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8065bb756b82df1e9a24dece8961dc68ab0d789335611dc7f1ce13d8113dcf58 +size 2491706 diff --git a/doc/datasheets/XT30PW-M30.G.Y.pdf b/doc/datasheets/XT30PW-M30.G.Y.pdf new file mode 100644 index 0000000..e51036f --- /dev/null +++ b/doc/datasheets/XT30PW-M30.G.Y.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e1b326300a43fec86c30484170006f3eb53bba8da25a9584b8982ad71c0afd5 +size 567295 diff --git a/tools/download_datasheets.py b/tools/download_datasheets.py new file mode 100644 index 0000000..b545bd2 --- /dev/null +++ b/tools/download_datasheets.py @@ -0,0 +1,135 @@ +import csv +import os +import re +import time +import hashlib +import requests +from bs4 import BeautifulSoup + +# --- Configuration --- +BOM_PATH = 'production/bom.csv' +OUTPUT_DIR = 'doc/datasheets' +PRODUCT_PAGE_URL = 'https://www.lcsc.com/product-detail/' +DATASHEET_BASE_URL = 'https://wmsc.lcsc.com/wmsc/upload/file/pdf/v2/' +HEADERS = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', +} + +# --- Helper Functions --- +def sanitize_filename(name): + """Replaces characters that are invalid for filenames.""" + return re.sub(r'[\\/*?:\"<>|]', '_', name) + +def get_mfr_part_number(session, lcsc_part_number): + """Fetches the product page and parses it for the Mfr. Part #.""" + product_url = f"{PRODUCT_PAGE_URL}{lcsc_part_number}.html" + try: + response = session.get(product_url, timeout=15) + response.raise_for_status() + soup = BeautifulSoup(response.text, 'html.parser') + + mfr_title_cell = soup.find(lambda tag: tag.name == 'td' and 'Mfr. Part #' in tag.get_text(strip=True)) + if mfr_title_cell: + mfr_value_cell = mfr_title_cell.find_next_sibling('td') + if mfr_value_cell and mfr_value_cell.find('span'): + return mfr_value_cell.find('span').text.strip() + except requests.exceptions.RequestException as e: + print(f" - ERROR: Could not fetch product page for {lcsc_part_number}. {e}") + except Exception as e: + print(f" - ERROR: Parsing Mfr. Part # failed for {lcsc_part_number}. {e}") + return None + +def download_pdf(session, lcsc_part, mfr_part): + """Downloads a PDF and saves it with the Mfr. Part #.""" + pdf_url = f"{DATASHEET_BASE_URL}{lcsc_part}.pdf" + sanitized_mfr_part = sanitize_filename(mfr_part) + filepath = os.path.join(OUTPUT_DIR, f"{sanitized_mfr_part}.pdf") + + if os.path.exists(filepath): + print(f" - INFO: File already exists for Mfr. Part '{mfr_part}'. Skipping.") + return filepath, True # Return path for deduplication check + + print(f" - Downloading: {pdf_url}") + try: + pdf_response = session.get(pdf_url, timeout=60) + pdf_response.raise_for_status() + + if 'application/pdf' in pdf_response.headers.get('Content-Type', ''): + with open(filepath, 'wb') as f: + f.write(pdf_response.content) + print(f" - SUCCESS: Saved to {filepath}") + return filepath, True + else: + print(f" - ERROR: URL did not return a PDF. Content-Type: {pdf_response.headers.get('Content-Type', 'N/A')}") + return None, False + except requests.exceptions.RequestException as e: + print(f" - ERROR: Could not download PDF for {lcsc_part}. {e}") + return None, False + +def deduplicate_files(): + """Finds duplicate files in the output directory and replaces them with symlinks.""" + print("\n--- Starting Deduplication Process ---") + hashes = {} + files_to_process = [f for f in os.listdir(OUTPUT_DIR) if f.endswith('.pdf')] + + for filename in files_to_process: + filepath = os.path.join(OUTPUT_DIR, filename) + if os.path.islink(filepath): + continue + + with open(filepath, 'rb') as f: + file_hash = hashlib.sha256(f.read()).hexdigest() + + if file_hash in hashes: + original_file = hashes[file_hash] + print(f" - DUPLICATE: '{filename}' is identical to '{os.path.basename(original_file)}'.") + os.remove(filepath) + # Create a relative symlink + relative_path = os.path.relpath(original_file, start=OUTPUT_DIR) + os.symlink(relative_path, filepath) + print(f" - ACTION: Replaced '{filename}' with a symbolic link.") + else: + hashes[file_hash] = filepath + print(f" - UNIQUE: '{filename}'") + print("--- Deduplication Finished ---") + +# --- Main Execution --- +def main(): + """Main script execution.""" + if not os.path.exists(BOM_PATH): + print(f"FATAL: BOM file not found at '{BOM_PATH}'") + return + + os.makedirs(OUTPUT_DIR, exist_ok=True) + + # --- Phase 1: Gather Info & Download --- + print("--- Starting Download Process ---") + download_tasks = {} # {lcsc_part: mfr_part} + + with open(BOM_PATH, 'r', encoding='utf-8') as f: + reader = csv.DictReader(f) + unique_lcsc_parts = {row.get('LCSC Part #', '').strip() for row in reader if row.get('LCSC Part #', '').strip()} + + with requests.Session() as session: + session.headers.update(HEADERS) + + for i, lcsc_part in enumerate(unique_lcsc_parts): + print(f"\nProcessing LCSC Part {i+1}/{len(unique_lcsc_parts)}: {lcsc_part}") + mfr_part = get_mfr_part_number(session, lcsc_part) + if mfr_part: + download_tasks[lcsc_part] = mfr_part + time.sleep(0.5) # Be a good citizen + + print("\n--- All product information gathered. Starting downloads. ---") + for lcsc_part, mfr_part in download_tasks.items(): + print(f"\nDownloading for LCSC Part: {lcsc_part} (Mfr: {mfr_part})") + download_pdf(session, lcsc_part, mfr_part) + time.sleep(0.5) + + # --- Phase 2: Deduplicate --- + deduplicate_files() + + print("\nScript finished.") + +if __name__ == '__main__': + main() diff --git a/tools/requirements.txt b/tools/requirements.txt new file mode 100644 index 0000000..1190bd8 --- /dev/null +++ b/tools/requirements.txt @@ -0,0 +1,2 @@ +requests +beautifulsoup4