You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
293 lines
7.6 KiB
293 lines
7.6 KiB
1 month ago
|
// script.js
|
||
|
|
||
|
import { Element } from './element.js';
|
||
|
|
||
|
const scrapeIMDbData = () => {
|
||
|
const title = document.querySelector('h1').innerText.trim();
|
||
|
const directorElement = document.querySelector('a[href^="/name/"]');
|
||
|
const director = directorElement ? directorElement.innerText.trim() : null;
|
||
|
const yearElement = document.querySelectorAll('a[href*="/releaseinfo"]')[0];
|
||
|
const year = yearElement ? yearElement.innerText.trim() : null;
|
||
|
const coverImageElement = document.querySelectorAll('img.ipc-image')[0];
|
||
|
const coverImageUrl = coverImageElement ? coverImageElement.src : null;
|
||
|
return {
|
||
|
'title': title,
|
||
|
'author': director,
|
||
|
'year': year,
|
||
|
'image_src': coverImageUrl,
|
||
|
'type': 'movie'
|
||
|
};
|
||
|
}
|
||
|
|
||
|
const scrapeGoodReads = () => {
|
||
|
const title = document.querySelector('h1').innerText.trim();
|
||
|
const author = document.querySelector('span.ContributorLink__name').innerText.trim();
|
||
|
const yearElement = document.querySelector('p[data-testid="publicationInfo"]');
|
||
|
const year = yearElement ? yearElement.innerText.trim().split(', ')[1] : null;
|
||
|
const coverImageElement = document.querySelector('.BookCover img');
|
||
|
const coverImageUrl = coverImageElement ? coverImageElement.src : null;
|
||
|
return {
|
||
|
'title': title,
|
||
|
'author': author,
|
||
|
'year': year,
|
||
|
'image_src': coverImageUrl,
|
||
|
'type': 'book'
|
||
|
};
|
||
|
}
|
||
|
|
||
|
const scrapeRymData = () => {
|
||
|
const title = document.querySelector('.album_title').innerText.trim();
|
||
|
const author = document.querySelector('a.artist').innerText.trim();
|
||
|
const yearElement = document.querySelector('a[href^="/charts/top/"]');
|
||
|
const year = yearElement ? yearElement.innerText.trim() : null;
|
||
|
const coverImageElement = document.querySelector('div[class^="coverart_"] > img');
|
||
|
const coverImageUrl = coverImageElement ? coverImageElement.src : null;
|
||
|
const spotifyElement = document.querySelector('a[title="Spotify"]');
|
||
|
const spotifyUrl = spotifyElement ? spotifyElement.href : null;
|
||
|
return {
|
||
|
'title': title,
|
||
|
'author': author,
|
||
|
'year': year,
|
||
|
'image_src': coverImageUrl,
|
||
|
'spotify_url': spotifyUrl,
|
||
|
'type': 'album'
|
||
|
};
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
const medias = [
|
||
|
{'name': 'movie', 'urlPattern': /https:\/\/www.imdb.com\/title\/.*\/?/, 'scrapeFunction': scrapeIMDbData},
|
||
|
{'name': 'book', 'urlPattern': /https:\/\/www.goodreads.com\/book\/show\/.*/, 'scrapeFunction': scrapeGoodReads},
|
||
|
{'name': 'album', 'urlPattern': /https:\/\/rateyourmusic.com\/release\/.*/, 'scrapeFunction': scrapeRymData}
|
||
|
]
|
||
|
|
||
|
const body = new Element(document.body)
|
||
|
.addClass(
|
||
|
'bg-slate-900',
|
||
|
'text-slate-500',
|
||
|
'flex',
|
||
|
'flex-col',
|
||
|
'items-center',
|
||
|
'justify-center',
|
||
|
'w-screen',
|
||
|
'h-screen',
|
||
|
);
|
||
|
|
||
|
chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) {
|
||
|
const tab = tabs[0];
|
||
|
const url = tab.url
|
||
|
console.log('URL:', url);
|
||
|
for (let i = 0; i < medias.length; i++) {
|
||
|
const media = medias[i];
|
||
|
if (url.match(media.urlPattern)) {
|
||
|
chrome.scripting.executeScript({
|
||
|
target: { tabId: tab.id },
|
||
|
function: media.scrapeFunction
|
||
|
}, (results) => {
|
||
|
const data = results[0].result;
|
||
|
console.log({data});
|
||
|
|
||
|
const row = new Element('div') // {{{
|
||
|
.appendTo(body)
|
||
|
.addClass(
|
||
|
'flex',
|
||
|
'flex-row',
|
||
|
'justify-between',
|
||
|
'w-full',
|
||
|
)
|
||
|
|
||
|
const image = new Element('img') // {{{
|
||
|
.addClass(
|
||
|
'h-32',
|
||
|
'w-auto',
|
||
|
'p-2',
|
||
|
'object-contain',
|
||
|
)
|
||
|
.setAttribute('src', data.image_src)
|
||
|
.appendTo(row);
|
||
|
|
||
|
// }}}
|
||
|
|
||
|
const col = new Element('div') // {{{
|
||
|
.appendTo(row)
|
||
|
.addClass(
|
||
|
'flex',
|
||
|
'flex-col',
|
||
|
'justify-center',
|
||
|
'items-center',
|
||
|
'p-2',
|
||
|
'gap-1',
|
||
|
'text-center'
|
||
|
|
||
|
)
|
||
|
|
||
|
// }}}
|
||
|
|
||
|
const title = new Element('input') // {{{
|
||
|
.setAttribute('type', 'text')
|
||
|
.setAttribute('value', data.title)
|
||
|
.setId('title')
|
||
|
.addClass(
|
||
|
'text-slate-200',
|
||
|
'font-bold',
|
||
|
'bg-slate-900',
|
||
|
'text-center',
|
||
|
|
||
|
)
|
||
|
.setText(data.title)
|
||
|
.appendTo(col);
|
||
|
|
||
|
// }}}
|
||
|
|
||
|
const author = new Element('input') // {{{
|
||
|
.addClass(
|
||
|
'bg-slate-900',
|
||
|
'text-center',
|
||
|
)
|
||
|
.setAttribute('type', 'text')
|
||
|
.setAttribute('value', data.author)
|
||
|
.setId('author')
|
||
|
.setText(data.author)
|
||
|
.appendTo(col);
|
||
|
|
||
|
// }}}
|
||
|
|
||
|
const year = new Element('input') // {{{
|
||
|
.addClass(
|
||
|
'bg-slate-900',
|
||
|
'text-center',
|
||
|
)
|
||
|
.setAttribute('type', 'text')
|
||
|
.setAttribute('value', data.year)
|
||
|
.setId('year')
|
||
|
.setText(data.year)
|
||
|
.appendTo(col);
|
||
|
|
||
|
// }}}
|
||
|
|
||
|
if (media.name === 'movie') {
|
||
|
const typeDiv = new Element('div')
|
||
|
.addClass(
|
||
|
'flex',
|
||
|
'flex-row',
|
||
|
'justify-center',
|
||
|
'gap-2',
|
||
|
)
|
||
|
.appendTo(col);
|
||
|
const tvRadio = new Element('input')
|
||
|
.setAttribute('type', 'radio')
|
||
|
.setAttribute('name', 'type')
|
||
|
.setAttribute('value', 'tv')
|
||
|
.appendTo(typeDiv);
|
||
|
const tvLabel = new Element('label')
|
||
|
.setText('TV')
|
||
|
.appendTo(typeDiv);
|
||
|
const movieRadio = new Element('input')
|
||
|
.setAttribute('type', 'radio')
|
||
|
.setAttribute('name', 'type')
|
||
|
.setAttribute('value', 'movie')
|
||
|
.setAttribute('checked', 'checked')
|
||
|
.appendTo(typeDiv);
|
||
|
const movieLabel = new Element('label')
|
||
|
.setText('Movie')
|
||
|
.appendTo(typeDiv);
|
||
|
}
|
||
|
|
||
|
const saveButton = new Element('span') // {{{
|
||
|
.addClass(
|
||
|
'text-slate-900',
|
||
|
'rounded',
|
||
|
'px-2',
|
||
|
'bg-slate-500',
|
||
|
)
|
||
|
.setText('Checking...')
|
||
|
.appendTo(col);
|
||
|
|
||
|
// }}}
|
||
|
|
||
|
chrome.runtime.sendMessage({ action: 'checkMedia', data, url: url}, (response) => {
|
||
|
if (response.success) {
|
||
|
if (response.responseData.exists) {
|
||
|
saveButton
|
||
|
.setText('Saved!')
|
||
|
.addClass('bg-green-600')
|
||
|
.removeClass(
|
||
|
'hover:bg-slate-400',
|
||
|
'bg-slate-500',
|
||
|
'cursor-pointer',
|
||
|
);
|
||
|
} else {
|
||
|
saveButton
|
||
|
.setText('Save')
|
||
|
.addClass(
|
||
|
'bg-slate-500',
|
||
|
'hover:bg-slate-400',
|
||
|
'cursor-pointer',
|
||
|
)
|
||
|
.addEventListener('click', () => {
|
||
|
const messageData = {
|
||
|
'title': title.element.value,
|
||
|
'author': author.element.value,
|
||
|
'year': year.element.value,
|
||
|
'image_src': data.image_src,
|
||
|
'type': data.type,
|
||
|
};
|
||
|
if (media.name === 'movie') {
|
||
|
messageData.type = document.querySelector('input[name="type"]:checked').value;
|
||
|
if (messageData.type === 'tv') {
|
||
|
messageData.author = null;
|
||
|
}
|
||
|
}
|
||
|
if (media.name === 'album') {
|
||
|
if (data.spotify_url) {
|
||
|
messageData.spotify_url = data.spotify_url;
|
||
|
}
|
||
|
}
|
||
|
console.log({messageData});
|
||
|
chrome.runtime.sendMessage({ action: 'saveMedia', data: messageData, url: url}, (response) => {
|
||
|
console.log('Background response:', response);
|
||
|
if (response.success) {
|
||
|
saveButton.setText('Saved!').
|
||
|
addClass('bg-green-600').
|
||
|
removeClass(
|
||
|
'hover:bg-slate-400',
|
||
|
'bg-slate-500',
|
||
|
'cursor-pointer',
|
||
|
);
|
||
|
} else {
|
||
|
saveButton.setText('Error!').
|
||
|
addClass('bg-red-500').
|
||
|
removeClass(
|
||
|
'hover:bg-slate-400',
|
||
|
'bg-slate-500',
|
||
|
'cursor-pointer',
|
||
|
);
|
||
|
}
|
||
|
});
|
||
|
})
|
||
|
}
|
||
|
} else {
|
||
|
saveButton.setText('Error!').addClass('bg-red-500').removeClass('hover:bg-slate-400');
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
console.log('No match');
|
||
|
new Element('div')
|
||
|
.appendTo(body)
|
||
|
.addClass(
|
||
|
'flex',
|
||
|
'flex-row',
|
||
|
'justify-center',
|
||
|
'w-full',
|
||
|
)
|
||
|
.appendChild(
|
||
|
new Element('span')
|
||
|
.setText('No match')
|
||
|
);
|
||
|
|
||
|
});
|