Files
prodik 257b42f518 Каталог плагинов: полный локальный mirror в ./plugins (один directory-mount в wwwroot/plugins), доки и вычистка неиспользуемых модулей
- plugins/: скачаны все 30 плагинов store локально (sources.json - карта исходных URL);
  патчи: showy.js (абсолютный хост подгрузки), pubtorr/td/torrentmanager - тела вместо лоадеров,
  modss.js - local-patched копия (из каталога исключена, upstream мёртв)
- extensions.json: 32 позиции, все ссылки {localhost}/plugins/<файл>.js, удалены мёртвые
  (Skaz TV x3, export.js, hotkeys/gold_theme/select_weapon/want/mult, MODS's, o.js, др.)
- compose: ./plugins:/lampac/wwwroot/plugins (один маунт вместо 30 file-mount)
- вычистка: удалены неиспользуемые mods (DatabaseEditor, ExternalBind, LogUserRequest-Lite,
  Telemetry, Transcoding, WatchTogether) и дубль каталога modules/
- config/init.conf: секции Tracks/AdminPanel/Music, customPlugins без gst.js
- mods/Tracks: правки Controller.cs/plugin.js
- README.md / AGENT.md: mirror, кеш static, правила mount
2026-10-02 16:37:30 +03:00

417 lines
16 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(function () {
'use strict';
var connect_host = '{localhost}';
var list_opened = false;
var unic_id = Lampa.Storage.get('lampac_unic_id', '');
if (!unic_id) {
unic_id = Lampa.Utils.uid(8).toLowerCase();
Lampa.Storage.set('lampac_unic_id', unic_id);
}
function reguest(params, callback) {
if (params.ffprobe) {
setTimeout(function () {
callback({
streams: params.ffprobe
});
}, 200);
} else {
var net = new Lampa.Reguest();
net.timeout(1000 * 15);
var url = connect_host + '/ffprobe?media=' + encodeURIComponent(params.url);
if (url.indexOf('account_email=') == -1) {
var email = Lampa.Storage.get('account_email');
if (email) url = Lampa.Utils.addUrlComponent(url, 'account_email=' + encodeURIComponent(email));
}
if (url.indexOf('uid=') == -1) {
var uid = Lampa.Storage.get('lampac_unic_id', '');
if (uid) url = Lampa.Utils.addUrlComponent(url, 'uid=' + encodeURIComponent(uid));
}
if (url.indexOf('token=') == -1) {
var token = '{token}';
if (token != '') url = Lampa.Utils.addUrlComponent(url, 'token={token}');
}
net["native"](url, function (str) {
var json = {};
try {
json = JSON.parse(str);
} catch (e) { }
callback(json.streams && json.streams.length ? json : null);
}, function () {
callback(null);
}, false, {
dataType: 'text'
});
}
}
function subscribeTracks(data) {
var inited = false;
var inited_parse = false;
var webos_replace = {};
function log() {
console.log.apply(console.log, arguments);
}
function getTracks() {
var video = Lampa.PlayerVideo.video();
return video.audioTracks || [];
}
function getSubs() {
var video = Lampa.PlayerVideo.video();
return video.textTracks || [];
}
log('Tracks', 'start');
function setTracks() {
if (inited_parse) {
var new_tracks = [];
var video_tracks = getTracks();
var parse_tracks = inited_parse.streams.filter(function (a) {
return a.codec_type == 'audio';
});
var minus = 1;
log('Tracks', 'set tracks:', video_tracks.length);
if (parse_tracks.length !== video_tracks.length) parse_tracks = parse_tracks.filter(function (a) {
return a.codec_name !== 'dts';
});
parse_tracks = parse_tracks.filter(function (a) {
return a.tags;
});
log('Tracks', 'filtred tracks:', parse_tracks.length);
parse_tracks.forEach(function (track) {
var orig = video_tracks[track.index - minus];
var elem = {
index: track.index - minus,
language: track.tags.language,
label: track.tags.title || track.tags.handler_name,
ghost: orig ? false : true,
selected: orig ? orig.selected == true || orig.enabled == true : false
};
console.log('Tracks', 'tracks original', orig);
Object.defineProperty(elem, "enabled", {
set: function set(v) {
if (v) {
var aud = getTracks();
var trk = aud[elem.index];
for (var i = 0; i < aud.length; i++) {
aud[i].enabled = false;
aud[i].selected = false;
}
if (trk) {
trk.enabled = true;
trk.selected = true;
}
}
},
get: function get() { }
});
new_tracks.push(elem);
});
if (parse_tracks.length) Lampa.PlayerPanel.setTracks(new_tracks);
}
}
function setSubs() {
if (inited_parse) {
var new_subs = [];
var video_subs = getSubs();
var parse_subs = inited_parse.streams.filter(function (a) {
return a.codec_type == 'subtitle';
});
var minus = inited_parse.streams.filter(function (a) {
return a.codec_type == 'audio';
}).length + 1;
log('Tracks', 'set subs:', video_subs.length);
parse_subs = parse_subs.filter(function (a) {
return a.tags;
});
log('Tracks', 'filtred subs:', parse_subs.length);
parse_subs.forEach(function (track) {
var orig = video_subs[track.index - minus];
var elem = {
index: track.index - minus,
language: track.tags.language,
label: track.tags.title || track.tags.handler_name,
ghost: video_subs[track.index - minus] ? false : true,
selected: orig ? orig.selected == true || orig.mode == 'showing' : false
};
console.log('Tracks', 'subs original', orig);
Object.defineProperty(elem, "mode", {
set: function set(v) {
if (v) {
var txt = getSubs();
var sub = txt[elem.index];
for (var i = 0; i < txt.length; i++) {
txt[i].mode = 'disabled';
txt[i].selected = false;
}
if (sub) {
sub.mode = 'showing';
sub.selected = true;
}
}
},
get: function get() { }
});
new_subs.push(elem);
});
if (parse_subs.length) Lampa.PlayerPanel.setSubs(new_subs);
}
}
function listenTracks() {
log('Tracks', 'tracks video event');
setTracks();
Lampa.PlayerVideo.listener.remove('tracks', listenTracks);
}
function listenSubs() {
log('Tracks', 'subs video event');
setSubs();
Lampa.PlayerVideo.listener.remove('subs', listenSubs);
}
function canPlay() {
log('Tracks', 'canplay video event');
if (webos_replace.tracks) setWebosTracks(webos_replace.tracks); else setTracks();
if (webos_replace.subs) setWebosSubs(webos_replace.subs); else setSubs();
Lampa.PlayerVideo.listener.remove('canplay', canPlay);
}
function setWebosTracks(video_tracks) {
if (inited_parse) {
var parse_tracks = inited_parse.streams.filter(function (a) {
return a.codec_type == 'audio';
});
log('Tracks', 'webos set tracks:', video_tracks.length);
if (parse_tracks.length !== video_tracks.length) {
parse_tracks = parse_tracks.filter(function (a) {
return a.codec_name !== 'truehd';
});
if (parse_tracks.length !== video_tracks.length) {
parse_tracks = parse_tracks.filter(function (a) {
return a.codec_name !== 'dts';
});
}
}
parse_tracks = parse_tracks.filter(function (a) {
return a.tags;
});
log('Tracks', 'webos tracks', video_tracks);
parse_tracks.forEach(function (track, i) {
if (video_tracks[i]) {
video_tracks[i].language = track.tags.language;
video_tracks[i].label = track.tags.title || track.tags.handler_name;
}
});
}
}
function setWebosSubs(video_subs) {
if (inited_parse) {
var parse_subs = inited_parse.streams.filter(function (a) {
return a.codec_type == 'subtitle';
});
log('Tracks', 'webos set subs:', video_subs.length);
if (parse_subs.length !== video_subs.length - 1) parse_subs = parse_subs.filter(function (a) {
return a.codec_name !== 'hdmv_pgs_subtitle';
});
parse_subs = parse_subs.filter(function (a) {
return a.tags;
});
parse_subs.forEach(function (track, a) {
var i = a + 1;
if (video_subs[i]) {
video_subs[i].language = track.tags.language;
video_subs[i].label = track.tags.title || track.tags.handler_name;
}
});
}
}
function listenWebosSubs(_data) {
log('Tracks', 'webos subs event');
webos_replace.subs = _data.subs;
if (inited_parse) setWebosSubs(_data.subs);
}
function listenWebosTracks(_data) {
log('Tracks', 'webos tracks event');
webos_replace.tracks = _data.tracks;
if (inited_parse) setWebosTracks(_data.tracks);
}
function listenStart() {
inited = true;
reguest(data, function (result) {
if (!result) return log('Tracks', 'no metadata');
log('Tracks', 'parsed', inited_parse);
inited_parse = result;
if (inited) {
if (webos_replace.subs) setWebosSubs(webos_replace.subs); else setSubs();
if (webos_replace.tracks) setWebosTracks(webos_replace.tracks); else setTracks();
}
});
}
function listenDestroy() {
inited = false;
Lampa.Player.listener.remove('destroy', listenDestroy);
Lampa.PlayerVideo.listener.remove('tracks', listenTracks);
Lampa.PlayerVideo.listener.remove('subs', listenSubs);
Lampa.PlayerVideo.listener.remove('webos_subs', listenWebosSubs);
Lampa.PlayerVideo.listener.remove('webos_tracks', listenWebosTracks);
Lampa.PlayerVideo.listener.remove('canplay', canPlay);
log('Tracks', 'end');
}
Lampa.Player.listener.follow('destroy', listenDestroy);
Lampa.PlayerVideo.listener.follow('tracks', listenTracks);
Lampa.PlayerVideo.listener.follow('subs', listenSubs);
Lampa.PlayerVideo.listener.follow('webos_subs', listenWebosSubs);
Lampa.PlayerVideo.listener.follow('webos_tracks', listenWebosTracks);
Lampa.PlayerVideo.listener.follow('canplay', canPlay);
listenStart();
}
function parseMetainfo(data) {
var loading = Lampa.Template.get('tracks_loading');
data.item.after(loading);
reguest(data.element, function (result) {
if (!result) {
loading.addClass('tracks-loading--error').find('span').text(Lampa.Lang.translate('tracks_nometa'));
return;
}
if (list_opened) {
var append = function append(name, fields) {
if (fields.length) {
var block = Lampa.Template.get('tracks_metainfo_block', {});
block.find('.tracks-metainfo__label').text(Lampa.Lang.translate(name == 'video' ? 'extensions_hpu_video' : name == 'audio' ? 'player_tracks' : 'player_' + name));
fields.forEach(function (data) {
var item = $('<div class="tracks-metainfo__item tracks-metainfo__item--' + name + ' selector"></div>');
item.on('hover:focus', function (e) {
Lampa.Modal.scroll().update(item);
});
for (var i in data) {
var div = $('<div class="tracks-metainfo__column--' + i + '"></div>');
div.text(data[i]);
item.append(div);
}
block.find('.tracks-metainfo__info').append(item);
});
html.append(block);
}
};
var video = [];
var audio = [];
var subs = [];
var codec_video = result.streams.filter(function (a) {
return a.codec_type == 'video';
});
var codec_audio = result.streams.filter(function (a) {
return a.codec_type == 'audio';
});
var codec_subs = result.streams.filter(function (a) {
return a.codec_type == 'subtitle';
});
codec_video.slice(0, 1).forEach(function (v) {
var line = {};
if (v.width && v.height) line.video = v.width + 'х' + v.height;
if (v.codec_name) line.codec = v.codec_name.toUpperCase();
if (Boolean(v.is_avc)) line.avc = 'AVC';
if (Lampa.Arrays.getKeys(line).length) video.push(line);
});
codec_audio.forEach(function (a, i) {
var line = {
num: i + 1
};
if (a.tags) {
line.lang = (a.tags.language || '').toUpperCase();
}
line.name = a.tags ? a.tags.title || a.tags.handler_name : '';
if (a.codec_name) line.codec = a.codec_name.toUpperCase();
if (a.channel_layout) line.channels = a.channel_layout.replace('(side)', '').replace('stereo', '2.0');
var bit = a.bit_rate ? a.bit_rate : a.tags && (a.tags.BPS || a.tags["BPS-eng"]) ? a.tags.BPS || a.tags["BPS-eng"] : '--';
line.rate = bit == '--' ? bit : Math.round(bit / 1000) + ' ' + Lampa.Lang.translate('speed_kb');
if (Lampa.Arrays.getKeys(line).length) audio.push(line);
});
codec_subs.forEach(function (a, i) {
var line = {
num: i + 1
};
if (a.tags) {
line.lang = (a.tags.language || '').toUpperCase();
}
line.name = a.tags ? a.tags.title || a.tags.handler_name : '';
if (Lampa.Arrays.getKeys(line).length) subs.push(line);
});
var html = Lampa.Template.get('tracks_metainfo', {});
append('video', video);
append('audio', audio);
append('subs', subs);
loading.remove();
if (video.length || audio.length || subs.length) {
data.item.after(html);
}
if (Lampa.Controller.enabled().name == 'modal') Lampa.Controller.toggle('modal');
}
});
}
Lampa.Player.listener.follow('start', function (data) {
if (data.torrent_hash) subscribeTracks(data);
});
Lampa.Listener.follow('torrent_file', function (data) {
if (data.type == 'list_open') list_opened = true;
if (data.type == 'list_close') list_opened = false;
if (data.type == 'render' && data.items.length == 1 && list_opened) {
parseMetainfo(data);
}
});
Lampa.Lang.add({
tracks_nometa: {
ru: 'Не удалось получить сведения о дорожках',
uk: 'Не вдалося отримати відомості про доріжки',
en: 'Failed to get track info'
}
});
Lampa.Template.add('tracks_loading', "\n <div class=\"tracks-loading\">\n <span>#{loading}...</span>\n </div>\n");
Lampa.Template.add('tracks_metainfo', "\n <div class=\"tracks-metainfo\"></div>\n");
Lampa.Template.add('tracks_metainfo_block', "\n <div class=\"tracks-metainfo__line\">\n <div class=\"tracks-metainfo__label\"></div>\n <div class=\"tracks-metainfo__info\"></div>\n </div>\n");
Lampa.Template.add('tracks_css', "\n <style>\n .tracks-loading{margin-top:1em;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start}.tracks-loading:before{content:'';display:inline-block;width:1.3em;height:1.3em;background:url('./img/loader.svg') no-repeat 50% 50%;-webkit-background-size:contain;-moz-background-size:contain;-o-background-size:contain;background-size:contain;margin-right:.4em}.tracks-loading>span{font-size:1.1em;line-height:1.1}.tracks-loading--error{opacity:.5}.tracks-loading--error:before{display:none}.tracks-metainfo{margin-top:1em}.tracks-metainfo__line+.tracks-metainfo__line{margin-top:2em}.tracks-metainfo__label{opacity:.5;font-weight:600}.tracks-metainfo__info{padding-top:1em;line-height:1.2}.tracks-metainfo__info>div{background-color:rgba(0,0,0,0.22);display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-border-radius:.3em;-moz-border-radius:.3em;border-radius:.3em;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.tracks-metainfo__info>div.focus{background-color:rgba(255,255,255,0.06)}.tracks-metainfo__info>div>div{padding:1em;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.tracks-metainfo__info>div>div:not(:last-child){padding-right:1.5em}.tracks-metainfo__info>div+div{margin-top:1em}.tracks-metainfo__column--video,.tracks-metainfo__column--name{margin-right:auto}.tracks-metainfo__column--num{min-width:3em;padding-right:0}.tracks-metainfo__column--rate{min-width:7em;text-align:right}.tracks-metainfo__column--channels{min-width:5em;text-align:right}\n </style>\n");
$('body').append(Lampa.Template.get('tracks_css', {}, true));
})();