{"id":25528826,"url":"https://github.com/pythoninthegrass/medium_to_markdown","last_synced_at":"2025-07-17T20:39:15.709Z","repository":{"id":277070800,"uuid":"931238074","full_name":"pythoninthegrass/medium_to_markdown","owner":"pythoninthegrass","description":"Export Medium URLs to Markdown","archived":false,"fork":false,"pushed_at":"2025-02-12T00:17:22.000Z","size":10,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-03T04:12:38.202Z","etag":null,"topics":["beautifulsoup","bs4","markdown","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pythoninthegrass.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-12T00:05:53.000Z","updated_at":"2025-02-12T00:17:26.000Z","dependencies_parsed_at":"2025-02-12T01:25:45.116Z","dependency_job_id":"e30cec6b-6ffc-4a67-8eb5-48cecfe23110","html_url":"https://github.com/pythoninthegrass/medium_to_markdown","commit_stats":null,"previous_names":["pythoninthegrass/medium_to_markdown"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pythoninthegrass/medium_to_markdown","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoninthegrass%2Fmedium_to_markdown","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoninthegrass%2Fmedium_to_markdown/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoninthegrass%2Fmedium_to_markdown/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoninthegrass%2Fmedium_to_markdown/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pythoninthegrass","download_url":"https://codeload.github.com/pythoninthegrass/medium_to_markdown/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoninthegrass%2Fmedium_to_markdown/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265659996,"owners_count":23807043,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["beautifulsoup","bs4","markdown","python"],"created_at":"2025-02-19T23:23:25.432Z","updated_at":"2025-07-17T20:39:15.666Z","avatar_url":"https://github.com/pythoninthegrass.png","language":"Python","readme":"# medium_to_markdown\n\nInspiration from [A simple way to export your Medium’s reading list to a Markdown file by Eryk Lewinson](https://medium.com/geekculture/a-simple-way-to-export-your-mediums-reading-list-to-a-markdown-file-139e9861bf2)\n\n## Minimum Requirements\n\n* [Python 3.11+](https://www.python.org/downloads/)\n\n## Setup\n\n### Repo\n\n```bash\n# clone the repo\ngit clone https://github.com/pythoninthegrass/medium_to_markdown.git\n\n# setup the virtual environment\npython -m venv .venv\n\n# activate the virtual environment\nsource .venv/bin/activate\n\n# install the dependencies\npython -m pip install -r requirements.txt\n```\n\n### Medium\n\nExport your bookmarks from Medium. They're in your [account](https://medium.com/me/settings#account) settings under **Security and apps**.\n\nExtract the zip file into the `data` directory.\n\n## Usage\n\n```bash\n# run the script\npython main.py\n\n# deactivate the virtual environment\ndeactivate\n```\n\n## Benchmark\n\nTwo for loops, one to iterate over HTML files and another to append to the bookmarks markdown file.\n\n```bash\n# sync\nλ hyperfine ./main.py --warmup 1\nBenchmark 1: ./main.py\n  Time (mean ± σ):     154.7 ms ±   3.1 ms    [User: 146.3 ms, System: 6.7 ms]\n  Range (min … max):   151.1 ms … 162.6 ms    19 runs\n\n# async\nλ hyperfine ./main.py --warmup 1\nBenchmark 1: ./main.py\n  Time (mean ± σ):     172.2 ms ±   3.0 ms    [User: 159.1 ms, System: 11.7 ms]\n  Range (min … max):   168.6 ms … 179.3 ms    17 runs\n\n# multiprocessing\nλ hyperfine ./main.py --warmup 1\nBenchmark 1: ./main.py\n  Time (mean ± σ):     157.0 ms ±   4.9 ms    [User: 994.9 ms, System: 186.5 ms]\n  Range (min … max):   149.1 ms … 168.1 ms    19 runs\n```\n\nTurns out, the async version is slower than the sync version. The multiprocessing version is slightly faster than the sync version, but slower than the async version and uses more CPU resources.\n\nThe sync version is the fastest.\n\n## TODO\n\n* Scrape the Medium links and generate a PDF or EPUB file.\n* Build a website\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpythoninthegrass%2Fmedium_to_markdown","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpythoninthegrass%2Fmedium_to_markdown","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpythoninthegrass%2Fmedium_to_markdown/lists"}