1 line
No EOL
19 KiB
JavaScript
1 line
No EOL
19 KiB
JavaScript
import datetime from"./../common/datetime.js";import globalize from"./../common/globalize.js";import textEncoding from"./../common/textencoding.js";import itemHelper from"./../common/itemhelper.js";import itemManager from"./../common/itemmanager/itemmanager.js";import appRouter from"./../approuter.js";import"./../emby-elements/emby-button/emby-button.js";import dataFormatter from"./../common/dataformatter.js";import browser from"./../browser.js";require(["material-icons","css!modules/mediainfo/mediainfo.css","programStyles"]);let IconSvg={};function getTimerIndicator(item){let status;var itemType=item.Type;if("SeriesTimer"===itemType)return'<i class="md-icon md-icon-fill mediaInfoItem mediaInfoIconItem mediaInfoTimerIcon"></i>';if(item.TimerId||item.SeriesTimerId)status=item.Status||"Cancelled";else{if("Timer"!==itemType)return"";status=item.Status}return item.SeriesTimerId?"Cancelled"!==status?'<i class="md-icon md-icon-fill mediaInfoItem mediaInfoIconItem mediaInfoTimerIcon"></i>':'<i class="md-icon md-icon-fill mediaInfoItem mediaInfoIconItem"></i>':'<i class="md-icon md-icon-fill mediaInfoItem mediaInfoIconItem mediaInfoTimerIcon"></i>'}function getProgramInfoHtml(item,options){var name,dummyChannel,html="",miscInfo=[];let text,date;if(options.programIndicator&&(item.IsLive?miscInfo.push(getShadedMediaInfoItem(globalize.translate("Live"),"mediaInfoProgramAttribute liveTvProgram")):item.IsPremiere?miscInfo.push(getShadedMediaInfoItem(globalize.translate("Premiere"),"mediaInfoProgramAttribute premiereTvProgram")):item.IsNew?miscInfo.push(getShadedMediaInfoItem(globalize.translate("AttributeNew"),"mediaInfoProgramAttribute newTvProgram")):item.IsRepeat&&miscInfo.push(getShadedMediaInfoItem(globalize.translate("Repeat"),"mediaInfoProgramAttribute repeatTvProgram"))),item.StartDate&&!1!==options.programTime)try{text="",date=new Date(Date.parse(item.StartDate)),!1!==options.startDate&&(text+=datetime.toLocaleDateString(date,{weekday:"short",month:"short",day:"numeric"})),text+=" "+datetime.getDisplayTime(date),item.EndDate&&(date=new Date(Date.parse(item.EndDate)),text+=" – "+datetime.getDisplayTime(date)),miscInfo.push(text)}catch(e){console.log("Error parsing date: "+item.StartDate)}return item.ChannelName&&!1!==options.channelName&&(dummyChannel={ServerId:item.ServerId,Type:"TvChannel",Name:item.ChannelName,Id:item.ChannelId,Number:item.Number,ChannelNumber:item.ChannelNumber},name=itemManager.getDisplayName(dummyChannel,{}),options.interactive&&item.ChannelId?miscInfo.push({html:'<a is="emby-linkbutton" style="font-weight:inherit;" class="button-link button-link-color-inherit mediaInfoItem" href="'+appRouter.getRouteUrl(dummyChannel)+'">'+name+"</a>"}):miscInfo.push(name)),item.OfficialRating&&options.officialRating&&miscInfo.push(getBorderMediaInfoItem(item.OfficialRating)),options.timerIndicator&&(dummyChannel=getTimerIndicator(item))&&miscInfo.push({html:dummyChannel}),html+=miscInfo.map(getMediaInfoItem).join("")}function getGenresHtml(item,options){let context=options.context;var genres=(item.GenreItems||[]).slice(0);let genreLimit=options.genreLimit;null!=(genreLimit=null==genreLimit?1:genreLimit)&&genres.length>genreLimit&&(genres.length=genreLimit);let type;switch(context){case"games":type="GameGenre";break;case"music":type="MusicGenre";break;default:type="Genre"}options=options.genreConcat||", ";let html=genres.map(function(p){return'<a class="button-link button-link-color-inherit" is="emby-linkbutton" style="font-weight:inherit;" href="'+appRouter.getRouteUrl({Name:p.Name,Type:type,ServerId:item.ServerId,Id:p.Id},{context:context})+'">'+textEncoding.htmlEncode(p.Name)+"</a>"}).join(options);return html=html&&'<div class="mediaInfoItem" style="white-space:normal;">'+html+"</div>"}function getShadedMediaInfoItem(text,itemClass){let mainElementClass=("mediaInfoItem-shaded "+(itemClass||"")).trim();return browser.android||(mainElementClass+=" flex align-items-center"),{html:'<div class="mediaInfoItem '+mainElementClass+'"><span class="mediaInfoItem-shaded-text">'+text+"</span></div>"}}function getBorderMediaInfoItem(text,itemClass){itemClass=("mediaInfoItem-border "+(itemClass||"")).trim();return browser.android,{html:'<div class="mediaInfoItem '+itemClass+'"><span class="">'+text+"</span></div>"}}function addAudioIcon(mediaStreams,icons){for(let i=0,length=mediaStreams.length;i<length;i++){var stream=mediaStreams[i];if("Audio"===stream.Type&&"dts"===(stream.Codec||"").toLowerCase())if("dts-hd ma"===(stream.Profile||"").toLowerCase()){if(IconSvg.dtshdma)return void icons.push(IconSvg.dtshdma)}else if(IconSvg.dts)return void icons.push(IconSvg.dts)}}function addMediaIcons(item,options,miscInfo){var mediaStreams=options.mediaSource?.MediaStreams||item.MediaStreams||[],icons=[];if(!1!==options.mediaInfoIcons)for(let i=0,length=mediaStreams.length;i<length;i++)mediaStreams[i].Type;if(item.Video3DFormat&&icons.push(getBorderMediaInfoItem(globalize.translate("3D")).html),!1!==options.mediaInfoIcons&&addAudioIcon(mediaStreams,icons),!1!==options.subtitles){let hasSubtitles=item.HasSubtitles,hasSDHSubtitles;for(let i=0,length=mediaStreams.length;i<length;i++){let stream=mediaStreams[i];if("Subtitle"===stream.Type&&(hasSubtitles=!0,stream.IsHearingImpaired)){hasSDHSubtitles=!0;break}}hasSubtitles&&icons.push(getBorderMediaInfoItem("CC").html),hasSDHSubtitles&&icons.push(getBorderMediaInfoItem("SDH").html)}icons.length&&miscInfo.push({html:'<div class="mediaInfoItems mediaInfoItems-condensed align-self-center">'+icons.join("")+"</div>"})}function getMediaInfoHtml(item,options){var miscInfo=[];options=options||{};let text,date;var itemType=item.Type;let showFolderRuntime;switch(itemType){case"MusicAlbum":case"MusicArtist":case"Playlist":case"MusicGenre":case"BoxSet":showFolderRuntime=!0}if(!1!==options.CommunityRating&&item.CommunityRating&&"RemoteSubtitle"!==item.Type&&(starHtml=getStarIconsHtml(item))&&miscInfo.push({html:starHtml}),item.CriticRating&&!1!==options.criticRating){let starHtml=getCriticRating(item);starHtml&&miscInfo.push({html:starHtml})}if(("Episode"===itemType||"Recording"===itemType&&item.SeriesId||"Photo"===item.MediaType)&&!1!==options.originalAirDate&&item.PremiereDate)try{date=new Date(Date.parse(item.PremiereDate)),text=datetime.toLocaleDateString(date,{month:"short",day:"numeric",year:"numeric"}),miscInfo.push(text)}catch(e){console.log("Error parsing date: "+item.PremiereDate)}if("SeriesTimer"===itemType&&(item.RecordAnyTime?miscInfo.push(globalize.translate("Anytime")):item.StartDate&&miscInfo.push(datetime.getDisplayTime(item.StartDate)),item.RecordAnyChannel||!item.ChannelIds?.length?miscInfo.push(globalize.translate("AllChannels")):miscInfo.push(item.ChannelName||globalize.translate("OneChannel"))),!1!==options.year&&item.ProductionYear&&"Series"===itemType)if("Continuing"===item.Status)miscInfo.push(globalize.translate("SeriesYearToPresent",item.ProductionYear));else if(item.ProductionYear){if(text=item.ProductionYear,item.EndDate)try{var endYear=new Date(Date.parse(item.EndDate)).getFullYear();endYear!==item.ProductionYear&&(text+=" – "+endYear)}catch(e){console.log("Error parsing date: "+item.EndDate)}miscInfo.push(text)}if("Series"===itemType){let studioHtml="";item.Studios&&item.Studios.length&&(starHtml=item.Studios[0],studioHtml&&(studioHtml+=" on "),studioHtml+='<a style="font-weight:inherit;" class="button-link button-link-color-inherit" is="emby-linkbutton" href="'+appRouter.getRouteUrl({Name:starHtml.Name,Type:"Studio",ServerId:item.ServerId,Id:starHtml.Id})+'">'+starHtml.Name+"</a>"),studioHtml&&miscInfo.push(studioHtml)}if(!1!==options.programIndicator&&(item.IsLive?miscInfo.push(getShadedMediaInfoItem(globalize.translate("Live"),"mediaInfoProgramAttribute liveTvProgram")):item.IsPremiere?miscInfo.push(getShadedMediaInfoItem(globalize.translate("Premiere"),"mediaInfoProgramAttribute premiereTvProgram")):item.IsNew?miscInfo.push(getShadedMediaInfoItem(globalize.translate("AttributeNew"),"mediaInfoProgramAttribute newTvProgram")):item.IsRepeat&&miscInfo.push(getShadedMediaInfoItem(globalize.translate("Repeat"),"mediaInfoProgramAttribute repeatTvProgram"))),"Program"===itemType)if((item.IsSeries||item.EpisodeTitle)&&!1!==options.episodeTitle)(text=itemManager.getDisplayName(item,{includeIndexNumber:options.episodeTitleIndexNumber}))&&miscInfo.push(text);else if(item.IsMovie&&item.ProductionYear&&!1!==options.originalAirDate)miscInfo.push(item.ProductionYear);else if(item.PremiereDate&&!1!==options.originalAirDate)try{date=new Date(Date.parse(item.PremiereDate)),text=globalize.translate("OriginalAirDateValue",datetime.toLocaleDateString(date,{month:"short",day:"numeric",year:"numeric"})),miscInfo.push(text)}catch(e){console.log("Error parsing date: "+item.PremiereDate)}else item.ProductionYear&&miscInfo.push(item.ProductionYear);if(!1!==options.year&&"Series"!==itemType&&("Episode"!==itemType||!item.PremiereDate)&&"Person"!==itemType&&"Photo"!==item.MediaType&&"Program"!==itemType&&"Season"!==itemType)if(item.ProductionYear)miscInfo.push(item.ProductionYear);else if(item.PremiereDate)try{text=new Date(Date.parse(item.PremiereDate)).getFullYear(),miscInfo.push(text)}catch(e){console.log("Error parsing date: "+item.PremiereDate)}var endYear=options.mediaSource?.RunTimeTicks||item.RunTimeTicks,starHtml=("Series"===itemType||"Program"===itemType||showFolderRuntime||!1===options.runtime||endYear&&miscInfo.push("Audio"===itemType?datetime.getDisplayRunningTime(endYear):datetime.getHumanReadableRuntime(endYear)),showFolderRuntime&&((starHtml=item.SongCount||item.ChildCount)&&miscInfo.push("BoxSet"===itemType?1===starHtml?globalize.translate("ValueOneItem"):globalize.translate("ItemCount",starHtml):1===starHtml?globalize.translate("OneTrack"):globalize.translate("TrackCount",starHtml)),endYear)&&"Playlist"===itemType&&miscInfo.push(datetime.getHumanReadableRuntime(endYear)),"Series"===itemType&&item.ChildCount&&(1===item.ChildCount?miscInfo.push(globalize.translate("OneSeason")):miscInfo.push(globalize.translate("NumberSeasonsValue",item.ChildCount))),"Photo"===item.MediaType&&item.Width&&item.Height&&miscInfo.push(item.Width+"x"+item.Height),options.container&&item.Container&&miscInfo.push(item.Container.toUpperCase()),item.Bitrate||item.BitRate);options.bitrate&&starHtml&&miscInfo.push(dataFormatter.bitrateToString(starHtml)),"RemoteSubtitle"===itemType&&(item.IsHashMatch&&miscInfo.push(getShadedMediaInfoItem(globalize.translate("HashMatch"))),item.IsForced&&miscInfo.push(getShadedMediaInfoItem(globalize.translate("Forced"))),item.IsHearingImpaired&&miscInfo.push(getShadedMediaInfoItem("SDH")),null!=item.DownloadCount)&&miscInfo.push(globalize.translate("DownloadsValue",item.DownloadCount)),item.OfficialRating&&!1!==options.officialRating&&miscInfo.push(getBorderMediaInfoItem(item.OfficialRating)),options.genres&&(endYear=getGenresHtml(item,options))&&miscInfo.push({html:endYear}),addMediaIcons(item,options,miscInfo);let html=miscInfo.map(getMediaInfoItem).join("");return options.dateAdded&&itemHelper.enableDateAddedDisplay(item)&&(starHtml=new Date(Date.parse(item.DateCreated)),html+=getMediaInfoItem(globalize.translate("AddedOnValue",datetime.toLocaleDateString(starHtml,{month:"short",day:"numeric",year:"numeric"})))),!1!==options.endsAt&&(itemType=getEndsAt(item,options.mediaSource))&&(html+=getMediaInfoItem(itemType,("endsAt "+(options.endsAtClass||"")).trim())),html}function getEndsAt(item,mediaSource){if((mediaSource=mediaSource||item,"Video"===item.MediaType&&mediaSource.RunTimeTicks)&&(!item.StartDate&&"Program"!==item.Type))return item=item.UserData&&item.UserData.PlaybackPositionTicks||0,getEndsAtFromPosition(mediaSource.RunTimeTicks,item);return null}function getEndsAtFromPosition(runtimeTicks,positionTicks,includeText){runtimeTicks=Date.now()+(runtimeTicks-(positionTicks||0))/1e4,runtimeTicks=new Date(runtimeTicks),positionTicks=datetime.getDisplayTime(runtimeTicks);return!1===includeText?positionTicks:globalize.translate("EndsAtValue",positionTicks)}function getMediaInfoItem(m,cssClass){cssClass="string"==typeof cssClass?cssClass+" mediaInfoItem":"mediaInfoItem";let mediaInfoText=m;if("string"!=typeof m&&"number"!=typeof m){if(m.html)return m.html;mediaInfoText=m.text,cssClass+=" "+m.cssClass}return'<div class="'+cssClass+'">'+mediaInfoText+"</div>"}function getCriticRating(item,options){let outerClass="mediaInfoItem mediaInfoCriticRating";options&&options.outerClass&&(outerClass+=" "+options.outerClass);let imageClass;return imageClass=60<=item.CriticRating?"mediaInfoCriticRatingFresh":"mediaInfoCriticRatingRotten",'<div class="'+outerClass+'"><div class="mediaInfoCriticRatingImage '+imageClass+'"></div>'+item.CriticRating+"%</div>"}function getStarIconsHtml(item,options){let html="";item=item.CommunityRating;if(item){let outerClass="starRatingContainer mediaInfoItem";options&&options.outerClass&&(outerClass+=" "+options.outerClass),html=(html=html+('<div class="'+outerClass+'">')+'<i class="md-icon md-icon-fill starIcon"></i>')+dataFormatter.numberToString(item,1)+"</div>"}return html}function dynamicEndTime(elem,item,mediaSource){let interval=setInterval(function(){document.body.contains(elem)?elem.innerHTML=getEndsAt(item,mediaSource):clearInterval(interval)},6e4)}function fillPrimaryMediaInfo(elem,item,options){var html=getPrimaryMediaInfoHtml(item,options);(elem.innerHTML=html)?elem.classList.remove("hide"):elem.classList.add("hide"),afterFill(elem,item,options)}function fillSecondaryMediaInfo(elem,item,options){var html=getSecondaryMediaInfoHtml(item,options);(elem.innerHTML=html)?elem.classList.remove("hide"):elem.classList.add("hide"),afterFill(elem,item,options)}function afterFill(elem,item,options){!1!==options.endsAt&&(elem=elem.querySelector(".endsAt"))&&dynamicEndTime(elem,item,options.mediaSource)}function getPrimaryMediaInfoHtml(item,options){return null==(options=options||{}).interactive&&(options.interactive=!1),getMediaInfoHtml(item,options)}function getSecondaryMediaInfoHtml(item,options){null==(options=options||{}).interactive&&(options.interactive=!1);var itemType=item.Type;return"Program"===itemType||"Timer"===itemType||"Recording"===itemType?getProgramInfoHtml(item,options):""}function createAttribute(label,value,className){return'<div class="'+(className=(className=className?className+" ":"")+" flex"+" mediaStreamAttribute")+'"><span class="mediaInfoAttributeLabel">'+label+'</span><span class="mediaInfoAttributeValue secondaryText">'+value+"</span></div>"}function getFileName(stream){stream=stream.Path.split("/").join("\\").split("\\");return stream[stream.length-1]}function pushMediaStreamLines(stream,options,lines,icon){var streamType=stream.StreamType;let streamTypeLocalizationKey="EmbeddedImage"===streamType?"Image":streamType,displayType=("Lyrics"===stream.SubtitleType&&(streamTypeLocalizationKey="Lyrics"),globalize.translate(streamTypeLocalizationKey));icon&&(displayType='<i class="md-icon autortl mediaStreamTypeIcon">'+icon+"</i>"+displayType),lines.push('<h3 style="margin: .6em 0 .8em;" class="flex align-items-center">'+displayType+"</h3>"),stream.DisplayTitle&&lines.push(createAttribute(globalize.translate("Title"),stream.DisplayTitle)),stream.Title&&stream.Title!==stream.DisplayTitle&&lines.push(createAttribute(globalize.translate("HeaderEmbeddedTitle"),stream.Title)),(stream.DisplayLanguage||stream.Language)&&"Video"!==streamType&&lines.push(createAttribute(globalize.translate("Language"),stream.DisplayLanguage||stream.Language)),stream.Codec&&lines.push(createAttribute(globalize.translate("Codec"),stream.Codec.toUpperCase())),"DolbyVision"===stream.ExtendedVideoType&&stream.ExtendedVideoSubTypeDescription&&lines.push(createAttribute(globalize.translate("DolbyProfile"),stream.ExtendedVideoSubTypeDescription)),stream.CodecTag&&lines.push(createAttribute(globalize.translate("HeaderCodecTag"),stream.CodecTag)),stream.Profile&&lines.push(createAttribute(globalize.translate("Profile"),stream.Profile)),stream.Level&&lines.push(createAttribute(globalize.translate("Level"),stream.Level)),(stream.Width||stream.Height)&&lines.push(createAttribute(globalize.translate("Resolution"),stream.Width+"x"+stream.Height)),stream.AspectRatio&&"mjpeg"!==stream.Codec&&lines.push(createAttribute(globalize.translate("HeaderAspectRatio"),stream.AspectRatio)),"Video"===streamType&&lines.push(createAttribute(globalize.translate("Interlaced"),stream.IsInterlaced?globalize.translate("Yes"):globalize.translate("No"))),(stream.AverageFrameRate||stream.RealFrameRate)&&lines.push(createAttribute(globalize.translate("Framerate"),dataFormatter.numberToString(stream.AverageFrameRate||stream.RealFrameRate,3))),stream.ChannelLayout&&lines.push(createAttribute(globalize.translate("Layout"),stream.ChannelLayout)),stream.Channels&&lines.push(createAttribute(globalize.translate("Channels"),stream.Channels+" ch")),stream.BitRate&&"mjpeg"!==stream.Codec&&lines.push(createAttribute(globalize.translate("Bitrate"),dataFormatter.bitrateToString(stream.BitRate))),stream.SampleRate&&lines.push(createAttribute(globalize.translate("HeaderSampleRate"),dataFormatter.numberToString(stream.SampleRate)+" Hz")),stream.VideoRange&&"SDR"!==stream.VideoRange&&lines.push(createAttribute(globalize.translate("HeaderVideoRange"),stream.VideoRange)),stream.ColorPrimaries&&lines.push(createAttribute(globalize.translate("HeaderColorPrimaries"),stream.ColorPrimaries)),stream.ColorSpace&&lines.push(createAttribute(globalize.translate("HeaderColorSpace"),stream.ColorSpace)),stream.ColorTransfer&&lines.push(createAttribute(globalize.translate("HeaderColorTransfer"),stream.ColorTransfer)),stream.BitDepth&&lines.push(createAttribute(globalize.translate("HeaderBitDepth"),stream.BitDepth+" bit")),stream.PixelFormat&&lines.push(createAttribute(globalize.translate("HeaderPixelFormat"),stream.PixelFormat)),stream.RefFrames&&lines.push(createAttribute(globalize.translate("HeaderReferenceFrames"),stream.RefFrames)),stream.Rotation&&lines.push(createAttribute(globalize.translate("Rotation"),stream.Rotation)),"Video"!==streamType&&"Attachment"!==streamType&&"Data"!==streamType&&lines.push(createAttribute(globalize.translate("Default"),stream.IsDefault?globalize.translate("Yes"):globalize.translate("No"))),"Subtitle"===streamType&&("Lyrics"!==stream.SubtitleType&&(lines.push(createAttribute(globalize.translate("Forced"),stream.IsForced?globalize.translate("Yes"):globalize.translate("No"))),null!=stream.IsHearingImpaired)&&lines.push(createAttribute(globalize.translate("HearingImpaired"),stream.IsHearingImpaired?globalize.translate("Yes"):globalize.translate("No"))),lines.push(createAttribute(globalize.translate("External"),stream.IsExternal?globalize.translate("Yes"):globalize.translate("No")))),stream.IsExternal&&stream.Path&&lines.push(createAttribute(globalize.translate("File"),getFileName(stream)))}export default{getMediaInfoHtml:getPrimaryMediaInfoHtml,fill:fillPrimaryMediaInfo,getEndsAt:getEndsAt,getEndsAtFromPosition:getEndsAtFromPosition,getPrimaryMediaInfoHtml:getPrimaryMediaInfoHtml,getSecondaryMediaInfoHtml:getSecondaryMediaInfoHtml,fillPrimaryMediaInfo:fillPrimaryMediaInfo,fillSecondaryMediaInfo:fillSecondaryMediaInfo,getResolutionText:dataFormatter.getResolutionText,pushMediaStreamLines:pushMediaStreamLines,getCommunityRating:getStarIconsHtml,getCriticRating:getCriticRating,bitrateToString:dataFormatter.bitrateToString,sizeToString:dataFormatter.sizeToString}; |