anime1-downloader

下載Anime1.me網站上的動漫

安裝腳本?
作者推薦腳本

您可能也會喜歡 khinsider 批量下載器

安裝腳本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        anime1-downloader
// @name:zh-tw  Anime1.me 下載器
// @namespace   https://blog.maple3142.net/
// @description 下載Anime1.me網站上的動漫
// @version     0.8.11
// @author      maple3142
// @match       https://anime1.me/*
// @match       https://p.anime1.me/pic.php*
// @match       https://p.anime1.me/ts.php*
// @match       https://p.anime1.me/mp4.php*
// @match       https://p.anime1.me/mf?id=*
// @match       https://torrent.anime1.me/*.html
// @match       https://video.anime1.me/video?*
// @match       https://player.anime1.me/watch?*
// @match       https://player.anime1.me/watchhls?*
// @match       https://v.anime1.me/watch?*
// @match       https://web.1ani.me/*.html
// @match       https://i.animeone.me/*
// @noframes
// @license     MIT
// @require     https://unpkg.com/[email protected]
// @require     https://unpkg.com/[email protected]
// @require     https://unpkg.com/[email protected]
// @grant       GM_info
// @grant       GM_download
// ==/UserScript==

(function (swal,$,Vue) {
'use strict';

swal = swal && swal.hasOwnProperty('default') ? swal['default'] : swal;
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
Vue = Vue && Vue.hasOwnProperty('default') ? Vue['default'] : Vue;

function download(url, filename) {
	//觸發下載
	const a = document.createElement('a');
	a.href = url;
	if (filename) a.download = filename;
	document.body.appendChild(a);
	a.click();
	return a;
}
function parseQuery(str) {
	return Object.assign(...str.replace('?', '').split('&').map(part => part.split('=')).map(ar => ({ [ar[0]]: ar[1] })));
}
function xhrDownload({ url, progcb, loadcb, proginterval = 3000 }) {
	const xhr = new XMLHttpRequest();
	xhr.responseType = 'blob';
	let lastupd = Date.now();
	xhr.onprogress = e => {
		if (!e.lengthComputable) return;
		if (Date.now() - lastupd > proginterval) {
			progcb(e);
			lastupd = Date.now();
		}
	};
	xhr.onload = e => loadcb(xhr.response);
	xhr.open('GET', url);
	xhr.send();
	return xhr;
}
function hook(obj, name, cb) {
	const orig = obj[name];
	obj[name] = function (...args) {
		cb(args);
		orig.apply(this, args);
	};
	return () => obj[name] = orig;
}

function pic () {
	//如果是普通下載頁面
	//取得資料
	const video = jwplayer().getPlaylist()[0]; //目前使用jwplayer
	if (!video) return;
	const sources = video.sources;
	const title = video.title;
	//Object.assign({'HD': 'hd video url'},{'SD': 'sd video url'},something...)
	const videomap = Object.assign(...sources.map(src => ({ [src.label]: src.file })));

	//詢問要下載的畫質
	const askmsg = `輸入要下載的畫質名稱:(${sources.map(src => src.label).join(',')})`;
	const type = prompt(askmsg);
	//如果畫質存在
	if (type in videomap) {
		if (GM_info.downloadMode === 'browser' && GM_download) {
			GM_download({
				url: videomap[type],
				name: `${title}.mp4`,
				onerror: () => download(videomap[type], `${title}.mp4`),
				saveAs: true
			});
		} else download(videomap[type], `${title}.mp4`);
	}
}

const msg = `由於這種影片是線上串流格式的影片,無法透過瀏覽器直接下載<br>但你可以複製下方的網址並使用 ffmpeg 或 vlc 來下載或是 google m3u8 的下載方法`;
const url = `https://chrome.google.com/webstore/detail/native-hls-playback/emnphkkblegpebimobpbekeedfgemhof`;
const nativehlsplayback = `只是需要播放的話可以安裝<a href="${url}">此插件</a>來播放`;
var hlsmsg = (m3u8 => {
	swal({
		title: '不支援下載',
		html: `<p>${msg}</p><p>${nativehlsplayback}</p><a href="${m3u8}">${m3u8}</a>`
	});
});

var ts = (() => hlsmsg(player.src()));

(function () {
	if (typeof document !== 'undefined') {
		var head = document.head || document.getElementsByTagName('head')[0],
		    style = document.createElement('style'),
		    css = " #outer[data-v-e2bc17e8] { width: 100%; height: 100vh; text-align: center; } #inner[data-v-e2bc17e8] { position: relative; top: 50%; transform: translateY(-50%); } ";style.type = 'text/css';if (style.styleSheet) {
			style.styleSheet.cssText = css;
		} else {
			style.appendChild(document.createTextNode(css));
		}head.appendChild(style);
	}
})();

var Mp4dl = { render: function () {
		var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c('div', { attrs: { "id": "outer" } }, [_c('div', { attrs: { "id": "inner" } }, [_c('div', [_c('progress', { attrs: { "max": _vm.total }, domProps: { "value": _vm.loaded } }), _vm._v(_vm._s(_vm.percent) + "% ")]), _vm._v(" "), _c('div', [_vm._v(" " + _vm._s(_vm.loadedMB) + " MB/" + _vm._s(_vm.totalMB) + " MB ")]), _vm._v(" "), _vm.fileurl ? _c('div', [_c('a', { attrs: { "href": _vm.fileurl, "download": _vm.vid + '.mp4' } }, [_vm._v("點此下載")])]) : _vm._e()])]);
	}, staticRenderFns: [], _scopeId: 'data-v-e2bc17e8',
	props: {
		url: {
			type: String,
			required: true
		},
		vid: {
			type: String,
			required: true
		}
	},
	data() {
		return {
			loaded: 0,
			total: 0,
			fileurl: null
		};
	},
	computed: {
		loadedMB() {
			return (this.loaded / 1024 / 1024).toFixed(2);
		},
		totalMB() {
			return (this.total / 1024 / 1024).toFixed(2);
		},
		percent() {
			return (this.loaded / this.total * 100).toFixed(2);
		}
	},
	created() {
		xhrDownload({
			url: this.url,
			progcb: e => {
				this.loaded = e.loaded;
				this.total = e.total;
			},
			loadcb: r => {
				this.fileurl = URL.createObjectURL(r);
				download(this.fileurl, this.vid + '.mp4');
				document.title = '下載完成!';
				this.loaded = this.total;
			}
		});
	}
};

const query = parseQuery(location.search);
function mp4 () {
	//特殊,因為需要Referer header才能得到影片檔
	if (!confirm('這類需要特殊下載方法,要保持此頁面開啟直到下載完成\n是否繼續?')) return;
	const url = $('video>source').attr('src');
	$('body *').remove();
	const div = document.createElement('div');
	$(document.body).append(div);
	new Vue({
		render: h => h(Mp4dl, {
			attrs: { url: url }
		})
	}).$mount(div);
}

function mf () {
	const restore = hook(XMLHttpRequest.prototype, 'open', ([GET, url]) => {
		restore();
		fetch(url).then(r => r.text()).then(ht => {
			const $$ = $(ht);
			let lnk = $$.find('.DownloadButtonAd-startDownload').attr('href') || $$.find('.download_link a').attr('href') || url;
			swal({
				title: '下載連結',
				html: `<a href="${lnk}">${lnk}</a>`
			});
			jwplayer('player').stop();
		});
	});
	load();
}

function torrent () {
	swal({
		title: '不支援下載',
		html: `<p>以下是影片的磁力連結,若想在瀏覽器中播放請按確定,按下取消會停止播放影片</p><a href="${torrentId}">${torrentId}</a>`
	});
	if (!_continue) {
		client.destroy();
		document.documentElement.innerHTML = '';
	}
}

function video () {
	const src = $('source').attr('src');
	location.href = src;
}

var watch = (() => setTimeout(() => {
	const url = jwplayer('player').getPlaylistItem().file;
	if (url.endsWith('.m3u8')) {
		hlsmsg(url);
	} else {
		location.href = url;
	}
}, 500));

var watchhls = (() => hlsmsg(player.src()));

var web1anime = (() => hlsmsg(player.src()));

var animeone = (() => hlsmsg(player.src()));

function other () {
	// other pages
	if ($('.acpwd-pass').length) {
		// automatically enter password if needed
		$('.acpwd-pass').get(0).value = 'anime1.me'; // current password (2017-12-03T14:15:37.823Z)
		$('.acpwd-submit').get(0).click();
		return;
	}
	// find each videos in articles
	const $articles = $('article');
	for (const art of $articles) {
		const $title = $(art).find('.entry-title');
		const iframes = $(art).find('iframe');
		for (let i = 0; i < iframes.length; i++) {
			const ifr = iframes[i];
			const url = $(ifr).attr('src');
			if (!url) continue; //如果沒有影片
			let btnText = '下載';
			if (iframes.length > 1) {
				// add number after the text if there are more than 1 video in the article
				btnText += ` #${i + 1}`;
			}
			$title.append($('<button>').addClass('search-submit').text(btnText).click(e => window.open(url, '_blank')));
		}
	}
	// handle load vid btns
	const loadvidBtns = $('.loadvideo');
	for (const btn of loadvidBtns) {
		const url = $(btn).data('src').replace('?autoplay=1', '');
		$(btn).after($('<button>').addClass('search-submit').css('margin-left', '1em').text('下載').click(e => window.open(url, '_blank')));
	}
}

const loc = location;
if (loc.hostname === 'p.anime1.me' && loc.pathname === '/pic.php') pic();else if (loc.hostname === 'p.anime1.me' && loc.pathname === '/ts.php') ts();else if (loc.hostname === 'p.anime1.me' && loc.pathname === '/mp4.php') mp4();else if (loc.hostname === 'p.anime1.me' && loc.pathname === '/mf') mf();else if (loc.hostname === 'torrent.anime1.me') torrent();else if (loc.hostname === 'video.anime1.me' && loc.pathname === '/video') video();else if ((loc.hostname === 'player.anime1.me' || loc.hostname === 'v.anime1.me') && loc.pathname === '/watch') watch();else if (loc.hostname === 'player.anime1.me' && loc.pathname === '/watchhls') watchhls();else if (loc.hostname === 'web.1ani.me') web1anime();else if (loc.hostname === 'i.animeone.me') animeone();else other();
document.oncontextmenu = null; // re-enable right click

}(Sweetalert2,$,Vue));