Skip to content

Instantly share code, notes, and snippets.

@lardissone
Created July 5, 2018 14:34
Show Gist options
  • Save lardissone/ac22c8fb5f6ea844caa02368ab6527c3 to your computer and use it in GitHub Desktop.
Save lardissone/ac22c8fb5f6ea844caa02368ab6527c3 to your computer and use it in GitHub Desktop.
Export Trakt watched episodes and movies

Export Trackt watched history for episodes and movies

Dependencies

npm install puppeteer

Modify your username and the amount of pages you see in Trakt website in at the top of each .js file.

Run

The script only writes to stdout one JSON array per page scrapped.
So you'll then need to remove extra garbage from the generated files. I'll add to a file in the future, but for now it works this way and is helpful to check if something fails.

node episodes.js > episodes.json

and

node movies.js > movies.json

const puppeteer = require('puppeteer');
// Config:
const username = 'something';
const totalPages = 84;
const pages = [`https://trakt.tv/users/${username}/history/episodes/added?genres=`];
for (let i = 2; i < totalPages; i++) {
pages.push(`https://trakt.tv/users/${username}/history/episodes/added?genres=&page=${i}`);
}
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
for (let p = 0; p < pages.length; p++) {
const url = pages[p];
console.log(`Page ${p + 1}`);
await page.goto(url, { waitUntil: 'networkidle2' });
const result = await page.evaluate(() => {
let data = [];
let elements = document.querySelectorAll('div[itemprop="episode"]');
// return elements;
elements.forEach(element => {
const links = element.querySelector('.titles-link');
data.push({
seasonEpisode: links.childNodes[0].childNodes[0].childNodes[0].innerText,
episodeName: links.childNodes[0].childNodes[0].childNodes[2].innerText,
showName: links.childNodes[0].childNodes[1].innerText,
watchedDate: links.childNodes[0].childNodes[2].childNodes[0].getAttribute('data-date')
});
})
return data;
});
console.log(JSON.stringify(result, null, 2));
}
await browser.close();
})();
const puppeteer = require('puppeteer');
// Config:
const username = 'something';
const totalPages = 14;
const pages = [`https://trakt.tv/users/${username}/history/movies/added?genres=`];
for (let i = 2; i < totalPages; i++) { // TODO: 14
pages.push(`https://trakt.tv/users/${username}/history/movies/added?genres=&page=${i}`);
}
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
for (let p = 0; p < pages.length; p++) {
const url = pages[p];
console.log(`Page ${p + 1}`);
await page.goto(url, { waitUntil: 'networkidle2' });
const result = await page.evaluate(() => {
let data = [];
let elements = document.querySelectorAll('div[data-type="movie"]');
elements.forEach(element => {
if (element.childNodes[4]) {
data.push({
movie: element.childNodes[4].getAttribute('content'),
watchedDate: element.childNodes[3].childNodes[0].childNodes[1].childNodes[0].getAttribute('data-date')
})
}
})
return data;
});
console.log(JSON.stringify(result, null, 2));
}
await browser.close();
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment