Compare commits

..

No commits in common. "master" and "0.0.1" have entirely different histories.

3 changed files with 27 additions and 52 deletions

View File

@ -5,48 +5,41 @@ _A small Janet script to archive all your Mastodon bookmarks in Markdown files._
Because Mastodon posts can disappear for a variety of reasons (deletion, defederation, server instance shutdown, ...), it is safer to archive your bookmarks. Because Mastodon posts can disappear for a variety of reasons (deletion, defederation, server instance shutdown, ...), it is safer to archive your bookmarks.
Each Markdown file will contain: Each Markdown file will contain:
- [x] A link to the original post - A link to the original post
- [x] The author's handle - The author's handle
- [x] The post's content in HTML - The post's content in HTML
- [x] The media attachments locally downloaded - The media attachments locally downloaded
- [x] If available, the alt text for each media - If available, the alt text for each media
- [ ] The full thread, if applicable
- [ ] The link card, if any
Most of these values will be in the form of `key:: value` for easy integration with Obsidian's plugin Dataview. A sample script is available [here](./dataview-query.js) Most of these values will be in the form of `key:: value` for easy integration with Obsidian's plugin Dataview. A sample script is available [here](./dataview-query.js)
## Build & Run ## Setup & Run
### Pre-requirements
```sh
# Required by the httprequest dependency
$ sudo apt install libcurl4-openssl-dev
```
- Clone this repository
- Install Janet and jpm https://janet-lang.org/
- Get an access token for your Mastodon account - Get an access token for your Mastodon account
![](image1.png) ![](image1.png)
![](image2.png) ![](image2.png)
- Run the program
### Run
```sh ```sh
# Install dependencies locally with -l (--local) $ ./mastodon-bookmarks YOUR_APP_TOKEN
$ jpm deps -l
# Tell jpm that our dependencies are local, before starting the script
$ jpm -l janet main.janet YOUR_INSTANCE YOUR_APP_TOKEN
``` ```
The `YOUR_INSTANCE` value **must not** have the trailing slash (e.g: `https://hachyderm.io`) ## Development
### Build for release - Clone this repository
- Install Janet and jpm https://janet-lang.org/
- `jpm deps --local`
```sh ```sh
$ jpm build -l $ janet main.janet YOUR_APP_TOKEN
```
## Build binary
```sh
$ jpm build
``` ```
## LICENSE ## LICENSE

View File

@ -2,11 +2,9 @@
(import spork/json :as json) (import spork/json :as json)
(import ./utils :as utils) (import ./utils :as utils)
(var server "")
(var apptoken "") (var apptoken "")
(var dbg false) (var dbg false)
(def urls @["https://hachyderm.io/api/v1/bookmarks"])
(def urls @[])
(def save-path "./bookmarks/") (def save-path "./bookmarks/")
(def done @[]) (def done @[])
@ -15,27 +13,20 @@
"Downloads the media from the item." "Downloads the media from the item."
(def files @[]) (def files @[])
(def media (item "media_attachments")) (def media (item "media_attachments"))
(if dbg (pp (item "media_attachments"))
(pp (item "media_attachments")))
(each m media (each m media
(def url (m "url")) (def url (m "url"))
(def folder (string save-path "attachments/")) (def folder (string save-path "attachments/"))
(array/push files {:path (string "./attachments/" (utils/get-image url folder)) (array/push files {:path (string "./attachments/" (utils/get-image url folder))
:description (m "description")})) :description (m "description")}))
(if dbg (pp files)) (pp files)
files) files)
(defn write-markdown [item] (defn write-markdown [item]
(def files (download-media item)) (def files (download-media item))
(def id (item "id")) (def id (item "id"))
(def path (string save-path id ".md")) (def fout (file/open (string save-path id ".md") :w))
(if (utils/exists? path)
(do
(print (string "Skipping " id))
(break)))
(def fout (file/open path :w))
(def inline (string (def inline (string
"mastodon-url:: " (item "url") " \n" "mastodon-url:: " (item "url") " \n"
@ -74,7 +65,7 @@
(do (do
(print "Done") (print "Done")
(os/exit 0))) (os/exit 0)))
(print (string "Downloading " url)) (print (string "Downloading " url))
(def response (def response
(r/get url {"Authorization" (string "Bearer " apptoken)} {})) (r/get url {"Authorization" (string "Bearer " apptoken)} {}))
@ -105,12 +96,8 @@
(defn main [& args] (defn main [& args]
(set server (args 1)) (set apptoken (or (os/getenv "TOKEN") (args 1)))
(set apptoken (args 2)) (set dbg (get args 2))
(set dbg (get args 3))
(array/push urls (string server "/api/v1/bookmarks"))
(os/mkdir "./bookmarks") (os/mkdir "./bookmarks")
(os/mkdir "./bookmarks/attachments") (os/mkdir "./bookmarks/attachments")
(download-bookmarks)) (download-bookmarks))

View File

@ -1,10 +1,5 @@
(import httprequest :as r) (import httprequest :as r)
(def exists? (fn [path]
"Returns whether a file exists at the specified path."
(def f (file/open path :r))
(if f (do (file/close f) true) false)))
(defn get-image [url folder &named headers opts] (defn get-image [url folder &named headers opts]
"Download an image from a URL and save it to a file. Returns the path to the saved file." "Download an image from a URL and save it to a file. Returns the path to the saved file."
(default headers {}) (default headers {})
@ -47,4 +42,4 @@
(if (empty? arr) (break nil)) (if (empty? arr) (break nil))
(def head (in arr 0)) (def head (in arr 0))
(array/remove arr 0) (array/remove arr 0)
head) head)