Skip to content

Instantly share code, notes, and snippets.

@darekkay
Last active January 5, 2026 06:39
Show Gist options
  • Select an option

  • Save darekkay/ff1c5aadf31588f11078 to your computer and use it in GitHub Desktop.

Select an option

Save darekkay/ff1c5aadf31588f11078 to your computer and use it in GitHub Desktop.
Trakt.tv backup script
<?php
/*
Backup script for trakt.tv (API v2).
*/
// create a Trakt app to get a client API key: http://docs.trakt.apiary.io/#introduction/create-an-app
$apikey = "CLIENT_API_KEY";
$username = "YOUR_USERNAME";
$zip = new ZipArchive();
$zip_filename = "trakt_backup_" . date("Y-m-d") . ".zip";
$zip_filepath = "/tmp/trakt_backup_" . date("Y-m-d") . ".zip";
if ($zip->open($zip_filepath, ZIPARCHIVE::CREATE) !== TRUE) {
exit("Cannot open <$zip_filepath>\n");
}
loadAndZip("watchlist/movies/", "watchlist_movies.json");
loadAndZip("watchlist/shows/", "watchlist_shows.json");
loadAndZip("watchlist/episodes/", "watchlist_episodes.json");
loadAndZip("watchlist/seasons/", "watchlist_seasons.json");
loadAndZip("ratings/movies/", "ratings_movies.json");
loadAndZip("ratings/shows/", "ratings_shows.json");
loadAndZip("ratings/episodes/", "ratings_episodes.json");
loadAndZip("ratings/seasons/", "ratings_seasons.json");
loadAndZip("collection/movies/", "library_collection_movies.json");
loadAndZip("collection/shows/", "library_collection_shows.json");
loadAndZip("watched/movies/", "watched_movies.json");
loadAndZip("watched/shows/", "watched_shows.json");
loadAndZip("history/movies/", "history_movies.json");
loadAndZip("history/shows/", "history_shows.json");
$zip->close();
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=$zip_filename");
header("Pragma: no-cache");
header("Expires: 0");
readfile($zip_filepath);
exit();
function loadAndZip($path, $filename)
{
global $zip, $apikey, $username;
$url = "https://api.trakt.tv/users/" . $username . '/' . $path ;
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => $url,
CURLOPT_HTTPHEADER => array(
"Content-Type: application/json",
"trakt-api-key: " . $apikey,
"trakt-api-version: 2"),
CURLOPT_VERBOSE => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_SSL_VERIFYHOST => 0
));
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($httpCode == 404) {
exit("<h3>Wrong username!</h3>");
}
curl_close($ch);
$zip->addFromString($filename, $result);
}
@mayerwin
Copy link

mayerwin commented Dec 18, 2025

I wasn't able to get the PHP script to work anymore, not sure why (the API returned empty results). So I rebuilt the whole thing with Powershell, also adding to the backup the user comments (which were not captured by the PHP script) and it works great. It also supports the authentication flow so it'll export everything even if your profile is private. I published the script here: https://github.com/mayerwin/trakt-tv-backup
If you want to convert it to another language, any LLM should be able to do it easily.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment