Skip to content

Instantly share code, notes, and snippets.

@ZackBoe
Last active June 9, 2024 03:17
Show Gist options
  • Save ZackBoe/98607c9b089bcd9faf1309d21178a11d to your computer and use it in GitHub Desktop.
Save ZackBoe/98607c9b089bcd9faf1309d21178a11d to your computer and use it in GitHub Desktop.
Quick & hacky script to add localStorage bookmarks + csv export to https://gamesrecap.io/
if(window.gamesrecapBookmarks) console.error('Already injected!')
else {
window.gamesrecapBookmarks = true;
document.head.insertAdjacentHTML('beforeend', `
<style>
.card .bookmark {
position: absolute;
top: 5px;
left: 5px;
z-index: 99;
opacity: 0;
}
.card .bookmark[bookmarked] {
top: 0px;
left: 0px;
}
.card:hover .bookmark, .card .bookmark[bookmarked] { opacity: 1; }
.card .bookmark i {
font-size: 2.5rem;
color: white;
pointer-events: none;
}
.card .bookmark[bookmarked] i {
background: #ffffffd4;
color: black;
border-radius: 0 0 50% 0;
padding: 1px 4px 4px 1px;
}
.card.flipped .bookmark { transform: rotate(180deg); }
</style>
`)
download = function(csv) {
el = document.createElement('a');
el.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(csv));
el.setAttribute('download', 'gamesrecapBookmarks.csv');
el.style.display = 'none';
document.body.appendChild(el);
el.click();
document.body.removeChild(el);
}
getGame = function(game){
return { Title: game.title, Developer: `"${game.developer}"`, Release: game.date || 'TBA', Genre: `"${game.genre}"` || '', Link: game.media[0]?.link, Image: `https://img.youtube.com/vi/${game.media[0].link.split('/')[4]}/0.jpg` }
}
getGameFromTitle = function(title){
return gamesList.find(game => game.title === title)
}
log = function(list, bookmarked){
csv = Object.keys(list[0]).toString() + '\n'
list.forEach(game => { csv += Object.values(game).toString(); csv += '\n' })
if (bookmarked) { download(csv); console.log(`%cGot ${list.length} bookmarked games!`, 'font-size: 2rem; color: goldenrod;') }
else console.log(`%cGot ${list.length} games!`, 'font-size: 2rem;')
console.group('Object')
console.log(list)
console.groupEnd('Object')
console.groupCollapsed('CSV')
console.log(csv)
console.groupEnd('CSV')
console.group('Table')
console.table(list)
console.groupEnd('Table')
}
gamesList = Array.from(document.getElementsByTagName('a')).find(e => e.__vue__).__vue__.$store.getters.games
games = []
bookmarked = JSON.parse(window.localStorage.getItem('bookmarked')) || []
document.querySelector('#filters-bottom .search').insertAdjacentHTML('afterend', `<div class="exportBookmarks col-md-2 col-xs-4 clickable text-center"><i class="fas fa-bookmark" aria-hidden="true"></i><span> Export Saved (${bookmarked.length})</span></div>`)
document.querySelector('#filters-bottom .exportBookmarks').addEventListener('click', (e) => {
bookmarkedGameInfo = []
bookmarked.forEach(id => {
game = gamesList.find(game => game._id === id)
bookmarkedGameInfo.push(getGame(game))
})
log(bookmarkedGameInfo, true)
})
document.querySelectorAll('.card').forEach(card => {
game = gamesList.find(game => game.title === card.querySelector('.title-and-dev .entry-title')?.textContent)
card.insertAdjacentHTML('afterbegin', `<div class="bookmark" ${bookmarked?.includes(game._id) ? `bookmarked="" ><i class="las la-bookmark` : `><i class="las la-bookmark`}"></i></div>`)
card.querySelector('.bookmark').addEventListener('click', (e) => {
e.target.toggleAttribute('bookmarked')
game = getGameFromTitle(card.querySelector('.title-and-dev .entry-title')?.textContent)
if(e.target.hasAttribute('bookmarked')) {
bookmarked.push(game._id)
}
else {
bookmarked.splice(bookmarked.findIndex(id => id === game._id), 1)
}
window.localStorage.setItem('bookmarked', JSON.stringify(bookmarked))
document.querySelector('#filters-bottom .exportBookmarks').innerHTML = `<i class="las la-bookmark" aria-hidden="true"></i><span> Export Saved (${bookmarked.length})</span>`
})
})
console.log(`%cGot ${gamesList.length} games!`, 'font-size: 2rem;')
gameInfo = gamesList.map((game) => {
return getGame(game)
})
log(gameInfo)
}
@ZackBoe
Copy link
Author

ZackBoe commented Jun 10, 2022

@ZackBoe
Copy link
Author

ZackBoe commented Jun 10, 2022

2022: Updated to use Line Awesome, replacing Font Awesome
2024: Updated to 'gamesrecap' and fixed images

@ZackBoe
Copy link
Author

ZackBoe commented Jun 9, 2024

Use below or use https://caiorss.github.io/bookmarklet-maker/

javascript:(function()%7Bif(window.gamesrecapBookmarks)%20console.error('Already%20injected!')%0Aelse%20%7B%0A%0Awindow.gamesrecapBookmarks%20%3D%20true%3B%0A%0Adocument.head.insertAdjacentHTML('beforeend'%2C%20%60%0A%3Cstyle%3E%0A.card%20.bookmark%20%7B%0A%09position%3A%20absolute%3B%0A%09top%3A%205px%3B%0A%09left%3A%205px%3B%0A%09z-index%3A%2099%3B%0A%09opacity%3A%200%3B%0A%7D%0A%0A.card%20.bookmark%5Bbookmarked%5D%20%7B%0A%20%20top%3A%200px%3B%0A%20%20left%3A%200px%3B%0A%7D%0A%0A.card%3Ahover%20.bookmark%2C%20.card%20.bookmark%5Bbookmarked%5D%20%7B%20opacity%3A%201%3B%20%7D%0A%0A.card%20.bookmark%20i%20%7B%0A%09font-size%3A%202.5rem%3B%0A%09color%3A%20white%3B%0A%09pointer-events%3A%20none%3B%0A%7D%0A%0A.card%20.bookmark%5Bbookmarked%5D%20i%20%7B%0A%20%20background%3A%20%23ffffffd4%3B%0A%20%20color%3A%20black%3B%0A%20%20border-radius%3A%200%200%2050%25%200%3B%0A%20%20padding%3A%201px%204px%204px%201px%3B%0A%7D%0A%0A.card.flipped%20.bookmark%20%7B%20transform%3A%20rotate(180deg)%3B%20%7D%0A%3C%2Fstyle%3E%0A%60)%0A%0Adownload%20%3D%20function(csv)%20%7B%0A%09el%20%3D%20document.createElement('a')%3B%0A%09el.setAttribute('href'%2C%20'data%3Atext%2Fplain%3Bcharset%3Dutf-8%2C'%20%2B%20encodeURIComponent(csv))%3B%0A%09el.setAttribute('download'%2C%20'gamesrecapBookmarks.csv')%3B%0A%09el.style.display%20%3D%20'none'%3B%0A%09document.body.appendChild(el)%3B%0A%09el.click()%3B%0A%09document.body.removeChild(el)%3B%0A%20%20%7D%0A%0AgetGame%20%3D%20function(game)%7B%0A%09return%20%7B%20Title%3A%20game.title%2C%20Developer%3A%20%60%22%24%7Bgame.developer%7D%22%60%2C%20Release%3A%20game.date%20%7C%7C%20'TBA'%2C%20Genre%3A%20%60%22%24%7Bgame.genre%7D%22%60%20%7C%7C%20''%2C%20Link%3A%20game.media%5B0%5D%3F.link%2C%20Image%3A%20%60https%3A%2F%2Fimg.youtube.com%2Fvi%2F%24%7Bgame.media%5B0%5D.link.split('%2F')%5B4%5D%7D%2F0.jpg%60%20%7D%0A%7D%0A%0AgetGameFromTitle%20%3D%20function(title)%7B%0A%09return%20gamesList.find(game%20%3D%3E%20game.title%20%3D%3D%3D%20title)%0A%7D%0A%0Alog%20%3D%20function(list%2C%20bookmarked)%7B%0A%09csv%20%3D%20Object.keys(list%5B0%5D).toString()%20%2B%20'%5Cn'%0A%09list.forEach(game%20%3D%3E%20%7B%20csv%20%2B%3D%20Object.values(game).toString()%3B%20csv%20%2B%3D%20'%5Cn'%20%7D)%0A%0A%09if%20(bookmarked)%20%7B%20download(csv)%3B%20console.log(%60%25cGot%20%24%7Blist.length%7D%20bookmarked%20games!%60%2C%20'font-size%3A%202rem%3B%20color%3A%20goldenrod%3B')%20%7D%0A%09else%20console.log(%60%25cGot%20%24%7Blist.length%7D%20games!%60%2C%20'font-size%3A%202rem%3B')%0A%09console.group('Object')%0A%09console.log(list)%0A%09console.groupEnd('Object')%0A%09console.groupCollapsed('CSV')%0A%09console.log(csv)%0A%09console.groupEnd('CSV')%0A%09console.group('Table')%0A%09console.table(list)%0A%09console.groupEnd('Table')%0A%7D%0A%0AgamesList%20%3D%20Array.from(document.getElementsByTagName('a')).find(e%20%3D%3E%20e.__vue__).__vue__.%24store.getters.games%0Agames%20%3D%20%5B%5D%0Abookmarked%20%3D%20JSON.parse(window.localStorage.getItem('bookmarked'))%20%7C%7C%20%5B%5D%0A%0Adocument.querySelector('%23filters-bottom%20.search').insertAdjacentHTML('afterend'%2C%20%60%3Cdiv%20class%3D%22exportBookmarks%20col-md-2%20col-xs-4%20clickable%20text-center%22%3E%3Ci%20class%3D%22fas%20fa-bookmark%22%20aria-hidden%3D%22true%22%3E%3C%2Fi%3E%3Cspan%3E%20Export%20Saved%20(%24%7Bbookmarked.length%7D)%3C%2Fspan%3E%3C%2Fdiv%3E%60)%0A%0Adocument.querySelector('%23filters-bottom%20.exportBookmarks').addEventListener('click'%2C%20(e)%20%3D%3E%20%7B%0A%0A%09bookmarkedGameInfo%20%3D%20%5B%5D%0A%09bookmarked.forEach(id%20%3D%3E%20%7B%0A%09%09game%20%3D%20gamesList.find(game%20%3D%3E%20game._id%20%3D%3D%3D%20id)%0A%09%09bookmarkedGameInfo.push(getGame(game))%0A%09%7D)%0A%0A%09log(bookmarkedGameInfo%2C%20true)%0A%0A%7D)%0A%0Adocument.querySelectorAll('.card').forEach(card%20%3D%3E%20%7B%0A%09%0A%09game%20%3D%20gamesList.find(game%20%3D%3E%20game.title%20%3D%3D%3D%20card.querySelector('.title-and-dev%20.entry-title')%3F.textContent)%0A%09%0A%09card.insertAdjacentHTML('afterbegin'%2C%20%60%3Cdiv%20class%3D%22bookmark%22%20%24%7Bbookmarked%3F.includes(game._id)%20%3F%20%60bookmarked%3D%22%22%20%3E%3Ci%20class%3D%22las%20la-bookmark%60%20%3A%20%60%3E%3Ci%20class%3D%22las%20la-bookmark%60%7D%22%3E%3C%2Fi%3E%3C%2Fdiv%3E%60)%0A%09%0A%09card.querySelector('.bookmark').addEventListener('click'%2C%20(e)%20%3D%3E%20%7B%0A%09%09e.target.toggleAttribute('bookmarked')%0A%09%09game%20%3D%20getGameFromTitle(card.querySelector('.title-and-dev%20.entry-title')%3F.textContent)%0A%0A%09%09if(e.target.hasAttribute('bookmarked'))%20%7B%0A%09%09%09bookmarked.push(game._id)%0A%09%09%7D%0A%09%09else%20%7B%0A%09%09%09bookmarked.splice(bookmarked.findIndex(id%20%3D%3E%20id%20%3D%3D%3D%20game._id)%2C%201)%0A%09%09%7D%0A%0A%09%09window.localStorage.setItem('bookmarked'%2C%20JSON.stringify(bookmarked))%0A%09%09document.querySelector('%23filters-bottom%20.exportBookmarks').innerHTML%20%3D%20%60%3Ci%20class%3D%22las%20la-bookmark%22%20aria-hidden%3D%22true%22%3E%3C%2Fi%3E%3Cspan%3E%20Export%20Saved%20(%24%7Bbookmarked.length%7D)%3C%2Fspan%3E%60%0A%09%7D)%0A%09%0A%09%0A%7D)%0A%0A%0Aconsole.log(%60%25cGot%20%24%7BgamesList.length%7D%20games!%60%2C%20'font-size%3A%202rem%3B')%0A%0AgameInfo%20%3D%20gamesList.map((game)%20%3D%3E%20%7B%0A%09return%20getGame(game)%0A%7D)%0A%0Alog(gameInfo)%0A%0A%7D%7D)()%3B

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