EmbyCrackedClient/web/modules/externalplayer/plugin.js

1 line
6.8 KiB
JavaScript
Raw Permalink Normal View History

2025-06-25 11:46:04 +08:00
import{shell}from"./../common/servicelocator.js";import pluginManager from"./../common/pluginmanager.js";import appSettings from"./../common/appsettings.js";import Events from"./../emby-apiclient/events.js";export default function(){let self=this;self.name="External Player",self.type="mediaplayer",self.id="externalplayer",self.priority=-10,self.supportsProgress=!1,self.isLocalPlayer=!0,self.isExternalPlayer=!0;let currentProcess,currentSrc;function getPlayer(options){let streamInfo=Object.assign({},options);return options.mediaSource&&(streamInfo.container=options.mediaSource.Container,streamInfo.protocol=options.mediaSource.Protocol,streamInfo.video3DFormat=options.mediaSource.Video3DFormat),options.item&&(streamInfo.gameSystem=options.item.GameSystemId||options.item.GameSystem),JSON.parse(appSettings.get("externalplayers")||"[]").filter(function(player){return((player,options)=>!(!shell.canExec||player.mediaType!==options.mediaType||("Game"===options.mediaType?(player.gameSystem||"").toString()!==(options.gameSystem||"").toString():(options=>{var filters=[];if("Video"===options.mediaType){switch((options.container||"").toLowerCase()){case"iso":case"blurayiso":case"dvdiso":filters.push("videotype-iso");break;case"dvd":filters.push("videotype-dvd");break;case"bluray":filters.push("videotype-bluray")}filters.length||("File"!==options.protocol?filters.push("videotype-stream"):filters.push("videotype-file"))}return filters})(options).filter(function(typeFilter){return!1===player[typeFilter]}).length||"Video"===options.mediaType&&!0===player["videotype-3d"]&&!options.video3DFormat)))(player,streamInfo)})[0]}function replaceArg(str,arg,value){return((str,strReplace,strWith)=>(strReplace=strReplace.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),strReplace=new RegExp(strReplace,"ig"),str.replace(strReplace,strWith)))(str,arg,value)}function modifyStreamUrl(options){let url=options.url;if(!url)return Promise.resolve(options.item.Path);let mediaSource=options.mediaSource;if(!mediaSource||"File"!==mediaSource.Protocol||url===mediaSource.Path)return Promise.resolve(url);let method="bluray"===mediaSource.Container||"dvd"===mediaSource.Container?"directoryExists":"fileExists";return new Promise(function(resolve,reject){require(["filesystem"],resolve)}).then(function(fileSystem){return fileSystem[method](mediaSource.Path).then(function(){return mediaSource.Path},function(){return url})})}function closePlayer(){currentProcess;return currentProcess=null,Promise.resolve()}function onEnded(){onEndedInternal(!(currentProcess=null))}function onEndedInternal(triggerEnded){triggerEnded&&(triggerEnded={src:currentSrc},Events.trigger(self,"stopped",[triggerEnded])),currentSrc=null}self.canPlayMediaType=function(mediaType){return!0},self.canPlayItem=function(item,playOptions){return!!playOptions.fullscreen&&null!=getPlayer({mediaType:item.MediaType,container:item.Container,gameSystem:item.GameSystemId||item.GameSystem,protocol:"Remote"!==item.LocationType&&"Virtual"!==item.LocationType&&item.Path?"File":"Http",video3DFormat:item.Video3DFormat})},self.currentSrc=function(){return currentSrc},self.play=function(options){let player=getPlayer(options),path=player.path;return modifyStreamUrl(options).then(function(streamUrl){return shell.exec({path:path,arguments:((player,streamUrl,options)=>{let startPosMs=(options.playerStartPositionTicks||0)/1e4;return(player.arguments||[]).map(function(arg){return arg=replaceArg(arg,"{path}",streamUrl),arg=replaceArg(arg,"{ms}",startPosMs),arg=replaceArg(arg,"{seconds}",Math.floor(startPosMs/1e3))})})(player,streamUrl,options).join("|||")}).then(function(process){return(currentProcess=process).promise.then(onEnded,onEnded),Promise.resolve()})})},self.setSubtitleStreamIndex=function(index){},self.canSetAudioStreamIndex=function(){return!1},self.setAudioStreamIndex=function(index){},self.currentTime=function(val){return null},self.duration=function(val){return null},self.stop=function(destroyPlayer,reportEnded){return closePlayer().then(function(){return onEndedInternal(reportEnded),Promise.resolve()})},self.destroy=fun