4 hướng là đủ rồi, ai muốn 8 hướng thì để họ tự sửa lại script thôi.Cập nhập phiên bản 1.2, không có gì mới cả ngoài thêm sẵn 8 hướng và hướng dẫn bật 8 hướng: https://voz.vn/t/tong-hop-nhung-addon-chat-cho-firefox-pc-mobile.682181/post-27790639
Bật sẵn 8 hướng hay không thì các bạn @nhoxbuondkny @trym to nhat voz @vincvn @Kawaii93 @pTalent
cho ý kiến xem chứ mình mặc định để 4 hướng, bật rất dễ thôi.
Hấp dẫn quá sếp ơi,Cập nhập thông tin về Floorp bản mới sắp tới 11.4.0, Private Container (chính là giống addon Temporary Container), nghĩa là cái container sẽ tự xóa trắng sau khi tắt đi mở lại:
Và Profile Switcher để không phải vàoabout:profiles
nữa:
Đang hóng native tải đa luồng với PWA.
Cũng hóng tiếp Floorp nó lên Firefox 117 hay 118 để hưởng lợi vụ tăng tốc của Firefox, Floorp hiện tại là dựa trên Firefox ESR 115, và nó đã nhanh gấp x2 115, nếu nó hấp thụ tinh túy từ 117 và 118 thì khó mà tưởng tượng.
Cái copy đoạn text khi bôi đen mình nhớ trong thread này có bạn nào từng chia sẻ, bạn thử search thread với từ khóacác bác cho em hỏi có addon nào tự động copy đoạn text và lưu hình ảnh của một bài báo về máy tính không ạ em cảm ơn
copy script
xem.K biết cái addon SingleFile có giống điều fen muốn k ?các bác cho em hỏi có addon nào tự động copy đoạn text và lưu hình ảnh của một bài báo về máy tính không ạ em cảm ơn
Đã cập nhập bản 1.3, sửa lỗi này kèm với làm theo một số khuyến nghị từ Firemonkey (thằng này rất tuyệt khi dùng để code, nó chỉ tận răng mình làm gì sai):@toi la gay :sosad: bác ơi bản 1.2 bị gì ấy e không xài được cop bản 1.1 thì oke
View attachment 2078427
// ==UserScript==
// @name Handlers Helper
// @namespace Violentmonkey Scripts
// @include http*://*/*
// @grant none
// @version 1.3
// @author -
// @description Helper for protocol_hook.lua
// ==/UserScript==
function attachDrag(elem) {
function GM_btoaUrl(url) {
return btoa(url).replace(/\//g, "_").replace(/\+/g, "-").replace(/\=/g, "");
}
function EA(attr, type) {
console.log(attr, type);
var url;
if (attr.startsWith('http')) {
url = attr;
}
if (url == '') {
url = location.href;
}
var subs = '';
var s = url;
var app = 'play';
if (type != 'vid') {
var app = type.toLowerCase();
}
var bs = GM_btoaUrl(s);
var url2 = 'mpv://' + app + '/' + bs + '/' + "?referer=" + GM_btoaUrl(location.href);
if (subs != '') {
url2 = url2 + '?subs=' + GM_btoaUrl(subs);
}
//alert(url2);
location.href = url2;
}
function getDirection(x, y, cx, cy) {
/*=================
| |
| 1↖ 2↑ 3↗ |
| |
| 4← 5 6→ |
| |
| 7↙ 8↓ 9↘ |
| |
|=================*/
let d, t;
if ((cx - x) >= -50 && (cx - x) <= 50 && (cy - y) >= -50 && (cy - y) <= 50) {return 5;}
// Change (4 == 4) to (8 == 4) to enable 8 directions
if (4 == 4) { //4 directions
if (Math.abs(cx - x) < Math.abs(cy - y)) {
d = cy > y ? "8" : "2";
} else {
d = cx > x ? "6" : "4";
}
} else { //8 directions
t = (cy - y) / (cx - x);
if (-0.4142 <= t && t < 0.4142) d = cx > x ? '6' : "4";
else if (2.4142 <= t || t < -2.4142) d = cy > y ? '8' : '2';
else if (0.4142 <= t && t < 2.4142) d = cx > x ? '9' : '1';
else d = cy > y ? '7' : '3';
}
return d;
}
elem.addEventListener('dragstart', function (e) {
//console.log(e.target);
//console.log(e.target.shadowRoot);
/*if (e.target.nodeName != "A") {
e.stopPropagation();
e.stopImmediatePropagation();
//e.preventDefault();
}*/
console.log('dragstart');
var x1 = e.clientX;
var y1 = e.clientY;
var dragend = elem.addEventListener('dragend', function doEA(e) {
var x2 = e.clientX;
var y2 = e.clientY;
var direction = getDirection(x1, y1, x2, y2);
//if ((x2 - x1) >= -50 && (x2 - x1) <= 50 && (y2 - y1) >= -50 && (y2 - y1) <= 50) {direction = 5;console.log(5);}
//if (e.target.nodeName == "A" && e.target.href.match(/youtube.com|youtu.be|streamable.com/)) {
if (direction == 6) { //right
console.log('MPV :' + e.target.href);
console.log(x1, y1, x2, y2, direction);
EA(e.target.href, 'vid');
} else if (direction == 4) { //left
console.log('Streamlink: ' + e.target.href);
console.log(x1, y1, x2, y2, direction);
EA(e.target.href, 'stream');
} else if (direction == 2) { //up
console.log('Open: ' + e.target.href);
console.log(x1, y1, x2, y2, direction);
window.open(e.target.href, '_blank');
} else if (direction == 8) { //down
console.log('YTDL: ' + e.target.href);
console.log(x1, y1, x2, y2, direction);
EA(e.target.href, 'ytdl');
} else if (direction == 1) { //up left
console.log('DUMMY: ' + e.target.href);
console.log(x1, y1, x2, y2, direction);
//EA(e.target.href, 'ytdl');
} else if (direction == 3) { //up right
console.log('DUMMY: ' + e.target.href);
console.log(x1, y1, x2, y2, direction);
//EA(e.target.href, 'ytdl');
} else if (direction == 7) { //down left
console.log('DUMMY: ' + e.target.href);
console.log(x1, y1, x2, y2, direction);
//EA(e.target.href, 'ytdl');
} else if (direction == 9) { //down right
console.log('DUMMY: ' + e.target.href);
console.log(x1, y1, x2, y2, direction);
//EA(e.target.href, 'ytdl');
}
//}
console.log(direction);
this.removeEventListener('dragend', doEA);
}, false);
}, false);
}
attachDrag(document);
var attachedeles = [];
document.addEventListener('mouseover', function(e) {
if (e.target.shadowRoot) {
if (attachedeles.includes(e.target) == false) {
console.log(attachedeles);
attachedeles.push(e.target);
attachDrag(e.target.shadowRoot);
}
}
});
Góp ý cho Khầy Gây là nên chuyển về dạng switch case chứ nhìn script khầy if hell ghê quáĐã cập nhập link lên Greasyfork.org cho tiện việc cài đặt và cập nhập: https://greasyfork.org/en/scripts/475574-handlers-helper
Cái hay của chơi Greasyfork chắc là mình cập nhập phát nó tự động cập nhập luôn trên các addon quản lý Userscript.
chạy được là được rồi, chuyển qua switch case nó ko chạy thì khổGóp ý cho Khầy Gây là nên chuyển về dạng switch case chứ nhìn script khầy if hell ghê quá
có chỉnh rồi, thầy Gầy @toi la gay :sosad: có xài thì xàiGóp ý cho Khầy Gây là nên chuyển về dạng switch case chứ nhìn script khầy if hell ghê quá
// ==UserScript==
// @name Handlers Helper
// @match *://*/*
// @grant none
// @version 1.2
// @author -
// @description Helper for protocol_hook.lua
// ==/UserScript==
function attachDrag(elem) {
function GM_btoaUrl(url) {
return btoa(url).replace(/\//g, "_").replace(/\+/g, "-").replace(/\=/g, "");
}
function EA(attr, type) {
console.log(attr, type)
if (attr.startsWith('http')) {
url = attr;
}
if (url == '') {
var url = location.href;
}
var subs = '';
var s = url;
var app = 'play';
if (type != 'vid') {
var app = type.toLowerCase();
}
var bs = GM_btoaUrl(s);
var url2 = 'mpv://' + app + '/' + bs + '/' + "?referer=" + GM_btoaUrl(location.href);
if (subs != '') {
url2 = url2 + '?subs=' + GM_btoaUrl(subs);
}
//alert(url2);
location.href = url2;
}
// Define the enum-like directory
const DirectionEnum = {
RIGHT: 6,
LEFT: 4,
UP: 2,
DOWN: 8,
UP_LEFT: 1,
UP_RIGHT: 3,
DOWN_LEFT: 7,
DOWN_RIGHT: 9
};
function getDirection(x, y, cx, cy) {
/*=================
| |
| 1↖ 2↑ 3↗ |
| |
| 4← 5 6→ |
| |
| 7↙ 8↓ 9↘ |
| |
|=================*/
let d, t;
if ((cx - x) >= -50 && (cx - x) <= 50 && (cy - y) >= -50 && (cy - y) <= 50) {
return 5;
}
// Change (4 == 4) to (8 == 4) to enable 8 directions
if (4 == 4) { //4 directions
if (Math.abs(cx - x) < Math.abs(cy - y)) {
d = cy > y ? "8" : "2";
} else {
d = cx > x ? "6" : "4";
}
} else { //8 directions
t = (cy - y) / (cx - x);
if (-0.4142 <= t && t < 0.4142) d = cx > x ? '6' : "4";
else if (2.4142 <= t || t < -2.4142) d = cy > y ? '8' : '2';
else if (0.4142 <= t && t < 2.4142) d = cx > x ? '9' : '1';
else d = cy > y ? '7' : '3';
}
return d;
}
elem.addEventListener('dragstart', function(e) {
//console.log(e.target);
//console.log(e.target.shadowRoot);
/*if (e.target.nodeName != "A") {
e.stopPropagation();
e.stopImmediatePropagation();
//e.preventDefault();
}*/
console.log('dragstart');
var x1 = e.clientX;
var y1 = e.clientY;
var dragend = elem.addEventListener('dragend', function doEA(e) {
var x2 = e.clientX;
var y2 = e.clientY;
var direction = getDirection(x1, y1, x2, y2);
//if ((x2 - x1) >= -50 && (x2 - x1) <= 50 && (y2 - y1) >= -50 && (y2 - y1) <= 50) {direction = 5;console.log(5);}
//if (e.target.nodeName == "A" && e.target.href.match(/youtube.com|youtu.be|streamable.com/)) {
console.log('Direction: ' + direction);
console.log(x1, y1, x2, y2, direction);
const targetHref = e.target.href || e.target.src;
switch (+direction) {
case DirectionEnum.RIGHT:
console.log('MPV: ' + targetHref);
EA(targetHref, 'vid');
break;
case DirectionEnum.LEFT:
console.log('Streamlink: ' + targetHref);
EA(targetHref, 'stream');
break;
case DirectionEnum.UP:
console.log('Open: ' + targetHref);
window.open(targetHref, '_blank');
break;
case DirectionEnum.DOWN:
console.log('YTDL: ' + targetHref);
EA(targetHref, 'ytdl');
break;
case DirectionEnum.UP_LEFT:
case DirectionEnum.UP_RIGHT:
case DirectionEnum.DOWN_LEFT:
case DirectionEnum.DOWN_RIGHT:
default:
break;
}
//}
console.log(direction);
this.removeEventListener('dragend', doEA);
}, false);
}, false);
}
attachDrag(document);
var attachedeles = [];
document.addEventListener('mouseover', function(e) {
if (e.target.shadowRoot) {
if (attachedeles.includes(e.target) == false) {
console.log(attachedeles);
attachedeles.push(e.target);
attachDrag(e.target.shadowRoot);
}
}
});
Code đẹp đó, để mình sửa lại chút phầncó chỉnh rồi, thầy Gầy @toi la gay :sosad: có xài thì xài
match
-> include
cho đúng chuẩn Greasemonkey tại Firemonkey nó không nhận (nếu không dùng script phức tạp quá thì Firemonkey hiệu năng vô đối) rồi bắn lên Greasyfork // ==UserScript==
// @name Handlers Helper
// @include *://*/*
// @grant none
// @version 1.4
// @author -
// @description Helper for protocol_hook.lua
// ==/UserScript==
function attachDrag(elem) {
function GM_btoaUrl(url) {
return btoa(url).replace(/\//g, "_").replace(/\+/g, "-").replace(/\=/g, "");
}
function EA(attr, type) {
console.log(attr, type)
if (attr.startsWith('http')) {
url = attr;
}
if (url == '') {
var url = location.href;
}
var subs = '';
var s = url;
var app = 'play';
if (type != 'vid') {
var app = type.toLowerCase();
}
var bs = GM_btoaUrl(s);
var url2 = 'mpv://' + app + '/' + bs + '/' + "?referer=" + GM_btoaUrl(location.href);
if (subs != '') {
url2 = url2 + '?subs=' + GM_btoaUrl(subs);
}
//alert(url2);
location.href = url2;
}
// Define the enum-like directory
const DirectionEnum = {
RIGHT: 6,
LEFT: 4,
UP: 2,
DOWN: 8,
UP_LEFT: 1,
UP_RIGHT: 3,
DOWN_LEFT: 7,
DOWN_RIGHT: 9
};
function getDirection(x, y, cx, cy) {
/*=================
| |
| 1↖ 2↑ 3↗ |
| |
| 4← 5 6→ |
| |
| 7↙ 8↓ 9↘ |
| |
|=================*/
let d, t;
if ((cx - x) >= -50 && (cx - x) <= 50 && (cy - y) >= -50 && (cy - y) <= 50) {
return 5;
}
// Change (4 == 4) to (8 == 4) to enable 8 directions
if (4 == 4) { //4 directions
if (Math.abs(cx - x) < Math.abs(cy - y)) {
d = cy > y ? "8" : "2";
} else {
d = cx > x ? "6" : "4";
}
} else { //8 directions
t = (cy - y) / (cx - x);
if (-0.4142 <= t && t < 0.4142) d = cx > x ? '6' : "4";
else if (2.4142 <= t || t < -2.4142) d = cy > y ? '8' : '2';
else if (0.4142 <= t && t < 2.4142) d = cx > x ? '9' : '1';
else d = cy > y ? '7' : '3';
}
return d;
}
elem.addEventListener('dragstart', function(e) {
//console.log(e.target);
//console.log(e.target.shadowRoot);
/*if (e.target.nodeName != "A") {
e.stopPropagation();
e.stopImmediatePropagation();
//e.preventDefault();
}*/
console.log('dragstart');
var x1 = e.clientX;
var y1 = e.clientY;
var dragend = elem.addEventListener('dragend', function doEA(e) {
var x2 = e.clientX;
var y2 = e.clientY;
var direction = getDirection(x1, y1, x2, y2);
//if ((x2 - x1) >= -50 && (x2 - x1) <= 50 && (y2 - y1) >= -50 && (y2 - y1) <= 50) {direction = 5;console.log(5);}
//if (e.target.nodeName == "A" && e.target.href.match(/youtube.com|youtu.be|streamable.com/)) {
console.log('Direction: ' + direction);
console.log(x1, y1, x2, y2, direction);
const targetHref = e.target.href || e.target.src;
switch (+direction) {
case DirectionEnum.RIGHT:
console.log('MPV: ' + targetHref);
EA(targetHref, 'vid');
break;
case DirectionEnum.LEFT:
console.log('Streamlink: ' + targetHref);
EA(targetHref, 'stream');
break;
case DirectionEnum.UP:
console.log('Open: ' + targetHref);
window.open(targetHref, '_blank');
break;
case DirectionEnum.DOWN:
console.log('YTDL: ' + targetHref);
EA(targetHref, 'ytdl');
break;
case DirectionEnum.UP_LEFT:
case DirectionEnum.UP_RIGHT:
case DirectionEnum.DOWN_LEFT:
case DirectionEnum.DOWN_RIGHT:
default:
break;
}
//}
console.log(direction);
this.removeEventListener('dragend', doEA);
}, false);
}, false);
}
attachDrag(document);
var attachedeles = [];
document.addEventListener('mouseover', function(e) {
if (e.target.shadowRoot) {
if (attachedeles.includes(e.target) == false) {
console.log(attachedeles);
attachedeles.push(e.target);
attachDrag(e.target.shadowRoot);
}
}
});
Ông tổ ngành thợ code từng có một câu nói bất hủ là: thứ gì đã chạy được thì đừng có đụng vô ))Góp ý cho Khầy Gây là nên chuyển về dạng switch case chứ nhìn script khầy if hell ghê quá
Cái này đã là bại tướng của HE rồi nhé@toi la gay :sosad: không biết tại sao mỗi lần mở một tấm ảnh trên reddit thì nó lại chuyển hướng đến trang này nhờ bác xử lý
Chi tiết tính năng + ví dụ cách ép Youtube Mobile, ép Bing Chat chạy trên Firefox + link tải
- Cách sửa xóa Response header
- Cách sửa xóa Request header
- Cách cho phép CORS không cần cài thêm addon CORS
- Cách sửa mọi thứ trong trang web, phá tan nát trang web, chặn những quảng cáo gần như khó nhất với Header Editor
- Tận dụng sức mạnh lọc trang web của HE để ép voz tạo shortcut ra màn hình điện thoại (đọc bài 4 để bật)
- Cách để Old.Reddit.Com hiển thị gọn gàng trên Mobile
- Phá kháng hotlink ảnh trên Reddit
- Chuyển hướng trang web với HE mà không cần addon như Redirector/RequestControl (Nâng cao với Custom function)
- Ép trang trình duyệt cache vĩnh viễn nội dung web giống addon huyền thoại BetterCache
Rồi sau khỏi bảo trì. Nâng cấp thì viết cái mới cho đúng quy trình à fen ?Ông tổ ngành thợ code từng có một câu nói bất hủ là: thứ gì đã chạy được thì đừng có đụng vô ))
cảm ơn bác mình không để ýCái này đã là bại tướng của HE rồi nhé
Kho siêu bí kíp tiên tri của HE:
Ổn phết đó, thế là không cần phải dùng Mercury để có AVX2 rồiTete's Atelier có bản AVX2 kìa mấy fen.
Chromium thì có justclueless với RobRich là có avx2 build update liên tụcMercury với Thorium cập nhật chậm quá fen ơi. Vài tháng mới có 1 version.