Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
xjbeta committed Mar 24, 2022
2 parents c04250a + feb2aef commit 9559653
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 63 deletions.
2 changes: 1 addition & 1 deletion DanmakuWeb/index.htm
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" value="IE=9">
<title>IINA-Plus danmaku</title>
<title>Danmaku Plugin Overlay</title>
<link rel="stylesheet" href="default.css" />

<!-- CCL -->
Expand Down
38 changes: 20 additions & 18 deletions DanmakuWeb/main.js
Original file line number Diff line number Diff line change
@@ -1,33 +1,36 @@
$ = function(a) {
return document.getElementById(a);
};
var isLiving = true;
var defWidth = 680;
var uuid = '';
var rawUrl;
var dmType;

function hexToString(hex) {
return decodeURIComponent('%' + hex.match(/.{1,2}/g).join('%'));
};

iina.onMessage("initDM", (opts) => {
dmType = opts.type;
defWidth = opts.dmSpeed;

window.bind();
window.initDM();

switch(dmType) {
case 0:
rawUrl = opts.rawUrl;
initWebsocket(opts.port);
break;
case 1:
window.loadDM(hexToString(opts.xmlContent), 'iina-danmaku');
break;
default:
return;
};

// Block unknown types.
// https://github.com/jabbany/CommentCoreLibrary/issues/97
window.cm.filter.allowUnknownTypes = false;


if (opts.hasOwnProperty('xmlContent')) {
window.loadDM(hexToString(opts.xmlContent), 'iina-danmaku');
};

if (opts.hasOwnProperty('port') && opts.hasOwnProperty('uuid')) {
initWebsocket(opts.uuid, opts.port);
};

window.cm.options.global.opacity = opts.dmOpacity;

blockDmType(opts.blockType);
Expand Down Expand Up @@ -226,7 +229,7 @@ function start(websocketServerLocation){
updateStatus('warning');
ws.onopen = function(evt) {
updateStatus();
ws.send(uuid);
ws.send('iinaDM://' + rawUrl);
};
ws.onmessage = function(evt) {
var event = JSON.parse(evt.data);
Expand Down Expand Up @@ -254,10 +257,10 @@ function start(websocketServerLocation){

};
ws.onclose = function(){
if (isLiving) {
if (dmType == 0) {
updateStatus('warning');
// Try to reconnect in 1 seconds
setTimeout(function(){start(websocketServerLocation)}, 1000);
setTimeout(function(){start(websocketServerLocation)}, 1500);
}
};
}
Expand All @@ -274,11 +277,10 @@ function start(websocketServerLocation){
// window.cm.send(comment);
// };

function initWebsocket(id, port){
uuid = id;
function initWebsocket(port){
if (port === undefined){
port = 19080;
}
start('ws://127.0.0.1:' + port + '/danmaku-websocket');
console.log('initWebsocket', id);
console.log('initWebsocket');
}
4 changes: 3 additions & 1 deletion Info.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@
"menu-items",
"video-overlay",
"call-process",
"file-system"
"file-system",
"network-request"
],
"allowedDomains": ["127.0.0.1"],
"preferencesPage": "pref.html",
"preferenceDefaults": {
"keyNum": 10,
Expand Down
136 changes: 93 additions & 43 deletions main.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
/// <reference path="node_modules/iina-plugin-definition/iina/index.d.ts" />

const { core, console, event, mpv, http, menu, overlay, preferences, utils, file } = iina;
const item = menu.item("Danmaku");
const danmakuMenuItem = menu.item("Danmaku");

const instanceID = (Math.random() + 1).toString(36).substring(3);

let iinaPlusArgsKey = 'iinaPlusArgs=';
var danmakuOpts;
var iinaPlusOpts;
var optsParsed = false;

var danmakuWebLoaded = false;
var overlayShowing = false;
var mpvPaused = false;
var danmakuWebInited = false;

var isLiving = false;

let defaultPreferences = {
dmOpacity: 1,
dmSpeed: 680,
Expand Down Expand Up @@ -78,39 +77,96 @@ function parseOpts() {

let scriptOpts = mpv.getString('script-opts').split(',');


let iinaPlusValue = scriptOpts.find(s => s.startsWith(iinaPlusArgsKey));
if (iinaPlusValue) {
optsParsed = true;

let opts = JSON.parse(hexToString(iinaPlusValue.substring(iinaPlusArgsKey.length)));
print('iina plus opts: ' + JSON.stringify(opts));

if (opts.hasOwnProperty('mpvArgs')) {
mpv.command('loadfile', opts.mpvArgs);
print('iina plus opts: ' + JSON.stringify(opts));

mpv.command('loadfile', [opts.urls[opts.currentLine], 'replace', opts.mpvScript]);
iinaPlusOpts = opts;
iinaPlusOpts.mpvScript = undefined;
switch(opts.type) {
case 0: // 0 ws
case 1: // 1 xmlFile
loadDanmaku();
break;
default: // 2 none
break;
};

if (opts.hasOwnProperty('xmlPath') || (opts.hasOwnProperty('port') && opts.hasOwnProperty('uuid'))) {
danmakuOpts = opts;
loadDanmaku();
};
initMenuItems();
};
};

function initMenuItems() {
menu.removeAllItems();
menu.addItem(danmakuMenuItem);

const qualityItem = menu.item("Qualitys");
iinaPlusOpts.qualitys.forEach((element, index) => {
qualityItem.addSubMenuItem(menu.item(element, () => {
requestNewUrl(element, iinaPlusOpts.currentLine)
}, {
selected: index == iinaPlusOpts.currentQuality
}));
});
menu.addItem(qualityItem);

const lineItem = menu.item("Lines");
iinaPlusOpts.lines.forEach((element, index) => {
lineItem.addSubMenuItem(menu.item(element, () => {
requestNewUrl(iinaPlusOpts.qualitys[iinaPlusOpts.currentQuality], index)
}, {
selected: index == iinaPlusOpts.currentLine
}));
});
menu.addItem(lineItem);
};

function requestNewUrl(quality, line) {
print(quality + line);

let u = 'http://127.0.0.1:'+iinaPlusOpts.port+'/video';
let pars = {'url': iinaPlusOpts.rawUrl, 'key': quality, 'pluginAPI': '1'};

iina.http.get(u, {params: pars}).then((response) => {
let re = JSON.parse(hexToString(response.text));
let urls = re.urls;
var url;
if (line >= urls.length) {
line = 0;
};

url = urls[line];

iinaPlusOpts.qualitys = re.qualitys;
iinaPlusOpts.currentQuality = re.qualitys.indexOf(quality);
iinaPlusOpts.lines = re.lines;
iinaPlusOpts.currentLine = line

mpv.command('loadfile', [url, 'replace', re.mpvScript]);
initMenuItems();
}).catch((response) => {
console.log(response)
})
};

// Init MainMenu Item.
item.addSubMenuItem(menu.item("Select Danmaku File...", async () => {
danmakuMenuItem.addSubMenuItem(menu.item("Select Danmaku File...", async () => {
let path = await iina.utils.chooseFile('Select Danmaku File...', {'chooseDir': false, 'allowedFileTypes': ['xml']});
danmakuOpts = {'xmlPath': path};
iinaPlusOpts = {'xmlPath': path, 'type': 1};
loadDanmaku();
}));

item.addSubMenuItem(menu.separator());
danmakuMenuItem.addSubMenuItem(menu.separator());

item.addSubMenuItem(menu.item("Show / Hide Danmaku", () => {
danmakuMenuItem.addSubMenuItem(menu.item("Show / Hide Danmaku", () => {
overlayShowing ? hideOverlay() : showOverlay();
}));

menu.addItem(item);
menu.addItem(danmakuMenuItem);

function loadDanmaku() {
if (!danmakuWebLoaded) {
Expand All @@ -129,20 +185,19 @@ function unloadDanmaku() {
};

function initDanmakuWeb() {
if (!danmakuOpts) {
return;
};

if (danmakuOpts.hasOwnProperty('xmlPath')) {
isLiving = false;
danmakuOpts.xmlContent = loadXMLFile(danmakuOpts.xmlPath);
} else {
isLiving = true;
switch (iinaPlusOpts.type) {
case 0:
break;
case 1:
iinaPlusOpts.xmlContent = loadXMLFile(iinaPlusOpts.xmlPath);
break;
default:
return;
};

danmakuOpts.dmOpacity = iina.preferences.get('dmOpacity') ?? defaultPreferences.dmOpacity;
danmakuOpts.dmSpeed = iina.preferences.get('dmSpeed') ?? defaultPreferences.dmSpeed;
danmakuOpts.dmFont = iina.preferences.get('dmFont') ?? defaultPreferences.dmFont;
iinaPlusOpts.dmOpacity = iina.preferences.get('dmOpacity') ?? defaultPreferences.dmOpacity;
iinaPlusOpts.dmSpeed = iina.preferences.get('dmSpeed') ?? defaultPreferences.dmSpeed;
iinaPlusOpts.dmFont = iina.preferences.get('dmFont') ?? defaultPreferences.dmFont;

var blockList = [];
if ((iina.preferences.get('blockTypeScroll') ?? 0) == 1) {
Expand All @@ -160,20 +215,16 @@ function initDanmakuWeb() {
if ((iina.preferences.get('blockTypeAdvanced') ?? 0) == 1) {
blockList.push('Advanced');
};
danmakuOpts.blockType = blockList.join(',');
iinaPlusOpts.blockType = blockList.join(',');

danmakuOpts.mpvArgs = undefined;
danmakuOpts.xmlPath = undefined;

if (danmakuOpts.hasOwnProperty('xmlPath') || (danmakuOpts.hasOwnProperty('port') && danmakuOpts.hasOwnProperty('uuid'))) {
print('initDM.');
showOverlay(false);
overlay.postMessage("initDM", danmakuOpts);
danmakuWebInited = true;
};
print('initDM.');
showOverlay(false);
overlay.postMessage("initDM", iinaPlusOpts);
danmakuWebInited = true;
print('initDM....');

setObserver(true);
danmakuOpts = undefined;
};

iina.event.on("iina.plugin-overlay-loaded", () => {
Expand All @@ -183,11 +234,10 @@ iina.event.on("iina.plugin-overlay-loaded", () => {

iina.event.on("iina.window-will-close", () => {
print('iina.window-will-close');
danmakuOpts = undefined;
iinaPlusOpts = undefined;
optsParsed = false;
removeOpts();
unloadDanmaku();
isLiving = false;
overlayShowing = false;
mpvPaused = false;
danmakuWebInited = false;
Expand Down Expand Up @@ -236,7 +286,7 @@ function setObserver(start) {
if (start && !mpvPaused && danmakuWebLoaded && danmakuWebInited && overlayShowing) {
print('Start Observers.');
stop();
if (!isLiving) {
if (iinaPlusOpts.type == 1) {
timePosListenerID = iina.event.on(timePosKey, (t) => {
overlay.postMessage("timeChanged", {'time': t});
});
Expand Down

0 comments on commit 9559653

Please sign in to comment.