diff options
author | Vika Shleina <vika@fireburn.ru> | 2021-07-15 04:32:29 +0300 |
---|---|---|
committer | Vika <vika@fireburn.ru> | 2021-07-19 04:57:11 +0300 |
commit | d399fd0bd00c9ea073e5b057de70c9ffdd9356f8 (patch) | |
tree | a9dafbeb62fb2aeb56e2d190565c70cd7f4b9d7a /src/bin/pyindieblog_to_kittybox.rs | |
parent | 93b56879298810d60d121203403e2416f35e4765 (diff) | |
download | kittybox-d399fd0bd00c9ea073e5b057de70c9ffdd9356f8.tar.zst |
Renamed main executable to kittybox, added tools
The new tools are: - kittybox-bulk-import, a bare-bones Micropub client that reads a JSON list of posts and then sends them one by one to the Micropub endpoint - pyindieblog-export, my personal tool which directly connects to Pyindieblog's redis instance and extracts data from it in JSON format suitable for use with kittybox-bulk-import.
Diffstat (limited to 'src/bin/pyindieblog_to_kittybox.rs')
-rw-r--r-- | src/bin/pyindieblog_to_kittybox.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/bin/pyindieblog_to_kittybox.rs b/src/bin/pyindieblog_to_kittybox.rs new file mode 100644 index 0000000..7935da5 --- /dev/null +++ b/src/bin/pyindieblog_to_kittybox.rs @@ -0,0 +1,48 @@ +use std::collections::HashMap; +use std::fs::File; +use anyhow::{Error, Result, Context, anyhow, bail}; +use mobc_redis::redis; +use mobc_redis::redis::AsyncCommands; +use serde::{Serialize, Deserialize}; +use serde_json::json; + +#[derive(Default, Serialize, Deserialize)] +struct PyindieblogData { + posts: Vec<serde_json::Value>, + cards: Vec<serde_json::Value> +} + +#[async_std::main] +async fn main() -> Result<()> { + let mut args = std::env::args(); + args.next(); // skip argv[0] which is the name + let redis_uri = args.next().ok_or(anyhow!("No Redis URI provided"))?; + let client = redis::Client::open(redis_uri.as_str()).with_context(|| format!("Failed to construct Redis client on {}", redis_uri))?; + + let filename = args.next().ok_or(anyhow!("No filename provided for export"))?; + + let mut data: Vec<serde_json::Value>; + + let file = File::create(filename)?; + + let mut conn = client.get_async_std_connection().await.with_context(|| "Failed to connect to the Redis server")?; + + data = conn.hgetall::<&str, HashMap<String, String>>("posts").await? + .values() + .map(|s| serde_json::from_str::<serde_json::Value>(s) + .with_context(|| format!("Failed to parse the following entry: {:?}", s))) + .collect::<std::result::Result<Vec<serde_json::Value>, anyhow::Error>>() + .with_context(|| "Failed to export h-entries from pyindieblog")?; + data.extend(conn.hgetall::<&str, HashMap<String, String>>("hcards").await? + .values() + .map(|s| serde_json::from_str::<serde_json::Value>(s) + .with_context(|| format!("Failed to parse the following card: {:?}", s))) + .collect::<std::result::Result<Vec<serde_json::Value>, anyhow::Error>>() + .with_context(|| "Failed to export h-cards from pyindieblog")?); + + data.sort_by_key(|v| v["properties"]["published"][0].as_str().map(|s| s.to_string())); + + serde_json::to_writer(file, &data)?; + + Ok(()) +} |