{ "info": { "author": "Adam Geitgey", "author_email": "ageitgey@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# Medium to Ghost 2.0\n\nFeeling locked into Medium.com? Instantly move all your content (formatted posts + images) to an open source [Ghost 2.0](https://blog.ghost.org/2-0/) blog!\n\n![Migrate your data out of Medium to Ghost](https://user-images.githubusercontent.com/896692/44764117-0c097c80-ab03-11e8-8925-bcc4c584059c.png)\n\nThis code converts all your Medium.com posts to a Ghost 2.0.x import file. With that,\nyou can import all your content into a [Ghost](https://ghost.org/) blog (hosted anywhere) in seconds. Your posts keep\nthe same formatting and all your images are migrated over too.\n\n## Why?\n\nMedium.com is a nice platform for creating blog posts. I use it and enjoy it.\n\nBut you should never feel like your content is locked into someone else's privately-owned platform. This \ngives you the option to move your content to your own blog if you want to do it. It's also a quick way \nto back up all your Medium.com content (especially your images which they don't export) in case the site disappears \nsomeday.\n\nI hacked this together quickly to move my blog, [Machine Learning is Fun!](https://www.machinelearningisfun.com/) from \nMedium to a self-hosted Ghost site. Hopefully it's useful to someone else too. More options is always good, right? \n\n## Requirements\n\n- A blog running Ghost v2.0.3+ (*NOT Ghost 1.x*). Both Self-hosted or professionally hosted Ghost instances are both \n fine.\n- A Medium.com account where you've previously written content. \n- Python 3.6+ to run this program\n\n## Installing this program\n\nAfter you've [installed Python 3.6+](https://www.python.org/downloads/), you can install this program by opening up a \nterminal window and running this command:\n\n### Mac / Linux\n\n```python\npip3 install medium_to_ghost\n```\n\n### Windows\n\n```python\npip install medium_to_ghost\n```\n\n## How to use this to export your Medium content\n\n1. Install [Python 3.6+](https://www.python.org/downloads/). Lower versions won't work!\n1. Install this program (See \"Installing this program\")\n1. Go to https://medium.com/me/settings and find `Download your information`. There's a button to export your data and \n email it to you. \n1. Wait for the email from Medium and download your zip file. This will give you a file called `medium-export.zip`\n1. Run `python3 medium_to_ghost.py medium-export.zip` which will produce `medium_export_for_ghost.zip`.\n This new zip file contains all your converted Medium posts and images from your posts. Make sure to put the full path\n to the zip file if it's not in the current directory. This may take a few minutes if you have lots of images\n in your posts since they all have to be downloaded.\n1. Go into Ghost 2.0.3+, navigate to /ghost/, click on 'Labs', and choose to import that zip file.\n1. That's it!\n\n## What gets moved over\n\nWhen exporting content from Medium, the following features are supported:\n\n- Both published articles and drafts are moved over. So even if you are in the middle of writing a new\n post, it should be a seamless transition.\n- Most Medium.com content is replicated perfectly in Ghost, including text formatting, embedded Github gists, image\n cards with captions, Upscribe mailing list signup forms, etc.\n- If your Medium posts have a featured image, that will come over automatically too.\n\n## What is lost when moving over\n\n- Comments are not moved over to Ghost\n- Story highlights are not moved over to Ghost\n- I tried to make the Ghost output as similar to Medium as possible. However, there may be bugs or types of \n Medium content I haven't seen before, so always check the results in Ghost carefully. I just made sure it worked\n for all my articles. No warranty! :)\n\n## Warnings!\n\n- Hopefully this code will work for you, but it may have bugs and cause your computer to explode. Make sure you \n test everything out on a test Ghost instance before you import anything into a live blog.\n- Ghost does not let you set a Canonical Url for a post! This means that your new Ghost blog will\n duplicate your existing Medium.com posts and that may mess with your Google rankings. Please [vote for\n this suggestion on Ghost](https://forum.ghost.org/t/change-canonical-url/28) and ask them nicely to \n support the ability to set canonical urls. If that was supported, this tool could automatically set \n up the exported Ghost posts to point back to Medium URLs to avoid any SEO impact.\n- Ghost 2.0.3 has [a bug with image paths in import files](https://github.com/TryGhost/Ghost/issues/9821).\n This tool may need to be updated when that bug is fixed in order for it to keep working, but it works \n for now with 2.0.3. \n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ageitgey/medium_to_ghost", "keywords": "Medium", "license": "MIT license", "maintainer": "", "maintainer_email": "", "name": "medium_to_ghost", "package_url": "https://pypi.org/project/medium_to_ghost/", "platform": "", "project_url": "https://pypi.org/project/medium_to_ghost/", "project_urls": { "Homepage": "https://github.com/ageitgey/medium_to_ghost" }, "release_url": "https://pypi.org/project/medium_to_ghost/0.0.3/", "requires_dist": null, "requires_python": "", "summary": "Convert a Medium blog export file to Ghost 2.0 format (including images)", "version": "0.0.3" }, "last_serial": 4984744, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "4d6c1077f179ff3912190510e95802ef", "sha256": "59de81cd8e333b5e74f2b205e9edb44ed82fa10bb272aa872d95a8e053f945da" }, "downloads": -1, "filename": "medium_to_ghost-0.0.1.tar.gz", "has_sig": false, "md5_digest": "4d6c1077f179ff3912190510e95802ef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13043, "upload_time": "2018-08-29T04:18:10", "url": "https://files.pythonhosted.org/packages/1f/6e/a6f7c0448c1be6800e1d5c80502dbd5ece649bf46c50e801312fc549b9f5/medium_to_ghost-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "c7d9b38143276bbd5cbb6b8807de9ef6", "sha256": "b8c37411bdef4d76ff23b9a486395d2c01bf024a8ce51e8832ddec6415391458" }, "downloads": -1, "filename": "medium_to_ghost-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "c7d9b38143276bbd5cbb6b8807de9ef6", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 15284, "upload_time": "2018-10-19T20:00:41", "url": "https://files.pythonhosted.org/packages/27/20/37193588e828fc6afdf8bcdae124af39091ed71b831e4a81eabdf4ab8e2e/medium_to_ghost-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e66834d38df81057b7d07926ec23845a", "sha256": "17ea82371a396a269691df05796645f64116cf177636f792f67bcde89f0fa703" }, "downloads": -1, "filename": "medium_to_ghost-0.0.2.tar.gz", "has_sig": false, "md5_digest": "e66834d38df81057b7d07926ec23845a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13166, "upload_time": "2018-10-19T20:00:26", "url": "https://files.pythonhosted.org/packages/8e/7e/1dfca829ed6f080564fee5bfb8bea54ab2c9abf594015cecf9345454214c/medium_to_ghost-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "e45f24bf6548698091ed21104f6be089", "sha256": "2b8a603d2a011e087d2c6eb602f0cc7ff79333e84b7ae8740b1885f5c0c9bdae" }, "downloads": -1, "filename": "medium_to_ghost-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e45f24bf6548698091ed21104f6be089", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 15348, "upload_time": "2019-03-25T21:45:33", "url": "https://files.pythonhosted.org/packages/8b/a3/1ca2be6e09a00f3184f063632ce18688721de9ccc902a3164ece95dee4f0/medium_to_ghost-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f5c263e937d586c49ff684c9dde09a0d", "sha256": "69a02dce16dac5ef16038f636def1762d850ac0727219d1c5333057e943b96e3" }, "downloads": -1, "filename": "medium_to_ghost-0.0.3.tar.gz", "has_sig": false, "md5_digest": "f5c263e937d586c49ff684c9dde09a0d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11145, "upload_time": "2019-03-25T21:45:21", "url": "https://files.pythonhosted.org/packages/38/ad/882793157a092956f9c33805199bcdce95d62b5250c731239bd7d6a51d58/medium_to_ghost-0.0.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e45f24bf6548698091ed21104f6be089", "sha256": "2b8a603d2a011e087d2c6eb602f0cc7ff79333e84b7ae8740b1885f5c0c9bdae" }, "downloads": -1, "filename": "medium_to_ghost-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e45f24bf6548698091ed21104f6be089", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 15348, "upload_time": "2019-03-25T21:45:33", "url": "https://files.pythonhosted.org/packages/8b/a3/1ca2be6e09a00f3184f063632ce18688721de9ccc902a3164ece95dee4f0/medium_to_ghost-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f5c263e937d586c49ff684c9dde09a0d", "sha256": "69a02dce16dac5ef16038f636def1762d850ac0727219d1c5333057e943b96e3" }, "downloads": -1, "filename": "medium_to_ghost-0.0.3.tar.gz", "has_sig": false, "md5_digest": "f5c263e937d586c49ff684c9dde09a0d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11145, "upload_time": "2019-03-25T21:45:21", "url": "https://files.pythonhosted.org/packages/38/ad/882793157a092956f9c33805199bcdce95d62b5250c731239bd7d6a51d58/medium_to_ghost-0.0.3.tar.gz" } ] }