Use the backup files from Trakt VIP settings to sync to Letterboxd.
Use the help to see what options are available.
$ ./letterboxd.sh -h| *.csv* |
Use the backup files from Trakt VIP settings to sync to Letterboxd.
Use the help to see what options are available.
$ ./letterboxd.sh -h| #!/usr/bin/env bash | |
| set -euo pipefail | |
| usage() { | |
| cat << EOF | |
| usage: $0 -b base_path | |
| This script will convert the Trakt backup files into a CSV file that | |
| can be imported into Letterboxd. | |
| The default mode is to create an import file for the watched movies. | |
| https://letterboxd.com/import/ | |
| You can alternatively create an import file for the watchlist by using | |
| the -w option. | |
| OPTIONS: | |
| -b The base path to the Trakt backup files | |
| -w Create an import file for the watchlist | |
| -d Turn on debugging output | |
| -h Show this message | |
| EOF | |
| } | |
| # Initialize options | |
| base_path= | |
| watchlist= | |
| while getopts "hdwb:" OPTION | |
| do | |
| case $OPTION in | |
| b) | |
| base_path=$OPTARG | |
| ;; | |
| w) | |
| watchlist=1 | |
| ;; | |
| d) | |
| set -x | |
| ;; | |
| h) | |
| usage | |
| exit 0 | |
| ;; | |
| ?) | |
| usage | |
| exit 1 | |
| ;; | |
| esac | |
| done | |
| if [ -z "$base_path" ]; then | |
| usage | |
| echo | |
| echo Error: base path is required | |
| exit 1 | |
| fi | |
| function letterboxd_import() { | |
| read -d '' -r letterboxd_query <<'EOF' || true | |
| # Combine the ratings and watched data by the Trakt ID | |
| JOIN( | |
| ($ratings[] | INDEX(.movie.ids.trakt | tostring)); | |
| .[]; | |
| .movie.ids.trakt | tostring; | |
| add | |
| ) | |
| | JOIN( | |
| ($comments[] | INDEX(.movie.ids.trakt | tostring)); | |
| .; | |
| .movie.ids.trakt | tostring; | |
| add | |
| ) | |
| # Remove the time information from the watched date | |
| | .last_watched_at |= sub( "T.*"; "") | |
| # Create our CSV output | |
| | .last_watched_at as $WatchedDate | .movie.ids.imdb as $imdbID | .rating as $Rating10 | .movie.title as $Title | .movie.year as $Year | .comment.comment as $Review | .last_updated_at as $LastUpdated | |
| | [$imdbID, $Title, $Year, $WatchedDate, $LastUpdated, $Rating10, $Review] | |
| | @csv | |
| EOF | |
| # Create the CSV header | |
| echo "imdbID,Title,Year,WatchedDate,LastUpdated,Rating10,Review" > letterboxd_import.csv | |
| # Combine the ratings and watched movies JSON files and generate the CSV | |
| jq -r --slurpfile ratings "${base_path}/ratings/ratings-movies.json" --slurpfile comments "${base_path}/comments/comments-movies.json" "$letterboxd_query" "${base_path}/watched/watched-movies.json" >> letterboxd_import.csv | |
| echo "letterboxd_import.csv created" | |
| } | |
| function letterboxd_watchlist() { | |
| read -d '' -r letterboxd_query <<'EOF' || true | |
| .[] | |
| | select(.type == "movie") | |
| # Create our CSV output | |
| | .movie.ids.imdb as $imdbID | .movie.title as $Title | .movie.year as $Year | .notes as $Review | .listed_at as $ListedAt | |
| | [$imdbID, $Title, $Year, $Review, $ListedAt] | |
| | @csv | |
| EOF | |
| # Create the CSV header | |
| echo "imdbID,Title,Year,Review,ListedAt" > letterboxd_watchlist.csv | |
| # Generate the CSV | |
| jq -r "$letterboxd_query" "${base_path}/lists/watchlist.json" >> letterboxd_watchlist.csv | |
| echo "letterboxd_watchlist.csv created" | |
| } | |
| if [ -n "$watchlist" ]; then | |
| letterboxd_watchlist | |
| else | |
| letterboxd_import | |
| fi |