Greasy Fork

Filmweb 1337x

Skrypt dodaje do Filmweba linki do szybkiego pobierania filmu/serialu z 1337x

// ==UserScript==
// @name         Filmweb 1337x
// @version      0.1.1
// @namespace    eitho
// @description  Skrypt dodaje do Filmweba linki do szybkiego pobierania filmu/serialu z 1337x
// @author       Eitho
// @match        https://www.filmweb.pl/serial/*
// @match        https://www.filmweb.pl/film/*
// @icon         https://fwcdn.pl/front/ogfx/icons2/fw-favicons.ico
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

	/*
		Autor: Eitho
		Data: 2022-07-02
		W planach było dodanie kilku innych serwisów oprócz 1337x i zmiana wyglądu przycisków.
		Skrypt obecnie nie jest już rozwijany - Filmweb działa tak powoli, że nie ma sensu przez niego się przeklikiwać.
		Planuję zrobić prostą stronę korzystającą z API TV Time, do której użytkownik by się logował swoim kontem - posiadałaby interfejs podobny do tego z aplikacji TV Time na Androida (webowy jest taki sobie) z automatycznym wyszukiwaniem odcinków na popularnych stronach z torrentami, a może też z streamingami.

		Jeśli chcesz się ze mną skontaktować:
			Discord: Eitho#9637
			GitHub: https://github.com/Eithoo
	*/

	const page = document.querySelector('.page__content');

	function getType() {
		const div = page.querySelector('.filmCoverSection__type');
		const type = div.innerText.trim().toLowerCase(); // serial, film, gra
		return type;
	}

	function isValidType() {
		const type = getType();
		return type === 'serial' || type === 'film';
	}

	function isTvShow() {
		return getType() === 'serial';
	}

	function getName() {
		const originalTitle = page.querySelector('.filmCoverSection__originalTitle');
		const translatedTitle = page.querySelector('.filmCoverSection__title');
		const title = originalTitle || translatedTitle;
		return title.innerText.trim();
	}

	function getNewestEpisodes() {
		const newestEpisodes = page.querySelector('div[data-section=newestEpisodes]');
		const isHidden = page.querySelector('div.filmCoverSection__year').innerText.trim().includes('-');
		const episodesDOM = [...newestEpisodes.querySelectorAll('div.episodePreview')];
		if (!episodesDOM || episodesDOM.length == 0) return false;
		const episodes = episodesDOM.map(episode => {
			const num = episode.querySelector('.episodePreview__subTitle').innerText.trim();
			const dateText = episode.querySelector('.episodePreview__date').innerText.trim();
			let ret = { num: num, dom: episode, premiere: dateText };
			if (dateText?.includes('.')) {
				const dateSplit = dateText.split('.');
				const day = parseInt(dateSplit[0]);
				const month = parseInt(dateSplit[1]);
				const year = parseInt(dateSplit[2]);
				const date = new Date(year, month - 1, day);
				if (date > new Date()) ret.beforePremiere = true;
			} else {
				ret.beforePremiere =  true;
			}
			return ret;
		});
		return {episodes: episodes, isHidden: isHidden};
	}

	function searchLink(name, num) {
		let query = num ? `${name} ${num}` : name;
		return `https://1337x.to/search/${encodeURIComponent(query)}/1/`;
	}

	function createButton_newestEpisodes(name, num) {
		const link = searchLink(name, num);
		const button = document.createElement('a');
		button.href = link;
		button.style.display = 'flex';
		button.style.alignItems = 'center';
		button.style.gap = '0.5em';
		button.target = '_blank';
		const text = document.createElement('span');
		text.innerText = 'Sprawdź dostępność na: ';
		const img = document.createElement('img');
		img.src = 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/1337X_logo.svg/320px-1337X_logo.svg.png';
		img.style.maxHeight = '2.5em';
		button.append(text);
		button.append(img);
		return button;
	}

	function createButton_desc(name, num) {
		const link = searchLink(name, num);
		const button = document.createElement('a');
		button.href = link;
		button.style.display = 'flex';
		button.style.alignItems = 'center';
		button.style.gap = '0.5em';
		button.target = '_blank';
		button.style.marginTop = '1em';
		const text = document.createElement('span');
		text.innerText = num ? 'Sprawdź dostępność ostatniego odcinka' : 'Sprawdź dostępność';
		if (num) {
			const text2 = document.createElement('p');
			text2.innerText = `(${num})`;
			text.style.textAlign = 'center';
			text.append(text2);
		}
		const img = document.createElement('img');
		img.src = 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/1337X_logo.svg/320px-1337X_logo.svg.png';
		img.style.maxHeight = '2.5em';
		button.append(img);
		button.append(text);
		return button;
	}

	function waitForElem(selector) {
		return new Promise(resolve => {
			if (document.querySelector(selector)) {
				return resolve(document.querySelector(selector));
			}
	
			const observer = new MutationObserver(mutations => {
				if (document.querySelector(selector)) {
					resolve(document.querySelector(selector));
					observer.disconnect();
				}
			});
	
			observer.observe(document.body, {
				childList: true,
				subtree: true
			});
		});
	}


	async function main() {
		console.log('%c❰❰ Filmweb - 1337x uruchomiony ❱❱', 'background-color: #ccc; color: white; text-shadow: 2px 2px 4px #000000; font-size: 4em; text-align: center;');
		if (!isValidType()) return;
		const name = getName();
		console.log(name);
		if (isTvShow()) {
			const newestEpisodes = getNewestEpisodes();
			if (!newestEpisodes) return;
			console.log(newestEpisodes);
			const place = page.querySelector('div.filmPosterSection__serialSeasons'); // pod opisem serialu i sezonami
			const newestAiredEpisode = newestEpisodes.episodes.find(episode => !episode.beforePremiere);
			const elem = createButton_desc(name, newestAiredEpisode.num);
			place.append(elem);

			// pozniej wywalic to do osobnej funkcji i zrobic zeby obserwowalo zmiany i dodawalo to jeszcze raz bo filmweb przy zmianie zakładki w serialach nie ukrywa elementow tylko je całkowicie usuwa a pozniej od nowa dodaje
			if (!newestEpisodes.isHidden) {
				await waitForElem('.navList__text[data-value="Najnowsze odcinki"]');
				await new Promise(r => setTimeout(r, 50)); // filmweb jest powalony
				for (const episode of newestEpisodes.episodes) {
					if (episode.beforePremiere) continue;
					const newDOM = page.querySelector(`.page__navContent .episodePreview[data-id="${episode.dom.getAttribute('data-id')}"]`);
					const date = newDOM.querySelector('.episodePreview__date');
					const elem = createButton_newestEpisodes(name, episode.num);
					date.after(elem);
				}
			} 
			
		} else {
			const place = page.querySelector('div.filmPosterSection__plot'); // pod opisem filmu
			const year = page.querySelector('div.filmCoverSection__year').innerText.trim();
			const elem = createButton_desc(`${name} ${year}`);
			place.append(elem);
		}
	}
	main();
})();