{"id":19494784,"url":"https://github.com/ceejbot/ljmigrate","last_synced_at":"2026-02-26T22:04:18.700Z","repository":{"id":43366480,"uuid":"2500038","full_name":"ceejbot/ljmigrate","owner":"ceejbot","description":"A tool for backing up Livejournal entries locally \u0026 migrating to another LJ-api service.","archived":false,"fork":false,"pushed_at":"2022-03-05T12:11:13.000Z","size":185,"stargazers_count":13,"open_issues_count":1,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-18T20:25:33.736Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ceejbot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.text","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2011-10-02T16:12:49.000Z","updated_at":"2022-04-27T18:51:15.000Z","dependencies_parsed_at":"2022-07-26T16:30:08.558Z","dependency_job_id":null,"html_url":"https://github.com/ceejbot/ljmigrate","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ceejbot%2Fljmigrate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ceejbot%2Fljmigrate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ceejbot%2Fljmigrate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ceejbot%2Fljmigrate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ceejbot","download_url":"https://codeload.github.com/ceejbot/ljmigrate/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250900012,"owners_count":21504984,"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":[],"created_at":"2024-11-10T21:33:19.274Z","updated_at":"2026-02-26T22:04:13.657Z","avatar_url":"https://github.com/ceejbot.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ljmigrate 1.5\n\nA tool for archiving posts from any LiveJournal clone site and optionally \nmigrating them to any other LJ-clone site. Useful for moving from LiveJournal\nto GreatestJournal or InsaneJournal, for instance.\n\nBased on ljdump; original ljdump license \u0026 header at the bottom of the single\nsource file. http://hewgill.com/software/ljdump/\n\nExtensive modifications by  C J Silverio.\nVersion 1.5\n18 April 2009\n\nBSD licence mumbo-jumbo to follow. By which I mean, do what you want \nwith the source. If you find it useful, excellent!\n\nTo get usage information:\n\n\t./ljmigrate --help \n\n## Running new versions of the tools\n\nIf you ran the tool once, migrated most of your posts, but failed to migrate some because of bugs, you might want to run a newer version but NOT re-migrate everything. Here's how to do that.\n\nThe folder named after your account has all the interesting data in it. You can copy it and move it around. You can move it from the folder holding the *old* version of the tool into the new one. Run the new version. Tada!\n\n## To use: expert version\n\nMake sure your journal has been converted to Unicode, if it's an older one.\n\nEdit the sample config options in ljmigrate.cfg.\n\nEdit to point the tool to your LJ account and the account you're migrating to.\n\nIf you're not migrating, set the \"migrate\" config value to 0 or False.\n\nRun ./ljmigrate.py.\n\nWait. DON'T INTERRUPT IT. I'm not yet very good about saving state as I go, so you'll get double-posts if you interrupt it in the middle and run it again.\n\nIf the migration failed for many of your posts, because of LiveJournal flakiness or troubles with your network connection, you can re-run the tool to retry the  migration:\n\n\t./ljmigrate.py --retry\n\nThis will skip entries it successfully moved before.\n\n## To use: long version\n\n* If your journal is an older one, you might need to convert it to Unicode.\nVisit this url and follow the instructions. If your journal was created later than 2004, or if you've ever done this conversion before, you don't need to do this.\n\n\t\thttp://www.livejournal.com/settings/?c=OldEncoding\n\t\thttp://www.livejournal.com/support/faqbrowse.bml?faqid=143\u0026q=unicode\u0026lang=\n\n* Edit the config file: `ljmigrate.cfg`\n  Make sure you use that EXACT name! Many editors will try to force on their filename ending, which will make the config file unfindable by the tool. For best results use TextEdit to edit the file. (Other options are vim, emacs, BBEdit, TextWrangler, and TextMate.)\n\n* Edit the settings in the config file.\n\n\t\t[settings]\n\t\tmigrate: True\n\t\tgenerate-html: True\n\t\tmigrate-community-posts-by-others: False\n\t\tmigrate-these-tags: fiction, meta\n\t\n  __migrate__: can be True or False. Set this to True if you want the tool to copy all your journal entries to another system.\n  __generate-html__: can be True or False. Set this to True if you want the tool  to make simple html files for your entries \u0026 all comments.\n  __migrate-these-tags__: If you want, you can migrate *only* posts that have one of the given lists of tags. For instance, you might want to migrate your fic posts but nothing else. If you want to migrate everything, just delete this entry or leave it empty.\n\n\t[source]\n\tserver: http://livejournal.com\n\tuser: myusername\n\tpassword: mypassword\n\t\n  You *must* have a source journal section. This is the journal that gets archived locally \u0026 the journal that will be optionally copied elsewhere.\n \n\t[destination]\n\tserver: http://insanejournal.com\n\tuser: myotheruser\n\tpassword: myotherpassword\n\n  This is the destination journal; the place you're migrating to. You can leave the destination section out if you don't want to migrate.\n\n* Proxied connections to the net\n\n  Some workplaces use proxy servers to mediate all web traffic. If you've had to tell your web browser to use an HTTP proxy, you'll need to give ljmigrate the same information. You can omit the port. You should omit this section entirely if you don't use a proxy.\n  \n\t[proxy]\n\thost: proxy-server-name\n\tport: 8000  \n  \n* Run the Terminal. It lives in Applications, in the Utilities folder.\n\n* In the terminal, change directories to the place where you unpacked the \n  tool. Exactly where that was, is up to you \u0026 your web browser. The desktop\n  is one popular location. \n  \n\t\tcd ~/Desktop/ljmigrate\n\n  If you unpacked it somewhere else, cd to there. One way to find out where is:\n  \tswitch to the Finder\n  \tlook at the Finder window for the ljmigrate folder\n  \tcommand-click on the titlebar: the folder trail shows up in a popup\n\n* Execute the tool:\n\n\t\t./ljmigrate.py\n\n* Watch and wait. The tool is pretty chatty about what it's doing.\n\n## What the tool produces\n\nThe tool makes a directory named for your account, with a subdirectory containing your userpics and one subdirectory for each entry. If you're generating html, it also makes an html directory inside the account directory, with bare-bones html versions of each of your posts, with comments.\n\n\tusername/\n\t\tentry000001/\n\t\t\tentry.xml\n\t\t\tcomments.xml\n\t\tentry000002/\n\t\t\tentry.xml\n\t\t\tcomments.xml\n\t\tuserpics/\n\t\t\tkeyword1.jpeg\n\t\t\tkeyword2.png\n\t\thtml/\n\t\t\tindex.html\n\t\t\t00001.html\n\t\t\t00002.html\n\t\tmetadata/\n\t\t\tljmigrate.log (logfile, with error reports)\n\t\t\t(program state, including the last time we synced)\n\t\t\nIf you're migrating, the posts at the destination will have all metadata preserved (user pic keywords, mood, tags, music, and location). They also have all privacy settings preserved (private, friends-only, custom filter settings). Custom friend groups are not yet migrated, since the tool makes no attempt to migrate friendlists. (That would, in my opinion, be dicey since you don't know that your friends at the destination have the same account names as your friends at your original journal site.)\n\nThe tool can't migrate your userpics, because the LiveJournal API provides no way to add or edit icons. You'll need to upload them by hand. The image files in userpics/ are named by keyword, to help. Spaces are replaced by _ (underbar) for various geeky reasons.\n\n## Migrating communities\n\nIn your config sections for \"source\" and \"destination\", add the names of the communities you want to back up or migrate:\n\n\t[source]\n\tserver: http://livejournal.com\n\tuser: my_original_user\n\tpassword: the_password\n\tcommunities: pony_fans cardboard_fans comm_to_archive_and_not_move\n\n\t[destination]\n\tserver: http://insanejournal.com\n\tuser: my_new_user\n\tpassword: the_password\n\tcommunities: pony_asylum cardboard_mania \n\nAll three communities will be archived, and these migrations will happen:\n\tpony_fans =\u003e pony_asylum\n\tcardboard_fans =\u003e cardboard_mania\n\tcomm_to_archive_and_not_move not migrated\n\nNOTE! You'll be the poster of any migrated community entries. By default the script will migrate ONLY your own posts. If you want to migrate everything and don't care that you'll be the poster on the other end, set this option:\n\n\t[settings]\n\tmigrate-community-posts-by-others: 1\n\t\nIf you enable moving posts by other people, each migrated post that you didn't make originally will have the original poster's name added at the top.\n\nNOTE! Moving communities has one other limitation to know in advance: community posts can't be back-dated the way regular journal posts can be. That means if you migrate a journal, every single post will appear as new in member's friendslists. This is a restriction imposed by the LJ client protocol.\n\nThere is one limitation to LJ's comment exporting script that affects how communities are archived. You must be a maintainer of the community to get access to get access to the comments. This is an artifact of how LJ's export_comments.bml script works.\n\n\n## Secret nuclear option\n\nWhile testing I found it very useful to have a tool that nukes all the entries in my test journal. I figured you could use it too.\n\nAdd a section to the config file that looks like this:\n\n\t[nuke]\n\tserver: http://insanejournal.com\n\tuser: user_to_nuke\n\tpassword: the_password\n\nRun the tool with the --nuke flag:\n\n\t./ljmigrate.py --nuke\n\nAnswer the two questions with Y if you REALLY REALLY mean it. THERE IS NO GOING BACK ON THIS. ONLY RUN IT IF YOU REALLY WANT ALL YOUR POSTS DELETED.\n\n## Troubleshooting\n\nTBD\n\n## Contributors\n\n[don-pit (Petr Gladkiy)](https://github.com/don-pit)\n\nEarly bug-reporting provided by LJ users ldybastet, kannnichtfranz, eleraama, daiseechain, nm973, zortified, weirdquark, winterthunder, unmisha, chicken_cem.\n\n## Changes from ljdump 1.2\n\n- Uses Configparser instead of xml for config, since we are not insane.\n- The concept of object-oriented programming is introduced.\n- Userpics are downloaded \u0026 image type identified.\n- Html generation for posts + comments.\n- Others too numerous to mention-- the codebase has now diverged seriously.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fceejbot%2Fljmigrate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fceejbot%2Fljmigrate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fceejbot%2Fljmigrate/lists"}