{"version":3,"sources":["./src/app/video/videoplayer/videoplayer.settings.service.ts","./src/app/_service/video/video.news.service.ts","./src/app/components/dn-radio/dn-radio.component.ts","./src/app/components/dn-radio/dn-radio.component.html","./src/app/video/player-media-list/player-media-list.service.ts","./src/app/_modules/comment/comment-box/utils.ts","./src/app/video/list/list.component.html","./src/app/video/list/list.component.ts","./src/app/_modules/player/overlay-danmu/bullet.ts","./src/app/_modules/danmu/danmu.selector.ts","./src/app/_modules/danmu/danmu.facade.ts","./src/app/video/videoplayer/videoplayer.api.ts","./src/app/_modules/player/puase-ads/vg-pause-ads.ts","./src/app/_modules/player/controls/vg-fullscreen/vg-fullscreen.ts","./src/app/_modules/player/controls/vg-play-pause/vg-play-pause.ts","./src/app/_modules/player/overlay-play/vg-overlay-play.html","./src/app/_modules/player/overlay-play/vg-overlay-play.ts","./src/app/_modules/player/overlay-danmu/bullet/bullet.component.html","./src/app/_modules/player/overlay-danmu/bullet/bullet.component.ts","./src/app/_modules/player/overlay-danmu/barrels.ts","./src/app/_modules/player/overlay-danmu/danmu.service.ts","./src/app/_modules/player/overlay-danmu/vg-overlay-danmu.html","./src/app/_modules/player/overlay-danmu/vg-overlay-danmu.ts","./src/app/_modules/player/controls/vg-airplay/vg-airplay.ts","./src/app/_modules/player/controls/vg-quality-selector/vg-quality-selector.html","./src/app/_modules/player/controls/vg-quality-selector/vg-quality-selector.ts","./src/app/_modules/player/controls/vg-playback-button/vg-playback-button.ts","./src/app/_modules/player/controls/vg-volume/vg-volume.ts","./src/app/video/auto-play-next-list/auto-play-next-list.component.html","./src/app/video/auto-play-next-list/auto-play-next-list.component.ts","./src/app/video/player-media-list/player-media-list.component.html","./src/app/video/player-media-list/player-media-list.component.ts","./src/app/video/videoplayer/videoplayer.component.html","./src/app/video/videoplayer/videoplayer.component.ts","./src/app/_modules/comment/dn-comments/dn-comment/dn-comment.component.html","./src/app/_modules/comment/dn-comments/dn-comment/dn-comment.component.ts","./src/app/_modules/comment/dn-comments/dn-comments.component.html","./src/app/_modules/comment/dn-comments/dn-comments.component.ts","./src/app/_modules/comment/dn-poll-option/dn-poll-option.component.html","./src/app/_modules/comment/dn-poll-option/dn-poll-option.component.ts","./src/app/_modules/comment/dn-poll/dn-poll.component.html","./src/app/_modules/comment/dn-poll/dn-poll.component.ts","./src/app/_directive/flex-placeholder.directive.ts","./src/app/_service/video/ivideo.service.ts","./src/app/video/list-by-year/list-by-year.component.html","./src/app/video/list-by-year/list-by-year.component.ts","./src/app/_modules/danmu/danmu-filter/danmu-filter.component.html","./src/app/_modules/danmu/danmu-filter/danmu-filter.component.ts","./src/app/_modules/danmu/danmu-menu/danmu-menu.component.html","./src/app/_modules/danmu/danmu-menu/danmu-menu.component.ts","./src/app/_modules/danmu/danmu-list-content/danmu-list-content.component.ts","./src/app/_modules/danmu/danmu-list-content/danmu-list-content.component.html","./src/app/_modules/danmu/danmu-list/danmu-list.component.html","./src/app/_modules/danmu/danmu-list/danmu-list.component.ts","./src/app/_modules/danmu/danmu-settings/danmu-settings.component.html","./src/app/_modules/danmu/danmu-settings/danmu-settings.component.ts","./src/app/_modules/danmu/danmu-input/danmu-input.html","./src/app/_modules/danmu/danmu-input/danmu-input.ts","./src/app/_model/poll.ts","./src/app/components/voting-creator/voting-creator.component.html","./src/app/components/voting-creator/voting-creator.component.ts","./src/app/_modules/comment/contenteditable-model.directive.ts","./src/app/_modules/comment/comment-box/comment-box.component.html","./src/app/_modules/comment/comment-box/comment-box.component.ts","./src/app/video/media-button/media-button.component.html","./src/app/video/media-button/media-button.component.ts","./src/app/components/namecard/namecard.component.ts","./src/app/components/namecard/namecard.component.html","./src/app/_service/danmu/danmu.service.ts","./src/app/_pipes/static-level.pipe.ts","./src/app/video/expandable-tabs/expandable-tabs.component.ts","./src/app/video/expandable-tabs/expandable-tabs.component.html","./src/app/_modules/danmu/danmu-menu/danmu-menu.service.ts"],"names":["VideoPlayerSettingsService","_playerSettings","forbiddenFloatingPlayer","autoSkip","autoStart","playerSettings$","this","asObservable","settings","next","VideoNewsService","_apiUrlHelper","_httpClientHelper","_storage","Object","assign","token","media","ispath","params","GetConfig","apiURL","urlBuilder","get","pipe","res","id","videoId","cinema","voteRecord","url","GetItem","JSON","parse","filter","item","length","behavior","user","obj","getAsync","cid","label","lable","size","vid","placeholder","DnRadioComponent","isMultiSelection","clearOtherOption","options","multiOptions","title","selected","customInput","onChange","onMultiChange","selectedIndex","equalWidth","allowUncheck","index","emit","map","t","r","PlayerMediaListService","isOpen","_open","open$","saveSelection","window","getSelection","sel","getRangeAt","rangeCount","document","createRange","restoreSelection","range","removeAllRanges","addRange","select","ListComponent","route","items","fixedTabs","fromPlayer","isWide","currentItems","tabs","subscriptions","pageSize","changes","playlistTabsNumber","Math","ceil","i","firstIndex","lastIndex","firstItem","lastItem","firstTitle","includes","split","lastTitle","modified_fristTitle","modified_lastTitle","toString","push","currentKey","setCurrentTab","onSelectTab","findIndex","key","activeTabIndex","undefined","page","currentTabIndex","slice","forEach","s","unsubscribe","BarrelType","getDanmuState","danmuQuery","getLoading","state","loading","getList","list","getPaused","paused","getSetCurrentTime","setCurrentTime","getKeywordFilter","keywordFilter","getUserFilter","userFilter","getFullScreen","fullScreen","getBlockTop","blockTop","getBlockBottom","blockBottom","getBlockLeft","blockLeft","getSpeed","speed","getShowDanmu","showDanmu","getFontSize","fontSize","getOpacity","opacity","getFontFamily","fontFamily","getDanmuKey","danmuKey","getOutputType","outputType","getOutputColor","outputColor","getUserSettings","userSettings","DanmuFacade","store","currentTime","loading$","list$","paused$","setCurrentTime$","keywordFilter$","userFilter$","blockTop$","blockBottom$","blockLeft$","speed$","showDanmu$","fontSize$","opacity$","fontFamily$","DanmuKey$","outputType$","outputColor$","userSettings$","isPaused","payload","dispatch","current","keywords","content","some","value","contxt","indexOf","users","p","uid","videoStartAPI","val","data","shouldMute","mediaList","info","hideSecond","override","eventName","func","isAds","console","log","time","VgPauseAds","ref","API","vgSeekBarAPI","shouldLoad","onShowPauseAds","shouldShow","showPlayEndContent","shouldShowControl","pauseImage","elem","nativeElement","isPlayerReady","onPlayerReady","playerReadyEvent","subscribe","pauseList","target","getMediaById","vgFor","pause","floor","random","play","event","stopPropagation","openInNewWindow","href","VgFullscreen","fsAPI","fullScreenService","isFullscreen","ariaValue","fullscreenStatus","onChangeFullscreen","bind","fullScreen$","toggleFullscreen","fromEvent","fsState","changeFullscreenState","keyCode","preventDefault","element","VgPlayPause","VG_PAUSED","isPlayingAds","playPause","active","activeElement","tagName","toLowerCase","hasAttribute","getState","VG_PLAYING","VG_ENDED","VgOverlayPlay","controlsHidden","_utility","isFloatPlayer","isNativeFullscreen","areControlsHidden","isTouchDevice","isMac","IsMac","isDesktop","isBuffering","isLive","notShow","GetHost","timeout","lastState","doubleClickTimer","left","timer","isSingleClick","clicked","shouldprevent","right","showCaption","doubleClickdelay","seekTime","viewRight","viewLeft","addEventListener","which","config","clearTimeout","doubleToFull","setTimeout","onClick","fromActivity","isHidden","onHideControls","bufferDetected","onUpdateBuffer","nativeFullscreen","hidden","show","force","part","handleDouble","playWithLeft","playWithRight","Array","l","logo","BulletComponent","danmuFacade","bulletStyleService","builder","elBullet","dialogService","cd","_danmuService","_videoService","_userService","canvasWidth","duration","width","top","style","barrelHeight","hovered","blocked","sysHidden","startTime","showMenu","userFilterd","onBulletEvent","onFudaiOpened","isCopiedSent","eventID","openedFudaiList","gainedCoins","subscribeBlock","subscribePaused","gid","membership","offsetWidth","getStyle","color","bullet","BulletEvent","Bullet_Loaded","object","canvasSize","guid","userState$","storeOpenedDanmuFudai","adsDanmuShowed","readOpenedFudaiList","player","factory","create","onDone","Bullet_End","barrelIndex","destroyPlayer","position","Barrel","FixTop","transform","transition","FixBottom","bottom","destroy","detectChanges","ngAfterViewInit","offset","Date","now","isStarted","actionDuration","totalWidth","build","createPlayerAndBindEvent","addUserFilter","name","nickName","onPaused","onPlay","pos","init","finish","removeDanmu","dispatchEvent","CustomEvent","userId","open","height","likeDanmu","code","isLike","isExist","good","number","copiedText","datePipe","sendDanmu","second","published","font","type","uniqueKey","lid","addTime","toISOString","link","sendWatched","replace","openedFudai$","fudai_id","orderID","isClicked","message","openDanmuFudai","coin","fudai_opened","BarrelManager","max","barrels","maxBarrels","getBarrelArray","barrel","stacks","newBallel","count","start","bullets","arr","error","Max","getMaxStacks","freeBarrels","getfreeBarrels","DanmuService","pendingBullet","onSchedule","flying","fixTop","fixBottom","initSignal","running","firePendingIfPossible","manager","recycleBullet","dataIndex","occupyBaller","ScheduleEvent","Bullet_Shot","nextBarrel","shotBullet","pass","dateNow","j","totalRun","smartHandler","fixHandler","resetBaller","Bullet_Recycle","freeBullet","clearBarrels","reCalculateSpeed","stopAddNew","tryGetBarrels","releaseBaller","VgOverlayDanmu","resolver","_bullstStyle","_window","danmuku","componentRefs","last","adsDanmus","openedFudai","userHidden","userDefineDuration","currentSize","timeoutChangeSize","filters","lastTime","innerWidth","mediaLoaded","userClicked","currentValue","showOrHideBullet","firstChange","concat","newBullets","d","onCueChange","entry","find","isFree","compnent","createBullet","isFire","instance","reload","fontList","isDefault","size$","onchangeSize","resetBarrel","fontIndex","componentRef","c","shot","GetOrCreateSubscript","DANMU_SEND","clearCue","combineLatest","containKeywordFilter","containUserFilter","timeUpdate","onTimeUpdate","onPause","seeked","onSeeked","freeBarrelsAndBullet","durationRatio","randomDuration","getOCreateBullet","$event","isDocumentVisible","howManyOn2Second","resolveComponentFactory","createComponent","location","classList","add","bulletHandler","tip","fudaiOpened","remove","$state","loadBullet","onBulletEnd","restart","recalculate","startAddNew","howManyOn10Second","execute","srcElement","currentTarget","attributes","nodeValue","VgAirplay","isAvailable","attched","isiOSDevice","detectAirplay","video","parentElement","getDefaultMedia","showList","VgQualitySelector","hiddenApi","_purchaseRequiredDialogService","_dnDialogService","_rechargeBoxService","_purchaseSuccessDialogService","isLine","onBitrateChange","filterClick","gold","autoLevelName","openList","isUnlocked","quanlityHeight","hasHeight","hasVIP","hasSameQuality","getAutoLevelName","_user","isEnabled","bitrates","bitrateSelected","isVIP","isBought","listenPurchase","selectBitrate","playingLevel","qualityIndex","getListOfBitrate","purchaseSuccessDialogSource$","mediaKey","playLineOrBitrateSource$","change","changeLineOrBitrate","bitrate","isActive","captureControls","releaseControls","checkForSameBitrate","group","showLoginDialog","roleId","setState","price","mediaId","changeDisplayStatus","changeOpener","VgPlaybackButton","releaseControl","isOpenOrHidePlaySpeedBox","playbackValues","playbackIndex","loadedMetadata","updatePlaybackSpeed","customCallback","playbackRate","toFixed","hiddenAPI","playSpeedBoxSubscript","playSpeedBox","openOrHidePlaySpeedBox","VgVolume","vertical","isDragging","ariaValueY","getVolume","setVolume","calculateVolume","clientY","clientX","mouseDownPosX","mouseDownPosY","min","parseInt","mousePos","devicePixelRatio","test","navigator","userAgent","recObj","volumeBarRef","getBoundingClientRect","vol","volume","err","onMouseDown","AutoPlayNextListComponent","_router","_upload","_favoriteService","nextPlayList","countSeconds","enableAutoPlay","progress","onClosePlayEndContent","likeLoading","dislikeLoading","favoriteLoading","userBehaviorEvent","suspendAutoPlay","endContentAutoPlay","closePlayEndContent","cancelAnimationFrame","requestId","cancelAutoPlay","roundProgressStart","startAutoPlay","performance","shadow","shadowRef","rValue","parseFloat","getAttribute","circleLength","PI","updateProgress","elapsed","setAttribute","requestAnimationFrame","navToSVideo","navigate","queryParams","v","navigateByUrl","publisher","userKey","SetAttension","isAttend","fansCount","result","getElementById","click","like","dislike","userBehaviors","share","userData","shared","favorite","removeFavoritesItem","favorites","changeFavoriteStatus","visit","guanzhu","rePlay","PlayerMediaListComponent","playerMediaListService","playlist","playlistType","noTransition","listOpenSubscribe","closeSubscribe","PlayerMediaList","classes","close","toggle","togglePlaylist","VideoplayerComponent","danmuService","_toastService","_httpHelper","activatedRoute","storageService","_guide","videoPlayerSettingsService","_apiHelper","settingsService","playerSettingGuide","started","playListConfig","canSelect","apiReady","onCloseSmallPlayer","isAdult","environment","_serverInfo","status","_needBought","_cachedLogo","reportDanmuReasons","videoLoop","poster","autoHide","isJump","autoNext","isContinuousPlay","smallPlayerValid","adVolume","isPublicBlocked","showPerfect","playerSelection","Original","streamTech","MP4","serverCaption","onVideoReady","onErrorHandler","showNextButton","languageList","shouldSkipAds","topPrefix","customHeight","isloadDefault","filterGold","unlockGold","filterCallback","unlockCallback","playNextCallback","isPlayRatio","previewFormat","playerMode","showQuantitySelect","mediaTitle","isNewsPlayer","isUserFilterAd","danmuChatRoomControl","_hasBought","onChangeLanguage","_bitrates","containerRatio","winWidth","windHeight","innerHeight","isIPhone","touchDevice","fromSpace","isVertical","activityPoster","isNews","hasState","skipAfter","shouldPlaySeoncd","leftSecond","mutable","inputShowTimeout","isChrome","isControlshow","cachePlaySecond","canSkipEnds","currentPlayingAds","isMuted","isSwitching","isSwitchComplete","switchCompleteText","needChangeNextBitrateTimeout","infoTimeout","_captions","checkIfNeedToggleCallback","checkIfNeedToggle","isVolumeShow","volumeTimer","volumeTimeout","loadMedia","isopenOrHideConfig","isMasterEnabled","currentLevel","currentBitrate","currentPlayingLevel","shouldChangePlayer","isFluence","isVideoSuccessPlayed","videoSuccessPlayerTimeout","defaultLiveSeoncd","shouldPlayVideo","hasError","errorText","pendding","shouldShowInput","skipEndTime","isLanguageSelectionOpened","languageOpenListUn_","isBackToPlayMedia","totalCount","scaled","videoStyle","needUserTouch","errorContent","timerShow","api","from","to","_logo","getAbsUrl","ppmm","stopPlay","showInfo","vipskipFormat","initMedia","alreadyBought","highFormat","onServerInfoChange","onUserStateChange","needBought","dispose","configBoxSubscript","removeDetectLivePlayable","load","isImage","src","startsWith","previousValue","reset","reportDanmuReason","settingGuide","getUserPerference","shouldUseNative","shouldHandleMouse","isIphoneDevice","shouldUseFakeFullScreen","useFakeFullScreenWhenNotPossible","app","canViewPublic","opened","playerConfig","setPlayerSettings","isiOS","getGuideCookie","stateTime","invokePauseList","subscript","renew","isshow","getPlayMedia","isNaN","totalTime","getTimeDefine","invokePlayConfig","ShouldCancel","continue","playNextVideo","needToShow","detectLivePlayable","cachedMedia","cachedTime","intersitialHandler","Timer","secondFormat","playVideo","Notify","ShouldBackToPlay","hasBought","ShouldLoadAds","PUBLIC_ENDPOINT","startLoadMedia","SkipTimer","captions","invokeList","startSecond","periodicSecond","muted","videoLog","logLevel","logType","resource","changeBitrateIfPossible","canPlayVideo","path","retry","playingMedia","isArray","toggleFullScreen","shift","offsetLeft","offsetTop","language","alreadymax","boughtVideo","cancel","showBlackToast","filterAllAds","isAd","listenToIntersitial","backup","mediaJudge","configBox","closeGuide","parsed","levels","startLevel","switchLevelComplete","sharpness","line","SetConfig","changeBitrate","needSign","appendUserInfo","uriSignature","short","shouldUseHlsmin","safariSwitchTimeout","ext","getFileExtensions","isHlsSupport","substring","lastIndexOf","isSafari","canUseMaster","level","switchingPromptTimeout","temp","isHls","GetFileExtension","M3U8","updateOneSetting","isSkipMode","setConfigOnSelection","volumeChange","snapshot","needPlayVideo","isQQBrwoser","triggerUserTouch","_onPlayerReady","ads","triggerPlayAds","seek","getRef","errorCode","timeOut","startsecond","detail","end","languageBox","itemCount","callback","startCountDown","VideoScaleManager","getResult","getVideoMeta","playerHeight","getScaled","ex","toggleDanmu","reportDanmu","e","setGuideCookie","closeGuideCover","isPipMode","mediaMeta","videoRatio","videoShouldWidth","videoShouldHeight","videoCanWidth","videoCanHeight","videoWidth","videoHeight","scalex","scaley","DnCommentComponent","_commentService","_commentBoxService","_notificationService","_confirmDialogService","_dialogService","blacklistService","isHot","isLast","showControls","isReply","onDeleteEvent","onSubCommentDeleteEvent","initialSize","noMoreSub","componentsReferences","voting","deleting","showNamecard","showShotcut","showReplyPopup","commentSuccessEvent","childCommentEvent","childModeParent","childModeChild","replyVisible","isloading","shotcutElem","shotcutMenu","$newCommentInputBox","commentId$","readState","comment","pollId","commentId","commendId","removeInputBox","commentsState","deleted","likeComment","hostPage","liked","likes","confirmFormId","dialogId","replyId","showIcon","Unknown","confirmSubscribe","confirmDialogSource$","Confirmed","commandType","removeComment","production","replyUserId","markANotificationsAsReadByMessageId","ret","changeNotificationStatus","componentFactory","commentInputContainer","currentComponent","isReplying","reply","compInteraction","notify","reported","ToUid","authorId","addBlacklist","removeBlacklist","parentNode","commentViewerId","getCommentByParentID","children","str","totalReplies","onUserLoaded","toggleShortcutMenuEnter","DnCommentsComponent","_commentListService","commentService","subscrption","onCommentsLoaded","commentPager","bottomLine","isLoading","isTryLoaded","reportCommentReasons","reportCommentReason","tabsList","commentCount","toggleChildComment","orderstyle","topComment","isChildMode","childCommentPager","tab","comments","getComments","commentState","currentComments","topComments","reportComment","hasOwnProperty","buttonText","childComment","getChildComment","DnPollOptionComponent","barWidth","optionsCount","total","selectEven","vote","isVoted","option","onSelectOption","DnPollComponent","_pollService","colors","randomColors","showButton","selectedOptions","getVote","shuffle","poll","voteOptions","o","voted","reduce","a","b","multipleOptions","array","temporaryValue","randomIndex","currentIndex","FlexboxPlaceholderDirective","elementRef","renderer","valid","FlexboxPlaceholder","num","querySelectorAll","old","removeChild","child","createElement","className","appendChild","IVideoService","ListByYearComponent","wideButton","parsedItems","years","medias","totalPages","reverse","parseItemsToObject","lastYear","sort","adataString","Number","match","bdataString","aDate","created","dataString","keys","year","selectedYear","DanmuFilterComponent","keyword","trim","addKeywordFilter","removeKeywordFilter","removeUserFilter","DanmuMenuComponent","danmuMenuService","_userS","visible","x","y","danmuId$","danmu","DanmuListContentComponent","isUserFilted","isKeywordFilter","subscritions","goThrough","contains","DanmuListComponent","rect","DanmuSettingsComponent","speedOptions","fontSizeOptions","opacityOptions","isAdjustedZoom","fontFamilyOptions","setFontFamily","setSpeed","setFontSize","setOpacity","view","mouseDown","percentage","eachPart","offsetX","clientWidth","halfPart","selecItem","onFontFamilyChange","DanmuInputComponent","styleService","_api","disableFont","isShowConfig","colorList","styleList","typeList","currentColor","currentFont","currentStyle","currentType","sampleStyle","text","disabled","showDanmuInputSettingsBlock","includeAvatar","includeLocation","danmuInitialSettings","userFilters","keywordFilters","openList1","configChange","send","onFocus","onBlur","vipFunction","onFontChanged","isKeyboard","danmuSettings","getDamuSetting","uf","updateLocalDanmuSettings","stringify","kf","settings$","isShowDanmuMode","lastSettingShowDanmu","sendMsg","action","JoinVideoRoom","on","SendBarrage","avatar","country","processContext","isDeleted","prefix","isOfficalUP","IsOfficalUP","newDanmu","dialogElem","configDialog","danmuInputSettingsBlockElem","danmuInputSettingsBlock","setOutputColor","setOutputType","currentTimestamp","getTime","timestamp","hashColor","isKeyEnter","LeaveVideoRoom","localStorage","getItem","updateUserSettings","setItem","showConfig","selectConfig","textFocus","textBlur","textinput","toggleDanmuInputSettingsBlock","toggleIncludeAvatar","toggleIncludeLocation","ViewPollResultPermissions","VotingCreatorComponent","formBuilder","unsb","viewVotingsOptions","maxTitleSize","maxOptionCharacterSize","closeEvent","videoState","currentVideo","createPollForm","createForm","fields","isRequired","required","maxLength","multipleSelect","viewResults","controls","removeAt","voteForm","author","headImage","blacklist","context","userLevel","voteId","post_Date","replyFloor","userStatus","userLevelSymbol","getGIDResource","videoID","newFloor","latestVote","field","markAsTouched","onlySelf","patchValue","ContenteditableDirective","elRef","sanitizer","_dnEmojiService","contenteditableModelChange","contenteditableHtml","isFirstChange","contenteditableModel","onInput","refreshView","getProperty","html","clipboardData","getData","emojiHtml2String","el","innerHTML","innerText","emojiString2Html","execCommand","newContent","sanitize","HTML","CommentBoxComponent","_emojiPickerService","pageScrollService","_route","cdRef","_permission","_transform","replySuccessEvent","_commentStatus","isVideo","showReply","canPublish","publishing","showEmojiPicker","maxiumCharacters","charactersLeft","focused","showVotingCreator","inActivityBottom","emojiSource$","emoji","savedSelection","pasteHtmlAtCaret","selectEmoji","editorRef","KeyboardEvent","events","evt","clearCommentBoxReply","refReplyState","currentReply","notificationId","markANotificationsAsRead","emojiPickerElem","EmojiPicker","tmp","textContent","isEmpty","setFocus","Cancalled","isValid","PublishVote","focus","selectPastedContent","getWindow","commonAncestorContainer","deleteContents","frag","createDocumentFragment","node","lastNode","firstChild","firstNode","insertNode","cloneRange","setStartAfter","setStartBefore","collapse","replyComment","nickname","fromList","scroll","scrollOffset","scrollTarget","retID","publishComment","AppStoreUnsubscribe","stripHtml","ctrlKey","shiftKey","closeVotingCreatorDialog","MediaButtonComponent","wide","shouldReplace","isUrlContains","NamecardComponent","hideNameCardEvent","userLoadedEvent","expanded","fromPublisher","getUserInfo","logout","lastTrend","body","Contxt","Color","Font","Second","post","reason","StaticLevelPipe","ExpandableTabsComponent","_windowService","fixed","mode","screenSize","setFixedItems","expanderElem","expander","openExpander$","activated","areaWidth","XSmall","Small","Medium","Large","ExtraLarge","buttonsWidth","buttons","call","hiddenNav","DanmuMenuService","_danmuId"],"mappings":"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","file":"2.a0b14cd5074262cedf5f.js","sourcesContent":["import { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\nexport interface playerSettingsInterface {\r\n forbiddenFloatingPlayer: boolean;\r\n autoSkip: boolean;\r\n autoStart: boolean;\r\n}\r\n\r\n@Injectable()\r\nexport class VideoPlayerSettingsService {\r\n private _playerSettings: BehaviorSubject\r\n = new BehaviorSubject({\r\n forbiddenFloatingPlayer: false,\r\n autoSkip: true,\r\n autoStart: true,\r\n });\r\n\r\n readonly playerSettings$ = this._playerSettings.asObservable();\r\n\r\n setPlayerSettings(settings: playerSettingsInterface) {\r\n this._playerSettings.next(settings);\r\n }\r\n}\r\n","\r\nimport { Observable, of } from 'rxjs';\r\nimport { Injectable } from '@angular/core';\r\nimport { ApiUrlHelper } from '../api-url-helper';\r\nimport { HttpClientHelper } from '../http-helper';\r\nimport { StorageService } from '../../storageprovider';\r\nimport { delay, map, } from 'rxjs/operators';\r\n// import { UsersState } from '../../app.reducer';\r\n// import { AppStore } from '../../app.store';\r\n// import { Store } from 'redux';\r\n// import { environment } from '../../../environments/environment';\r\nimport { IVideoService } from './ivideo.service';\r\n\r\n@Injectable()\r\nexport class VideoNewsService implements IVideoService {\r\n constructor(\r\n private _apiUrlHelper: ApiUrlHelper,\r\n private _httpClientHelper: HttpClientHelper,\r\n private _storage: StorageService,\r\n // @Inject(AppStore) private store: Store,\r\n\r\n ) { }\r\n public getToken() {\r\n // var token:any = {};\r\n // if(this.user!=null&& this.user.currentUser!=null&&this.user.currentUser.token!=null)\r\n // {\r\n // token.uid = this.user.currentUser.id;\r\n // token.gid = this.user.currentUser.token.gid;\r\n // token.expire = this.user.currentUser.token.expire;\r\n // token.sign = this.user.currentUser.token.sign;\r\n // token.token = this.user.currentUser.token.token;\r\n // if(environment.cinema>1)\r\n // {\r\n // token.cinema = environment.cinema;\r\n // }\r\n // }\r\n return Object.assign({}, this._httpClientHelper.token);\r\n }\r\n // get user() {\r\n // return this.store.getState()['users'] as UsersState;\r\n // }\r\n\r\n\r\n getMedia(media, ispath = true): Observable {\r\n let params = {};//this.getToken();\r\n params[\"region\"] = this._storage.GetConfig()[\"region\"]|| \"GL.\";\r\n params[\"device\"] = 1;\r\n params[\"ispath\"] = ispath;\r\n params['id'] = media;\r\n params['alluser'] = 1;\r\n const apiURL = this._apiUrlHelper.urlBuilder('video-media', params, 'NEWS_ENDPOINT');\r\n return this._httpClientHelper.get(apiURL)\r\n .pipe(map((res) => {\r\n if (res[0] !== null) {\r\n return res[0];\r\n }\r\n return [];\r\n }))\r\n }\r\n\r\n like(id): Observable {\r\n // if (this.isVoted(id)) {\r\n // return of({ message: '您已经递交过了' }).pipe(delay(300));\r\n // }\r\n const apiURL = this._apiUrlHelper.urlBuilder('video-like', { videoId: id,\r\n cinema:3\r\n }, 'NEWSV3_ENDPOINT');\r\n return this._httpClientHelper.get(apiURL)\r\n .pipe(map((res) => {\r\n this.voteRecord(id, 'like');\r\n return res;\r\n })).pipe(delay(300));\r\n }\r\n\r\n pageViewRecord(url): Observable {\r\n // console.log(url)\r\n return this._httpClientHelper.get(url, true);\r\n }\r\n\r\n dislike(id): Observable {\r\n // if (this.isVoted(id)) {\r\n // return of({ message: '您已经递交过了' }).pipe(delay(300));\r\n // }\r\n const apiURL = this._apiUrlHelper.urlBuilder('video-dislike', { videoId: id,\r\n cinema:3\r\n }, 'NEWSV3_ENDPOINT');\r\n return this._httpClientHelper.get(apiURL)\r\n .pipe(map((res) => {\r\n this.voteRecord(id, 'dislike');\r\n return res;\r\n }))\r\n .pipe(delay(300))\r\n\r\n }\r\n\r\n isVoted(id) {\r\n const voteHistory = this._storage.GetItem('news_voteVideo') ? JSON.parse(this._storage.GetItem('news_voteVideo')) : [];\r\n return voteHistory.filter(item => item.id === id).length > 0;\r\n }\r\n\r\n voteRecord(id, behavior) {\r\n // if (!this.isVoted(id)) {\r\n // let voteHistory = this._storage.GetItem('news_voteVideo') ? JSON.parse(this._storage.GetItem('news_voteVideo')) : [];\r\n // voteHistory.push({ id: id, behavior: behavior });\r\n // voteHistory = voteHistory.slice(-50);\r\n // this._storage.SetItem('news_voteVideo', JSON.stringify(voteHistory));\r\n // }\r\n }\r\n\r\n favorite(user, id) {\r\n //console.log(id)\r\n var obj: any = {};//this.getToken();\r\n obj.id = id;\r\n const apiURL = this._apiUrlHelper.urlBuilder('video-favorite', obj, 'NEWS_ENDPOINT');\r\n return this._httpClientHelper.get(apiURL)\r\n .pipe(map((res) => {\r\n return res;\r\n }))\r\n .pipe(delay(300))\r\n\r\n }\r\n\r\n\r\n sendPlayHistory(url) {\r\n this._httpClientHelper.getAsync(url);//.catch((error: any) => Observable.throw('Server error:' + error));\r\n }\r\n sendWatched(url) {\r\n this._httpClientHelper.getAsync(url)\r\n\r\n }\r\n\r\n\r\n getChannelList(cid, label) {\r\n var obj: any = {};//this.getToken();\r\n obj.cid = cid;\r\n obj.lable = label;\r\n obj.size = 10;\r\n const apiURL = this._apiUrlHelper.urlBuilder('related-channel', obj, 'NEWS_ENDPOINT');\r\n return this._httpClientHelper.get(apiURL)\r\n .pipe(map((res) => {\r\n return res;\r\n }))\r\n\r\n }\r\n\r\n share(vid): Observable {\r\n const apiURL = this._apiUrlHelper.urlBuilder('video-share', { vid });\r\n return this._httpClientHelper.get(apiURL)\r\n }\r\n}\r\n","import { Component, EventEmitter, HostBinding, Input, OnInit, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-dn-radio',\r\n templateUrl: './dn-radio.component.html',\r\n styleUrls: ['./dn-radio.component.scss']\r\n})\r\nexport class DnRadioComponent implements OnInit {\r\n\r\n @Input() isMultiSelection = false;\r\n @HostBinding('class')\r\n get classAttribute() {\r\n return {\r\n 'd-flex': this.isMultiSelection,\r\n 'flex-wrap': this.isMultiSelection\r\n }\r\n }\r\n @Input()\r\n clearOtherOption = '';\r\n\r\n @Input()\r\n options = [\r\n 'option1',\r\n 'option2',\r\n ];\r\n\r\n @Input()\r\n multiOptions = [\r\n {\r\n title:'option1',\r\n selected: false,\r\n customInput:false\r\n },\r\n {\r\n title:'option2',\r\n selected: false,\r\n customInput:false\r\n },\r\n ];\r\n\r\n @Output()\r\n onChange = new EventEmitter();\r\n\r\n @Output()\r\n onMultiChange = new EventEmitter>();\r\n\r\n @Input()\r\n selectedIndex = 0;\r\n\r\n @Input()\r\n equalWidth = false;\r\n\r\n @Input()\r\n allowUncheck = false;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n select(index: number) {\r\n if (this.selectedIndex !== index) {\r\n this.selectedIndex = index;\r\n this.onChange.emit(this.selectedIndex);\r\n } else if (this.allowUncheck) {\r\n this.selectedIndex = -1;\r\n this.onChange.emit(this.selectedIndex);\r\n }\r\n }\r\n\r\n selectMulti(index: number) {\r\n // clearOtherOption与其他选项之间同时只能选择一个,且再次点击可取消\r\n if (this.multiOptions[index].title === this.clearOtherOption) {\r\n if (!this.multiOptions[index].selected) {\r\n this.multiOptions = this.multiOptions.map(t => {\r\n return {\r\n ...t,\r\n selected: false,\r\n }\r\n });\r\n }\r\n } else {\r\n this.multiOptions.filter(r => {\r\n if (r.title === this.clearOtherOption) {\r\n r.selected = false;\r\n }\r\n });\r\n }\r\n this.multiOptions[index].selected = !this.multiOptions[index].selected;\r\n this.onMultiChange.emit(this.multiOptions);\r\n }\r\n emitChange()\r\n {\r\n this.onMultiChange.emit(this.multiOptions);\r\n }\r\n}\r\n","\r\n \r\n\r\n\r\n\r\n \r\n","import { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class PlayerMediaListService {\r\n private isOpen = false;\r\n private _open: BehaviorSubject = new BehaviorSubject(this.isOpen);\r\n readonly open$ = this._open.asObservable();\r\n\r\n constructor() {\r\n }\r\n\r\n open() {\r\n this.isOpen = true;\r\n this._open.next(this.isOpen);\r\n }\r\n\r\n close() {\r\n this.isOpen = false;\r\n this._open.next(this.isOpen);\r\n }\r\n\r\n toggle() {\r\n this.isOpen = !this.isOpen;\r\n this._open.next(this.isOpen);\r\n }\r\n\r\n}\r\n","/**\r\n * enable or disable toolbar based on configuration\r\n *\r\n * @param value toolbar item\r\n * @param toolbar toolbar configuration object\r\n */\r\nexport function canEnableToolbarOptions(value: string, toolbar: any): boolean {\r\n\r\n if (value) {\r\n\r\n if (toolbar['length'] === 0) {\r\n return true;\r\n } else {\r\n\r\n const found = toolbar.filter(array => {\r\n return array.indexOf(value) !== -1;\r\n });\r\n\r\n return found.length ? true : false;\r\n }\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * set editor configuration\r\n *\r\n * @param value configuration via [config] property\r\n * @param ngxEditorConfig default editor configuration\r\n * @param input direct configuration inputs via directives\r\n */\r\nexport function getEditorConfiguration(value: any, ngxEditorConfig: any, input: any): any {\r\n\r\n for (const i in ngxEditorConfig) {\r\n if (i) {\r\n\r\n if (input[i] !== undefined) {\r\n value[i] = input[i];\r\n }\r\n\r\n if (!value.hasOwnProperty(i)) {\r\n value[i] = ngxEditorConfig[i];\r\n }\r\n }\r\n }\r\n\r\n return value;\r\n}\r\n\r\n/**\r\n * return vertical if the element is the resizer property is set to basic\r\n *\r\n * @param resizer type of resizer, either basic or stack\r\n */\r\nexport function canResize(resizer: string): any {\r\n if (resizer === 'basic') {\r\n return 'vertical';\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * save selection when the editor is focussed out\r\n */\r\nexport function saveSelection(): any {\r\n if (window.getSelection) {\r\n const sel = window.getSelection();\r\n if (sel.getRangeAt && sel.rangeCount) {\r\n return sel.getRangeAt(0);\r\n }\r\n } else if (document.getSelection && document.createRange) {\r\n return document.createRange();\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * restore selection when the editor is focussed in\r\n *\r\n * @param range saved selection when the editor is focussed out\r\n */\r\nexport function restoreSelection(range): boolean {\r\n if (range) {\r\n if (window.getSelection) {\r\n const sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n return true;\r\n } else if (document.getSelection && range.select) {\r\n range.select();\r\n return true;\r\n }\r\n } else {\r\n return false;\r\n }\r\n}\r\n","
\r\n 1\" [fixed]=\"fixedTabs\">\r\n \r\n\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
","import { Component, OnInit, Input, OnChanges, SimpleChanges, OnDestroy } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'app-list',\r\n templateUrl: './list.component.html',\r\n styleUrls: ['./list.component.css']\r\n})\r\nexport class ListComponent implements OnInit, OnChanges, OnDestroy {\r\n\r\n @Input()\r\n items: Array = [];\r\n\r\n @Input()\r\n fixedTabs = 3;\r\n\r\n @Input()\r\n fromPlayer = false;\r\n\r\n @Input()\r\n isWide = false;\r\n\r\n @Input()\r\n newMediaKey;\r\n\r\n currentItems: Array = [];\r\n\r\n tabs: Array = [];\r\n\r\n currentTabIndex;\r\n activeTabIndex;\r\n subscriptions: Array = [];\r\n @Input()\r\n currentKey: string;\r\n\r\n pageSize = 50;\r\n\r\n constructor(\r\n private route: ActivatedRoute\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n // this.subscriptions.push(\r\n // this.route.queryParams.pipe(filter(params => params.id))\r\n // .subscribe(params => {\r\n // this.currentKey = params.id;\r\n // this.setCurrentTab();\r\n // }));\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n // if (changes.items) {\r\n // this.isWide = false;\r\n // changes.items.currentValue.map(item => {\r\n // if ((this.fromPlayer && item.title.length > 6) || (!this.fromPlayer && item.title.length > 12)) {\r\n // this.isWide = true;\r\n // this.pageSize = 20;\r\n // }\r\n // })\r\n // }\r\n\r\n const playlistTabsNumber = Math.ceil(this.items.length / this.pageSize);\r\n\r\n this.tabs = [];\r\n for (var i = 0; i < playlistTabsNumber; i++) {\r\n let firstIndex = i * this.pageSize;\r\n let lastIndex = (i + 1) * this.pageSize < this.items.length ? (i + 1) * this.pageSize - 1 : this.items.length - 1;\r\n const firstItem = this.items[firstIndex];\r\n const lastItem = this.items[lastIndex];\r\n const firstTitle = firstItem.title.includes(\"-\") ? firstItem.title.split(\"-\")[0] : firstItem.title;\r\n const lastTitle = lastItem.title.includes(\"-\") ? lastItem.title.split(\"-\")[1] : lastItem.title;\r\n // this.tabs.push(firstTitle + '-' + lastTitle)\r\n let modified_fristTitle = firstTitle;\r\n let modified_lastTitle = lastTitle;\r\n if (firstTitle.toString().length > 5 || lastTitle.toString().length > 5) {\r\n modified_fristTitle = (firstIndex + 1) + '';//firstTitle.substring(0, 5) + '... ';\r\n modified_lastTitle = (lastIndex + 1) + '';//' ' + lastTitle.substring(0, 5) + '...';\r\n\r\n }\r\n // if (lastTitle.toString().length > 5) {\r\n // }\r\n this.tabs.push(modified_fristTitle + '-' + modified_lastTitle)\r\n }\r\n // if (this.fromPlayer) {\r\n // this.tabs = [];\r\n // for (var i = 0; i < playlistTabsNumber; i++) {\r\n // const firstItem = this.items[i * this.pageSize];\r\n // const lastItem = (i + 1) * this.pageSize < this.items.length ? this.items[(i + 1) * this.pageSize - 1] : this.items[this.items.length - 1]\r\n // const firstTitle = firstItem.title.includes(\"-\") ? firstItem.title.split(\"-\")[0] : firstItem.title;\r\n // const lastTitle = lastItem.title.includes(\"-\") ? lastItem.title.split(\"-\")[1] : lastItem.title;\r\n // this.tabs.push(firstTitle + '-' + lastTitle)\r\n // }\r\n // // this.tabs = this.tabs.reverse();\r\n // } else {\r\n // this.tabs = [];\r\n // for (var i = 0; i < playlistTabsNumber; i++) {\r\n // const firstItem = this.items[i * this.pageSize];\r\n // const lastItem = (i + 1) * this.pageSize < this.items.length ? this.items[(i + 1) * this.pageSize - 1] : this.items[this.items.length - 1]\r\n // const firstTitle = firstItem.title.includes(\"-\") ? firstItem.title.split(\"-\")[0] : firstItem.title;\r\n // const lastTitle = lastItem.title.includes(\"-\") ? lastItem.title.split(\"-\")[1] : lastItem.title;\r\n // this.tabs.push(firstTitle + '-' + lastTitle)\r\n // }\r\n // }\r\n\r\n\r\n if (this.currentKey) {\r\n this.setCurrentTab();\r\n } else {\r\n this.onSelectTab(0);\r\n }\r\n\r\n }\r\n\r\n setCurrentTab() {\r\n const index = this.items.findIndex(item => item.key === this.currentKey);\r\n if (index > -1) {\r\n this.activeTabIndex = undefined;\r\n const page = Math.ceil((index + 1) / this.pageSize) - 1;\r\n this.currentTabIndex = page;\r\n\r\n // if (this.fromPlayer) {\r\n // this.currentTabIndex = Math.ceil(this.items.length / this.pageSize) - page - 1;\r\n // } else {\r\n // this.currentTabIndex = page;\r\n // }\r\n this.currentItems = this.items.slice(page * this.pageSize, page * this.pageSize + this.pageSize);\r\n } else {\r\n this.onSelectTab(0);\r\n }\r\n }\r\n onSelectTab(index: number) {\r\n this.activeTabIndex = index;\r\n\r\n this.currentItems = this.items.slice((index) * this.pageSize, (index) * this.pageSize + this.pageSize);\r\n\r\n // if (this.fromPlayer) {\r\n // const i = Math.ceil(this.items.length / this.pageSize) - index - 1;\r\n // this.currentItems = this.items.slice((i) * this.pageSize, (i) * this.pageSize + this.pageSize);\r\n // } else {\r\n // this.currentItems = this.items.slice((index) * this.pageSize, (index) * this.pageSize + this.pageSize);\r\n // }\r\n }\r\n ngOnDestroy(): void {\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n }\r\n}\r\n","export class Bullet {\r\n position:number;\r\n guid:string;\r\n duration:number;\r\n speed:number;\r\n contxt:string;\r\n uid:number;\r\n second:number;///显示的时间\r\n offset:number;\r\n}\r\n\r\n\r\nexport enum BarrelType {\r\n Barrel, FixTop, FixBottom\r\n}","import { createFeatureSelector, createSelector } from '@ngrx/store';\r\nimport { DanmuState } from './danmu.reducer';\r\n\r\nconst getDanmuState = createFeatureSelector(\r\n 'danmu'\r\n);\r\n\r\nconst getLoading = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.loading\r\n);\r\n\r\n// const getFlying = createSelector(\r\n// getDanmuState,\r\n// (state: DanmuState) => state.flying\r\n// );\r\n\r\nconst getList = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => {\r\n return state.list;\r\n }/// Looks good to me\r\n);\r\n\r\n// const getCue = createSelector(\r\n// getDanmuState,\r\n// (state: DanmuState) => state.cue\r\n// );\r\n\r\n// const getBullets = createSelector(\r\n// getDanmuState,\r\n// (state: DanmuState) => state.bullets\r\n// );\r\n\r\n// const getAllBarrels = createSelector(\r\n// getDanmuState,\r\n// (state: DanmuState) => state.barrels\r\n// );\r\n\r\n// const getBarrel = createSelector(\r\n// getDanmuState,\r\n// (state: DanmuState) => {\r\n// const sorted = state.barrels.sort(function (a, b) {\r\n// return a.stack - b.stack || a.index - b.index;\r\n// });\r\n// return sorted[0];\r\n// }\r\n// );\r\n\r\n// const getFixTop = createSelector(\r\n// getDanmuState,\r\n// (state: DanmuState) => {\r\n// const sorted = state.fixtops.sort(function (a, b) {\r\n// return a.stack - b.stack || a.index - b.index;\r\n// });\r\n// return sorted[0];\r\n// }\r\n// );\r\n\r\n// const getFixBottom = createSelector(\r\n// getDanmuState,\r\n// (state: DanmuState) => {\r\n// const sorted = state.fixbottoms.sort(function (a, b) {\r\n// return a.stack - b.stack || a.index - b.index;\r\n// });\r\n// return sorted[0];\r\n// }\r\n// );\r\n\r\n// const getComplete = createSelector(\r\n// getDanmuState,\r\n// (state: DanmuState) => state.complete\r\n// );\r\n\r\nconst getPaused = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.paused\r\n);\r\n\r\n// const getCurrentTime = createSelector(\r\n// getDanmuState,\r\n// (state: DanmuState) => state.currentTime\r\n// );\r\n\r\nconst getSetCurrentTime = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.setCurrentTime\r\n);\r\n\r\n// const getApprovedShot = createSelector(\r\n// getDanmuState,\r\n// (state: DanmuState) => state.approvedShot\r\n// );\r\n\r\nconst getKeywordFilter = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.keywordFilter\r\n);\r\n\r\nconst getUserFilter = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.userFilter\r\n);\r\n\r\nconst getFullScreen = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.fullScreen\r\n);\r\n\r\nconst getBlockTop = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.blockTop\r\n);\r\n\r\nconst getBlockBottom = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.blockBottom\r\n);\r\n\r\nconst getBlockLeft = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.blockLeft\r\n);\r\n\r\nconst getSpeed = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.speed\r\n);\r\n\r\nconst getShowDanmu = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.showDanmu\r\n);\r\n\r\nconst getFontSize = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.fontSize\r\n);\r\n\r\nconst getOpacity = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.opacity\r\n);\r\n\r\nconst getFontFamily = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.fontFamily\r\n);\r\n\r\nconst getDanmuKey = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.danmuKey\r\n);\r\n\r\nconst getOutputType = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.outputType\r\n);\r\n\r\nconst getOutputColor = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.outputColor\r\n);\r\n\r\nconst getUserSettings = createSelector(\r\n getDanmuState,\r\n (state: DanmuState) => state.userSettings\r\n);\r\nexport const danmuQuery = {\r\n getLoading,\r\n //getFlying,\r\n getList,\r\n // getCue,\r\n // getBullets,\r\n // getBarrel,\r\n // getFixTop,\r\n // getFixBottom,\r\n // getComplete,\r\n getPaused,\r\n // getCurrentTime,\r\n getSetCurrentTime,\r\n // getAllBarrels,\r\n // getApprovedShot,\r\n getKeywordFilter,\r\n getUserFilter,\r\n getFullScreen,\r\n getBlockTop,\r\n getBlockBottom,\r\n getBlockLeft,\r\n getSpeed,\r\n getShowDanmu,\r\n getFontSize,\r\n getOpacity,\r\n getFontFamily,\r\n getDanmuKey,\r\n getOutputType,\r\n getOutputColor,\r\n getUserSettings\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport { select, Store } from '@ngrx/store';\r\nimport { DanmuState } from './danmu.reducer';\r\nimport { danmuQuery } from './danmu.selector';\r\nimport {\r\n DanmuListLoadedAction,\r\n // DanmuLoadBulletAction,\r\n // DanmuBulletLoadedAction,\r\n // DanmuFireAction,\r\n // DanmuReleaseBarrelAction,\r\n // DanmuDestroyBulletAction,\r\n // DanmuBulletDestroyedAction,\r\n DanmuPauseAction,\r\n DanmuPlayAction,\r\n //DanmuTimeUpdatedAction,\r\n DanmuSendAction,\r\n DanmuNewAction,\r\n // DanmuSetCurrentTimeAction,\r\n //DanmuRequirBarrelAction,\r\n // DanmuBulletFiredAction,\r\n DanmuAddKeywordFilterAction,\r\n DanmuRemoveKeywordFilterAction,\r\n DanmuAddUserFilterAction,\r\n DanmuRemoveUserFilterAction,\r\n //DanmuSetFullScreenAction,\r\n DanmuBlockTopAction,\r\n DanmuBlockBottomAction,\r\n DanmuBlockLeftAction,\r\n DanmuSetSpeed,\r\n DanmuToggleDanmu,\r\n DanmuSetFontSize,\r\n // DanmuResetAllBarrels,\r\n DanmuListRequiredAction,\r\n DanmuSetDanmuKeyAction,\r\n DanmuRemovedAction,\r\n DanmuRemoveDanmuAction,\r\n DanmuSetOpacity,\r\n DanmuSetFontFamily,\r\n DanmuResetAction,\r\n DanmuSetOutputTypeAction,\r\n DanmuSetOutputColorAction,\r\n DanmuGetUserSettingsAction,\r\n DanmuGetUserSettingsSuccessAction,\r\n DanmuUpdateUserSettingsAction,\r\n DanmuSetCurrentTimeAction\r\n} from './danmu.action';\r\n\r\n@Injectable()\r\nexport class DanmuFacade {\r\n currentTime:number = 0;\r\n loading$ = this.store.pipe(select(danmuQuery.getLoading));\r\n list$ = this.store.pipe(select(danmuQuery.getList));\r\n \r\n // flying$ = this.store.pipe(select(danmuQuery.getFlying));\r\n // bullets$ = this.store.pipe(select(danmuQuery.getBullets));\r\n // nextBarrel$ = this.store.pipe(select(danmuQuery.getBarrel));\r\n // nextFixTop$ = this.store.pipe(select(danmuQuery.getFixTop));\r\n // nextFixBottom$ = this.store.pipe(select(danmuQuery.getFixBottom));\r\n // complete$ = this.store.pipe(select(danmuQuery.getComplete));\r\n paused$ = this.store.pipe(select(danmuQuery.getPaused));\r\n // currentTime$ = this.store.pipe(select(danmuQuery.getCurrentTime));\r\n setCurrentTime$ = this.store.pipe(select(danmuQuery.getSetCurrentTime));\r\n // barrels$ = this.store.pipe(select(danmuQuery.getAllBarrels));\r\n // approvedShot$ = this.store.pipe(select(danmuQuery.getApprovedShot));\r\n keywordFilter$ = this.store.pipe(select(danmuQuery.getKeywordFilter));\r\n userFilter$ = this.store.pipe(select(danmuQuery.getUserFilter));\r\n //fullScreen$ = this.store.pipe(select(danmuQuery.getFullScreen));\r\n blockTop$ = this.store.pipe(select(danmuQuery.getBlockTop));\r\n blockBottom$ = this.store.pipe(select(danmuQuery.getBlockBottom));\r\n blockLeft$ = this.store.pipe(select(danmuQuery.getBlockLeft));\r\n speed$ = this.store.pipe(select(danmuQuery.getSpeed));\r\n showDanmu$ = this.store.pipe(select(danmuQuery.getShowDanmu));\r\n fontSize$ = this.store.pipe(select(danmuQuery.getFontSize));\r\n opacity$ = this.store.pipe(select(danmuQuery.getOpacity));\r\n fontFamily$ = this.store.pipe(select(danmuQuery.getFontFamily));\r\n DanmuKey$ = this.store.pipe(select(danmuQuery.getDanmuKey));\r\n outputType$ = this.store.pipe(select(danmuQuery.getOutputType));\r\n outputColor$ = this.store.pipe(select(danmuQuery.getOutputColor));\r\n userSettings$ = this.store.pipe(select(danmuQuery.getUserSettings));\r\n public isPaused = false;\r\n constructor(private store: Store) { }\r\n\r\n danmuListLoaded(payload: Array) {\r\n this.store.dispatch(new DanmuListLoadedAction(payload));\r\n }\r\n // loadBullet(payload: any) {\r\n // this.store.dispatch(new DanmuLoadBulletAction(payload));\r\n // }\r\n // bulletLoaded(payload: { bullet: any }) {\r\n // this.store.dispatch(new DanmuBulletLoadedAction(payload));\r\n // }\r\n // bulletLoad(payload: { barrel: any, bullet: any }) {\r\n // this.store.dispatch(new DanmuFireAction(payload));\r\n // }\r\n // releaseBarrel(payload) {\r\n // this.store.dispatch(new DanmuReleaseBarrelAction(payload));\r\n // }\r\n // destroyBullet(payload) {\r\n // this.store.dispatch(new DanmuDestroyBulletAction(payload));\r\n // }\r\n // bulletDestroyed(payload) {\r\n // this.store.dispatch(new DanmuBulletDestroyedAction(payload));\r\n // }\r\n pause(current) {\r\n this.isPaused = true;\r\n this.store.dispatch(new DanmuPauseAction(current));\r\n }\r\n play(current) {\r\n this.isPaused = false;\r\n this.store.dispatch(new DanmuPlayAction(current));\r\n }\r\n // updateTime(current) {\r\n // this.store.dispatch(new DanmuTimeUpdatedAction(current));\r\n // }\r\n sendDanmu(payload) {\r\n this.store.dispatch(new DanmuSendAction(payload));\r\n }\r\n newDanmu(payload) {\r\n this.store.dispatch(new DanmuNewAction(payload));\r\n\r\n }\r\n setCurrentTime(payload) {\r\n this.store.dispatch(new DanmuSetCurrentTimeAction(payload));\r\n }\r\n // requirBarrel(payload) {\r\n // this.store.dispatch(new DanmuRequirBarrelAction(payload));\r\n // }\r\n // bulletFired(payload) {\r\n // this.store.dispatch(new DanmuBulletFiredAction(payload));\r\n // }\r\n addKeywordFilter(payload) {\r\n this.store.dispatch(new DanmuAddKeywordFilterAction(payload));\r\n }\r\n removeKeywordFilter(payload) {\r\n this.store.dispatch(new DanmuRemoveKeywordFilterAction(payload));\r\n }\r\n addUserFilter(payload) {\r\n this.store.dispatch(new DanmuAddUserFilterAction(payload));\r\n }\r\n removeUserFilter(payload) {\r\n this.store.dispatch(new DanmuRemoveUserFilterAction(payload));\r\n }\r\n // setFullScreen(payload) {\r\n // this.store.dispatch(new DanmuSetFullScreenAction(payload));\r\n // }\r\n blockTop(payload) {\r\n this.store.dispatch(new DanmuBlockTopAction(payload));\r\n }\r\n blockBottom(payload) {\r\n this.store.dispatch(new DanmuBlockBottomAction(payload));\r\n }\r\n blockLeft(payload) {\r\n this.store.dispatch(new DanmuBlockLeftAction(payload));\r\n }\r\n setSpeed(payload) {\r\n this.store.dispatch(new DanmuSetSpeed(payload));\r\n }\r\n toggleDanmu(payload) {\r\n this.store.dispatch(new DanmuToggleDanmu(payload));\r\n }\r\n setFontSize(payload) {\r\n this.store.dispatch(new DanmuSetFontSize(payload));\r\n }\r\n setOpacity(payload) {\r\n this.store.dispatch(new DanmuSetOpacity(payload));\r\n }\r\n setFontFamily(payload) {\r\n this.store.dispatch(new DanmuSetFontFamily(payload));\r\n }\r\n // resetAllBarrels() {\r\n // this.store.dispatch(new DanmuResetAllBarrels(null));\r\n // }\r\n requireDanmuList(payload) {\r\n this.store.dispatch(new DanmuListRequiredAction(payload));\r\n }\r\n setDanmuKey(payload) {\r\n this.store.dispatch(new DanmuSetDanmuKeyAction(payload));\r\n }\r\n removeDanmu(payload) {\r\n this.store.dispatch(new DanmuRemoveDanmuAction(payload));\r\n }\r\n danmuRemoved(payload) {\r\n this.store.dispatch(new DanmuRemovedAction(payload));\r\n }\r\n resetDanmu(payload) {\r\n this.store.dispatch(new DanmuResetAction(payload));\r\n }\r\n containKeywordFilter(keywords:Array, content) {\r\n\r\n return keywords.some((value)=>content.contxt.indexOf(value) > -1);\r\n }\r\n containUserFilter(users:Array, content) {\r\n // console.log(users,content)\r\n return users.some(p => p.id == content.uid) //_.find(users, { id: content.uid });\r\n }\r\n setOutputType(payload) {\r\n this.store.dispatch(new DanmuSetOutputTypeAction(payload));\r\n }\r\n setOutputColor(payload) {\r\n this.store.dispatch(new DanmuSetOutputColorAction(payload));\r\n }\r\n getUserSettings(payload) {\r\n this.store.dispatch(new DanmuGetUserSettingsAction(payload));\r\n }\r\n getUserSettingsSuccess(payload) {\r\n this.store.dispatch(new DanmuGetUserSettingsSuccessAction(payload));\r\n }\r\n updateUserSettings(payload) {\r\n this.store.dispatch(new DanmuUpdateUserSettingsAction(payload));\r\n }\r\n}\r\n","import { VgAPI, VgMedia, VgEvents } from \"../../_modules/player/core\";\r\nimport { Component, Injectable } from \"@angular/core\";\r\nimport { IMedia } from \"./videoplayer.imedia\";\r\nimport { Observable } from \"rxjs\";\r\nimport { interstitialData } from \"./videplayer.interstitialData\";\r\n\r\n\r\n\r\n/**\r\n* 播放器API\r\n*/\r\nexport abstract class videoPlayerApi {\r\n\r\n abstract captureControls();\r\n abstract releaseControls();\r\n\r\n abstract triggerPlayAds(media);\r\n /**\r\n * 订阅事件\r\n * @param eventName\r\n * @param func\r\n */\r\n abstract subscript(eventName: string, func);\r\n\r\n /**\r\n * 播放一个视频\r\n * @param media\r\n */\r\n abstract playVideo(media: Array, isAds);\r\n\r\n /**\r\n * 播放插播广告\r\n * @param media\r\n */\r\n abstract invokeInterstitial(mediaList)\r\n /**\r\n * 开始播放\r\n * @param media\r\n */\r\n abstract play()\r\n /**\r\n * 暂停播放\r\n * @param media\r\n */\r\n abstract pause()\r\n\r\n /*\r\n ** 获取总时间\r\n */\r\n abstract get totalTime();\r\n\r\n /*\r\n ** 获取当前时间\r\n */\r\n abstract get currentTime();\r\n\r\n /*\r\n ** 获取component的实例\r\n */\r\n abstract getRef();\r\n\r\n /*\r\n ** 跳转时间\r\n */\r\n abstract seek(time: number);\r\n\r\n\r\n /*\r\n ** 对广告进行处理\r\n */\r\n abstract intersitialHandler(data: interstitialData);\r\n\r\n /*\r\n ** 显示一个消息\r\n */\r\n abstract showInfo(info: string, hideSecond: number, override: boolean);\r\n\r\n\r\n /*\r\n ** 加载暂停广告\r\n */\r\n abstract invokePauseList(mediaList);\r\n\r\n /*\r\n ** 重置所有计时器先关数据\r\n */\r\n abstract reset();\r\n\r\n /*\r\n ** 获取正在播放的视频\r\n */\r\n abstract get getPlayMedia();\r\n\r\n\r\n /*\r\n ** 设置视频标题\r\n */\r\n abstract setTitle(title: string);\r\n\r\n /*\r\n ** 设置视频是否静音\r\n */\r\n abstract muted(shouldMute: boolean);\r\n\r\n\r\n abstract get getVideoMeta();\r\n /*\r\n ** 清空数据\r\n */\r\n abstract dispose();\r\n\r\n\r\n /*\r\n ** 装载预播时间,跳过时间\r\n */\r\n abstract invokePlayConfig(data);\r\n\r\n abstract setVolume(val);\r\n\r\n abstract getVolume();\r\n\r\n abstract changeBitrate(index);\r\n abstract videoLog(info);\r\n abstract getAndDeleteLogs()\r\n\r\n}\r\n\r\n@Injectable()\r\nexport class videoStartAPI implements videoPlayerApi {\r\n changeBitrate(index) { }\r\n captureControls() { }\r\n releaseControls() { }\r\n triggerPlayAds(media: IMedia) {\r\n }\r\n setVolume(val: any) {\r\n }\r\n getVolume() {\r\n }\r\n invokePlayConfig(data) {\r\n }\r\n getVideoMeta: any;\r\n dispose() {\r\n }\r\n setTitle(title: string) {\r\n }\r\n muted(shouldMute: boolean) {\r\n }\r\n get getPlayMedia() {\r\n return '';\r\n // throw new Error(\"Method not implemented.\");\r\n }\r\n reset() {\r\n\r\n }\r\n \r\n invokePauseList(mediaList: any) {\r\n }\r\n totalTime: any;\r\n showInfo(info: string, hideSecond: number = 5, override = false) {\r\n //throw new Error(\"Method not implemented.\");\r\n }\r\n subscript(eventName: string, func: any) {\r\n // throw new Error(\"Method not implemented.\");\r\n }\r\n playVideo(media: Array, isAds: any) {\r\n //throw new Error(\"Method not implemented.\");\r\n }\r\n invokeInterstitial(mediaList: any) {\r\n // throw new Error(\"Method not implemented.\");\r\n }\r\n play() {\r\n console.log(\"fake play\")\r\n // throw new Error(\"Method not implemented.\");\r\n }\r\n pause() {\r\n //throw new Error(\"Method not implemented.\");\r\n }\r\n currentTime: any;\r\n getRef() {\r\n //throw new Error(\"Method not implemented.\");\r\n }\r\n seek(time: number) {\r\n //throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n intersitialHandler(data: interstitialData) {\r\n\r\n }\r\n videoLog(info)\r\n {\r\n \r\n }\r\n getAndDeleteLogs()\r\n {\r\n\r\n }\r\n\r\n}\r\n\r\n\r\nexport enum videoplayerEvent {\r\n fullscreen = 0,\r\n time = 1,\r\n ended = 2\r\n}\r\n","import {\r\n Component, OnInit, Input, ElementRef, \r\n ViewEncapsulation, OnDestroy,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n HostListener\r\n} from '@angular/core';\r\nimport { VgAPI } from '../core/services/vg-api';\r\nimport { Subscription } from 'rxjs';\r\nimport { VgUtils } from '../core';\r\nimport { VgSeekBarApi } from '../core/services/vg-seekbar-api';\r\n\r\n@Component({\r\n selector: 'vg-pause-p',\r\n encapsulation: ViewEncapsulation.None,\r\n template: `
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
广告
\r\n
\r\n
\r\n
`,\r\n styles: [ `\r\n vg-pause-p{\r\n z-index: 4500;\r\n }\r\n vg-overlay-pause {\r\n display: block;\r\n z-index: 999;\r\n }\r\n .vg-overlay-pause{\r\n\r\n width: 100%;\r\n height: 100%;\r\n }\r\n .vg-bg{\r\n position:absolute;\r\n\r\n max-width: 640px;\r\n max-height: 360px;\r\n background-size: 100%;\r\n margin: 0 auto;\r\n cursor:pointer;\r\n transform: translate(-50%,-50%);\r\n left: 50%;\r\n top: 45%;\r\n width: 57%;\r\n height: 57%;\r\n }\r\n .vg-b{\r\n width: 100%;\r\n height: 100%;\r\n\r\n }\r\n .vg-pause-close{\r\n\r\n // background:url('data:image/png;base64,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');\r\n background-image: url('./assets/images/vg-pause-close.png?v=2');\r\n background-repeat:no-repeat;\r\n width:22px;\r\n height:22px;\r\n //top: -20px;\r\n right: -30px;\r\n position:absolute;\r\n margin-left: auto;\r\n margin-right: 0;\r\n top: -30px;\r\n }\r\n .vg-pause-close:hover{\r\n background-image: url('./assets/images/vg-pause-close.png?v=2');\r\n // background:url('data:image/png;base64,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');\r\n animation: rotate 0.5s ease 1 forwards;\r\n }\r\n @keyframes rotate {\r\n 0% {-webkit-transform: rotate(0deg);}\r\n 25% {-webkit-transform: rotate(90deg);}\r\n 50% {-webkit-transform: rotate(180deg);}\r\n 75% {-webkit-transform: rotate(270deg);}\r\n 100% {-webkit-transform: rotate(360deg);}\r\n }\r\n .vg-pause-close-font {\r\n width:22px;\r\n height:22px;\r\n right: -30px;\r\n position:absolute;\r\n margin-left: auto;\r\n margin-right: 0;\r\n top: -30px;\r\n color: #ffffff;\r\n text-shadow: 1px 1px 4px #000000;\r\n }\r\n .vg-tips-text {\r\n font-size: 12px;\r\n color: #ffffff;\r\n opacity: 0.5;\r\n position: absolute;\r\n top: 5px;\r\n left: 8px;\r\n text-shadow: 1px 1px #000000;\r\n }\r\n .vg-learn-more {\r\n margin: 0 auto 0 auto;\r\n width: calc(158px + 40px);\r\n height: calc(47px + 40px);\r\n background-image: url('./assets/images/learn-more.png');\r\n background-position: 20px;\r\n background-repeat: no-repeat;\r\n // background-size: contain;\r\n }\r\n .vg-learn-more:hover {\r\n background-image: url('./assets/images/learn-more-hover.png');\r\n }\r\n ` ]\r\n})\r\n\r\nexport class VgPauseAds implements OnInit, OnDestroy {\r\n\r\n\r\n @Input() vgFor: string;\r\n private list: Array = [];\r\n @Input() shouldLoad:boolean = true;\r\n\r\n @Output() onShowPauseAds = new EventEmitter();\r\n private shouldShow = true;\r\n elem: HTMLElement;\r\n target: any;\r\n\r\n\r\n subscriptions: Subscription[] = [];\r\n\r\n // @HostBinding('class.is-buffering') isBuffering: boolean = false;\r\n\r\n @Input() showPlayEndContent = false;\r\n\r\n constructor(ref: ElementRef, public API: VgAPI,\r\n public vgSeekBarAPI:VgSeekBarApi\r\n ) {\r\n this.elem = ref.nativeElement;\r\n }\r\n public shouldShowControl = false;\r\n\r\n ngOnInit() {\r\n if (this.API.isPlayerReady) {\r\n this.onPlayerReady();\r\n }\r\n else {\r\n this.subscriptions.push(this.API.playerReadyEvent.subscribe(() => this.onPlayerReady()));\r\n // this.subscriptions.push(this.vgSeekBarAPI.subscript(\"seekstart\",()=>{this.shouldShow = false;}));\r\n // this.subscriptions.push(this.vgSeekBarAPI.subscript(\"seekend\",()=>{this.shouldShow = true;}));\r\n }\r\n }\r\n\r\n\r\n @HostListener(\"window:invokePauseAds\",['$event.detail'])\r\n invokeAds(pauseList)\r\n {\r\n // console.log(pauseList)\r\n this.list = pauseList;\r\n }\r\n\r\n\r\n onPlayerReady() {\r\n this.target = this.API.getMediaById(this.vgFor);\r\n if(this.target !=null && this.target.subscriptions !=null)\r\n {\r\n this.subscriptions.push(this.target.subscriptions.pause.subscribe(p=>{\r\n if(this.shouldLoad && this.shouldShow)\r\n {\r\n if(this.list.length >0)\r\n {\r\n\r\n this.pauseImage = this.list[Math.floor(Math.random()*this.list.length)];\r\n this.onShowPauseAds.next(this.pauseImage);\r\n // console.log(this.pauseImage);\r\n\r\n }\r\n }\r\n\r\n\r\n\r\n }));\r\n\r\n this.subscriptions.push(this.target.subscriptions.play.subscribe(p=>{\r\n //console.log(\"video playing\")\r\n this.pauseImage = null;\r\n }));\r\n }\r\n\r\n }\r\n\r\n // onUpdateBuffer(isBuffering) {\r\n // this.isBuffering = isBuffering;\r\n // }\r\n\r\n pauseImage = null;\r\n // private currentIndex = 0;\r\n\r\n\r\n public getBackgroudImage() {\r\n\r\n if (this.pauseImage)\r\n {\r\n return {\r\n \"background-image\": 'url(\\'' + this.pauseImage[\"src\"] + '\\')',\r\n \"background-repeat\":\"no-repeat\",\r\n \"background-position\":\"center\",\r\n \"background-size\":\"contain\"\r\n };\r\n }\r\n return {};\r\n\r\n }\r\n close()\r\n {\r\n this.pauseImage = null;\r\n }\r\n navigate(event)\r\n {\r\n event.stopPropagation();\r\n VgUtils.openInNewWindow(this.pauseImage.href);\r\n //window.open(this.pauseImage.link,\"_blank\");\r\n }\r\n ngOnDestroy(): void\r\n {\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n }\r\n // screenWidth ={\r\n // width:\"533px\",\r\n // height:\"300px\"\r\n // }\r\n}\r\n","import { Component, ElementRef, HostListener, OnDestroy, OnInit, ViewEncapsulation, Output, EventEmitter, Input } from '@angular/core';\r\nimport { VgAPI } from '../../core/services/vg-api';\r\nimport { VgFullscreenAPI } from '../../core/services/vg-fullscreen-api';\r\nimport { Subscription, fromEvent } from 'rxjs';\r\nimport { FullScreenService } from 'app/_service/full-screen/full-screen.service';\r\n\r\n\r\n@Component({\r\n selector: 'vg-fullscreen',\r\n encapsulation: ViewEncapsulation.None,\r\n template: `\r\n
\r\n
`,\r\n styles: [`\r\n vg-fullscreen {\r\n -webkit-touch-callout: none;\r\n -webkit-user-select: none;\r\n -khtml-user-select: none;\r\n -moz-user-select: none;\r\n -ms-user-select: none;\r\n user-select: none;\r\n display: flex;\r\n justify-content: center;\r\n height: 50px;\r\n width: 50px;\r\n cursor: pointer;\r\n color: white;\r\n line-height: 50px;\r\n }\r\n\r\n vg-fullscreen .iconfont {\r\n pointer-events: none;\r\n font-size: 32px;\r\n }\r\n ` ]\r\n})\r\nexport class VgFullscreen implements OnInit, OnDestroy {\r\n elem: HTMLElement;\r\n @Input() vgFor: string;\r\n target: Object;\r\n @Input() isFullscreen: boolean = false;\r\n\r\n subscriptions: Subscription[] = [];\r\n\r\n ariaValue = 'normal mode';\r\n @Output() fullscreenStatus = new EventEmitter();\r\n\r\n constructor(\r\n ref: ElementRef, public API: VgAPI,\r\n public fsAPI: VgFullscreenAPI,\r\n private fullScreenService: FullScreenService\r\n ) {\r\n this.elem = ref.nativeElement;\r\n this.subscriptions.push(this.fsAPI.onChangeFullscreen.subscribe(this.onChangeFullscreen.bind(this)));\r\n this.fullScreenService.fullScreen$.subscribe(() => {\r\n this.fsAPI.toggleFullscreen()\r\n })\r\n }\r\n\r\n ngOnInit() {\r\n if (this.API.isPlayerReady) {\r\n this.onPlayerReady();\r\n }\r\n else {\r\n this.subscriptions.push(this.API.playerReadyEvent.subscribe(() => this.onPlayerReady()));\r\n }\r\n //console.log(\"full screen control\")\r\n this.subscriptions.push(fromEvent(window,\"quitVideoFullScreenIfany\").subscribe(()=>{\r\n if(this.fsAPI.isFullscreen)\r\n {\r\n this.fsAPI.toggleFullscreen();\r\n }\r\n }));\r\n }\r\n\r\n onPlayerReady() {\r\n this.target = this.API.getMediaById(this.vgFor);\r\n }\r\n\r\n onChangeFullscreen(fsState: boolean) {\r\n this.ariaValue = fsState ? 'fullscren mode' : 'normal mode';\r\n this.isFullscreen = fsState;\r\n this.fullscreenStatus.emit(this.isFullscreen);\r\n }\r\n\r\n @HostListener('click')\r\n onClick() {\r\n this.changeFullscreenState();\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeyDown(event: KeyboardEvent) {\r\n // On press Enter (13) or Space (32)\r\n if (event.keyCode === 13 || event.keyCode === 32) {\r\n event.preventDefault();\r\n this.changeFullscreenState();\r\n }\r\n }\r\n\r\n changeFullscreenState() {\r\n let element = this.target;\r\n\r\n if (this.target instanceof VgAPI) {\r\n element = null;\r\n }\r\n\r\n this.fsAPI.toggleFullscreen(element);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n }\r\n}\r\n","import { Component, ElementRef, HostListener, OnInit, Input, ViewEncapsulation, OnDestroy } from '@angular/core';\r\nimport { VgAPI } from '../../core/services/vg-api';\r\nimport { VgStates } from '../../core/states/vg-states';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'vg-play-pause',\r\n encapsulation: ViewEncapsulation.None,\r\n template: `\r\n
\r\n
`,\r\n styles: [ `\r\n vg-play-pause {\r\n -webkit-touch-callout: none;\r\n -webkit-user-select: none;\r\n -khtml-user-select: none;\r\n -moz-user-select: none;\r\n -ms-user-select: none;\r\n user-select: none;\r\n display: flex;\r\n justify-content: center;\r\n height: 50px;\r\n width: 50px;\r\n cursor: pointer;\r\n color: white;\r\n line-height: 50px;\r\n }\r\n\r\n vg-play-pause .iconfont {\r\n pointer-events: none;\r\n font-size: 66px;\r\n margin-left: -5px;\r\n }\r\n ` ]\r\n})\r\nexport class VgPlayPause implements OnInit, OnDestroy {\r\n @Input() vgFor: string;\r\n\r\n elem: HTMLElement;\r\n target: any;\r\n\r\n subscriptions: Subscription[] = [];\r\n\r\n ariaValue = VgStates.VG_PAUSED;\r\n\r\n @Input() isPlayingAds = false;\r\n\r\n constructor(ref: ElementRef, public API: VgAPI) {\r\n this.elem = ref.nativeElement;\r\n }\r\n\r\n ngOnInit() {\r\n if (this.API.isPlayerReady) {\r\n this.onPlayerReady();\r\n }\r\n else {\r\n this.subscriptions.push(this.API.playerReadyEvent.subscribe(() => this.onPlayerReady()));\r\n }\r\n }\r\n\r\n onPlayerReady() {\r\n this.target = this.API.getMediaById(this.vgFor);\r\n }\r\n\r\n @HostListener('click')\r\n onClick() {\r\n this.playPause();\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n onKeyDown(event: KeyboardEvent) {\r\n // On press Enter (13) or Space (32)\r\n var active =document.activeElement;\r\n if(!(active == null || (\r\n active.tagName.toLowerCase() != \"input\" &&\r\n active.tagName.toLowerCase() != \"textarea\" &&\r\n !active.hasAttribute(\"contenteditable\")\r\n )))return;\r\n if ( event.keyCode === 32 ) {\r\n // console.log(document.activeElement);\r\n if (this.isPlayingAds) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.playPause();\r\n }\r\n }\r\n\r\n playPause() {\r\n let state = this.getState();\r\n if(!!this.target)\r\n {\r\n switch (state) {\r\n case VgStates.VG_PLAYING:\r\n this.target.pause();\r\n break;\r\n \r\n case VgStates.VG_PAUSED:\r\n case VgStates.VG_ENDED:\r\n this.target.play();\r\n break;\r\n }\r\n }\r\n \r\n }\r\n\r\n\r\n getState() {\r\n this.ariaValue = this.target ? this.target.state : VgStates.VG_PAUSED;\r\n return this.ariaValue;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n }\r\n}\r\n","
\r\n
\r\n\r\n
在左侧或右侧点按两次即可跳过10秒
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n","import {\r\n Component, OnInit, Input, ElementRef, ViewEncapsulation, OnDestroy,\r\n HostBinding\r\n} from '@angular/core';\r\nimport { VgAPI } from '../core/services/vg-api';\r\nimport { VgStates } from '../core/states/vg-states';\r\nimport { Subscription } from 'rxjs';\r\nimport { VgFullscreenAPI } from '../core/services/vg-fullscreen-api';\r\nimport { VgControlsHidden } from '../core/services/vg-controls-hidden';\r\nimport { VgUtils } from '../core';\r\nimport { Utility } from 'app/_service/utility';\r\n// import { VgSeekBarApi } from '../core/services/vg-seekbar-api';\r\n\r\n@Component({\r\n selector: 'vg-overlay-play',\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl:\"./vg-overlay-play.html\",\r\n styles: [`\r\n .vg-overlay-play {\r\n z-index: 4445;\r\n }\r\n\r\n .vg-overlay-play.paused {\r\n z-index: 4446;\r\n cursor:pointer;\r\n }\r\n vg-overlay-play.is-buffering {\r\n display: none;\r\n }\r\n vg-overlay-play.isdesktop .vv-state\r\n {\r\n pointer-events:none;\r\n }\r\n\r\n vg-overlay-play .vg-overlay-play {\r\n position: absolute;\r\n display: block;\r\n color: white;\r\n width: 100%;\r\n height: 100%;\r\n font-size: 80px;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n }\r\n\r\n vg-overlay-play .vg-overlay-play.native-fullscreen.controls-hidden {\r\n cursor: none;\r\n }\r\n\r\n .vg-overlay-play .overlay-play-container{\r\n width:100%;\r\n height:100%;\r\n position:relative;\r\n }\r\n\r\n\r\n .vv-state{\r\n\r\n left: 0;\r\n right: 0;\r\n top: 0;\r\n bottom: 0;\r\n position: absolute;\r\n color:white;\r\n font-size: 100px;\r\n border-radius: 50%;\r\n padding: 0.5em;\r\n\r\n\r\n /* transition:opacity 0.3s; */\r\n opacity:0;\r\n /* visibility:hidden; */\r\n }\r\n\r\n .vv-state.iconbofang:before {\r\n transform: translate(-50%,-50%);\r\n left:50%;\r\n top:50%;\r\n position: absolute;\r\n }\r\n\r\n .vv-state.iconbofang3:before {\r\n transform: translate(-50%,-50%);\r\n left:50%;\r\n top:50%;\r\n position: absolute;\r\n width: 85px;\r\n height: 85px;\r\n border-radius: 50%;\r\n border: 3px solid #ffffff;\r\n background-color: #00000080;\r\n padding-left: 16px;\r\n font-size: 54px;\r\n }\r\n\r\n .vv-state.iconzanting3:before {\r\n transform: translate(-50%,-50%);\r\n left:50%;\r\n top:50%;\r\n position: absolute;\r\n width: 85px;\r\n height: 85px;\r\n border-radius: 50%;\r\n border: 3px solid #ffffff;\r\n background-color: #00000080;\r\n padding-left: 13px;\r\n font-size: 54px;\r\n }\r\n\r\n .vv-state.iconzanting3 {\r\n opacity: 0;\r\n transition: opacity 0.5s ease-out;\r\n }\r\n\r\n @keyframes opacityForAWhile {\r\n 0% {\r\n opacity: 1;\r\n }\r\n 75% {\r\n opacity: 1;\r\n }\r\n 100% {\r\n opacity: 0;\r\n }\r\n }\r\n\r\n .overlay-play-container .vg-icon-pause{\r\n\r\n opacity:1.0;\r\n visibility:visible;\r\n\r\n }\r\n\r\n .overlay-play-container .iconbofang {\r\n\r\n opacity:1.0;\r\n visibility:visible;\r\n text-shadow: 1px 1px 4px #888888;\r\n }\r\n\r\n .overlay-play-container .iconbofang3 {\r\n opacity:1.0;\r\n visibility:visible;\r\n text-shadow: 1px 1px 4px #888888;\r\n font-size: 60px;\r\n }\r\n\r\n .overlay-play-container:hover .iconzanting3 {\r\n opacity:0;\r\n transition: opacity 0.5s ease-out;\r\n animation: opacityForAWhile 2s 1;\r\n visibility:visible;\r\n text-shadow: 1px 1px 4px #888888;\r\n font-size: 60px;\r\n }\r\n\r\n vg-overlay-play .vg-overlay-play:hover {\r\n filter: alpha(opacity=100);\r\n opacity: 1;\r\n }\r\n\r\n vg-overlay-play .vg-overlay-play:hover .overlay-play-container.iconbofang:before {\r\n transform: scale(1.2);\r\n }\r\n\r\n .overlay-play-container .overlay-part{\r\n width:50%;\r\n height:100%;\r\n text-align: center;\r\n }\r\n .overlay-play-container .overlay-part.overlay-play-left{\r\n float:left;\r\n }\r\n .overlay-play-container .overlay-part.overlay-play-right{\r\n float:right;\r\n }\r\n .overlay-part>svg{\r\n\r\n height: 2em;\r\n width: 3em;\r\n font-size: 14px;\r\n position: absolute;\r\n top: 50%;\r\n margin-top: -1.5em;\r\n }\r\n\r\n\r\n .overlay-part.overlay-play-left>svg{\r\n transform: scaleX(-1);\r\n left: 1em;\r\n }\r\n .overlay-part.overlay-play-right>svg{\r\n // margin-left: 1.2em;\r\n right:2em;\r\n }\r\n\r\n .overlay-caption{\r\n width: 100%;\r\n height: 3.5em;\r\n font-size: 15px;\r\n text-align: center;\r\n background: linear-gradient(to top, transparent, black);\r\n padding-top: 1em;\r\n }\r\n\r\n .overlay-logo {\r\n position:absolute;\r\n width: 1em;\r\n height: 0.5em;\r\n pointer-events: none;\r\n background-position:left top;\r\n background-repeat:no-repeat;\r\n margin-left: 23px;\r\n margin-top: 23px;\r\n top:0;\r\n z-index: 500;\r\n -webkit-transition: top 1s;\r\n -khtml-transition: top 1s;\r\n -moz-transition: top 1s;\r\n -ms-transition: top 1s;\r\n transition: top 1s;\r\n background-size: contain;\r\n font-size: 70px;\r\n }\r\n .overlay-logo.hide{\r\n //top:-1em;\r\n }\r\n .vg-overlay-play.is-buffering .vv-state\r\n {\r\n display:none;\r\n }\r\n .vg-overlay-play.paused.is-buffering\r\n {\r\n display:block;\r\n }\r\n\r\n .live-overlay-logo {\r\n position:absolute;\r\n width: 1em;\r\n height: 0.5em;\r\n pointer-events: none;\r\n background-repeat: no-repeat;\r\n margin-right: 23px;\r\n margin-top: 23px;\r\n top:0;\r\n right:0;\r\n opacity:0.7;\r\n z-index: 500;\r\n background-image: url(\"assets/images/live-logo.png?v=1\");\r\n -webkit-transition: top 1s;\r\n -khtml-transition: top 1s;\r\n -moz-transition: top 1s;\r\n -ms-transition: top 1s;\r\n transition: top 1s;\r\n background-size: contain;\r\n font-size: 60px;\r\n }\r\n\r\n ` ]\r\n})\r\nexport class VgOverlayPlay implements OnInit, OnDestroy {\r\n @Input() vgFor: string;\r\n @Input() logo: string;\r\n @Input() isPlayingAds: boolean;\r\n @Input() paused;\r\n @Input() isFloatPlayer = false;\r\n elem: HTMLElement;\r\n target: any;\r\n\r\n isNativeFullscreen: boolean = false;\r\n areControlsHidden: boolean = false;\r\n\r\n subscriptions: Subscription[] = [];\r\n isTouchDevice: boolean = VgUtils.isTouchDevice;\r\n isMac: boolean = VgUtils.IsMac();\r\n @HostBinding(\"class.isdesktop\") isDesktop = !this.isTouchDevice;\r\n isBuffering: boolean = true;\r\n constructor(ref: ElementRef,\r\n public API: VgAPI,\r\n public fsAPI: VgFullscreenAPI,\r\n private controlsHidden: VgControlsHidden,\r\n private _utility: Utility,\r\n ) {\r\n this.elem = ref.nativeElement;\r\n }\r\n public shouldShowControl = false;\r\n @Input() isLive = false;\r\n @Input() fromActivity;\r\n @Input() isFullscreen;\r\n @Input() showPlayEndContent = false\r\n\r\n notShow = this._utility.GetHost(\"{Host}\") === 'jssp.tv' ? true : false;\r\n \r\n ngOnInit() {\r\n if (this.API.isPlayerReady) {\r\n this.onPlayerReady();\r\n }\r\n else {\r\n this.subscriptions.push(this.API.playerReadyEvent.subscribe(() => this.onPlayerReady()));\r\n }\r\n\r\n if (this.isDesktop) {\r\n this.elem.addEventListener(\"mouseup\", (event) => {\r\n if (event.which != 1) {\r\n return;\r\n }\r\n var part = \"left\";\r\n var config = this.doubleClickTimer[part];\r\n\r\n config.isSingleClick = true;\r\n ++config.clicked;\r\n if (config.timer != null) {\r\n\r\n VgUtils.clearTimeout(config.timer);\r\n config.isSingleClick = false;\r\n config.timer = null;\r\n this.doubleToFull(part);\r\n }\r\n else {\r\n config.timer = VgUtils.setTimeout(() => {\r\n if (config.isSingleClick) {\r\n\r\n this.onClick();\r\n }\r\n\r\n config.timer = null;\r\n }, this.doubleClickdelay)\r\n }\r\n })\r\n\r\n }\r\n }\r\n playOrPauseVideo() {\r\n // console.log(\"clicked\");\\\r\n if (this.isTouchDevice && !this.fromActivity) {\r\n return;\r\n }\r\n let state = this.getState();\r\n if (state == VgStates.VG_PLAYING) {\r\n this.target.pause();\r\n }\r\n else if (state = VgStates.VG_PAUSED) {\r\n this.target.play();\r\n }\r\n }\r\n onPlayerReady() {\r\n this.target = this.API.getMediaById(this.vgFor);\r\n if (this.target != null && this.target.subscriptions != null) {\r\n this.subscriptions.push(this.fsAPI.onChangeFullscreen.subscribe(this.onChangeFullscreen.bind(this)));\r\n this.subscriptions.push(this.controlsHidden.isHidden.subscribe(this.onHideControls.bind(this)));\r\n this.subscriptions.push(\r\n this.target.subscriptions.bufferDetected.subscribe(\r\n isBuffering => this.onUpdateBuffer(isBuffering)\r\n )\r\n );\r\n }\r\n\r\n // this.subscriptions.push(this.vgSeekApi.subscript(\"seekstart\", () => this.onSeekStart()))\r\n // this.subscriptions.push(this.vgSeekApi.subscript(\"seekend\", () => this.onSeekEnd()))\r\n\r\n }\r\n timeout = null;\r\n onUpdateBuffer(isBuffering) {\r\n this.isBuffering = isBuffering;\r\n // VgUtils.clearTimeout(this.timeout);\r\n\r\n // if(this.isBuffering)\r\n // {\r\n // VgUtils.setTimeout(()=>{\r\n // this.isBuffering = false\r\n\r\n // },1000);\r\n // }\r\n\r\n }\r\n\r\n onChangeFullscreen(fsState: boolean) {\r\n if (this.fsAPI.nativeFullscreen) {\r\n this.isNativeFullscreen = fsState;\r\n }\r\n }\r\n\r\n onHideControls(hidden: boolean) {\r\n this.areControlsHidden = hidden;\r\n if (this.areControlsHidden) {\r\n this.shouldShowControl = true;\r\n }\r\n }\r\n\r\n public lastState = null;\r\n\r\n //@HostListener('click')\r\n onClick() {\r\n // console.debug(\"clicked\",\"should play\");\r\n // if (playerUtil.isIphoneDevice) {\r\n // return;\r\n // }\r\n let state = this.getState();\r\n\r\n if (this.isTouchDevice) {\r\n switch (state) {\r\n case VgStates.VG_PLAYING:\r\n if (this.shouldShowControl) {\r\n this.shouldShowControl = false;\r\n this.controlsHidden.show();\r\n }\r\n else {\r\n this.controlsHidden.force(true);\r\n\r\n // this.shouldShowControl = true;\r\n\r\n //this.target.pause();\r\n }\r\n // this.target.pause();\r\n break;\r\n\r\n case VgStates.VG_PAUSED:\r\n case VgStates.VG_ENDED:\r\n this.shouldShowControl = false;\r\n this.target.play();\r\n break;\r\n }\r\n\r\n this.lastState = state;\r\n }\r\n else {\r\n\r\n switch (state) {\r\n case VgStates.VG_PLAYING:\r\n // if (this.shouldShowControl)\r\n // {\r\n // this.shouldShowControl = false;\r\n // // this.controlsHidden.show();\r\n // }\r\n // else\r\n // {\r\n // //this.controlsHidden.force(true);\r\n\r\n // // this.shouldShowControl = true;\r\n\r\n // //this.target.pause();\r\n // }\r\n this.target.pause();\r\n break;\r\n\r\n case VgStates.VG_PAUSED:\r\n case VgStates.VG_ENDED:\r\n this.shouldShowControl = false;\r\n this.target.play();\r\n\r\n break;\r\n }\r\n\r\n }\r\n this.lastState = state;\r\n\r\n }\r\n\r\n pauseVideo() {\r\n let state = this.getState();\r\n if (state == VgStates.VG_PLAYING) {\r\n this.target.pause();\r\n }\r\n else if (state = VgStates.VG_PAUSED) {\r\n this.target.play();\r\n }\r\n }\r\n\r\n\r\n public doubleClickTimer = {\r\n left: {\r\n timer: null,\r\n isSingleClick: false,\r\n clicked: 0,\r\n shouldprevent: false\r\n },\r\n right: {\r\n timer: null,\r\n isSingleClick: false,\r\n clicked: 0,\r\n shouldprevent: false\r\n }\r\n }\r\n showCaption = false;\r\n onSeekStart() {\r\n this.showCaption = true;\r\n // console.log(\"seek start\")\r\n }\r\n\r\n onSeekEnd() {\r\n this.showCaption = false;\r\n //console.log(\"seek end\")\r\n\r\n }\r\n doubleClickdelay = 200;\r\n\r\n handleClick(part) {\r\n\r\n if (this.isTouchDevice) {\r\n //console.log(part + \" tap\");\r\n if (this.getState() == VgStates.VG_PAUSED) {\r\n var config = this.doubleClickTimer[part];\r\n config.isSingleClick = true;\r\n if (config.timer != null) {\r\n\r\n VgUtils.clearTimeout(config.timer);\r\n }\r\n //console.log(\"clicked\");\r\n this.onClick();\r\n }\r\n else {\r\n var config = this.doubleClickTimer[part];\r\n config.isSingleClick = true;\r\n if (config.timer != null) {\r\n // console.log(\"should handle \" + part + \" click\");\r\n\r\n VgUtils.clearTimeout(config.timer);\r\n this.handleDouble(part);\r\n\r\n }\r\n else {\r\n config.timer = VgUtils.setTimeout(() => {\r\n if (config.isSingleClick) {\r\n // console.log(part+\" click\");\r\n\r\n this.onClick();\r\n }\r\n config.timer = null;\r\n }, this.doubleClickdelay)\r\n }\r\n\r\n }\r\n }\r\n else {\r\n //this.onClick();\r\n // var config = this.doubleClickTimer[part];\r\n\r\n // config.isSingleClick = true;\r\n // ++config.clicked;\r\n // //console.log(config);\r\n\r\n // if (config.timer != null) {\r\n\r\n // VgUtils.clearTimeout(config.timer);\r\n // config.isSingleClick = false;\r\n // config.timer = null;\r\n // this.doubleToFull(part);\r\n\r\n // }\r\n // else {\r\n // config.timer = VgUtils.setTimeout(() => {\r\n // if (config.isSingleClick) {\r\n\r\n // this.onClick();\r\n // }\r\n\r\n // config.timer = null;\r\n // }, this.doubleClickdelay)\r\n // }\r\n\r\n }\r\n\r\n\r\n\r\n }\r\n // @HostListener(\"document:mouseup\")\r\n // masterDoubleClick()\r\n\r\n // {\r\n // console.log(\"double click\");\r\n\r\n // this.doubleToFull(\"left\");\r\n // }\r\n\r\n\r\n seekTime = 10;\r\n handleDouble(part) {\r\n\r\n var config = this.doubleClickTimer[part];\r\n\r\n config.isSingleClick = false;\r\n config.timer = null;\r\n //console.log(part + \"double click\");\r\n\r\n //if (config.timer != null)\r\n //{\r\n // VgUtils.clearTimeout(config.timer);\r\n // config.timer = null;\r\n\r\n //}\r\n\r\n if (part == \"left\") {\r\n this.API.seekTime(this.API.currentTime - this.seekTime);\r\n //this.viewLeft = true;\r\n this.playWithLeft();\r\n //setTimeout(() => this.viewLeft =false, 100)\r\n }\r\n else {\r\n this.API.seekTime(this.API.currentTime + this.seekTime);\r\n this.playWithRight();\r\n\r\n }\r\n\r\n }\r\n doubleToFull(part) {\r\n // console.log(\"double\");\r\n if (!this.isFloatPlayer)\r\n this.fsAPI.toggleFullscreen();\r\n\r\n }\r\n private playWithLeft() {\r\n this.viewLeft = true\r\n VgUtils.setTimeout(() => {\r\n this.viewLeft = false\r\n VgUtils.setTimeout(() => {\r\n this.viewLeft = true;\r\n VgUtils.setTimeout(() => this.viewLeft = false, 100)\r\n }, 100)\r\n }\r\n , 100)\r\n }\r\n\r\n private playWithRight() {\r\n this.viewRight = true\r\n VgUtils.setTimeout(() => {\r\n this.viewRight = false\r\n VgUtils.setTimeout(() => {\r\n this.viewRight = true;\r\n VgUtils.setTimeout(() => this.viewRight = false, 100)\r\n }, 100)\r\n }\r\n , 100)\r\n }\r\n viewRight = false;\r\n viewLeft = false;\r\n\r\n getState() {\r\n let state = VgStates.VG_PAUSED;\r\n\r\n if (this.target) {\r\n if (this.target.state instanceof Array) {\r\n for (let i = 0, l = this.target.state.length; i < l; i++) {\r\n if (this.target.state[i] === VgStates.VG_PLAYING) {\r\n state = VgStates.VG_PLAYING;\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n state = this.target.state;\r\n }\r\n }\r\n\r\n return state;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n }\r\n\r\n\r\n public getBackgroudImage() {\r\n\r\n if (this.logo) {\r\n return {\r\n\r\n \"background-image\": 'url(\\'' + this.logo + '\\')',\r\n\r\n };\r\n }\r\n return {};\r\n\r\n }\r\n}\r\n","
\r\n \r\n \r\n \"大V标\"/\r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n {{ bullet.nickName}}:\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n {{ bullet.country}}\r\n
\r\n
0 && !bullet?.isAds\">\r\n \r\n {{ bullet.good | chineseCounter }}\r\n
\r\n
\r\n
\r\n
\r\n
{{ bullet.nickName }}
\r\n
\r\n
\r\n \r\n {{ bullet.good | chineseCounter }}\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n 屏蔽\r\n
\r\n
\r\n \r\n 举报\r\n
\r\n
\r\n \r\n 撤回\r\n
\r\n
\r\n
\r\n
","import { Component, OnInit, Input, AfterViewInit, ViewChild, ElementRef, ChangeDetectorRef, OnDestroy, ViewEncapsulation, HostBinding, HostListener, Output, EventEmitter } from '@angular/core';\r\nimport { DanmuFacade } from '../../../../_modules/danmu/danmu.facade';\r\nimport { BulletStyleService } from '../../../../_modules/danmu/bullet.style.service';\r\nimport { Unsubscribable } from 'rxjs';\r\nimport { style, animate, AnimationBuilder, AnimationFactory, AnimationPlayer } from '@angular/animations';\r\n//import { ContextMenuComponent } from 'ngx-contextmenu';\r\nimport { DnDialogService } from '../../../dn-dialog/dn-dialog.service';\r\nimport { BarrelType } from '../bullet';\r\nimport { DatePipe } from '@angular/common';\r\nimport { UserService } from '../../../../_service/user/user.service';\r\nimport { VideoService } from '../../../../_service/video/video.service';\r\nimport { DanmuService } from '../../../../_service/danmu/danmu.service';\r\n// import { ToastService } from 'app/_service/toast/toast.service';\r\n@Component({\r\n selector: '.bullet',\r\n templateUrl: './bullet.component.html',\r\n styleUrls: ['./bullet.component.scss']\r\n\r\n})\r\n\r\nexport class BulletComponent implements OnInit, AfterViewInit, OnDestroy {\r\n\r\n\r\n @Input()\r\n bullet: any;\r\n @Input()\r\n userId: any;\r\n fullScreen = false;\r\n @Input() canvasWidth = 900;\r\n duration = 10000;\r\n width = 99999;\r\n top = -99999;\r\n fontSize = 22;\r\n opacity = 100;\r\n // started = false;\r\n speed: number;\r\n style = {};\r\n durationLeft;\r\n barrelHeight = 30;\r\n subscriptions: Array = [];\r\n @HostBinding(\"class.hovered\") hovered = false;\r\n private factory: AnimationFactory;\r\n barrelIndex: number;\r\n\r\n hidden = false;\r\n blocked = false;\r\n sysHidden = false;\r\n player: AnimationPlayer;\r\n startTime: number = 0;\r\n fontFamily = 1;\r\n @HostBinding(\"class.show-menu\") showMenu = false;\r\n @HostBinding(\"class.transparent\") get transparent() {\r\n return this.hidden || this.blocked || this.sysHidden || this.userFilterd;\r\n };\r\n userFilterd = false;\r\n @Output() onBulletEvent: EventEmitter = new EventEmitter();\r\n user;\r\n @Output() onFudaiOpened = new EventEmitter();\r\n\r\n\r\n\r\n //@ViewChild(ContextMenuComponent, { static: true }) public danmuMenu: ContextMenuComponent;\r\n\r\n isCopiedSent = false;\r\n @ViewChild('fudaiOpened') fudaiOpened: ElementRef;\r\n constructor(\r\n private danmuFacade: DanmuFacade,\r\n private bulletStyleService: BulletStyleService,\r\n private builder: AnimationBuilder,\r\n private elBullet: ElementRef,\r\n private dialogService: DnDialogService,\r\n private cd: ChangeDetectorRef,\r\n private _danmuService: DanmuService,\r\n private _videoService: VideoService,\r\n private _userService: UserService,\r\n ) {\r\n\r\n }\r\n\r\n\r\n recalculate()\r\n {\r\n this.speed = (this.canvasWidth + this.width) / this.duration;\r\n }\r\n ngOnInit() {\r\n\r\n // this.getFontSize();\r\n // this.getOpacity();\r\n // this.getFontFamily();\r\n this.subscribeBlock();\r\n this.subscribePaused();\r\n }\r\n\r\n // private animate() {\r\n\r\n // }\r\n\r\n\r\n getMembership(gid) {\r\n let membership = '';\r\n switch (gid) {\r\n case 0:\r\n membership = '';\r\n break;\r\n case 1:\r\n membership = 'gvip';\r\n break;\r\n case 2:\r\n membership = 'gvip';\r\n break;\r\n case 3:\r\n membership = 'royalVip';\r\n break;\r\n case 4:\r\n membership = 'cpvip';\r\n break;\r\n case 101:\r\n membership = 'cpvip';\r\n break;\r\n case 102:\r\n membership = 'cpvip';\r\n break;\r\n default:\r\n membership = 'vip';\r\n }\r\n return membership;\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.width = this.elBullet.nativeElement.offsetWidth;\r\n this.speed = (this.canvasWidth + this.width) / this.duration;\r\n var style = this.bulletStyleService.getStyle(\r\n {\r\n color: this.bullet.color,\r\n });\r\n\r\n \r\n this.style = style;\r\n this.onBulletEvent.emit({\r\n event: BulletEvent.Bullet_Loaded,\r\n object: {\r\n duration: this.duration,\r\n size: this.width,\r\n canvasSize: this.canvasWidth,\r\n bullet: this.bullet,\r\n speed: this.speed,\r\n guid:this.bullet.guid\r\n }\r\n });\r\n\r\n if (this.bullet?.isAds) {\r\n this.subscriptions.push(\r\n this._userService.userState$.subscribe(p => {\r\n this.user = p;\r\n if (!this.user || !this.user.id) {\r\n // 退出登录,清空已开启的福袋\r\n this.openedFudaiList = [];\r\n this._danmuService.storeOpenedDanmuFudai(this.openedFudaiList);\r\n }\r\n })\r\n );\r\n this.adsDanmuShowed();\r\n this.readOpenedFudaiList();\r\n }\r\n }\r\n eventID = 0; ///事件+1 保证不会执行onDone\r\n private createPlayerAndBindEvent() {\r\n this.player = this.factory.create(this.elBullet.nativeElement, {\r\n });\r\n let eventID = ++this.eventID;\r\n this.player.onDone(() => { ///调用destroy 也会触发事件\r\n // console.log(this.eventID,eventID)\r\n if (this.eventID == eventID) {\r\n this.onBulletEvent.emit({\r\n event: BulletEvent.Bullet_End,//!this.released?BulletEvent.Bullet_End:BulletEvent.Bullet_Recycle,///主动调用destroy,会延迟,这里告诉调度器,子弹已经回收\r\n object: {\r\n bullet: this.bullet,\r\n index: this.barrelIndex\r\n }\r\n });\r\n this.hidden = true;\r\n this.barrelIndex = 0;\r\n this.startTime = 0;\r\n this.userFilterd = false;\r\n\r\n }\r\n });\r\n\r\n }\r\n\r\n\r\n\r\n\r\n /*\r\n ** 主动停止当前播放的动画\r\n */\r\n\r\n finish() {\r\n if (!!this.player) {\r\n\r\n this.destroyPlayer();\r\n this.hidden = true;\r\n this.barrelIndex = 0;\r\n this.startTime = 0;\r\n this.userFilterd = false;\r\n\r\n }\r\n\r\n }\r\n\r\n @HostBinding('style') get getBulletStyle() {\r\n if (this.bullet.position === BarrelType.Barrel) {\r\n return {\r\n left: \"100%\",\r\n top: this.top + 'px',\r\n //'font-size': this.fontSize + 'px',\r\n ...this.style,\r\n };\r\n } else if (this.bullet.position === BarrelType.FixTop) {\r\n const style = {\r\n left: '50%',\r\n transform: 'TranslateX(-50%)',\r\n transition: 'none',\r\n top: this.top + 'px',\r\n //'font-size': this.fontSize + 'px',\r\n ...this.style,\r\n };\r\n return style;\r\n } else if (this.bullet.position === BarrelType.FixBottom) {\r\n return {\r\n left: '50%',\r\n transform: 'TranslateX(-50%)',\r\n transition: 'none',\r\n bottom: this.top + 'px',\r\n // 'font-size': this.fontSize + 'px',\r\n ...this.style,\r\n };\r\n }\r\n }\r\n\r\n /*\r\n ** 销毁播放器\r\n */\r\n private destroyPlayer() {\r\n if (!!this.player) {\r\n this.eventID += 1;\r\n this.player.destroy();\r\n this.player = null;\r\n }\r\n\r\n }\r\n /*\r\n ** 重新加载bullet,动画重头开始\r\n */\r\n reload(bullet) {\r\n this.bullet = bullet;\r\n this.destroyPlayer();\r\n this.style = {\r\n ...this.style,\r\n transform: '',\r\n }\r\n this.cd.detectChanges()\r\n this.ngAfterViewInit();\r\n //console.log(this.duration)\r\n\r\n }\r\n /*\r\n ** 重新适配尺寸,从结束的时间开始\r\n */\r\n restart() {\r\n if (this.bullet.position === BarrelType.Barrel) {\r\n let offset = this.startTime > 0 ? (Date.now() - this.startTime) : 0;\r\n this.speed = (this.canvasWidth + this.width) / this.duration;\r\n let duration = this.duration - offset;\r\n let isStarted = this.startTime > 0;\r\n if (duration > 0 ) ///有可能\r\n {\r\n let actionDuration = duration - this.bullet.offset;\r\n if(actionDuration <0)\r\n {\r\n actionDuration = 1;\r\n }\r\n this.destroyPlayer();\r\n let totalWidth = this.canvasWidth + this.width;\r\n this.factory = this.builder.build([\r\n style({ transform: `translateX(${-this.speed * offset - this.bullet.offset * this.speed}px) translateY(0) translateZ(0)` }),\r\n animate(actionDuration, style({ transform: 'translateX(-' + (totalWidth) + 'px) translateY(0) translateZ(0)' })),\r\n ]);\r\n this.createPlayerAndBindEvent();\r\n if (isStarted)\r\n this.player.play();\r\n }\r\n\r\n }\r\n else {\r\n }\r\n }\r\n\r\n onPaused() {\r\n if (!!this.player) {\r\n this.player.pause();\r\n }\r\n }\r\n\r\n onPlay() {\r\n if (!!this.player) {\r\n this.player.play();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (!!this.player)\r\n this.player.destroy();\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n }\r\n\r\n @HostListener(\"mouseover\")\r\n onMouseOver() {\r\n if (!!this.player)\r\n this.player.pause();\r\n this.hovered = true;\r\n if (this.bullet?.isAds) {\r\n this.showMenu = true;\r\n }\r\n }\r\n\r\n @HostListener(\"mouseleave\")\r\n onMouseLeave() {\r\n if (!this.danmuFacade.isPaused && !!this.player)\r\n this.player.play();\r\n this.hovered = false;\r\n this.showMenu = false;\r\n }\r\n\r\n addUserFilter() {\r\n this.danmuFacade.addUserFilter({ id: this.bullet.uid, name: this.bullet.nickName });\r\n }\r\n\r\n subscribeHide() {\r\n // this.danmuFacade.showDanmu$.subscribe(\r\n // (show) => {\r\n // this.hidden = !show;\r\n // }\r\n // )\r\n }\r\n\r\n subscribeBlock() {\r\n if (this.bullet.position === BarrelType.FixTop) {\r\n this.subscriptions.push(\r\n this.danmuFacade.blockTop$.subscribe(\r\n (blockTop) => {\r\n this.blocked = blockTop;\r\n }\r\n )\r\n );\r\n }\r\n\r\n if (this.bullet.position === BarrelType.FixBottom) {\r\n this.subscriptions.push(\r\n this.danmuFacade.blockBottom$.subscribe(\r\n (blockBottom) => {\r\n this.blocked = blockBottom;\r\n }\r\n )\r\n );\r\n }\r\n\r\n if (this.bullet.position === BarrelType.Barrel) {\r\n this.subscriptions.push(\r\n this.danmuFacade.blockLeft$.subscribe(\r\n (blockLeft) => {\r\n this.blocked = blockLeft;\r\n }\r\n )\r\n );\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n subscribePaused() {\r\n this.subscriptions.push(\r\n this.danmuFacade.paused$.subscribe(paused => {\r\n if (paused) {\r\n this.onPaused();\r\n }\r\n if (paused === 0) {\r\n this.onPlay();\r\n }\r\n })\r\n );\r\n }\r\n\r\n // getFontSize() {\r\n // this.subscriptions.push(\r\n // this.danmuFacade.fontSize$.pipe(take(1)).subscribe(\r\n // fontSize => {\r\n // switch (fontSize) {\r\n // case 0:\r\n // this.fontSize = 14;\r\n // break;\r\n // case 1:\r\n // this.fontSize = 18;\r\n // break;\r\n // case 2:\r\n // this.fontSize = 22;\r\n // break;\r\n // case 3:\r\n // this.fontSize = 26;\r\n // break;\r\n // case 4:\r\n // this.fontSize = 30;\r\n // break;\r\n // default:\r\n // this.fontSize = 18;\r\n // }\r\n // }\r\n // )\r\n // );\r\n // }\r\n\r\n // getOpacity() {\r\n // this.subscriptions.push(\r\n // this.danmuFacade.opacity$.pipe(take(1)).subscribe(\r\n // opacity => {\r\n // switch (opacity) {\r\n // case 0:\r\n // this.opacity = 10;\r\n // break;\r\n // case 1:\r\n // this.opacity = 25;\r\n // break;\r\n // case 2:\r\n // this.opacity = 50;\r\n // break;\r\n // case 3:\r\n // this.opacity = 75;\r\n // break;\r\n // case 4:\r\n // this.opacity = 100;\r\n // break;\r\n // default:\r\n // this.opacity = 100;\r\n // }\r\n // }\r\n // )\r\n // );\r\n // }\r\n\r\n // getFontFamily() {\r\n // this.subscriptions.push(\r\n\r\n // this.danmuFacade.fontFamily$.subscribe(value => {\r\n // this.fontFamily = value;\r\n // }),\r\n // );\r\n // }\r\n\r\n\r\n\r\n @HostListener(\"click\", ['$event'])\r\n shouldShowMenu(event) {\r\n if (!!event.target) {\r\n if (event.target.id === 'avatar-img' || event.target.id === 'bullet-link') {\r\n return;\r\n }\r\n }\r\n event.preventDefault();\r\n this.showMenu = true;\r\n }\r\n /*\r\n ** 发射\r\n */\r\n shot(index) {\r\n\r\n this.hidden = false;\r\n if (this.bullet.position === BarrelType.Barrel) {\r\n this.top = (index) * this.barrelHeight + 35;\r\n } else {\r\n\r\n if (this.bullet.position === BarrelType.FixBottom) {\r\n this.top = 70 + (index) * this.barrelHeight;\r\n }\r\n else {\r\n this.top = (index) * this.barrelHeight + 10;\r\n }\r\n }\r\n\r\n if ((this.bullet.position === BarrelType.FixTop) || (this.bullet.position === BarrelType.FixBottom)) {\r\n this.duration = 4200;\r\n }\r\n if (this.bullet.position === BarrelType.Barrel) {\r\n let pos = -this.speed * this.bullet.offset;\r\n let totalWidth = this.canvasWidth + this.width;\r\n this.factory = this.builder.build([\r\n style({ transform: `translateX(${pos}px) translateY(0) translateZ(0)` }),\r\n animate(this.duration - this.bullet.offset, style({ transform: 'translateX(-' + (totalWidth) + 'px) translateY(0) translateZ(0)' })),\r\n ]);\r\n // console.log(pos,this.speed)\r\n } else {\r\n this.factory = this.builder.build([\r\n style({ transform: 'translateX(-50%) translateY(0) translateZ(0)' }),\r\n animate(this.duration, style({ transform: 'translateX(-50%) translateY(0) translateZ(0)' }))\r\n ]);\r\n }\r\n this.createPlayerAndBindEvent();\r\n\r\n this.barrelIndex = index;\r\n this.startTime = Date.now();\r\n\r\n\r\n\r\n if (!!this.player)\r\n {\r\n if(!this.danmuFacade.isPaused)\r\n {\r\n this.player.play();\r\n }\r\n else\r\n {\r\n this.player.init();\r\n }\r\n }\r\n \r\n\r\n\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n /*\r\n ** 删除弹幕\r\n */\r\n removeDanmu() {\r\n this.player.finish();\r\n this.danmuFacade.removeDanmu({ id: this.bullet.guid, user: null });\r\n }\r\n\r\n /*\r\n ** 举报弹幕\r\n */\r\n reportDanmu(id) {\r\n window.dispatchEvent(new CustomEvent(\"quitVideoFullScreenIfany\"))\r\n if (!this.userId) {\r\n this.dialogService.open('login-required-dialog');\r\n } else {\r\n this.dialogService.open('reportDanmu', { size: { width: 280, height: 270 }, id });\r\n }\r\n }\r\n\r\n // 点赞弹幕\r\n likeDanmu(id) {\r\n if (!this.userId) {\r\n this.dialogService.open('login-required-dialog');\r\n } else {\r\n this._danmuService.likeDanmu(id).subscribe(\r\n res => {\r\n if (res.code !== 401) {\r\n this.bullet.isLike = res[0].isExist;\r\n this.bullet.good = res[0].number;\r\n }\r\n }\r\n );\r\n }\r\n }\r\n\r\n // +1弹幕,发同样的弹幕\r\n sendSameDanmu(bullet) {\r\n if (!this.userId) {\r\n this.dialogService.open('login-required-dialog');\r\n } else {\r\n if (this.isCopiedSent) {\r\n return;\r\n }\r\n this.isCopiedSent = true;\r\n if (bullet.contxt !== '') {\r\n const copiedText = bullet.contxt;\r\n const datePipe = new DatePipe('en-US');\r\n let t = this.danmuFacade.currentTime;\r\n if (t !== 0) {\r\n this.danmuFacade.sendDanmu({\r\n second: t,\r\n published: datePipe.transform(new Date, 'MM-dd'),\r\n font: 0,\r\n color: '#ffffff',\r\n style: 0,\r\n contxt: copiedText,\r\n type: 0,\r\n user: this.userId,\r\n uniqueKey: bullet.lid + '_' + bullet.vid,\r\n position: 0,\r\n addTime: new Date(new Date().toString().split('GMT')[0] + ' UTC').toISOString().split('.')[0]\r\n });\r\n };\r\n }\r\n }\r\n }\r\n\r\n // 展示弹幕广告\r\n adsDanmuShowed() {\r\n if (this.bullet.link) {\r\n this._videoService.sendWatched(this.bullet.link.replace(\"/c/c\", \"/c/d\").replace(\"http:\", \"https:\"));\r\n }\r\n }\r\n\r\n openedFudaiList = [];\r\n // 获取已开启的福袋\r\n readOpenedFudaiList() {\r\n this._danmuService.openedFudai$.subscribe(list => {\r\n // console.log(list);\r\n this.openedFudaiList = list;\r\n const hasOpened = this.openedFudaiList.filter(s => s.fudai_id === this.bullet.orderID);\r\n if (hasOpened.length > 0) {\r\n this.bullet.isClicked = true;\r\n }\r\n });\r\n }\r\n\r\n gainedCoins = 3;\r\n // 打开福袋送金币\r\n openFudai() {\r\n if (!this.user || !this.user.id) {\r\n console.log(this.user);\r\n this.dialogService.open('login-required-dialog');\r\n } else {\r\n if (this.bullet.isClicked) {\r\n // this._messageDialogService.setState({ message: '您已经领取过了' });\r\n this.dialogService.open('message-dialog',{ message: '您已经领取过了' });\r\n return;\r\n }\r\n this._danmuService.openDanmuFudai(this.bullet.orderID).subscribe(\r\n res => {\r\n if (res.code !== 401) {\r\n // console.log(res);\r\n this.bullet.isClicked = true;\r\n this.gainedCoins = res[0].coin;\r\n // 缓存已开启的福袋id\r\n this.openedFudaiList.push({\r\n fudai_id: this.bullet.orderID,\r\n fudai_opened: this.bullet.isClicked,\r\n });\r\n this._danmuService.storeOpenedDanmuFudai(this.openedFudaiList);\r\n // 提示动画\r\n this.onFudaiOpened.emit({\r\n isAds: true,\r\n nickName: this.bullet.nickName,\r\n gainedCoins: this.gainedCoins,\r\n });\r\n // const tip = (this.fudaiOpened.nativeElement as HTMLElement);\r\n // tip.classList.remove('run-animation');\r\n // setTimeout(() => {\r\n // tip.classList.add('run-animation');\r\n // }, 10);\r\n }\r\n }\r\n );\r\n }\r\n }\r\n}\r\n\r\n\r\nexport class BulletState {\r\n event: BulletEvent;\r\n object: any;\r\n}\r\n\r\nexport enum BulletEvent {\r\n Bullet_Loaded, ///trigger when bullet loaded\r\n Bullet_Out, /// trigger when bullet is in front of guy\r\n Bullet_End,\r\n}","export class Barrel {\r\n id: number;\r\n stacks: number;\r\n speed: number; ///上一颗子弹的速度\r\n size: number; ///上一颗子弹的大小\r\n start: number; ///上一颗子弹开始时间\r\n duration:number; ///上一颗子弹存在时间\r\n canvasSize:number; ///路程\r\n //bullets:Array<{speed:number,end:number,guid:string}>; ///子弹位置\r\n}\r\n\r\n\r\n\r\nexport class BarrelManager {\r\n barrels: Array = [];\r\n maxBarrels = 13;\r\n preNextBarrels:Function\r\n\r\n constructor(max)\r\n {\r\n this.maxBarrels = max;\r\n }\r\n\r\n count() {\r\n const arr = this.getBarrelArray();\r\n // console.log(this.barrels);\r\n return arr.length;\r\n }\r\n\r\n freeBarrels() {\r\n const arr = this.getBarrelArray();\r\n return arr.filter(barrel => barrel.stacks === 0).length;\r\n }\r\n\r\n clearBarrels()\r\n {\r\n this.barrels.forEach(p=>{\r\n p.duration = 0;\r\n p.speed = 0;\r\n p.size = 0;\r\n p.duration = 0;\r\n p.stacks =0;\r\n // p.bullets = [];\r\n })\r\n }\r\n newBallel() {\r\n const newBallel = {\r\n id: this.count() + 1,\r\n stacks: 0,\r\n speed:0,\r\n size:0,\r\n start:0,\r\n duration:0,\r\n canvasSize:0,\r\n bullets:[]\r\n };\r\n const arr = this.getBarrelArray();\r\n arr.push(newBallel);\r\n }\r\n\r\n reCalculateSpeed(canvasSize)\r\n {\r\n\r\n this.barrels.forEach(p=>{\r\n p.speed = (canvasSize + p.size)/p.duration;\r\n })\r\n }\r\n releaseBaller(id,guid) {\r\n const arr = this.getBarrelArray();\r\n // console.log(arr.length,id)\r\n if(arr.length >= id)\r\n {\r\n arr[id - 1].stacks = arr[id - 1].stacks - 1;\r\n //arr[id - 1].bullets = arr[id - 1].bullets.filter(p=>p.guid != guid);\r\n if (arr[id - 1].stacks < 0 ) {\r\n console.error('error',id);\r\n }\r\n }\r\n\r\n \r\n \r\n }\r\n\r\n /*\r\n ** 重设管道\r\n */\r\n resetBaller(size)\r\n {\r\n this.barrels = this.barrels.slice(0,size);\r\n this.maxBarrels = size;\r\n }\r\n occupyBaller(id) {\r\n const arr = this.getBarrelArray();\r\n arr[id - 1].stacks = arr[id - 1].stacks + 1;\r\n return arr[id - 1].stacks;\r\n }\r\n\r\n getfreeBarrels() {\r\n const arr = this.getBarrelArray();\r\n return arr.filter(barrel => barrel.stacks === 0);\r\n }\r\n\r\n nextBarrel() {\r\n \r\n const count = this.count();\r\n const Max = this.getMaxStacks();\r\n\r\n // 首次出现的弹幕\r\n if (count === 0) {\r\n this.newBallel();\r\n return 1;\r\n }\r\n\r\n // 有空闲的弹道\r\n const freeBarrels = this.getfreeBarrels();\r\n if (freeBarrels.length > 0) {\r\n return freeBarrels[0].id;\r\n }\r\n\r\n // 没有空闲的弹道,但是还可以添加弹道\r\n if (freeBarrels.length === 0 && count < Max) {\r\n this.newBallel();\r\n const aa = this.count();\r\n return aa;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getBarrelArray() {\r\n return this.barrels;\r\n }\r\n\r\n getMaxStacks() {\r\n return this.maxBarrels;\r\n }\r\n}\r\n","import { EventEmitter, Injectable, OnDestroy } from \"@angular/core\";\r\nimport { timer, Unsubscribable } from \"rxjs\";\r\nimport { BarrelManager } from \"./barrels\";\r\nimport { BarrelType, Bullet } from \"./bullet\";\r\n\r\nclass BulletState {\r\n bullet: Bullet;\r\n speed: number;\r\n size: number; ///子弹大小\r\n guid: string;\r\n duration: number;\r\n canvasSize: number; //路程\r\n}\r\n\r\n\r\n/*\r\n** 弹幕调度服务\r\n*/\r\n@Injectable()\r\nexport class DanmuService implements OnDestroy {\r\n flying: BarrelManager;\r\n fixTop: BarrelManager;\r\n fixBottom: BarrelManager;\r\n pendingBullet: Array = [];\r\n private subscriptions: Array = [];\r\n onSchedule: EventEmitter = new EventEmitter();\r\n\r\n\r\n constructor() {\r\n this.flying = new BarrelManager(13);\r\n this.fixTop = new BarrelManager(10);\r\n this.fixBottom = new BarrelManager(3);\r\n this.initSignal();\r\n }\r\n\r\n private initSignal() {\r\n let running = false;\r\n this.subscriptions.push(timer(0, 100).subscribe(p => {\r\n if (!running) {\r\n running = true;\r\n this.firePendingIfPossible();\r\n }\r\n running = false;\r\n }))\r\n }\r\n\r\n /*\r\n ** 发射子弹\r\n */\r\n private shotBullet(manager: BarrelManager, barrelIndex: number, state: BulletState) {\r\n\r\n if (barrelIndex != null) ///如果当前没有合适的弹道,则在下一次调度中执行\r\n {\r\n let dataIndex = barrelIndex - 1;\r\n manager.occupyBaller(barrelIndex);\r\n manager.barrels[dataIndex].size = state.size;\r\n manager.barrels[dataIndex].start = Date.now();\r\n manager.barrels[dataIndex].duration = state.duration;\r\n manager.barrels[dataIndex].canvasSize = state.canvasSize;\r\n manager.barrels[dataIndex].speed = state.speed;\r\n\r\n if (state.bullet.offset != 0) {\r\n manager.barrels[dataIndex].start -= state.bullet.offset;\r\n }\r\n \r\n this.onSchedule.emit({\r\n event: ScheduleEvent.Bullet_Shot,\r\n object: {\r\n bullet: state.bullet,\r\n index: barrelIndex\r\n }\r\n });\r\n // console.log(\"ok\",state)\r\n this.pendingBullet = this.pendingBullet.filter(p => p.guid != state.guid);\r\n }\r\n else {\r\n //console.log(\"not ok\",state,this.pendingBullet)\r\n if (state.bullet.offset != 0) ///预设位置调度失败,同屏显示,是不可能的。暂时是不显示\r\n {\r\n this.recycleBullet(state);\r\n }\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /*\r\n ** 简单调度\r\n */\r\n private fixHandler(barrels: BarrelManager, pendingBullet: Array) {\r\n for (let i = 0; i < pendingBullet.length; ++i) {\r\n let state = pendingBullet[i];\r\n let barrelIndex = barrels.nextBarrel();;\r\n if (!this.shotBullet(barrels, barrelIndex, state)) {\r\n break;\r\n }\r\n\r\n }\r\n }\r\n\r\n ///计算预设位置,是否重叠。\r\n // private isOverlap(state:BulletState,barrel:Barrel)\r\n // {\r\n // let result = false;\r\n // if (state.bullet.offset != 0 && barrel.bullets.length>0) { \r\n // let posOffset = state.speed * state.bullet.offset ;\r\n // // let maxStart = Math.max(...barrel.bullets.map(p=>p.start));\r\n // let minEnd = Math.min(...barrel.bullets.map(p=>p.end));\r\n // if(posOffset > minEnd)\r\n // {\r\n // result = true;\r\n // }\r\n\r\n // } \r\n // return result;\r\n // }\r\n /*\r\n ** 先选取可用通道,再添加通道\r\n */\r\n private smartHandler(barrels: BarrelManager, pendingBullet: Array) {\r\n //console.log(\"smart\",pendingBullet)\r\n let pass = false;\r\n for (let i = 0; i < pendingBullet.length; ++i) {\r\n let state = pendingBullet[i];\r\n let barrelIndex = null;\r\n\r\n if (!pass) {\r\n let dateNow = Date.now();\r\n for (let j = 0; j < barrels.barrels.length; ++j) {\r\n let barrel = barrels.barrels[j];\r\n let offset = dateNow - barrel.start;\r\n let totalRun = offset * barrel.speed;\r\n //console.log(\"totalRun\",totalRun,barrel)\r\n\r\n if (totalRun <= barrel.size) ///如果之前的弹幕还未完整出现,则先计算下一条\r\n {\r\n continue;\r\n }\r\n\r\n // if (state.bullet.offset != 0 && this.isOverlap(state,barrel)) { \r\n // break;\r\n // } \r\n let left = totalRun - barrel.size - state.bullet.offset * state.speed;\r\n if (left < 0) ///已经相遇了\r\n {\r\n continue;\r\n }\r\n if (barrel.speed >= state.speed)///而新加的弹幕比之前的速度慢\r\n {\r\n //console.log(\"speed\",state)\r\n barrelIndex = j + 1;\r\n break;\r\n }\r\n else ///如果速度比之前的快,则计算是否会相撞\r\n {\r\n \r\n let crashTime = left / (state.speed - barrel.speed);\r\n if (crashTime > (barrel.duration - offset)) {\r\n barrelIndex = j + 1;\r\n break;\r\n }\r\n }\r\n\r\n }\r\n\r\n if (barrelIndex == null)\r\n {\r\n pass = state.bullet.offset == 0;\r\n }\r\n } //这里确保先进先出 || 如果有预设位置,则先保证能显示\r\n\r\n if (barrelIndex == null) {\r\n barrelIndex = barrels.nextBarrel();\r\n }\r\n //console.log(\"shot\",barrelIndex,state)\r\n if (!this.shotBullet(barrels, barrelIndex, state)\r\n && state.bullet.offset == 0) {\r\n break;\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n /*\r\n ** 调度算法\r\n */\r\n private firePendingIfPossible() {\r\n\r\n this.smartHandler(this.flying, this.pendingBullet.filter(p => p.bullet.position == BarrelType.Barrel))\r\n this.fixHandler(this.fixBottom, this.pendingBullet.filter(p => p.bullet.position == BarrelType.FixBottom));\r\n this.fixHandler(this.fixTop, this.pendingBullet.filter(p => p.bullet.position == BarrelType.FixTop))\r\n }\r\n\r\n\r\n\r\n private tryGetBarrels(bullet: Bullet): BarrelManager {\r\n switch (bullet.position) {\r\n case BarrelType.Barrel:\r\n return this.flying;\r\n case BarrelType.FixTop:\r\n return this.fixTop;\r\n case BarrelType.FixBottom:\r\n return this.fixBottom;\r\n }\r\n }\r\n\r\n ///外部调用\r\n public execute() {\r\n this.firePendingIfPossible();\r\n }\r\n\r\n resetBarrel(size: number) {\r\n this.flying.resetBaller(size)\r\n }\r\n /*\r\n ** 这里需要清空数据\r\n */\r\n ngOnDestroy(): void {\r\n this.subscriptions.forEach(p => p.unsubscribe());\r\n }\r\n\r\n /*\r\n ** 成功加载一条弹幕\r\n */\r\n loadBullet(object: BulletState) {\r\n // if(object.bullet.contxt.indexOf(\"温馨提醒\")>-1)\r\n // {\r\n // console.log(\"load\",object)\r\n // }\r\n this.pendingBullet.push(object);\r\n }\r\n\r\n /*\r\n ** 回收子弹\r\n */\r\n private recycleBullet(object: BulletState) {\r\n this.pendingBullet = this.pendingBullet.filter(p => p.guid != object.guid);\r\n this.onSchedule.emit({\r\n event: ScheduleEvent.Bullet_Recycle,\r\n object: {\r\n bullet: object.bullet,\r\n index: -1\r\n }\r\n });\r\n }\r\n /*\r\n ** 清空所有等发射的子弹和弹道\r\n */\r\n freeBarrelsAndBullet() {\r\n this.freeBullet();\r\n this.flying.clearBarrels();\r\n this.fixBottom.clearBarrels();\r\n this.fixTop.clearBarrels();\r\n }\r\n\r\n /*\r\n ** 尺寸改变,导致速度变化,更新最后一个子弹的速度,让之后调度不会出错,\r\n ** 尺寸改变,导致速度改变,相撞时间也会变化\r\n */\r\n reCalculateSpeed(canvasSize) {\r\n this.flying.reCalculateSpeed(canvasSize);\r\n }\r\n /*\r\n ** 清空所有等待发射的子弹\r\n */\r\n freeBullet() {\r\n // console.log(\"free bullet\")\r\n this.pendingBullet = [];\r\n }\r\n /*\r\n ** 停止调度\r\n */\r\n stopAddNew() {\r\n this.subscriptions.forEach(p => p.unsubscribe());\r\n this.subscriptions = [];\r\n }\r\n /*\r\n ** 开始一个新调度\r\n */\r\n startAddNew() {\r\n this.stopAddNew();\r\n this.initSignal();\r\n }\r\n\r\n\r\n /*\r\n ** 子弹发射完成\r\n ** {\r\n bullet:{guid:},\r\n index:0\r\n }\r\n */\r\n onBulletEnd(data) {\r\n\r\n if (!!data.index) {\r\n this.tryGetBarrels(data.bullet).releaseBaller(data.index, data.bullet.guid);\r\n }\r\n }\r\n}\r\n\r\nexport class ScheduleState {\r\n object: any;\r\n event: ScheduleEvent;\r\n}\r\n\r\nexport enum ScheduleEvent {\r\n Bullet_Shot,\r\n Bullet_SpeedUP,\r\n Bullet_Recycle\r\n}","
\r\n
\r\n \r\n {{ openedFudai.nickName }}送您{{ openedFudai.gainedCoins }}金币\r\n
\r\n","import {\r\n Component,\r\n ViewChild,\r\n ViewContainerRef,\r\n ComponentFactoryResolver,\r\n ComponentRef,\r\n OnInit, Input, ElementRef, OnDestroy,\r\n OnChanges, SimpleChanges, HostBinding, HostListener, AfterViewInit, ComponentFactory\r\n} from '@angular/core';\r\nimport { VgAPI } from '../core/services/vg-api';\r\nimport { combineLatest, fromEvent, Unsubscribable } from 'rxjs';\r\nimport { DanmuFacade } from '../../danmu/danmu.facade';\r\nimport { BulletComponent, BulletEvent, BulletState } from './bullet/bullet.component';\r\nimport { Utility } from '../../../_service/utility';\r\nimport { UserService } from '../../../_service/user/user.service';\r\nimport { DanmuActionTypes } from '../../danmu/danmu.action';\r\nimport { DanmuService, ScheduleEvent, ScheduleState } from './danmu.service';\r\nimport { Bullet } from './bullet';\r\nimport { BulletStyleService } from '../../danmu/bullet.style.service';\r\nimport { WindowService } from '../../../_service/screen-size.service';\r\n\r\n@Component({\r\n selector: 'vg-overlay-danmu',\r\n templateUrl: './vg-overlay-danmu.html',\r\n styleUrls: ['./vg-overlay-danmu.scss'],\r\n providers: [DanmuService]\r\n})\r\n\r\n\r\n\r\n// tslint:disable-next-line:component-class-suffix\r\nexport class VgOverlayDanmu implements OnInit, OnDestroy, OnChanges, AfterViewInit {\r\n @Input() vgFor: string;\r\n @Input() isPlayingAds = false;\r\n\r\n // @Input()\r\n // isFloatPlayer = false;\r\n\r\n elem: HTMLElement;\r\n target: any;\r\n\r\n subscriptions: Array = [];\r\n // api: VgAPI;\r\n track: TextTrack;\r\n danmuku = [];\r\n bullets = [];\r\n componentRefs: Array = [];\r\n showDanmu = true;\r\n user: any = {\r\n id: 0\r\n };\r\n last = 0;\r\n\r\n @Input()\r\n isLive = false;\r\n //allLoadedDanmuList = [];\r\n\r\n @ViewChild('danmu', { read: ViewContainerRef }) entry: ViewContainerRef;\r\n @HostBinding('style.opacity') opacity = 1;\r\n @HostBinding('style.font-size') fontSize = \"18px\";\r\n @HostBinding('style.font-family') fontFamily = \"SimSun, 新宋体\";\r\n\r\n @Input() adsDanmus = [];\r\n @ViewChild('fudaiOpened') fudaiOpened: ElementRef;\r\n openedFudai: any = {\r\n isAds: false,\r\n nickName: '',\r\n gainedCoins: 0,\r\n };\r\n constructor(\r\n private ref: ElementRef,\r\n public API: VgAPI,\r\n private resolver: ComponentFactoryResolver,\r\n private danmuFacade: DanmuFacade,\r\n private _userService: UserService,\r\n private _utility: Utility,\r\n private _danmuService: DanmuService,\r\n private _bullstStyle: BulletStyleService,\r\n private _window: WindowService\r\n ) {\r\n this.elem = this.ref.nativeElement;\r\n }\r\n ngAfterViewInit(): void {\r\n\r\n\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"isPlayingAds\"]) {\r\n this.sysHidden = changes[\"isPlayingAds\"].currentValue;\r\n this.showOrHideBullet();\r\n }\r\n\r\n if (changes[\"adsDanmus\"] && !changes[\"adsDanmus\"].firstChange) {\r\n // 广告弹幕重载后\r\n this.subscriptions.push(\r\n this.danmuFacade.list$.subscribe(items => {\r\n // 将弹幕广告加入\r\n if (this.adsDanmus.length > 0) {\r\n items = items.concat(this.adsDanmus);\r\n }\r\n // console.log(items);\r\n if(this.isLive)\r\n {\r\n let newBullets= items.filter(p=>{\r\n return this.list.findIndex(d=>d.guid == p.guid) == -1\r\n });\r\n this.list = items;\r\n if(this.danmuFacade.isPaused )\r\n {\r\n return;\r\n }\r\n if(this.hidden)\r\n {\r\n return;\r\n }\r\n this.onCueChange(newBullets, newBullets.length > 12 ? 0.5 : 1);\r\n // console.log(newBullets)\r\n }\r\n else\r\n {\r\n this.list = items;\r\n }\r\n }),\r\n );\r\n }\r\n }\r\n\r\n readState() {\r\n // const allState = this.store.getState();\r\n // const userState: UsersState = allState['users'] as UsersState;\r\n // this.user = new User(true);\r\n // Object.assign(this.user, userState.currentUser);\r\n }\r\n get hidden() {\r\n return this.userHidden || this.sysHidden\r\n };\r\n\r\n private userHidden = false; /// 用户点击隐藏\r\n private sysHidden = false; /// 系统隐藏\r\n\r\n\r\n /*\r\n ** 给一个非固定时间\r\n */\r\n randomDuration(duration) {\r\n return duration * (Math.floor(Math.random() * 30) + 86) / 100;\r\n }\r\n userDefineDuration = 10000; ///获取用户设置的速度\r\n\r\n\r\n\r\n /*\r\n **\r\n ** 生成或使用现有的子弹 \r\n */\r\n private getOCreateBullet(bullet) {\r\n if(!this.entry)\r\n {\r\n return;\r\n }\r\n let freeBullet = this.componentRefs.find(p => p.isFree == true);\r\n if (freeBullet == null) {\r\n this.componentRefs.push({\r\n guid: bullet.guid,\r\n compnent: this.createBullet(bullet),\r\n isFree: false,\r\n isFire: false,\r\n bullet: bullet\r\n })\r\n }\r\n else {\r\n freeBullet.isFree = false;\r\n freeBullet.isFire = false;\r\n freeBullet.guid = bullet.guid;\r\n freeBullet.bullet = bullet;\r\n freeBullet.compnent.instance.duration = bullet.duration; //this.randomDuration(this.userDefineDuration);\r\n freeBullet.compnent.instance.canvasWidth = this.canvasWidth;\r\n freeBullet.compnent.instance.reload(bullet);\r\n }\r\n }\r\n currentSize = 0;\r\n ngOnInit() {\r\n this.user = this._userService.user;\r\n this.fontFamily = this._bullstStyle.fontList.filter(p => p.isDefault)[0];\r\n if (this.API.isPlayerReady) {\r\n this.onPlayerReady();\r\n } else {\r\n this.subscriptions.push(this.API.playerReadyEvent.subscribe(() => {\r\n this.onPlayerReady();\r\n }));\r\n }\r\n\r\n this.subscriptions.push(\r\n\r\n this._window.size$.subscribe(p => {\r\n if (this.currentSize != 0) {\r\n this.onchangeSize(p);\r\n }\r\n this.currentSize = p;\r\n this._danmuService.resetBarrel(this.currentSize < 3 ? 8 : 13)\r\n }),\r\n this.danmuFacade.speed$\r\n .subscribe(speed => {\r\n let d = 15000;\r\n switch (speed) {\r\n case 0:\r\n d = 17000;\r\n break;\r\n case 1:\r\n d = 14500;\r\n break;\r\n case 2:\r\n d = 12000;\r\n break;\r\n case 3:\r\n d = 9500;\r\n break;\r\n case 4:\r\n d = 7000;\r\n break;\r\n default:\r\n d = 15000;\r\n }\r\n this.userDefineDuration = d;\r\n\r\n }),\r\n this.danmuFacade.fontFamily$.subscribe(value => {\r\n let fontIndex = this._bullstStyle.fontList.findIndex(p => p.value == value)\r\n if (fontIndex > -1)\r\n this.fontFamily = this._bullstStyle.fontList[fontIndex][\"font-family\"];\r\n }),\r\n this.danmuFacade.showDanmu$.subscribe(showDanmu => {\r\n this.showDanmu = showDanmu;\r\n }),\r\n this._danmuService.onSchedule.subscribe((state: ScheduleState) => {\r\n switch (state.event) {\r\n case ScheduleEvent.Bullet_Shot: ///子弹上膛\r\n let componentRef = this.componentRefs.find(c => c.guid.toString() === state.object.bullet.guid);\r\n if (componentRef != null) {\r\n componentRef.compnent.instance.shot(state.object.index);\r\n componentRef.isFire = true;\r\n }\r\n break;\r\n case ScheduleEvent.Bullet_Recycle:\r\n // console.log(\"Bullet_Recycle\",state)\r\n let index = this.componentRefs.findIndex(p => p.guid == state.object.bullet.guid);\r\n this.componentRefs[index].isFree = true;\r\n this.componentRefs[index].isFire = false;\r\n break;\r\n\r\n }\r\n }),\r\n\r\n this.danmuFacade.opacity$.subscribe(opacity => {\r\n switch (opacity) {\r\n case 0:\r\n this.opacity = 0.1;\r\n break;\r\n case 1:\r\n this.opacity = .25;\r\n break;\r\n case 2:\r\n this.opacity = .50;\r\n break;\r\n case 3:\r\n this.opacity = .75;\r\n break;\r\n case 4:\r\n this.opacity = 1;\r\n break;\r\n default:\r\n this.opacity = 1;\r\n }\r\n }\r\n ),\r\n this.danmuFacade.fontSize$.subscribe(\r\n fontSize => {\r\n switch (fontSize) {\r\n case 0:\r\n this.fontSize = \"14px\";\r\n break;\r\n case 1:\r\n this.fontSize = \"18px\";\r\n break;\r\n case 2:\r\n this.fontSize = \"22px\";\r\n break;\r\n case 3:\r\n this.fontSize = \"26px\";\r\n break;\r\n case 4:\r\n this.fontSize = \"30px\";\r\n break;\r\n default:\r\n this.fontSize = \"18px\";\r\n }\r\n }\r\n ),\r\n\r\n this.danmuFacade.showDanmu$.subscribe(\r\n (show) => {\r\n this.userHidden = !show;\r\n this.showOrHideBullet();\r\n }\r\n ),\r\n\r\n this.danmuFacade.list$.subscribe(items => {\r\n // 将弹幕广告加入\r\n if (this.adsDanmus.length > 0) {\r\n items = items.concat(this.adsDanmus);\r\n }\r\n // console.log(items);\r\n if(this.isLive)\r\n {\r\n let newBullets= items.filter(p=>{\r\n return this.list.findIndex(d=>d.guid == p.guid) == -1\r\n });\r\n this.list = items;\r\n if(this.danmuFacade.isPaused )\r\n {\r\n return;\r\n }\r\n if(this.hidden)\r\n {\r\n return;\r\n }\r\n this.onCueChange(newBullets, newBullets.length > 12 ? 0.5 : 1);\r\n // console.log(newBullets)\r\n }\r\n else\r\n {\r\n this.list = items;\r\n }\r\n\r\n \r\n\r\n\r\n\r\n \r\n }),\r\n\r\n this._utility\r\n .GetOrCreateSubscript(DanmuActionTypes.DANMU_SEND)\r\n .subscribe(item => { ////自己发送的弹幕,直接显示\r\n this.onCueChange([item], 1);\r\n }),\r\n\r\n this.danmuFacade.setCurrentTime$.subscribe(p => {\r\n this.API.currentTime = p;\r\n this.lastTime = p;\r\n }),\r\n\r\n this.danmuFacade.DanmuKey$.subscribe(p => { ///播放新视频\r\n this.clearCue();\r\n }),\r\n\r\n fromEvent(document, \"fullscreenchange\").subscribe(p => {\r\n if (this.userClicked) {\r\n this.onchangeSize();\r\n }\r\n }),\r\n\r\n combineLatest([this.danmuFacade.keywordFilter$, this.danmuFacade.userFilter$])\r\n .subscribe((filter) => {///用户添加过滤词\r\n this.filters = filter;\r\n if (this.userClicked) {\r\n // console.log(this.filters,this.componentRefs)\r\n this.componentRefs\r\n .filter(p => p.isFire)\r\n .filter(p => this.danmuFacade.containKeywordFilter(this.filters[0], p.bullet) ||\r\n this.danmuFacade.containUserFilter(this.filters[1], p.bullet)\r\n ).forEach(p => {\r\n //console.log(\"aaa\")\r\n p.compnent.instance.userFilterd = true;\r\n })\r\n //this.componentRefs.filter(p=>p.bullet.)\r\n }\r\n }),\r\n\r\n\r\n\r\n );\r\n\r\n }\r\n\r\n\r\n private showOrHideBullet() {\r\n this.componentRefs.forEach(p => p.compnent.instance.sysHidden = this.hidden);\r\n }\r\n timeoutChangeSize = null;\r\n list: Array = [];\r\n\r\n\r\n\r\n onPlayerReady() {\r\n\r\n this.target = this.API.getMediaById(this.vgFor);\r\n if (!!this.target) {\r\n this.subscriptions.push(\r\n this.target.subscriptions.timeUpdate.subscribe(this.onTimeUpdate.bind(this))\r\n );\r\n this.subscriptions.push(\r\n this.target.subscriptions.pause.subscribe(this.onPause.bind(this))\r\n );\r\n this.subscriptions.push(\r\n this.target.subscriptions.play.subscribe(this.onPlay.bind(this))\r\n );\r\n this.subscriptions.push(\r\n this.target.subscriptions.seeked.subscribe(this.onSeeked.bind(this)),\r\n );\r\n }\r\n\r\n\r\n\r\n }\r\n\r\n filters = [[], []];\r\n\r\n\r\n\r\n clearCue() {\r\n\r\n this._danmuService.freeBarrelsAndBullet();\r\n this.componentRefs.forEach(componentRef => { ///让正在发射的子弹,结束动画\r\n componentRef.compnent.instance.finish();\r\n componentRef.isFire = false;\r\n componentRef.isFree = true;\r\n });\r\n\r\n }\r\n\r\n\r\n /*\r\n ** list:需要显示的弹幕,\r\n ** durationRatio:如果弹幕较多,则加快\r\n ** calculatePos:是否计算位置\r\n */\r\n onCueChange(list: Array, durationRatio, currentTime = 0) {\r\n if (this.isPlayingAds) {\r\n return;\r\n }\r\n\r\n let bullet: Bullet;\r\n for (let i = 0; i < list.length; i++) {\r\n bullet = list[i];\r\n if (!this.danmuFacade.containKeywordFilter(this.filters[0], bullet)\r\n && !this.danmuFacade.containUserFilter(this.filters[1], bullet)\r\n ) {\r\n\r\n if (currentTime > 0 && bullet.position == 0) {\r\n bullet.offset = (currentTime - bullet.second) * 1000;\r\n }\r\n else {\r\n bullet.offset = 0;\r\n }\r\n bullet.duration = this.randomDuration(this.userDefineDuration) * (bullet.position == 0 ? durationRatio : 1); /// 为滚动弹幕时应用\r\n\r\n if (bullet.duration - bullet.offset > 0 || bullet.position != 0)\r\n this.getOCreateBullet(bullet);\r\n }\r\n }\r\n\r\n\r\n }\r\n\r\n\r\n lastTime = 0;\r\n\r\n onTimeUpdate($event: any) {\r\n // console.log('onTimeUpdate', this.list);\r\n let currentTime = $event.target.currentTime;\r\n if (this._utility.isDocumentVisible\r\n && !this.hidden) {\r\n\r\n\r\n this.danmuFacade.currentTime = currentTime;\r\n\r\n if (this.isLive) {\r\n return;\r\n }\r\n if (\r\n currentTime > this.lastTime &&\r\n currentTime - this.lastTime <= 2\r\n ) ///最多2秒的弹幕 显示\r\n {\r\n let howManyOn2Second = this.list.filter(p => p.second > this.lastTime && p.second <= this.lastTime + 2);\r\n let list = howManyOn2Second.filter(p => p.second <= currentTime);\r\n this.onCueChange(list, howManyOn2Second.length > 12 ? 0.5 : 1);\r\n }\r\n\r\n }\r\n //console.log(currentTime,this.lastTime)\r\n this.lastTime = currentTime;\r\n\r\n }\r\n factory: ComponentFactory = null;\r\n\r\n createBullet(bullet) {\r\n\r\n if (null == this.factory)\r\n this.factory = this.resolver.resolveComponentFactory(BulletComponent);\r\n const componentRef = this.entry.createComponent(this.factory);\r\n (componentRef.location.nativeElement as HTMLElement).classList.add(\"bullet\");\r\n componentRef.instance.bullet = bullet;\r\n componentRef.instance.duration = bullet.duration;\r\n componentRef.instance.userId = this._userService.user.id;\r\n componentRef.instance.canvasWidth = this.canvasWidth;\r\n componentRef.instance.onBulletEvent.subscribe(this.bulletHandler.bind(this));\r\n componentRef.instance.onFudaiOpened.subscribe(r => {\r\n this.openedFudai = r;\r\n setTimeout(() => {\r\n const tip = (this.fudaiOpened.nativeElement as HTMLElement);\r\n tip.classList.remove('run-animation');\r\n setTimeout(() => {\r\n tip.classList.add('run-animation');\r\n }, 10);\r\n \r\n }, 0);\r\n });\r\n return componentRef;\r\n }\r\n\r\n bulletHandler($state: BulletState) {\r\n\r\n switch ($state.event) {\r\n case BulletEvent.Bullet_Loaded:\r\n this._danmuService.loadBullet($state.object);\r\n break;\r\n case BulletEvent.Bullet_End:\r\n this._danmuService.onBulletEnd($state.object);\r\n let index = this.componentRefs.findIndex(p => p.guid == $state.object.bullet.guid);\r\n this.componentRefs[index].isFree = true;\r\n this.componentRefs[index].isFire = false;\r\n break;\r\n }\r\n }\r\n\r\n canvasWidth = window.innerWidth;\r\n\r\n timeout = null;\r\n\r\n onchangeSize(size: number = 0) {\r\n\r\n clearTimeout(this.timeout);\r\n this.timeout = setTimeout(() => { /// 可以稍微提升速度,也保证尺寸正确\r\n this.canvasWidth = (this.entry.element.nativeElement as HTMLElement).offsetWidth || window.innerWidth;\r\n this.componentRefs.forEach(p => {\r\n p.compnent.instance.canvasWidth = this.canvasWidth;\r\n if (p.isFire)\r\n p.compnent.instance.restart();\r\n else\r\n p.compnent.instance.recalculate();\r\n\r\n });\r\n this._danmuService.reCalculateSpeed(this.canvasWidth);\r\n }, 20);\r\n\r\n\r\n }\r\n\r\n destroyBullet() {\r\n\r\n }\r\n onPause() {\r\n this.danmuFacade.pause(this.API.currentTime);\r\n this._danmuService.stopAddNew();\r\n }\r\n onPlay() {\r\n if (this.API.currentTime >= 0) {\r\n this.danmuFacade.play(this.API.currentTime);\r\n this._danmuService.startAddNew();\r\n }\r\n }\r\n\r\n mediaLoaded = false;\r\n\r\n onSeeked() {\r\n\r\n if (this.userClicked) {\r\n this.clearCue();\r\n if (!this.hidden) {\r\n let currentTime = this.danmuFacade.currentTime;\r\n let howManyOn10Second = this.list.filter(p => p.second > currentTime - 10 && p.second <= currentTime);\r\n this.onCueChange(howManyOn10Second, howManyOn10Second.length > 30 ? 0.5 : 1, currentTime);\r\n this._danmuService.execute();\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n /*\r\n ** 用户有点击操作\r\n */\r\n userClicked = false;\r\n @HostListener(\"document:click\")\r\n userClick() {\r\n this.userClicked = true;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n // this.AppStoreUnsubscribe();\r\n }\r\n\r\n pause(event) {\r\n const target = event.target || event.srcElement || event.currentTarget;\r\n if (target.attributes.id && target.attributes.id.nodeValue === 'vg-overlay-danmu') {\r\n this.API.pause();\r\n }\r\n }\r\n}\r\n\r\n/*\r\n** 流程: \r\n** 1. 占用bullet,isFree = false\r\n** 2. 等待调度,发射事件\r\n** 3. 发射后: isFire = true\r\n** 4. 发射完成后,isFire = false, isFree = true\r\n*/\r\nclass BulletRef {\r\n guid: string;\r\n compnent: ComponentRef;\r\n isFree: boolean; ////是否可以回收\r\n isFire: boolean; /// 是否发射\r\n bullet: Bullet; /// 子弹信息\r\n}\r\n\r\n","import { Component, OnInit, ElementRef, ViewEncapsulation, HostBinding, ViewChild, Input } from '@angular/core';\r\nimport { VgAPI, VgMedia } from '../../core';\r\nimport { Subscription } from 'rxjs';\r\nimport { VgUtils } from '../../core/core';\r\n\r\n@Component({\r\n selector: 'vg-airplay',\r\n encapsulation: ViewEncapsulation.None,\r\n template: `\r\n
\r\n
\r\n \r\n `,\r\n styles: [`\r\n vg-airplay\r\n {\r\n\r\n display: none !important;\r\n /* width: 1.8em; */\r\n /* height: 3.2em; */\r\n text-align: center;\r\n color:white;\r\n cursor:pointer;\r\n margin-right: 2em !important;\r\n\r\n }\r\n vg-airplay .iconfont{\r\n }\r\n\r\n vg-airplay.show\r\n {\r\n\r\n display:inline-block !important;\r\n cursor:pointer;\r\n }\r\n ` ]\r\n})\r\nexport class VgAirplay implements OnInit {\r\n @Input() vgFor: string;\r\n\r\n subscriptions: Subscription[] = [];\r\n\r\n constructor(public API: VgAPI) { }\r\n isAvailable = true;\r\n ngOnInit() {\r\n\r\n if (VgUtils.isiOSDevice() || VgUtils.IsMac()) {\r\n\r\n if (this.API.isPlayerReady) {\r\n this.onPlayerReady();\r\n }\r\n else {\r\n this.subscriptions.push(this.API.playerReadyEvent.subscribe(() => this.onPlayerReady()));\r\n }\r\n this.detectAirplay();\r\n \r\n\r\n }\r\n\r\n\r\n }\r\n @ViewChild(\"videoElement\", { static: true }) video: ElementRef;\r\n private detectAirplay() {\r\n console.log(\"airplay\",!!window[\"WebKitPlaybackTargetAvailabilityEvent\"])\r\n if (window[\"WebKitPlaybackTargetAvailabilityEvent\"]) {\r\n this.attched = true;\r\n //console.log(this.target,this.API.getDefaultMedia().elem);\r\n var element = (this.video.nativeElement as HTMLElement);\r\n element.addEventListener('webkitplaybacktargetavailabilitychanged',\r\n (event) => {\r\n\r\n // console.log(event);\r\n switch (event[\"availability\"]) {\r\n case \"available\":\r\n this.isAvailable = true;\r\n if (!!element && !!element.parentElement && !!element.parentElement.classList) {\r\n element.parentElement.classList.add(\"show\");\r\n element.remove();//.remove(element);\r\n\r\n }\r\n\r\n break;\r\n case \"not-available\":\r\n //console.log(\"should hide\")\r\n this.isAvailable = false;\r\n break;\r\n }\r\n\r\n });\r\n }\r\n }\r\n attched = false;\r\n onPlayerReady() {\r\n \r\n }\r\n showList() {\r\n //console.log(\"list\");\r\n var target = this.API.getDefaultMedia();\r\n if (this.attched && target != null) {\r\n ((target).elem as HTMLElement)[\"webkitShowPlaybackTargetPicker\"]();\r\n }\r\n }\r\n}\r\n","
\r\n
\r\n {{hasSameQuality?'选线路':'清晰度'}}\r\n \r\n \r\n {{ bitrateSelected?.bitrate> 1080 ? bitrateSelected?.short:(bitrateSelected?.label + (!isLine ?\r\n (bitrateSelected?.qualityIndex>-1)?\"P\":autoLevelName : \"\"))}}\r\n \r\n\r\n
\r\n\r\n
\r\n\r\n
0) && !isUnlocked\">\r\n
\r\n 去广告·享高清\r\n
\r\n
\r\n
开通VIP
\r\n
金币解锁
\r\n
\r\n
\r\n
\r\n
\r\n 1080\">{{item.short}}\r\n (客户端)\r\n \r\n 1080)\">\r\n {{isLine?item.label :item.short+''+item.label +'P'}}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
","import {\r\n Component,\r\n ElementRef,\r\n OnInit,\r\n Input,\r\n ViewEncapsulation,\r\n OnDestroy, Output, EventEmitter, SimpleChanges, HostBinding, OnChanges\r\n} from '@angular/core';\r\nimport { VgAPI } from '../../core/services/vg-api';\r\nimport { Subscription, Unsubscribable } from 'rxjs';\r\nimport { BitrateOption, VgControlsHidden, VgFullscreenAPI } from '../../core/core';\r\nimport { Utility } from '../../../../_service/utility';\r\nimport { UserService } from 'app/_service/user/user.service';\r\nimport { PurchaseRequiredDialogService } from 'app/components/dialogs/purchase-required/purchase-required.service';\r\nimport { DnDialogService } from 'app/_modules/dn-dialog/dn-dialog.service';\r\nimport { RechargeBoxService } from 'app/_service/recharge-box/recharge-box.service';\r\nimport { PurchaseSuccessDialogService } from 'app/components/dialogs/purchase-success/purchase-success.service';\r\n\r\n@Component({\r\n selector: 'vg-quality-selector',\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: './vg-quality-selector.html',\r\n styleUrls: ['./vg-quality-selector.scss']\r\n})\r\nexport class VgQualitySelector implements OnInit, OnDestroy, OnChanges {\r\n @Input() bitrates: BitrateOption[];\r\n @Input() isLine = false;\r\n @Output() onBitrateChange: EventEmitter = new EventEmitter();\r\n @Output() filterClick: EventEmitter = new EventEmitter();\r\n @Input() bitrateSelected: BitrateOption;\r\n @Input() set playingLevel(value) {\r\n if (value !== undefined && value > -1) {\r\n var data = this.getAutoLevelName(value);\r\n this.autoLevelName = data ? \"(\" + this.getAutoLevelName(value) + \"P)\" : \"\";\r\n }\r\n } /// 正在播放的质量\r\n\r\n @HostBinding('class.active') isActive;\r\n\r\n @Input() set user(value) {\r\n\r\n this._user = value;\r\n this.hasHeight = false;\r\n this.quanlityHeight = \"auto\";\r\n\r\n };\r\n get user() {\r\n return this._user;\r\n }\r\n _user;\r\n @Input() gold = 0;\r\n\r\n autoLevelName = \"\";\r\n private openList: Unsubscribable = null;\r\n elem: HTMLElement;\r\n target: any;\r\n subscriptions: Unsubscribable[] = [];\r\n ariaValue: string;\r\n isOpen: boolean = false;\r\n isUnlocked = false;\r\n quanlityHeight = 'auto';\r\n hasHeight = false;\r\n hasVIP = true;\r\n hasSameQuality = false;\r\n constructor(ref: ElementRef,\r\n public API: VgAPI,\r\n public fsAPI: VgFullscreenAPI,\r\n private hiddenApi: VgControlsHidden,\r\n private _userService: UserService,\r\n private _purchaseRequiredDialogService: PurchaseRequiredDialogService,\r\n private _dnDialogService: DnDialogService,\r\n private _rechargeBoxService: RechargeBoxService,\r\n private _purchaseSuccessDialogService: PurchaseSuccessDialogService,\r\n private _utility: Utility\r\n ) {\r\n this.elem = ref.nativeElement;\r\n }\r\n\r\n getListOfBitrate(isEnabled) {\r\n return this.bitrates.filter(p => p.isEnabled == isEnabled && p.label != this.bitrateSelected?.label);\r\n }\r\n ngOnInit() {\r\n if (this.bitrates[0].isVIP) {\r\n this.isUnlocked = this.bitrates[0].isBought;\r\n } else {\r\n this.isUnlocked = true;\r\n }\r\n this.listenPurchase();\r\n this.subscriptions.push(this._utility.GetOrCreateSubscript(\"system.call.changeBitrate\").subscribe(p => {\r\n this.selectBitrate(p);\r\n }))\r\n //console.log(this.bitrateSelected)\r\n }\r\n\r\n getAutoLevelName(playingLevel) {\r\n //console.log(playingLevel)\r\n return this.bitrates.find(p => p.qualityIndex == playingLevel)?.label;\r\n }\r\n filterCall(event) {\r\n this.filterClick.emit(this.getListOfBitrate(false).map(p => p.key)[0]);\r\n // this.listenPurchase();\r\n }\r\n\r\n listenPurchase() {\r\n this.subscriptions.push(\r\n this._purchaseSuccessDialogService.purchaseSuccessDialogSource$.subscribe(state => {\r\n if (!!state && state.mediaKey) {\r\n if (state.mediaKey === this.bitrates[0].key) {\r\n this.isUnlocked = true;\r\n } else {\r\n this.isUnlocked = false;\r\n }\r\n }\r\n }),\r\n this._purchaseSuccessDialogService.playLineOrBitrateSource$.subscribe(change => {\r\n //console.log(this.bitrates)\r\n if (change === true) {\r\n this._purchaseSuccessDialogService.changeLineOrBitrate(false);\r\n this.selectBitrate(this.bitrates.filter(p => p.bitrate <= 1080)[0]);\r\n }\r\n })\r\n );\r\n }\r\n\r\n changeOpener() {\r\n this.isActive = this.isOpen = !this.isOpen;\r\n if (this.isOpen) {\r\n this.hiddenApi.captureControls();\r\n this.openList = this._utility.openList(this.elem, null, () => {\r\n this.isActive = this.isOpen = false;\r\n this.openList.unsubscribe();\r\n this.hiddenApi.releaseControls();\r\n })\r\n }\r\n else {\r\n if (this.openList) {\r\n this.openList.unsubscribe();\r\n }\r\n this.hiddenApi.releaseControls();\r\n }\r\n // if (this.hasHeight === false) {\r\n // this.getQuanlityHeight();\r\n // }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['bitrates']\r\n && changes['bitrateSelected']\r\n && changes['bitrates'].currentValue\r\n && changes['bitrates'].currentValue.length\r\n && changes['bitrateSelected'].currentValue\r\n ) {\r\n\r\n if (this.bitrates[0].isVIP) {\r\n this.isUnlocked = this.bitrates[0].isBought;\r\n } else {\r\n this.isUnlocked = true;\r\n }\r\n this.hasVIP = this.bitrates.filter(p => p.isVIP).length > 0;\r\n this.checkForSameBitrate();\r\n \r\n }\r\n }\r\n\r\n private checkForSameBitrate() {\r\n //console.log(this.bitrates)\r\n if (this.isLine) {\r\n this.hasSameQuality = true;\r\n return;\r\n }\r\n let group = {};\r\n this.hasSameQuality = false;\r\n for (let i = 0; i < this.bitrates.length; ++i) {\r\n group[this.bitrates[i].bitrate] = group[this.bitrates[i].bitrate] ?? 0;\r\n group[this.bitrates[i].bitrate] += 1;\r\n if (group[this.bitrates[i].bitrate] > 1) {\r\n this.hasSameQuality = true;\r\n break;\r\n }\r\n }\r\n }\r\n selectBitrate(item) {\r\n if (item.bitrate > 1080) {\r\n if (this.fsAPI.isFullscreen) {\r\n this.fsAPI.toggleFullscreen();\r\n }\r\n this._dnDialogService.open('4k-ask-app-download-dialog', { 'bitrate': item.bitrate });\r\n return;\r\n }\r\n\r\n\r\n\r\n if (this.bitrateSelected?.key === item.key) {\r\n return;\r\n }\r\n if (item.isVIP && (!this._user || !this._user.id)) {\r\n if (this.fsAPI.isFullscreen) {\r\n this.fsAPI.toggleFullscreen();\r\n }\r\n\r\n this._userService.showLoginDialog(true);\r\n return;\r\n }\r\n\r\n if (item.isVIP && !item.isBought && this._user && this._user && this._user.roleId === 0) {\r\n if (this.fsAPI.isFullscreen) {\r\n this.fsAPI.toggleFullscreen();\r\n }\r\n\r\n this._purchaseRequiredDialogService.setState({ price: this.gold, mediaId: item.key });\r\n this._dnDialogService.open('purchase-required', { 'purchase-required-price': this.gold, 'media-id': item.key });\r\n //this.listenPurchase();\r\n return;\r\n }\r\n\r\n this.bitrateSelected = item;\r\n\r\n this.onBitrateChange.emit(item);\r\n this.isActive = this.isOpen = false;\r\n if (this.openList) {\r\n this.openList.unsubscribe();\r\n }\r\n this.hiddenApi.releaseControls();\r\n\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n if (this.openList) {\r\n this.openList.unsubscribe();\r\n }\r\n }\r\n openRechargeBox() {\r\n if (window[\"rechargeBox\"]) {\r\n window[\"rechargeBox\"]();\r\n }\r\n }\r\n\r\n showRechargeBox() {\r\n this._rechargeBoxService.changeDisplayStatus(true);\r\n }\r\n\r\n}\r\n","import { Component, Input, ElementRef, HostListener, OnInit, ViewEncapsulation, OnDestroy, ViewChild, Output, EventEmitter } from '@angular/core';\r\nimport { VgAPI } from '../../core/services/vg-api';\r\nimport { Subscription } from 'rxjs';\r\nimport { Unsubscribable } from 'rxjs';\r\nimport { Utility } from 'app/_service/utility';\r\nimport { UserService } from 'app/_service/user/user.service';\r\nimport { RechargeBoxService } from 'app/_service/recharge-box/recharge-box.service';\r\nimport { VgFullscreenAPI } from '../../core';\r\n@Component({\r\n selector: 'vg-playback-button',\r\n encapsulation: ViewEncapsulation.None,\r\n template: `\r\n \r\n
\r\n
\r\n {{getPlaybackRate() === '1.0' ? \"倍速\" : getPlaybackRate()+\"x\"}}\r\n \r\n
\r\n
\r\n
\r\n {{v +\"x\"}}\r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n `,\r\n styles: [`\r\n vg-playback-button {\r\n -webkit-touch-callout: none;\r\n -webkit-user-select: none;\r\n -moz-user-select: none;\r\n -ms-user-select: none;\r\n user-select: none;\r\n display: flex;\r\n justify-content: center;\r\n height: 50px;\r\n width: 50px;\r\n cursor: pointer;\r\n color: white;\r\n line-height: 50px;\r\n font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\r\n }\r\n\r\n vg-playback-button .button {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 50px;\r\n\r\n }\r\n .player-speed {\r\n position: relative;\r\n }\r\n .player-speed-toggler {\r\n width: 90px;\r\n padding: 0 10px;\r\n line-height: 52px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n }\r\n .player-speed-toggler-label {\r\n flex: 1;\r\n text-align: center;\r\n }\r\n .player-speed-toggler:hover {\r\n color: #00c0FF;\r\n }\r\n .player-speed-menu {\r\n max-height: unset !important;\r\n left: -2px !important;\r\n margin-left: 0 !important;\r\n bottom: 3.5em !important;\r\n display: none;\r\n }\r\n .player-speed-menu.opened {\r\n display: block;\r\n }\r\n .openList.opened{\r\n padding: 0 !important;\r\n }\r\n .player-speed-menu-item {\r\n line-height: 26px;\r\n min-width: 92px;\r\n padding: 9px 10px;\r\n text-align: center;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n }\r\n .player-speed-menu-item-label {\r\n flex: 1;\r\n text-align-center: center;\r\n }\r\n .player-speed-menu-item.active {\r\n background-color: rgba(0, 0, 0, 0.76);\r\n color: #00c0FF;\r\n }\r\n .player-speed-menu-item:hover {\r\n color: #00c0FF;\r\n }\r\n ` ]\r\n})\r\nexport class VgPlaybackButton implements OnInit, OnDestroy {\r\n @Input() vgFor: string;\r\n\r\n elem: HTMLElement;\r\n target: any;\r\n\r\n @Input() playbackValues: Array;\r\n\r\n @Input() customCallback:Function;\r\n // @Input()\r\n // api;\r\n\r\n // @Input()\r\n // user;\r\n\r\n playbackIndex: number;\r\n @ViewChild(\"playSpeedBox\") playSpeedBox: ElementRef;\r\n subscriptions: Subscription[] = [];\r\n\r\n ariaValue = 1;\r\n\r\n @Output()\r\n releaseControl = new EventEmitter();\r\n\r\n @Input() isPlayingAds = false;\r\n\r\n constructor(\r\n ref: ElementRef,\r\n public API: VgAPI,\r\n // private _userService: UserService,\r\n // private _rechargeBoxService: RechargeBoxService,\r\n public fsAPI: VgFullscreenAPI,\r\n private _utility:Utility\r\n ) {\r\n this.elem = ref.nativeElement;\r\n this.playbackValues = ['0.5', '0.75', '1.0', '1.25', '1.5', '2.0'];\r\n this.playbackIndex = 2;\r\n }\r\n\r\n ngOnInit() {\r\n\r\n if (this.API.isPlayerReady) {\r\n this.onPlayerReady();\r\n }\r\n else {\r\n this.subscriptions.push(this.API.playerReadyEvent.subscribe(() => this.onPlayerReady()));\r\n }\r\n }\r\n\r\n onPlayerReady() {\r\n this.target = this.API.getMediaById(this.vgFor);\r\n this.subscriptions.push(\r\n this.target.subscriptions.loadedMetadata.subscribe(p => {\r\n this.updatePlaybackSpeed(this.playbackValues[this.playbackIndex])\r\n })\r\n // this.API.medias\r\n // this.api.subscript(\"loadedmetadata\", () => {\r\n // this.updatePlaybackSpeed(this.playbackValues[this.playbackIndex])\r\n // })\r\n );\r\n }\r\n\r\n // @HostListener('click')\r\n onClick(index) {\r\n this.isOpenOrHidePlaySpeedBox = false;\r\n\r\n // if (index === 5 && (!this._userService.user.id)) {\r\n // if (this.fsAPI.isFullscreen) {\r\n // this.fsAPI.toggleFullscreen();\r\n // }\r\n // this._userService.showLoginDialog(true);\r\n // return;\r\n // }\r\n\r\n // if (index === 5 \r\n // && !!this._userService.user.id \r\n // && this._userService.user.roleId === 0) {\r\n // if (this.fsAPI.isFullscreen) {\r\n // this.fsAPI.toggleFullscreen();\r\n // }\r\n // this._rechargeBoxService.changeDisplayStatus(true);\r\n // return;\r\n // }\r\n var result = this.customCallback(index);\r\n if(result == false)\r\n {\r\n return;\r\n }\r\n\r\n this.playbackIndex = index;\r\n this.updatePlaybackSpeed(this.playbackValues[index]);\r\n this.releaseControl.emit(true);\r\n }\r\n\r\n // @HostListener('keydown', ['$event'])\r\n // onKeyDown(event: KeyboardEvent) {\r\n // // On press Enter (13) or Space (32)\r\n // if (event.keyCode === 13 || event.keyCode === 32) {\r\n // event.preventDefault();\r\n // this.updatePlaybackSpeed();\r\n // }\r\n // }\r\n\r\n updatePlaybackSpeed(value) {\r\n // this.playbackIndex = ++this.playbackIndex % this.playbackValues.length;\r\n value = this.isPlayingAds ? '1.0' : value; // 广告播放强制1倍速\r\n if (this.target instanceof VgAPI) {\r\n this.target.playbackRate = value;\r\n }\r\n else {\r\n this.target.playbackRate[this.vgFor] = (value);\r\n }\r\n }\r\n\r\n getPlaybackRate() {\r\n this.ariaValue = this.target ? this.target.playbackRate : 1.0;\r\n return this.ariaValue.toFixed(Math.max(1, (this.ariaValue.toString().split('.')[1] || []).length));\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscriptions.forEach(s => { if (s) { s.unsubscribe() } });\r\n }\r\n\r\n isOpenOrHidePlaySpeedBox = false;\r\n playSpeedBoxSubscript: Unsubscribable;\r\n openOrHidePlaySpeedBox() {\r\n this.isOpenOrHidePlaySpeedBox = !this.isOpenOrHidePlaySpeedBox;\r\n\r\n if (this.isOpenOrHidePlaySpeedBox) {\r\n this.API.hiddenAPI.captureControls();\r\n this.playSpeedBoxSubscript = this._utility.openList(this.playSpeedBox.nativeElement as HTMLElement, null, () => {\r\n this.isOpenOrHidePlaySpeedBox = false;\r\n this.playSpeedBoxSubscript.unsubscribe();\r\n this.API.hiddenAPI.releaseControls();\r\n })\r\n }\r\n else {\r\n\r\n if (this.playSpeedBoxSubscript != null)\r\n this.playSpeedBoxSubscript.unsubscribe();\r\n this.API.hiddenAPI.releaseControls();\r\n }\r\n\r\n }\r\n}\r\n","import {\r\n Component, Input, ElementRef, HostListener, OnInit, ViewEncapsulation, ViewChild,\r\n OnDestroy,\r\n HostBinding\r\n} from '@angular/core';\r\nimport { VgAPI } from '../../core/services/vg-api';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'vg-volume',\r\n encapsulation: ViewEncapsulation.None,\r\n template: `\r\n
{{ getVolumecCaption() }}
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n `,\r\n styles: [ `\r\n vg-volume {\r\n -webkit-touch-callout: none;\r\n -webkit-user-select: none;\r\n -moz-user-select: none;\r\n -ms-user-select: none;\r\n user-select: none;\r\n display: flex;\r\n justify-content: center;\r\n height: 50px;\r\n width: 100px;\r\n cursor: pointer;\r\n color: white;\r\n line-height: 50px;\r\n }\r\n\r\n\r\n vg-volume .volumeBar {\r\n position: relative;\r\n display: flex;\r\n flex-grow: 1;\r\n align-items: center;\r\n }\r\n vg-volume .volumeBackground {\r\n display: flex;\r\n flex-grow: 1;\r\n height: 5px;\r\n pointer-events: none;\r\n background-color: #333;\r\n }\r\n vg-volume .volumeValue {\r\n display: flex;\r\n height: 5px;\r\n pointer-events: none;\r\n background-color: #FFF;\r\n transition:all 0.2s ease-out;\r\n }\r\n vg-volume .volumeKnob {\r\n position: absolute;\r\n width: 10px; height: 11px;\r\n left: 0; top: 50%;\r\n transform: translateY(-50%);\r\n\r\n pointer-events: none;\r\n background-color: #FFF;\r\n transition:all 0.2s ease-out;\r\n }\r\n vg-volume .volumeBackground.dragging .volumeValue,\r\n vg-volume .volumeBackground.dragging .volumeKnob {\r\n transition: none;\r\n }\r\n\r\n vg-volume.vertical{\r\n height: 160px;\r\n width: 3.5em;\r\n display: block;\r\n padding-top: 2em;\r\n line-height: 2em;\r\n\r\n }\r\n vg-volume.vertical .volumeBar{\r\n\r\n\r\n position: relative;\r\n display: block;\r\n top: 0.3em;\r\n }\r\n\r\n vg-volume.vertical .volumeBackground{\r\n\r\n\r\n\r\n width: 0.2em;\r\n background-color:white;\r\n height:100px;\r\n margin: 0 auto;\r\n\r\n\r\n }\r\n vg-volume.vertical .volumeValue{\r\n\r\n width: 0.2em;\r\n height:auto;\r\n position: absolute;\r\n bottom: 0;\r\n background-color:red;\r\n }\r\n\r\n vg-volume.vertical .volumeKnob{\r\n\r\n top: auto;\r\n left: 50%;\r\n // margin-left: -7.5px;\r\n background-color:red;\r\n transform: translateX(-50%);\r\n // margin-bottom: -15px;\r\n }\r\n\r\n vg-volume .caption{\r\n\r\n position: absolute;\r\n top: 0;\r\n text-align: center;\r\n width: 100%;\r\n margin-top:0.1em;\r\n }\r\n ` ]\r\n})\r\nexport class VgVolume implements OnInit, OnDestroy {\r\n @Input() vgFor: string;\r\n @HostBinding('class.vertical') @Input() vertical = true;\r\n\r\n @ViewChild('volumeBar',{static:true}) volumeBarRef: ElementRef;\r\n\r\n elem: HTMLElement;\r\n target: any;\r\n isDragging: boolean;\r\n mouseDownPosX: number;\r\n mouseDownPosY: number;\r\n ariaValue: number;\r\n ariaValueY:number;\r\n subscriptions: Subscription[] = [];\r\n\r\n constructor(ref: ElementRef, public API: VgAPI) {\r\n this.elem = ref.nativeElement;\r\n this.isDragging = false;\r\n }\r\n\r\n ngOnInit() {\r\n if (this.API.isPlayerReady) {\r\n this.onPlayerReady();\r\n } else {\r\n this.subscriptions.push(this.API.playerReadyEvent.subscribe(() => this.onPlayerReady()));\r\n }\r\n }\r\n\r\n onPlayerReady() {\r\n this.target = this.API.getMediaById(this.vgFor);\r\n this.ariaValueY = this.ariaValue = this.getVolume() * 100;\r\n }\r\n\r\n onClick(event: { clientX: number ,clientY:number}) {\r\n // console.log(event);\r\n if(this.vertical)\r\n {\r\n this.setVolume(this.calculateVolume(event.clientY));\r\n }\r\n else\r\n {\r\n this.setVolume(this.calculateVolume(event.clientX));\r\n\r\n }\r\n }\r\n\r\n onMouseDown(event: { clientX: number,clientY:number }) {\r\n this.mouseDownPosX = event.clientX;\r\n this.mouseDownPosY = event.clientY;\r\n this.isDragging = true;\r\n }\r\n\r\n @HostListener('document:mousemove', [ '$event' ])\r\n onDrag(event: { clientX: number ,clientY:number}) {\r\n if (this.isDragging) {\r\n if(this.vertical)\r\n {\r\n this.setVolume(this.calculateVolume(event.clientY));\r\n }\r\n else\r\n {\r\n this.setVolume(this.calculateVolume(event.clientX));\r\n\r\n }\r\n }\r\n }\r\n\r\n @HostListener('document:mouseup', [ '$event' ])\r\n onStopDrag(event: { clientX: number,clientY:number }) {\r\n if (this.isDragging) {\r\n this.isDragging = false;\r\n\r\n if(this.vertical)\r\n {\r\n if (this.mouseDownPosY === event.clientY) {\r\n this.setVolume(this.calculateVolume(event.clientY));\r\n }\r\n }\r\n else\r\n {\r\n if (this.mouseDownPosX === event.clientX) {\r\n this.setVolume(this.calculateVolume(event.clientX));\r\n }\r\n }\r\n\r\n }\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n arrowAdjustVolume(event: KeyboardEvent) {\r\n\r\n var active =document.activeElement;\r\n if(!(active == null || (\r\n active.tagName.toLowerCase() != \"input\" &&\r\n !active.hasAttribute(\"contenteditable\")\r\n )))return;\r\n\r\n\r\n if (event.keyCode === 38 ) {\r\n event.preventDefault();\r\n this.setVolume(Math.max(0, Math.min(100, (this.getVolume() * 100) + 10)));\r\n }\r\n else if ( event.keyCode === 40) {\r\n event.preventDefault();\r\n this.setVolume(Math.max(0, Math.min(100, (this.getVolume() * 100) - 10)));\r\n }\r\n }\r\n\r\n\r\n public getVolumecCaption()\r\n {\r\n return parseInt(\"\" + (this.getVolume() * 100 ));\r\n }\r\n\r\n calculateVolume(mousePos: number) {\r\n let devicePixelRatio = 1;\r\n var isMac = /macintosh|mac os x/i.test(navigator.userAgent);\r\n if (isMac) {\r\n // if (window.devicePixelRatio >= 2) {\r\n // devicePixelRatio = (window.devicePixelRatio / 2);\r\n // }\r\n } else {\r\n // devicePixelRatio = window.innerWidth < 1366 ? window.devicePixelRatio : 1; // innerWidth如果小于1366启用\r\n // devicePixelRatio = window.innerWidth < 1366 ? (1366 / window.innerWidth) : 1; // innerWidth如果小于1366启用,使用最小尺寸\r\n devicePixelRatio = window.innerWidth < 1366 ? (1366 / window.innerWidth) : window.innerWidth > 2560 ? (1920 / window.innerWidth) : 1; // innerWidth如果小于1366启用,使用最小尺寸;大于2560启用,使用最大尺寸\r\n }\r\n\r\n if(this.vertical)\r\n {\r\n const recObj = this.volumeBarRef.nativeElement.getBoundingClientRect();\r\n const volumeBarOffset: number = recObj.top;\r\n const volumeBar: number = recObj.height;\r\n\r\n // console.log(mousePos,volumeBarOffset,volumeBar);\r\n\r\n return ( 1- (mousePos * devicePixelRatio - volumeBarOffset) / volumeBar) * 100;\r\n }\r\n else\r\n {\r\n const recObj = this.volumeBarRef.nativeElement.getBoundingClientRect();\r\n const volumeBarOffsetLeft: number = recObj.left;\r\n const volumeBarWidth: number = recObj.width;\r\n return (mousePos * devicePixelRatio - volumeBarOffsetLeft) / volumeBarWidth * 100;\r\n }\r\n\r\n }\r\n\r\n setVolume(vol: number) {\r\n try{\r\n this.target.volume = Math.max(0, Math.min(1, vol / 100));\r\n this.ariaValueY = this.ariaValue = this.target.volume * 100;\r\n }\r\n catch(err)\r\n {\r\n\r\n }\r\n\r\n }\r\n\r\n getVolume(): number {\r\n return this.target ? this.target.volume : 0;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n }\r\n}\r\n","
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \"{{\r\n \r\n
0 && !publisher?.isOfficalUP\">\r\n \r\n \r\n
\r\n
\r\n \"官方标识\"\r\n
\r\n
\r\n
\r\n
\r\n
{{publisher.title}}
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n 重播\r\n
\r\n
\r\n \r\n \r\n 点赞\r\n
\r\n
\r\n \r\n \r\n 点踩\r\n
\r\n
\r\n \r\n \r\n 收藏\r\n
\r\n
\r\n \r\n 分享\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
{{ item.title }}
\r\n
\r\n \r\n 取消连播\r\n
\r\n \r\n
\r\n
\r\n
","import { Component, OnInit, Input, Output, EventEmitter, OnDestroy, ViewChild, ElementRef } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { Subscription } from 'rxjs';\r\nimport { DnDialogService } from '../../_modules/dn-dialog/dn-dialog.service';\r\nimport { VgFullscreenAPI } from '../../_modules/player/core';\r\nimport { FavoriteService } from '../../_service/favorite/favorite.service';\r\nimport { UploadService } from '../../_service/upload/upload.service';\r\nimport { UserService } from '../../_service/user/user.service';\r\nimport { Utility } from '../../_service/utility';\r\nimport { IVideoService } from '../../_service/video/ivideo.service';\r\n\r\n@Component({\r\n selector: 'app-auto-play-next-list',\r\n templateUrl: './auto-play-next-list.component.html',\r\n styleUrls: ['./auto-play-next-list.component.scss']\r\n})\r\nexport class AutoPlayNextListComponent implements OnInit, OnDestroy {\r\n @Input() video;\r\n @Input() showPlayEndContent = false;\r\n @Input() nextPlayList = [];\r\n @Input() publisher;\r\n @Input() user;\r\n countSeconds = 5;\r\n enableAutoPlay = false;\r\n timeout;\r\n progress: number = 0; // 圆环进度\r\n startTime: number; // 进度开始时间\r\n requestId: number;\r\n @Output() onClosePlayEndContent = new EventEmitter();\r\n likeLoading = false;\r\n dislikeLoading = false;\r\n favoriteLoading = false;\r\n subscriptions: Subscription[] = [];\r\n @Output() userBehaviorEvent = new EventEmitter();\r\n @ViewChild('shadow') shadowRef: ElementRef;\r\n @Input() suspendAutoPlay = false;\r\n\r\n constructor(\r\n private _router: Router,\r\n private _utility: Utility,\r\n // private _toast: ToastService,\r\n private _upload: UploadService,\r\n private _user: UserService,\r\n private _dnDialogService: DnDialogService,\r\n // private _messageDialogService: MessageDialogService,\r\n private _videoService: IVideoService,\r\n private _favoriteService: FavoriteService,\r\n public fsAPI: VgFullscreenAPI,\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.endContentAutoPlay();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n this.closePlayEndContent();\r\n }\r\n\r\n cancelAutoPlay() {\r\n cancelAnimationFrame(this.requestId);\r\n this.enableAutoPlay = false;\r\n this.countSeconds = 5;\r\n }\r\n\r\n closePlayEndContent() {\r\n this.cancelAutoPlay();\r\n this.showPlayEndContent = false;\r\n this.onClosePlayEndContent.emit(this.showPlayEndContent);\r\n }\r\n\r\n endContentAutoPlay() {\r\n this.countSeconds = 5;\r\n this.enableAutoPlay = true;\r\n setTimeout(() => {\r\n // this.startAutoPlay();\r\n this.roundProgressStart();\r\n }, 10);\r\n }\r\n\r\n startAutoPlay() {\r\n if (this.suspendAutoPlay) {\r\n this.cancelAutoPlay();\r\n }\r\n if (this.countSeconds === 0) {\r\n // this.navToSVideo(this.nextPlayList[0]);\r\n return;\r\n }\r\n if (this.timeout) {\r\n this._utility.clearTimeout(this.timeout);\r\n }\r\n if (!this.enableAutoPlay) {\r\n return;\r\n }\r\n this.timeout = this._utility.setTimeout(() => {\r\n this.startAutoPlay();\r\n }, 1000)\r\n this.countSeconds--;\r\n }\r\n\r\n roundProgressStart() {\r\n this.progress = 0;\r\n this.startTime = performance.now();\r\n const shadow = this.shadowRef.nativeElement;\r\n const rValue = parseFloat(shadow.getAttribute('r'));\r\n const circleLength = Math.floor(2 * Math.PI * rValue);\r\n this.updateProgress(circleLength, shadow);\r\n }\r\n\r\n updateProgress(circleLength, shadow) {\r\n if (this.suspendAutoPlay) {\r\n this.cancelAutoPlay();\r\n }\r\n if (!this.enableAutoPlay) {\r\n return;\r\n }\r\n // 计算当前进度,百分比\r\n const elapsed = performance.now() - this.startTime; // 距离开始的时间差\r\n this.progress = Math.min((elapsed / 5000) * 100, 100); // 5 秒时间,百分比最大为 100\r\n shadow.setAttribute('stroke-dasharray', `${circleLength * this.progress / 100},10000`); // 绘制圆环进度\r\n if (this.progress < 100) {\r\n // 如果进度还未达到 100%,则继续更新\r\n this.requestId = requestAnimationFrame(() => this.updateProgress(circleLength, shadow));\r\n } else {\r\n // 如果已达到 100%,则停止更新\r\n cancelAnimationFrame(this.requestId);\r\n this.navToSVideo(this.nextPlayList[0]);\r\n }\r\n }\r\n\r\n navToSVideo(item) {\r\n this._router.navigate(['/watch'], { queryParams: { v: item.key } });\r\n }\r\n\r\n visit() {\r\n this._router.navigateByUrl('/space/' + (this.publisher?.userKey || this.publisher.key) + '');\r\n }\r\n\r\n loading = false;\r\n guanzhu() {\r\n if (this.user.id > 0) {\r\n this.loading = true;\r\n this._upload.SetAttension(this.publisher.userKey).subscribe(p => {\r\n this.loading = false;\r\n if (p.code === 401) {\r\n return;\r\n }\r\n if (this.publisher.uid !== this.user.id) {\r\n this.publisher.isAttend = !this.publisher.isAttend;\r\n this.publisher.fansCount += this.publisher.isAttend ? 1 : this.publisher.fansCount > 0 ? -1 : 0;\r\n }\r\n })\r\n }\r\n else {\r\n if (this.fsAPI.isFullscreen) {\r\n this.fsAPI.toggleFullscreen();\r\n }\r\n // this._toast.showBlackToast(\"请先登录\");\r\n this._user.showLoginDialog(true);\r\n }\r\n }\r\n\r\n getMembership(gid) {\r\n var result = '';\r\n switch (gid) {\r\n case 0: result = ''; break;\r\n case 1: result = 'gvip'; break;\r\n case 2: result = 'gvip'; break;\r\n case 3: result = 'royalVip'; break;\r\n case 4: result = 'cpvip'; break;\r\n case 101: result = 'cpvip'; break;\r\n case 102: result = 'cpvip'; break;\r\n default:\r\n result = 'vip'; break;\r\n }\r\n return result;\r\n }\r\n\r\n rePlay() {\r\n const button = document.getElementById('play-pause-button');\r\n button.click();\r\n }\r\n\r\n like() {\r\n if (!this.user || !this.user.id) {\r\n if (this.fsAPI.isFullscreen) {\r\n this.fsAPI.toggleFullscreen();\r\n }\r\n this._dnDialogService.open('login-required-dialog');\r\n return;\r\n }\r\n\r\n if (this.likeLoading) {\r\n return;\r\n }\r\n this.likeLoading = true;\r\n this.subscriptions.push(\r\n this._videoService.like(this.video.id).subscribe(\r\n res => {\r\n this.likeLoading = false;\r\n if (res.message) {\r\n // this._messageDialogService.setState({ message: res.message });\r\n this._dnDialogService.open('message-dialog',{ message: res.message });\r\n } else {\r\n // console.log(res)\r\n this.userBehaviorEvent.emit({\r\n name: 'likeStatus',\r\n ...res[0]\r\n });\r\n // this._toast.showBlackToast('递交成功!');\r\n }\r\n }\r\n )\r\n );\r\n }\r\n\r\n dislike() {\r\n if (!this.user || !this.user.id) {\r\n if (this.fsAPI.isFullscreen) {\r\n this.fsAPI.toggleFullscreen();\r\n }\r\n this._dnDialogService.open('login-required-dialog');\r\n return;\r\n }\r\n\r\n if (this.dislikeLoading) {\r\n return;\r\n }\r\n this.dislikeLoading = true;\r\n this.subscriptions.push(\r\n this._videoService.dislike(this.video.id).subscribe(\r\n res => {\r\n this.dislikeLoading = false;\r\n\r\n if (res.message) {\r\n // this._messageDialogService.setState({ message: res.message });\r\n this._dnDialogService.open('message-dialog',{ message: res.message });\r\n } else {\r\n this.userBehaviorEvent.emit({\r\n name: 'likeStatus',\r\n ...res[0]\r\n });\r\n // this._toast.showBlackToast('递交成功!');\r\n }\r\n }\r\n )\r\n );\r\n }\r\n\r\n share() {\r\n if (!this.video.userBehaviors.share) {\r\n this.video.userBehaviors.share = true;\r\n this.video.userData.shared += 1;\r\n this._videoService.share(this.video.id).subscribe();\r\n }\r\n this._dnDialogService.open('share');\r\n }\r\n\r\n favorite() {\r\n if (this.favoriteLoading === true) {\r\n return;\r\n }\r\n if (this.user && this.user.id) {\r\n this.favoriteLoading = true;\r\n if (this.video.userBehaviors.favorite) {\r\n this._favoriteService.removeFavoritesItem(this.user, this.video.id).subscribe(\r\n (res) => {\r\n if (res.code != 401) {\r\n this.video.userBehaviors.favorite = false;\r\n this.video.userData.favorites = this.video.userData.favorites - 1;\r\n // this._toast.showBlackToast('已取消收藏!');\r\n this._favoriteService.changeFavoriteStatus(undefined);\r\n }\r\n this.favoriteLoading = false;\r\n }\r\n );\r\n } else {\r\n this._videoService.favorite(this.user, this.video.id).subscribe(\r\n (res) => {\r\n if (res.code != 401) {\r\n this.video.userData.favorites = this.video.userData.favorites + 1;\r\n this.userBehaviorEvent.emit('favorite');\r\n // this._toast.showBlackToast('收藏成功!');\r\n this._favoriteService.changeFavoriteStatus(undefined);\r\n }\r\n this.favoriteLoading = false;\r\n }\r\n );\r\n }\r\n } else {\r\n if (this.fsAPI.isFullscreen) {\r\n this.fsAPI.toggleFullscreen();\r\n }\r\n this._dnDialogService.open('login-required-dialog');\r\n }\r\n }\r\n}\r\n","
\r\n
\r\n
\r\n\r\n \r\n\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n","import { Component, OnInit, Input, ViewChild, ElementRef, OnDestroy } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { Utility } from 'app/_service/utility';\r\nimport { Unsubscribable } from 'rxjs';\r\nimport { PlayerMediaListService } from './player-media-list.service';\r\n\r\n@Component({\r\n selector: 'app-player-media-list',\r\n templateUrl: './player-media-list.component.html',\r\n styleUrls: ['./player-media-list.component.scss']\r\n})\r\nexport class PlayerMediaListComponent implements OnInit, OnDestroy {\r\n\r\n\r\n closeSubscribe: Unsubscribable;\r\n listOpenSubscribe: Unsubscribable;\r\n // perfectScrollbarConfig: PerfectScrollbarConfigInterface = {\r\n // suppressScrollX: true,\r\n // wheelPropagation: false\r\n // }\r\n\r\n @Input()\r\n show = false;\r\n\r\n @Input()\r\n playlist = [];\r\n\r\n @Input()\r\n playlistType = 'byDefault';\r\n\r\n @Input()\r\n isWide = false;\r\n\r\n @Input()\r\n newMediaKey;\r\n\r\n @ViewChild(\"PlayerMediaList\") PlayerMediaList: ElementRef;\r\n\r\n @Input()\r\n noTransition = false;\r\n\r\n constructor(\r\n private playerMediaListService: PlayerMediaListService,\r\n private route: ActivatedRoute,\r\n private _utility:Utility\r\n ) {\r\n\r\n \r\n }\r\n\r\n ngOnInit(): void {\r\n this.listOpenSubscribe = this.playerMediaListService.open$.subscribe(isOpen => {\r\n this.show = isOpen;\r\n if (this.show) {\r\n setTimeout(() => {\r\n this.closeSubscribe = this._utility.openList(this.PlayerMediaList.nativeElement as HTMLElement, null, (elem) => {\r\n if (elem.getAttribute('class')) {\r\n const classes = elem.getAttribute('class')?.split(' ');\r\n if (classes.indexOf('pmb') > -1\r\n || classes.indexOf('ps') > -1\r\n || classes.indexOf('ps__thumb-y') > -1\r\n || classes.indexOf('ps--active-y') > -1\r\n || classes.indexOf('ps__rail-y') > -1) {\r\n return;\r\n }\r\n }\r\n this.playerMediaListService.close();\r\n // this.listOpenSubscribe.unsubscribe();\r\n })\r\n });\r\n } else {\r\n if (this.closeSubscribe) {\r\n this.closeSubscribe.unsubscribe();\r\n }\r\n }\r\n });\r\n\r\n this.route.queryParams.subscribe((queryParams: any) => {\r\n this.playerMediaListService.close();\r\n });\r\n \r\n this.route.queryParams.subscribe((data) => {\r\n if (data[\"s\"]) {\r\n this.playerMediaListService.open()\r\n }\r\n });\r\n }\r\n\r\n togglePlaylist() {\r\n this.playerMediaListService.toggle();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.closeSubscribe) {\r\n this.closeSubscribe.unsubscribe();\r\n }\r\n\r\n if (this.listOpenSubscribe) {\r\n this.listOpenSubscribe.unsubscribe();\r\n }\r\n }\r\n}\r\n","
\r\n \r\n
\r\n\r\n \r\n\r\n \r\n\r\n\r\n
\r\n
\r\n {{serverCaption}}\r\n
\r\n
\r\n \r\n
\r\n
\r\n {{errorContent}}\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n\r\n \r\n\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
0\">\r\n
\r\n {{leftSecond}}s\r\n
\r\n
\r\n
\r\n
\r\n 跳过广告\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n 无法显示广告。\r\n
\r\n
\r\n
广告
\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n
0}\">\r\n {{ video?.title }}\r\n {{ mediaTitle }}\r\n
\r\n
\r\n\r\n \r\n
\r\n
\r\n {{ isSwitching ? isLine ? '正在切换线路...' : '正在切换清晰度...' : switchCompleteText}}\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n \r\n\r\n
= 3600000 && !fromActivity\">\r\n \r\n
/
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
/
\r\n \r\n \r\n
\r\n\r\n \r\n
\r\n\r\n\r\n\r\n
\r\n \r\n
\r\n\r\n
\r\n\r\n \r\n \r\n\r\n
0\" class=\"control-item l\" (click)=\"openLanguageList()\"\r\n style=\"margin-right: 20px;white-space: nowrap;\" [ngClass]=\"{active:isLanguageSelectionOpened}\" #languageBox>\r\n
\r\n
\r\n {{item.title}}\r\n
\r\n
\r\n
{{language}}
\r\n
\r\n\r\n \r\n \r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
画面比例
\r\n
\r\n
默认
\r\n
4:3
\r\n
16:9
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n 自动开始播放\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n 跳过片头 / 片尾\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n 画中画\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n
请选择举报原因
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n 举报\r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n
{{data.message}}
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n \r\n \r\n
\r\n 跳过广告将花费{{data.price}}金币\r\n
\r\n
\r\n 开通VIP即刻享受永久无广告特权!\r\n
\r\n
\r\n 跳过广告\r\n
\r\n 开通VIP\r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
= 3600000 && fromActivity\">\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n \r\n\r\n\r\n
\r\n\r\n
\r\n

无法播放

\r\n\r\n
\r\n
\r\n
\r\n\r\n\r\n\r\n","import { Component, OnInit, Input, Output, EventEmitter, HostListener, OnDestroy, ViewChild, ElementRef, Inject, OnChanges, SimpleChanges, AfterViewInit } from '@angular/core';\r\nimport { VgUtils, VgAPI, VgStates, VgMedia } from '../../_modules/player/core';\r\nimport { IMedia } from './videoplayer.imedia';\r\nimport { videoPlayerApi, videoStartAPI } from './videoplayer.api';\r\nimport { interstitialManager, intersitialEvent, interstitialData } from './videplayer.interstitialData';\r\nimport { playerUtil } from './videoplayer.utils';\r\nimport { videoPlayerVgApi } from './videoplayer.vgApi';\r\nimport { environment } from '../../../environments/environment';\r\nimport { VideoResource, PlayerTech, StreamTech } from './videoplayer.config';\r\nimport { Utility } from '../../_service/utility';\r\nimport { Store } from 'redux';\r\nimport { AppStore } from '../../app.store';\r\nimport { DanmuFacade } from '../../_modules/danmu/danmu.facade';\r\nimport { ToastService } from '../../_service/toast/toast.service';\r\nimport { DanmuService } from '../../_service/danmu/danmu.service';\r\nimport { DnDialogService } from '../../_modules/dn-dialog/dn-dialog.service';\r\nimport { Unsubscribable } from 'rxjs';\r\nimport { HttpClientHelper } from '../../_service/http-helper';\r\nimport { ApiUrlHelper } from 'app/_service/api-url-helper';\r\nimport { PlayerMediaListService } from '../player-media-list/player-media-list.service';\r\nimport { UserService } from 'app/_service/user/user.service';\r\nimport { RechargeBoxService } from 'app/_service/recharge-box/recharge-box.service';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { StorageService } from 'app/storageprovider';\r\nimport { VideoPlayerSettingsService } from './videoplayer.settings.service';\r\nimport { FullScreenService } from 'app/_service/full-screen/full-screen.service';\r\nimport { GuideService } from 'app/_service/guide/guide.service';\r\nimport { SettingsService } from 'app/user-center/settings/settings.service';\r\n\r\n@Component({\r\n selector: 'dn-videoplayer',\r\n templateUrl: './videoplayer.component.html',\r\n styleUrls: ['./videoplayer.component.scss'],\r\n providers: [\r\n // VideoPlayerConfigManager,\r\n ]\r\n})\r\n\r\nexport class VideoplayerComponent implements OnInit, OnDestroy, OnChanges, AfterViewInit {\r\n playerSettingGuide = false;\r\n //allVip = false;\r\n isPaused = false;\r\n\r\n @Input()\r\n isFloatPlayer = false;\r\n\r\n @Input()\r\n started = true;\r\n\r\n @Input() playListConfig = {\r\n canSelect:false, ///是否可选集\r\n isWide:false , /// 是否应用大按钮\r\n title:\"选集\"\r\n }\r\n @Output()\r\n apiReady = new EventEmitter();\r\n\r\n @Output()\r\n onCloseSmallPlayer = new EventEmitter();\r\n // @Output() onLevelChanged: EventEmitter = new EventEmitter();\r\n public isAdult = environment.cinema == 2 ? 1 : 0;\r\n private subscriptions = [];\r\n private _serverInfo = {\r\n status: -1\r\n }; ///\r\n private _needBought = false; /// 用户是否需要购买\r\n private _logo; /// logo输入字段\r\n private _cachedLogo = \"\"; /// 当前显示的LOGO\r\n reportDanmuReason;\r\n reportDanmuReasons = [\r\n { name: '剧透', value: 'spoiler' },\r\n { name: '人身攻击', value: 'language' },\r\n { name: '恶意刷弹幕', value: 'virulence' },\r\n { name: '发布广告', value: 'advertise' },\r\n { name: '其它', value: 'other' },\r\n ];\r\n\r\n @Input() videoLoop = false;\r\n @Input() poster = \"\";\r\n @Input() user;\r\n\r\n autoHide = true;\r\n playbackValues = ['0.5', '0.75', '1.0', '1.25', '1.5', '2.0'];\r\n playbackIndex = 1;\r\n //wideButton = false;\r\n // private _autoHide = new BehaviorSubject(true);\r\n // autoHide$ = this._autoHide.asObservable();\r\n isJump = true;\r\n forbiddenFloatingPlayer = false;\r\n autoStart = false;\r\n autoNext = true;\r\n // 正在连续播放中\r\n isContinuousPlay = false;\r\n @Input()\r\n newMediaKey;\r\n smallPlayerValid = true;\r\n /**\r\n * 静音\r\n * 1,在播放影片时静音,在随后出现广告时,广告也是静音。\r\n * 2,在播放影片时非静音,在随后出现广告时,广告也是非静音。\r\n * 3,在广告时点静音,之后的广告也是静音\r\n * 3,在广告时非静音,之后的广告也是非静音\r\n */\r\n\r\n adVolume = 0.8;\r\n volume = 0.8;\r\n\r\n public isPublicBlocked = false;\r\n /*\r\n ** 用户状态更新\r\n */\r\n private onUserStateChange(from, to) ///监测用户数据的变化\r\n {\r\n\r\n if (this._logo == \"auto\") {\r\n if (!!this._userService.user?.token?.gid) {\r\n\r\n if (environment.cinema == 2) {\r\n this._cachedLogo = this._utility.getAbsUrl( \"./assets/images/player_logo_adult_vip.png\");\r\n }\r\n else\r\n this._cachedLogo =this._utility.getAbsUrl( \"./assets/images/player_logo_vip.png\");\r\n } else {\r\n if (environment.cinema == 2) {\r\n this._cachedLogo = this._utility.getAbsUrl(\"./assets/images/player_logo_adult.png\");\r\n }\r\n else\r\n this._cachedLogo = this._utility.getAbsUrl(\"./assets/images/player_logo.png\");\r\n }\r\n }\r\n else {\r\n this._cachedLogo = this._logo;\r\n }\r\n\r\n if (!to)//无需购买\r\n {\r\n if (!!this.ppmm && this.api != null) {\r\n // this.hasState = true;\r\n this.ppmm.stopPlay();\r\n this.api.showInfo(VideoResource.vipskipFormat, 5, false);\r\n\r\n }\r\n\r\n var config = this.storageService.GetConfig();\r\n this.isJump = !(config[\"autoSkip\"] == 0);\r\n if (this.api[\"changeConfig\"]) {\r\n this.api[\"changeConfig\"](\"autoSkip\", this.isJump ? 1 : 0);\r\n }\r\n\r\n if (this.api[\"backToPlay\"]) {\r\n this.api[\"backToPlay\"]();\r\n }\r\n }\r\n\r\n }\r\n\r\n private onServerInfoChange(from, to) ///监测视频服务器数据变化\r\n {\r\n if (to.status > -1) {\r\n // if (!to.ismp4available && this.mutable) {\r\n // this.showPerfect = true;\r\n // }\r\n // else {\r\n // this.showPerfect = false;\r\n // }\r\n\r\n this.serverCaption = to.info;\r\n }\r\n }\r\n\r\n public showPerfect = false;//是否显示最佳\r\n public playerSelection: PlayerTech = PlayerTech.Original; // 播放器的选择\r\n public streamTech: StreamTech = StreamTech.MP4; //流的选择\r\n public serverCaption = \"\"; //视频服务器的说明\r\n\r\n // @ViewChild('controls') controlsRef: ElementRef;\r\n // @ViewChild('vgHls', { static: true }) vgHls: VgHLS;\r\n @Output() onVideoReady = new EventEmitter(); // 视频加载时\r\n @Output() onErrorHandler = new EventEmitter(); // 视频加载时\r\n @Input() showNextButton: boolean = false;\r\n @Input() language;\r\n @Input() languageList = [];\r\n ///是否需要跳广告\r\n @Input() shouldSkipAds = false;\r\n @Input() playingMedia;\r\n ///播放列表\r\n @Input() set mediaList(value: Array) {\r\n this.initMedia(value);\r\n };\r\n @Input() video: any;\r\n @Input() topPrefix = - 40 - 49 - 58; // 顶部过滤\r\n @Input() customHeight = 0;\r\n @Input() isloadDefault = false;\r\n @Input() filterGold = 10; ///过滤广告的金币数\r\n @Input() unlockGold = 100; /// 购买视频所需的金币\r\n @Input() filterCallback = null;\r\n @Input() unlockCallback = null;\r\n @Input() playNextCallback = null; // 播放下一集\r\n @Input() isPlayRatio = false;\r\n @Input() previewFormat = \"\";\r\n @Input() playerMode = \"auto\";\r\n @Input() playlist = [];\r\n @Input() playlistType = 'byDefault';\r\n @Input() showQuantitySelect = true;\r\n @Input() mediaTitle = \"\";\r\n @Input() isNewsPlayer = false;\r\n @Input() isLive = false;\r\n @Input() isUserFilterAd = false;\r\n @Input() danmuChatRoomControl = 1;\r\n\r\n private _hasBought = 0;\r\n\r\n get hasBought() {\r\n return this._hasBought;\r\n }\r\n\r\n @Input() set hasBought(value) {\r\n if (value && !this._hasBought && !!this.ppmm && !!this.api && (this.api.currentTime > 0)) {\r\n //this.hasState = true;\r\n this.ppmm.stopPlay();\r\n this.api.showInfo(value == 1 ? VideoResource.alreadyBought : VideoResource.highFormat, 5, false);\r\n }\r\n this._hasBought = value;\r\n if (this._hasBought) {\r\n this.pauseList = []\r\n }\r\n }; //是否已购买\r\n @Input() set serverInfo(value) {\r\n this.onServerInfoChange(this._serverInfo, value);\r\n this._serverInfo = value;\r\n };\r\n\r\n @Input() set needBought(value) {\r\n this.onUserStateChange(this._needBought, value && !this._hasBought);\r\n this._needBought = value;\r\n };\r\n\r\n @Input() set logo(value) {\r\n this._logo = value;\r\n this.needBought = this._needBought;\r\n }\r\n\r\n @Output() onChangeLanguage = new EventEmitter();\r\n get needBought() {\r\n return this._needBought;\r\n }\r\n private _bitrates= [];\r\n get bitrates()\r\n {\r\n return this._bitrates;\r\n }\r\n @Input() set bitrates(value:Array){\r\n this._bitrates = value;\r\n this.currentBitrate = null;\r\n // console.log(this.bitrates)\r\n };\r\n\r\n @Input() isLine = false;\r\n get logo() {\r\n return this._cachedLogo;//this._logo;\r\n }\r\n\r\n // readState() {\r\n // const userState: UsersState = this.store.getState()['users'] as UsersState;\r\n // this.user = userState.currentUser;\r\n // if (this.user && this.user.roleId > 0) {\r\n // this.pauseList = [];\r\n // }\r\n // const configState = this.store.getState()['config'];\r\n // if (configState.config.allVip) {\r\n // this.allVip = true;\r\n // }\r\n // }\r\n\r\n ngOnDestroy(): void {\r\n this.dispose();\r\n this.subscriptions.forEach(p => !!p[\"unsubscribe\"] ? p.unsubscribe() : p())\r\n if (this.languageOpenListUn_) {\r\n this.languageOpenListUn_.unsubscribe();\r\n }\r\n if (this.configBoxSubscript != null)\r\n this.configBoxSubscript.unsubscribe();\r\n\r\n this.removeDetectLivePlayable();\r\n this.playerMediaListService.close();\r\n }\r\n\r\n //private _pendlistMediaList: Array;//等待播放的视频\r\n\r\n getBackgroudImage(load) ///获取广告的图片\r\n {\r\n return load && load.isImage ? {\r\n \"background-image\": 'url(\\'' + load.src + '\\')',\r\n \"background-size\": \"100%\",\r\n \"background-repeat\": \"no-repeat\",\r\n \"background-position\": \"center\"\r\n } : {};\r\n }\r\n\r\n public get playerHeight() {\r\n if (this.customHeight == 0) {\r\n if (this.winWidth / this.windHeight < 1) {\r\n return Math.floor(this.winWidth * this.containerRatio);\r\n }\r\n else {\r\n return this.windHeight + this.topPrefix;\r\n }\r\n }\r\n return this.customHeight;\r\n };\r\n\r\n containerRatio = 16 / 9;// 容器的长宽比\r\n winWidth = window.innerWidth;\r\n windHeight = window.innerHeight;\r\n\r\n isIPhone = false;\r\n touchDevice = false;\r\n public media: IMedia = null;\r\n // {\r\n // title: \"loading\",\r\n // src: this._utility.GetVideoCDN(\"https://{Host}/fast/ll.js\"),\r\n // type: \"video/mp4\",\r\n // length: 1,\r\n // href: \"\",\r\n // isHls: false,\r\n // isStream: true,\r\n // isAd: false,\r\n // rtmp: \"\",\r\n // isImage: false,\r\n // backup: \"\",\r\n // isLive: false\r\n // };\r\n\r\n public isPlayerReady = false;\r\n api: videoPlayerApi;\r\n\r\n //是否能播放HLS\r\n public get canPlayHls() {\r\n return playerUtil.isTouchDevice();\r\n }\r\n\r\n //是否能播放RTMP\r\n public get canPlayRTMP() {\r\n return false;//!environment.app && playerUtil.isFlashAvailable() && !playerUtil.IsMac() && !playerUtil.isTouchDevice();\r\n }\r\n @Output()\r\n onPlay = new EventEmitter();\r\n\r\n @Input()\r\n fromSpace = false;\r\n\r\n @Input()\r\n fromActivity = false;\r\n\r\n @Input()\r\n isVertical = false;\r\n\r\n @Input() activityPoster = \"\";\r\n\r\n @Input() isNews = false;\r\n @Input() showPlayEndContent = false;\r\n @Input() nextPlayList = [];\r\n @Input() publisher;\r\n @Output() onClosePlayEndContent = new EventEmitter();\r\n @Output() userBehaviorEvent = new EventEmitter();\r\n @Input() suspendAutoPlay = false;\r\n\r\n @Input() adsDanmus = [];\r\n\r\n closePlayEndContent(event) {\r\n this.onClosePlayEndContent.emit(event);\r\n }\r\n\r\n onUserrBehavior(event) {\r\n this.userBehaviorEvent.emit(event);\r\n }\r\n\r\n constructor(\r\n //private _configManager: VideoPlayerConfigManager,\r\n public danmuFacade: DanmuFacade,\r\n @Inject(AppStore) private store: Store,\r\n private danmuService: DanmuService,\r\n private _toastService: ToastService,\r\n private _dnDialogService: DnDialogService,\r\n private _httpHelper: HttpClientHelper,\r\n private playerMediaListService: PlayerMediaListService,\r\n private _userService: UserService,\r\n private _rechargeBoxService: RechargeBoxService,\r\n private activatedRoute: ActivatedRoute,\r\n private storageService: StorageService,\r\n private _guide: GuideService,\r\n private videoPlayerSettingsService: VideoPlayerSettingsService,\r\n private fullScreenService: FullScreenService,\r\n private _utility: Utility,\r\n private _apiHelper: ApiUrlHelper,\r\n private settingsService: SettingsService,\r\n ) {\r\n this.api = new videoStartAPI();\r\n }\r\n ngAfterViewInit(): void {\r\n\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n\r\n\r\n\r\n if (changes.video \r\n && changes.video.currentValue \r\n && changes.video.currentValue.cid) {\r\n this.isContinuousPlay = false;\r\n if (!(changes.video.currentValue.cid.startsWith(\"0,1,3\") || changes.video.currentValue.cid.startsWith(\"0,1,7\")) \r\n && !this.autoStart\r\n && this.playListConfig.canSelect\r\n ) {\r\n setTimeout(() => {\r\n this.playerMediaListService.open();\r\n }, 1000);\r\n }\r\n }\r\n\r\n if (changes.video && changes.video.previousValue) {\r\n // 跳转新视频后重置\r\n this.ppmm.reset();\r\n // 重置广告\r\n this.isPlayingAds = false;\r\n this.shouldChangePlayer = true;\r\n this.api[\"isPlayingAds\"] = false;\r\n this.isBackToPlayMedia = false;\r\n }\r\n\r\n if (changes.isFloatPlayer && !changes.isFloatPlayer.firstChange) {\r\n // 小窗口播放时,关闭选集框\r\n this.playerMediaListService.close();\r\n }\r\n }\r\n\r\n // onSeekStart() {\r\n // // this.danmuFacade.init();\r\n // this.danmuFacade.seekStart(true);\r\n // }\r\n\r\n public hasState = false; //是否已显示过通知了\r\n\r\n\r\n public isPlayingAds;\r\n public skipAfter = 10;\r\n public shouldPlaySeoncd = 0;\r\n\r\n public leftSecond = 20;\r\n public mutable = false; //为真时,用户只使用H5播放器\r\n inputShowTimeout = null;\r\n // isCurrentFullScreen = false;\r\n\r\n //playerConfig;\r\n ngOnInit() {\r\n this.reportDanmuReason = this.reportDanmuReasons[0].name;\r\n this.subscriptions.push(\r\n\r\n this._utility.GetOrCreateSubscript(\"change.player\").subscribe(p => {\r\n this._dnDialogService.close('coin-or-upgrade-to-skip-ad');\r\n }),\r\n this._guide.settingGuide.subscribe(r => {\r\n this.playerSettingGuide = r;\r\n })\r\n );\r\n // this.readState();\r\n\r\n this.isPlayerReady = true;\r\n var cannotchangeVideo = true;\r\n\r\n // if(!environment.production)\r\n // {\r\n // cannotchangeVideo = false;\r\n // }\r\n this.playerSelection = PlayerTech.Original;\r\n this.mutable = true;\r\n if (this.playerMode == \"auto\"\r\n && cannotchangeVideo) {\r\n this.isFluence = true;\r\n }\r\n\r\n\r\n this.getUserPerference();\r\n\r\n VgUtils.shouldUseNative = true;\r\n VgUtils.shouldHandleMouse = !playerUtil.isIphoneDevice();\r\n VgUtils.shouldUseFakeFullScreen = false;\r\n VgUtils.useFakeFullScreenWhenNotPossible = true;\r\n\r\n if (playerUtil.isTouchDevice()) {\r\n this.touchDevice = VgUtils.isTouchDevice = true;\r\n }\r\n\r\n //this.initMedia(this.mediaList);\r\n //this.listenToIntersitial();\r\n\r\n this.isIPhone = playerUtil.isIphoneDevice();\r\n this.isChrome = playerUtil.isChrome();\r\n if (environment.app) {\r\n this.mutable = true;\r\n }\r\n this.isPublicBlocked = !this._utility.canViewPublic;\r\n\r\n //console.log(this.isPublicBlocked)\r\n\r\n this.subscriptions.push(\r\n this.playerMediaListService.open$\r\n .subscribe(opened => {\r\n if (opened) {\r\n this.api.captureControls();\r\n } else {\r\n this.api.releaseControls();\r\n }\r\n })\r\n );\r\n var playerConfig = this.storageService.GetConfig();\r\n this.isJump = playerConfig.autoSkip == 0 ? false : true; // 跳过状态由storageConfig保存\r\n this.autoStart = playerConfig.autoStart == 0 ? false : true;\r\n this.autoNext = playerConfig.autoNext == 0 ? false : true; // 自动下一集状态由storageConfig保存\r\n this.forbiddenFloatingPlayer = playerConfig.forbiddenFloatingPlayer == 1 ? true : false; // 画中画状态由storageConfig保存\r\n this.smallPlayerValid = !this.forbiddenFloatingPlayer;\r\n this.videoPlayerSettingsService.setPlayerSettings(playerConfig);\r\n\r\n const isiOS = this._utility.isIphoneDevice();\r\n if (!this.isLive && !isiOS) {\r\n this._guide.getGuideCookie(0);\r\n }\r\n\r\n }\r\n public isChrome = false;\r\n\r\n private getUserPerference() /// 根据用户操作习惯来\r\n {\r\n // var config = this._configManager.getConfig();\r\n\r\n // if (!this.mutable)/// 在可以选择播放器的情况下\r\n // {\r\n // this.playerSelection = config[\"player\"] == \"VideoJS\" ? PlayerTech.Original : PlayerTech.Flash;\r\n // if (environment.app) {\r\n // this.playerSelection = PlayerTech.Original;\r\n // }\r\n\r\n // if (this.playerSelection == PlayerTech.Flash) {\r\n // this.isFluence = true;\r\n // }\r\n // else {\r\n // this.isFluence = false;\r\n // }\r\n // }\r\n // else {\r\n // this.isFluence = !config[\"tech\"] || config[\"tech\"] == \"RTMP\";\r\n\r\n // }\r\n // //console.log(config,this.mutable,!config[\"tech\"] || config[\"tech\"] == \"RTMP\")\r\n // if (this.needBought) {\r\n // // this.isJump = false;\r\n // }\r\n // else {\r\n // this.isJump = !(config[\"jump\"] == 0);\r\n // }\r\n\r\n // this.isJump = !(this.needBought || (config[\"jump\"] ==1 && !this.needBought));\r\n }\r\n\r\n private setConfigOnSelection() {\r\n\r\n // var config = this._configManager.getConfig();\r\n\r\n // if (this.playerSelection == PlayerTech.Flash) {\r\n // config[\"player\"] = \"CKPlayer\";\r\n // }\r\n // else {\r\n // config[\"player\"] = \"VideoJS\";\r\n // }\r\n\r\n // if (this.isFluence) {\r\n // config[\"tech\"] = \"RTMP\";\r\n // }\r\n // else {\r\n // config[\"tech\"] = \"HLS\";\r\n\r\n // }\r\n\r\n\r\n // if (this.isJump) {\r\n // config[\"jump\"] = 1;\r\n // }\r\n // else {\r\n // config[\"jump\"] = 0;\r\n // }\r\n // // console.log(config);\r\n\r\n\r\n // this._configManager.setConfig(config);\r\n\r\n }\r\n\r\n // isVideoVertical = false;\r\n ///开始加载一下个视频\r\n public startLoadMedia(media) {\r\n if(!!media?.src)\r\n media.src = media.src.split(\"?\")[0];\r\n this.loadMedia = media;\r\n \r\n\r\n }\r\n public reset() {\r\n this.ppmm.reset();\r\n }\r\n ///清空视频\r\n // private resetLoadMeida() {\r\n // this.loadMedia = null;\r\n // }\r\n public isControlshow = true;\r\n // @ViewChild(\"loader\", { static: true }) loader: ElementRef;\r\n cachePlaySecond = null;\r\n canSkipEnds = true;\r\n public currentPlayingAds: IMedia = null;\r\n /*\r\n ** 设备无关插播广告。\r\n */\r\n private listenToIntersitial() {\r\n //console.log(\"listen\");\r\n var stateTime = 0;\r\n if (this.pauseList)\r\n this.api.invokePauseList(this.pauseList);\r\n\r\n\r\n this.api.subscript(\"play\", () => {\r\n // console.log(\"aaa\");\r\n if (!this.isPlayingAds) {\r\n this.ppmm.renew();\r\n }\r\n this.isPaused = false;\r\n this.hasError = false;\r\n this.errorContent = \"\";\r\n this.onPlay.emit();\r\n\r\n });\r\n\r\n this.api.subscript(\"pause\", () => {\r\n if (!this.isPlayingAds) {\r\n this.ppmm.pause();\r\n }\r\n this.isPaused = true;\r\n this.removeDetectLivePlayable();\r\n })\r\n\r\n this.api.subscript(\"controlBarShow\", (isshow) => {\r\n if (isshow) {\r\n this.isControlshow = true;\r\n }\r\n else {\r\n this.isControlshow = false;\r\n }\r\n\r\n });\r\n this.api.subscript(\"loadedmetadata\", () => {\r\n //console.log(this.isPlayingAds);\r\n if (this.api.getPlayMedia.title != \"loading\" && !this.isPlayingAds) {\r\n stateTime = 0;\r\n if (!isNaN(this.api.totalTime)) {\r\n // console.log(this.api.getPlayMedia.title)\r\n this.ppmm.getTimeDefine(this.api.getPlayMedia.title, this.api.totalTime / 1000);\r\n }\r\n if (this.cachePlaySecond) {\r\n this.invokePlayConfig(this.cachePlaySecond);\r\n this.cachePlaySecond = null;\r\n }\r\n\r\n //console.log(this.ppmm);\r\n if (this.ppmm.state == intersitialEvent.ShouldCancel) {\r\n this.ppmm.continue();\r\n }\r\n }\r\n else {\r\n \r\n }\r\n this.removeDetectLivePlayable();\r\n });\r\n // this.api.subscript(\"play\", () => {\r\n // this.hasError = false;\r\n // this.errorContent = \"\";\r\n // this.onPlay.emit();\r\n // });\r\n this.api.subscript(\"ended\", () => {\r\n if (this.autoNext)\r\n this.playNextVideo(false)\r\n });\r\n\r\n this.api.subscript(\"time\", (time) => {\r\n if (!this.isPlayingAds) {\r\n var current = time.current / 1000;\r\n this.ppmm.needToShow(current);\r\n if (this.skipEndTime\r\n && current > this.skipEndTime\r\n && this.isJump\r\n && this.canSkipEnds\r\n && this.autoNext\r\n ) {\r\n if (!stateTime) {\r\n this.api.showInfo('即将为您跳过片尾', 5, true);\r\n }\r\n ++stateTime;\r\n if (stateTime == 5) {\r\n this.playNextVideo();\r\n }\r\n }\r\n else {\r\n stateTime = 0;\r\n }\r\n this.detectLivePlayable();\r\n }\r\n else {\r\n this.removeDetectLivePlayable();\r\n }\r\n });\r\n /*\r\n ** 广告\r\n */\r\n if (this.ppmm == null) {\r\n this.ppmm = new interstitialManager();\r\n\r\n var cachedMedia: IMedia = null;\r\n var cachedTime = 0;\r\n\r\n this.subscriptions.push(this.ppmm.subscribe((data: interstitialData) => {\r\n this.api.intersitialHandler(data);\r\n switch (data.event) {\r\n case intersitialEvent.Timer:\r\n this.api.showInfo(VideoResource.secondFormat.replace('{second}', data.data[\"time\"]), 0, true);\r\n //this.caption = this.secondFormat.replace('{second}', data.data[\"time\"]);\r\n break;\r\n case intersitialEvent.Timer+2:///需要缓存播放时间,和路径\r\n this.api.showInfo(\"\", 0, false);\r\n cachedMedia = this.api.getPlayMedia;\r\n cachedTime = this.api.currentTime;\r\n this.currentPlayingAds = this.loadMedia;\r\n // if(!environment.production)\r\n // {\r\n // this.currentPlayingAds.src=this.currentPlayingAds.src.replace(\"s1-a1\",\"s1-a2\");\r\n // }\r\n if (this._utility.canViewPublic) {\r\n if (!this.currentPlayingAds.isImage) {\r\n this.api.playVideo([this.currentPlayingAds], true);\r\n }\r\n else {\r\n this.api.pause();\r\n }\r\n }\r\n else {\r\n this.api.pause();\r\n }\r\n this._utility.Notify(\"video.playads\", true)\r\n this.isPlayingAds = true;\r\n this.skipAfter = 10;\r\n //window.dispatchEvent(new CustomEvent(VgEvents.VG_START_ADS));\r\n break;\r\n case intersitialEvent.ShouldBackToPlay:\r\n\r\n this._utility.Notify(\"video.playads\", false);\r\n this.isBackToPlayMedia = true;\r\n if (!(this.shouldSkipAds || this.hasBought) || this.isPlayingAds) {\r\n if (cachedMedia != null) {\r\n this.currentPlayingAds = this.loadMedia = null;\r\n if (this._utility.canViewPublic) {\r\n this.api.playVideo([cachedMedia], false);\r\n this.shouldPlaySeoncd = cachedTime;\r\n }\r\n else {\r\n this.api.play();\r\n }\r\n this.isPlayingAds = false;\r\n this.shouldChangePlayer = true;\r\n this.api[\"isPlayingAds\"] = false;\r\n this.isBackToPlayMedia = false; // 广告结束后,重置\r\n }\r\n }\r\n this.canSkipEnds = true;\r\n break\r\n case intersitialEvent.ShouldLoadAds:\r\n this.canSkipEnds = false;\r\n this.isBackToPlayMedia = false;\r\n\r\n if (this.shouldSkipAds || this.hasBought || this.isUserFilterAd) {\r\n this.ppmm.stopPlay();\r\n if (!this.hasState) {\r\n //this.hasState = true;\r\n if (this.needBought) {\r\n this.api.showInfo(\r\n this.hasBought == 1 ?\r\n VideoResource.alreadyBought : VideoResource.highFormat, 5, false);\r\n }\r\n else {\r\n this.api.showInfo(VideoResource.vipskipFormat, 5, false);\r\n // * 向后台发送过滤了一个广告\r\n this._httpHelper.get(this._apiHelper.PUBLIC_ENDPOINT() + \"/filter/a?s=1\", true)\r\n .subscribe();\r\n }\r\n\r\n }\r\n\r\n }\r\n else {\r\n this.startLoadMedia(data.data)\r\n }\r\n break;\r\n case intersitialEvent.SkipTimer:\r\n this.skipAfter = data.data[\"time\"];\r\n this.leftSecond = data.data[\"left\"];\r\n break;\r\n\r\n case intersitialEvent.ShouldCancel:\r\n\r\n\r\n // this.caption = \"\";\r\n this.captions = [];\r\n cachedMedia = null;\r\n cachedTime = 0;\r\n this.loadMedia = null;\r\n this.isPlayingAds = false;\r\n\r\n break\r\n }\r\n }));\r\n\r\n if (this.pendding) {\r\n this.ppmm.invokeList(this.pendding.mediaList, this.pendding.startSecond, this.pendding.periodicSecond);\r\n this.pendding = null;\r\n }\r\n\r\n\r\n }\r\n\r\n // if(this.ppmm.playStart(this.api))\r\n // {\r\n // console.log(\"play start\");\r\n // }\r\n }\r\n\r\n // publicLoader(event)\r\n // {\r\n // console.log(\"video loading\",event);\r\n // }\r\n @Input()\r\n isMuted = false;\r\n\r\n // * 正在切换清晰度或线路\r\n isSwitching = false;\r\n isSwitchComplete = false;\r\n switchCompleteText = \"切换完成!\";\r\n\r\n switchingPromptTimeout;\r\n muted(event) {\r\n if (event != null)\r\n event.stopPropagation();\r\n\r\n this.isMuted = !this.isMuted;\r\n this.api.muted(this.isMuted);\r\n }\r\n\r\n private needChangeNextBitrateTimeout = null\r\n\r\n private detectLivePlayable() {\r\n VgUtils.clearTimeout(this.needChangeNextBitrateTimeout);\r\n\r\n // if(!environment.production)\r\n // {\r\n // this.api.videoLog({\r\n // logLevel:\"warning\",\r\n // logType:\"autoSwitchLine\",\r\n // message:\"user auto switch line\",\r\n // resource:this.media.src?.split(\"?\")[0]\r\n // });\r\n // }\r\n //console.log(this.isLive,this.hasError);\r\n if (!this.isLive) {\r\n return;\r\n }\r\n\r\n if (this.hasError) {\r\n return;\r\n }\r\n this.needChangeNextBitrateTimeout = VgUtils.setTimeout(() => {\r\n // const apiURL = this._apiHelper.APIV3_ENDPOINT() + \"/user/UpdateFields\";\r\n // this._httpHelper.post() \r\n this.api.videoLog({\r\n logLevel:\"warning\",\r\n logType:\"autoSwitchLine\",\r\n message:\"user auto switch line\",\r\n resource:this.media.src?.split(\"?\")[0]\r\n });\r\n this.changeBitrateIfPossible()\r\n }, 10 * 1000 )\r\n }\r\n\r\n /*\r\n ** 自动切换清晰度\r\n */\r\n private changeBitrateIfPossible() {\r\n let canPlayVideo = this.bitrates.filter(p => !!p.path);\r\n if (!environment.app) {\r\n canPlayVideo = canPlayVideo.filter(p => p.bitrate <= 1080)\r\n }\r\n if (canPlayVideo.length == 0) {\r\n this.showInfo(\"暂无信号,请稍后重试\", 5, false);\r\n return;\r\n }\r\n if(canPlayVideo.length == 1)\r\n {\r\n this.showInfo(\"信号源丢失, 正在找回\",5,false);\r\n this.retry();\r\n return;\r\n }\r\n\r\n\r\n\r\n // console.log(canPlayVideo)\r\n let key = this.currentBitrate?.key || this.playingMedia.key;\r\n let index = canPlayVideo.findIndex(p => p.key == key);\r\n if(index == -1)\r\n {\r\n this.showInfo(\"自动切换失败,请尝试手动切换\",5,false);\r\n console.log(canPlayVideo,key);\r\n return;\r\n }\r\n index += 1;\r\n if (index >= canPlayVideo.length) {\r\n index = 0;\r\n };\r\n this.showInfo(\"信号源丢失, 为您切换线路\",5,false);\r\n this._utility.Notify(\"system.call.changeBitrate\", canPlayVideo[index]);\r\n \r\n }\r\n\r\n private removeDetectLivePlayable() {\r\n //console.log(\"disable live check\")\r\n VgUtils.clearTimeout(this.needChangeNextBitrateTimeout);\r\n }\r\n\r\n navigatetopublic() {\r\n\r\n if (this._utility.isIphoneDevice()) {\r\n this.api.play();\r\n this.api.play();\r\n\r\n }\r\n else {\r\n VgUtils.openInNewWindow(this.currentPlayingAds.href);\r\n }\r\n }\r\n\r\n\r\n private infoTimeout = null;\r\n //captions = [];\r\n\r\n public get captions(){\r\n return this._captions;\r\n }\r\n public set captions(value)\r\n {\r\n if(Array.isArray(value))\r\n {\r\n this._captions = value;\r\n }\r\n }\r\n private _captions = [];\r\n\r\n checkIfNeedToggleCallback = this.checkIfNeedToggle.bind(this);\r\n ///this is call back\r\n checkIfNeedToggle(index) {\r\n if (index === 5 && (!this._userService.user.id)) {\r\n if (this.isFullscreen) {\r\n this.fullScreenService.toggleFullScreen();\r\n }\r\n this._userService.showLoginDialog(true);\r\n return false;\r\n }\r\n\r\n if (index === 5\r\n && !!this._userService.user.id\r\n && this._userService.user.roleId === 0) {\r\n if (this.isFullscreen) {\r\n this.fullScreenService.toggleFullScreen();\r\n // this.fsAPI.toggleFullscreen();\r\n }\r\n this._rechargeBoxService.changeDisplayStatus(true);\r\n return false;\r\n }\r\n\r\n console.log(index);\r\n return true;\r\n }\r\n /*\r\n ** data: 显示的信息\r\n ** second:出现几秒\r\n ** override:是否替换最后一条信息\r\n */\r\n showInfo(data, second, override) {\r\n if (data.indexOf(\"跳过广告\") > -1\r\n || data.indexOf(\"已过滤广告\") > -1) {\r\n this.captions = this.captions.filter(item => !item.includes(\"后播放广告\"))\r\n }\r\n if (data === this.captions[this.captions.length - 1]) {\r\n playerUtil.clearTimeout(this.infoTimeout);\r\n this.infoTimeout = playerUtil.setTimeout(\r\n () => { this.captions = this.captions.filter(c => c !== data) },\r\n second * 1000\r\n );\r\n return;\r\n }\r\n if (data != \"\") {\r\n if (override && !!this.captions.length) {\r\n this.captions[this.captions.length - 1] = data;\r\n } else {\r\n this.captions.push(data);\r\n }\r\n if (second > 0)\r\n this.infoTimeout = playerUtil.setTimeout(\r\n () => { this.captions = this.captions.filter(c => c !== data) },\r\n second * 1000\r\n );\r\n } else {\r\n this.infoTimeout = playerUtil.setTimeout(\r\n () => { this.captions.shift() }, 0\r\n );\r\n }\r\n }\r\n\r\n isVolumeShow = false;\r\n volumeTimer = null;\r\n volumeTimeout = 330;\r\n position: any = {};\r\n showVolume(event) {\r\n var element = event.target;\r\n if (element) {\r\n this.position.left = (element as HTMLElement).offsetLeft + 2;\r\n this.position.top = (element as HTMLElement).offsetTop;\r\n //console.log(this.position);\r\n }\r\n\r\n if (this.volumeTimer != null) {\r\n clearTimeout(this.volumeTimer);\r\n this.volumeTimer = null;\r\n }\r\n\r\n this.volumeTimer = setTimeout(() => {\r\n this.isVolumeShow = true;\r\n this.api.captureControls();\r\n\r\n }, this.volumeTimeout);\r\n }\r\n keepVolume() {\r\n if (this.volumeTimer != null) {\r\n clearTimeout(this.volumeTimer);\r\n this.volumeTimer = null;\r\n }\r\n this.isVolumeShow = true;\r\n }\r\n hideVolume() {\r\n if (this.volumeTimer != null) {\r\n clearTimeout(this.volumeTimer);\r\n this.volumeTimer = null;\r\n }\r\n\r\n this.volumeTimer = setTimeout(() => {\r\n if (this.isVolumeShow && !!this.api)\r\n this.api.releaseControls();\r\n this.isVolumeShow = false;\r\n\r\n }, this.volumeTimeout);\r\n // this.isVolumeShow = false;\r\n // console.log(\"should hide volume\");\r\n }\r\n currentPlayLanguage;\r\n changeLanguage(item) {\r\n this.language = item.title;\r\n this.onChangeLanguage.emit(item);\r\n this.api.releaseControls();\r\n }\r\n /* 播放下一集 */\r\n playNextVideo(showCaption = true) {\r\n\r\n this.isContinuousPlay = true;\r\n if (this.playNextCallback) {\r\n //console.debug(\"next video called\")\r\n this.playNextCallback(() => {\r\n }, () => {\r\n if (!!this.api && showCaption)\r\n this.api.showInfo(VideoResource.alreadymax, 10, true)\r\n this.isContinuousPlay = false;\r\n });\r\n }\r\n }\r\n\r\n\r\n purchaseMedia(mediaKey) {\r\n //console.log(mediaKey);\r\n if (this.unlockCallback) {\r\n if (this.isFullscreen)\r\n this.showInfo(\"请先退出全屏\", 5, false);\r\n\r\n this.unlockCallback(mediaKey);\r\n }\r\n }\r\n /**\r\n * 跳过广告\r\n */\r\n skipAds($event) {\r\n\r\n if (this.isFullscreen) {\r\n this.fullScreenService.toggleFullScreen();\r\n }\r\n if ($event != null)\r\n $event.stopPropagation();\r\n\r\n if (!this.user?.id) {\r\n this._userService.showLoginDialog(true);\r\n return;\r\n }\r\n this._dnDialogService.open('coin-or-upgrade-to-skip-ad', { price: this.filterGold });\r\n\r\n }\r\n\r\n filterAllAds() {\r\n this.api.showInfo(VideoResource.boughtVideo, 5, false);\r\n this.ppmm.stopPlay();\r\n }\r\n\r\n public loadMedia: IMedia = null;\r\n\r\n\r\n skipAd() {\r\n if (this.needBought) {\r\n if (this.filterCallback) {\r\n this._dnDialogService.close('coin-or-upgrade-to-skip-ad');\r\n this.filterCallback(() => {\r\n //this.ppmm.reset();\r\n this.ppmm.cancel();\r\n this.ppmm.stopPlay();\r\n this.api.showInfo(VideoResource.boughtVideo.replace(\"{0}\", \"\" + this.filterGold), 5, false);\r\n // console.log(\"成功\");\r\n }, (data) => {\r\n if (!this.user?.id) {\r\n this._userService.showLoginDialog(true);\r\n return;\r\n }\r\n this._toastService.showBlackToast('金币不足!');\r\n // this.api.showInfo(VideoResource.notenoughGold, 5);\r\n });\r\n }\r\n }\r\n else {\r\n this.filterAllAds();// this.ppmm.stopPlay();\r\n }\r\n }\r\n ppmm: interstitialManager;\r\n\r\n public initMedia(mediaList: Array) {\r\n if (!!mediaList) {\r\n this.media = mediaList.find(p => !!p && !p.isAd);\r\n }\r\n }\r\n\r\n @HostListener('window:resize')\r\n private onWindowResize(): void {\r\n this.winWidth = window.innerWidth;\r\n this.windHeight = window.innerHeight;\r\n\r\n }\r\n\r\n // onFlashTrulyReady() {\r\n // this._onPlayerReady();\r\n // this.api[\"setLogo\"](this.logo);\r\n // //console.log(this.shouldPlaySeoncd);\r\n\r\n // this.api.subscript(\"loadedmetadata\", () => {\r\n // if (this.shouldPlaySeoncd) {\r\n // // console.log(this.shouldPlaySeoncd);\r\n // playerUtil.setTimeout(() => {\r\n // this.api.seek(this.shouldPlaySeoncd);\r\n // this.shouldPlaySeoncd = 0;\r\n // //console.log(\"aaa\");\r\n // }, 100)\r\n // }\r\n\r\n // });\r\n // this.api[\"changeConfig\"](\"jump\", this.isJump ? 1 : 0);\r\n // this.onVideoReady.emit(this.api);\r\n\r\n // }\r\n\r\n private _onPlayerReady() {\r\n this.listenToIntersitial();\r\n }\r\n\r\n // onPlayerReadyFlash(ckAPI: CKPlayerAPI) {\r\n // // console.log(ckAPI);\r\n // this.api = ckAPI;\r\n // //ckAPI.setLogo(this.logo);\r\n\r\n // this.onVideoReady.emit(this.api);\r\n\r\n // if (!!this.media && !!this.media.rtmp) {\r\n // this.api.playVideo([this.media], false);\r\n\r\n // // if(this.shouldPlaySeoncd)\r\n // // {\r\n // // // console.log(this.shouldPlaySeoncd);\r\n // // this.api.seek(this.shouldPlaySeoncd);\r\n // // this.shouldPlaySeoncd = 0;\r\n // // }\r\n // }\r\n // }\r\n /*\r\n ** 判定正在播放的视频为何种流\r\n */\r\n onPlayVideo() {\r\n if (this.mutable && !!this.media.backup) {\r\n\r\n // if((this.media.isHls && this.isFluence) || (!this.media.isHls && !this.isFluence))\r\n\r\n // this.swapBackup();\r\n\r\n this.shouldPlaySeoncd = this.isLive ? 0 : this.api.currentTime;\r\n\r\n this.api.playVideo([this.media], false);\r\n\r\n this.mediaJudge();\r\n this.shouldChangePlayer = true;\r\n // if(streamType==\".m3u8\")\r\n // {\r\n // this.isFluence = false;\r\n // }\r\n // else\r\n // {\r\n // this.isFluence = true;\r\n // }\r\n }\r\n\r\n }\r\n @ViewChild(\"configBox\") configBox: ElementRef;\r\n isopenOrHideConfig = false;\r\n configBoxSubscript: Unsubscribable;\r\n openOrHideConfig() {\r\n this.isopenOrHideConfig = !this.isopenOrHideConfig;\r\n if (this.isopenOrHideConfig) {\r\n this.api.captureControls();\r\n this.configBoxSubscript = this._utility.openList(this.configBox.nativeElement as HTMLElement, null, () => {\r\n this.isopenOrHideConfig = false;\r\n this.configBoxSubscript.unsubscribe();\r\n this.api.releaseControls();\r\n })\r\n }\r\n else {\r\n if (this.configBoxSubscript != null)\r\n this.configBoxSubscript.unsubscribe();\r\n this.api.releaseControls();\r\n }\r\n this.closeGuide();\r\n }\r\n\r\n\r\n\r\n /*\r\n ** 是否解析成功\r\n */\r\n isMasterEnabled = false;\r\n\r\n /*\r\n ** master playlist 解析成功,确定码率\r\n */\r\n onMasterPlayParsed(parsed: { levels: Array, startLevel: any }) {\r\n \r\n if (parsed.levels.length > 1) /// 多比特率,有作用\r\n {\r\n this.isMasterEnabled = true;\r\n\r\n for (var i = 0; i < parsed.levels.length; ++i) {\r\n let index = this.bitrates.findIndex(p => p.title == parsed.levels[i].label);\r\n if (index > -1)\r\n this.bitrates[index].qualityIndex = parsed.levels[i].qualityIndex;\r\n }\r\n\r\n var index = this.bitrates.findIndex(p => p.label === parsed.startLevel.label);\r\n this.playingMedia = this.bitrates[index];\r\n this.currentLevel = {};\r\n this.currentPlayingLevel = index;\r\n\r\n }\r\n else {\r\n this.isMasterEnabled = false;\r\n }\r\n this.switchLevelComplete();\r\n\r\n }\r\n currentLevel: any = {};\r\n private currentBitrate = null;\r\n /*\r\n ** 改变bitrate\r\n */\r\n onSelectBitrate(data) {\r\n let obj:any = {\r\n sharpness:data.bitrate\r\n }\r\n if(data.line)\r\n {\r\n obj['line'] = data.line\r\n }\r\n this.storageService.SetConfig(obj);\r\n if (this.isMasterEnabled && !this.hasError) ///如果第一个level有问题,导致无法切换其他的,需要重新加载\r\n {\r\n this.api.changeBitrate(data);\r\n }\r\n else {\r\n if (!!data && !!data.path) {\r\n this.shouldPlaySeoncd = this.isLive ? this.defaultLiveSeoncd : this.api.currentTime;\r\n var url = data.path.needSign? this._httpHelper.appendUserInfo(data.path.result).url:data.path.result;\r\n var shouldPlayVideo = this._httpHelper.uriSignature(url);\r\n var media = Object.assign({}, this.media);\r\n media.src = shouldPlayVideo;\r\n this.api.playVideo([media], false);\r\n }\r\n }\r\n this.switchCompleteText = this.isLine ? \"已切换到\" + data.label : \"已切换到\" + (data.bitrate > 1080 ? data.short : data.label + \"P\");\r\n this.isSwitching = true;\r\n this.currentBitrate = data;\r\n\r\n // safari浏览器,手动修改清晰度结束\r\n if (!this.shouldUseHlsmin()) {\r\n clearTimeout(this.safariSwitchTimeout);\r\n this.safariSwitchTimeout = setTimeout(() => {\r\n this.switchLevelComplete();\r\n }, 10000);\r\n }\r\n }\r\n safariSwitchTimeout;\r\n\r\n // 检测是否是safari浏览器,不支持Hls\r\n private shouldUseHlsmin() {\r\n var ext = this.getFileExtensions(this.media.src);\r\n if (this.media.src && ext != 'mp4'\r\n && ext != 'js'\r\n ) {\r\n return this.isHlsSupport();\r\n }\r\n return false;\r\n }\r\n\r\n getFileExtensions(url) {\r\n try {\r\n url = url.split(\"#\")[0].split(\"?\")[0];\r\n return url.substring(url.lastIndexOf('.') + 1, url.length) || url;\r\n } catch (error) {\r\n return \"\"\r\n }\r\n }\r\n\r\n isHlsSupport() {\r\n try {\r\n if ((VgUtils.isiOSDevice()\r\n || VgUtils.IsMac()) && VgUtils.isSafari()) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n } catch {\r\n }\r\n return false;\r\n }\r\n\r\n /*\r\n ** 是否支持master播放列表的播放\r\n */\r\n private isMasterCompible() {\r\n return this._utility.canUseMaster;\r\n }\r\n /*\r\n ** hls,自动更换\r\n */\r\n onLevelChanged(data) {\r\n\r\n //console.log(levelId)\r\n // this.onLevelChanged.emit(data);\r\n if (this.playingMedia?.qualityIndex == -1) /// 自动中\r\n {\r\n this.currentPlayingLevel = data.level;\r\n }\r\n this.switchLevelComplete();\r\n }\r\n /*\r\n ** 修改清晰度结束\r\n */\r\n private switchLevelComplete() {\r\n clearTimeout(this.switchingPromptTimeout);\r\n if (this.isSwitching) {\r\n this.isSwitching = false;\r\n this.isSwitchComplete = true;\r\n this.switchingPromptTimeout = setTimeout(() => {\r\n this.isSwitchComplete = false;\r\n }, 1000);\r\n\r\n }\r\n\r\n }\r\n public currentPlayingLevel = 0;\r\n private shouldChangePlayer = false;\r\n\r\n private swapBackup() {\r\n\r\n if (!!this.media.backup) {\r\n var temp = this.media.src;\r\n this.media.src = this.media.backup;\r\n this.media.backup = temp;\r\n this.media.isHls = playerUtil.GetFileExtension(this.media.src) == \".m3u8\";\r\n\r\n }\r\n\r\n }\r\n //h5播放器对流进行判定\r\n private mediaJudge() {\r\n\r\n if (this.mutable && !this.isPlayingAds) {\r\n if (this.media.isHls) {\r\n this.isFluence = false;\r\n this.streamTech = StreamTech.M3U8;\r\n }\r\n else {\r\n this.isFluence = true;\r\n this.streamTech = StreamTech.MP4;\r\n\r\n }\r\n }\r\n\r\n // if(streamTyp\r\n }\r\n\r\n isFluence = false;\r\n\r\n\r\n /*\r\n ** 选择是否跳过\r\n */\r\n selectTian() {\r\n this.isJump = !this.isJump;\r\n // 向storageconfig更新切换后的跳过设置\r\n // this.storageService.SetConfig({\r\n // autoSkip: this.isJump ? 1 : 0\r\n // })\r\n\r\n // 向setting服务更新切换后的跳过设置,再由服务里的switchSkipMode()传递到storageconfig\r\n if (this.user && this.user.id) {\r\n this.settingsService.updateOneSetting({isSkipMode: this.isJump});\r\n }\r\n\r\n //this.playerConfig = { ...this.playerConfig, autoSkip: this.isJump }\r\n //this.storageService.SetItem('player-config', JSON.stringify(this.playerConfig))\r\n\r\n this.setConfigOnSelection()\r\n }\r\n\r\n toggleAutoStart() {\r\n this.autoStart = !this.autoStart;\r\n this.storageService.SetConfig({\r\n autoStart: this.autoStart ? 1 : 0\r\n });\r\n //this.autoStart = !this.autoStart;\r\n //this.playerConfig = { ...this.playerConfig, autoStart: this.autoStart }\r\n //this.storageService.SetItem('player-config', JSON.stringify(this.playerConfig))\r\n }\r\n toggleAutoNext() {\r\n this.autoNext = !this.autoNext;\r\n // 向storageconfig更新切换后的自动下一集设置\r\n // 此开关已隐藏,未启用\r\n this.storageService.SetConfig({\r\n autoNext: this.autoNext ? 1 : 0\r\n });\r\n }\r\n\r\n // canSelect() {\r\n // return this.video?.category !== 'movie'\r\n // && this.video?.cid != null\r\n // && this.video?.cid !== 'top'\r\n // && !this.video?.cid.startsWith('0,1,6,57')\r\n // }\r\n private dispose() {\r\n this.api.dispose();\r\n this.api = null;\r\n }\r\n public isVideoSuccessPlayed = false;\r\n public videoSuccessPlayerTimeout = null;\r\n /**\r\n * 播放器加载完成\r\n */\r\n onPlayerReady(api: VgAPI) {\r\n //console.log(\"player ready 1\")\r\n this.api = new videoPlayerVgApi();\r\n this.apiReady.emit(this.api);\r\n this.api[\"assignData\"](api, this);\r\n this.api['canViewPublic'] = this._utility.canViewPublic;\r\n this.subscriptions.push((api.getDefaultMedia()).subscriptions.volumeChange.subscribe((val) => {\r\n if (this.isPlayingAds) {\r\n this.adVolume = this.api.getVolume();\r\n } else {\r\n this.volume = this.api.getVolume();\r\n }\r\n }));\r\n\r\n this.subscriptions.push((api.getDefaultMedia())\r\n .subscriptions\r\n .loadedMetadata\r\n .subscribe(\r\n () => {\r\n const fromSearchResult = this.activatedRoute.snapshot.queryParams[\"s\"];\r\n if (!fromSearchResult) {\r\n if (this.autoStart || this.isContinuousPlay || this.isPlayingAds || this.shouldChangePlayer) {\r\n this.needPlayVideo();\r\n }\r\n }\r\n this.videoSuccessPlayerTimeout = VgUtils.setTimeout(() => {\r\n\r\n if (playerUtil.isQQBrwoser() && playerUtil.isIphoneDevice()) {\r\n this.needUserTouch = false;\r\n this.ppmm.renew();\r\n this.isVideoSuccessPlayed = true;\r\n }\r\n else {\r\n if (!this.isVideoSuccessPlayed) {\r\n this.needUserTouch = true;\r\n api.triggerUserTouch();\r\n if (this.needBought) /// 非VIP用户\r\n {\r\n this.ppmm.pause();\r\n }\r\n }\r\n }\r\n }, 200);\r\n\r\n if (this.shouldChangePlayer) {\r\n this.shouldChangePlayer = false;\r\n this._utility.Notify(\"change.player\", 1);\r\n }\r\n }\r\n ));\r\n\r\n this.subscriptions.push((api.getDefaultMedia()).subscriptions.play.subscribe(() => {\r\n this.needUserTouch = false;\r\n this.isVideoSuccessPlayed = true;\r\n VgUtils.clearTimeout(this.videoSuccessPlayerTimeout);\r\n if (this.needBought) /// 非VIP用户\r\n {\r\n this.ppmm.renew();\r\n }\r\n\r\n }));\r\n\r\n this._onPlayerReady();\r\n this.onVideoReady.emit(this.api);\r\n }\r\n\r\n\r\n public showAds(ads) {\r\n this.api.triggerPlayAds(ads);\r\n }\r\n private defaultLiveSeoncd = 0;\r\n /*\r\n * 需要播放视频\r\n *\r\n */\r\n private needPlayVideo() {\r\n\r\n //console.log(\"should play second\",this.shouldPlaySeoncd)\r\n if (this.media.isAd) {\r\n this.api.setVolume(this.adVolume * 100);\r\n } else {\r\n this.api.setVolume(this.volume * 100);\r\n }\r\n if (!!this.media && this.media.isHls) {\r\n this.api.seek(this.shouldPlaySeoncd || (this.isLive?this.defaultLiveSeoncd:0));\r\n this.shouldPlaySeoncd = 0;\r\n }\r\n if (this.shouldPlaySeoncd) {\r\n this.api.seek(this.shouldPlaySeoncd);\r\n this.shouldPlaySeoncd = 0;\r\n }\r\n this.api.play();\r\n\r\n this.mediaJudge();\r\n }\r\n\r\n /**\r\n * 在找之前\r\n */\r\n seekVideo() {\r\n if (this.api.getRef()[\"state\"]\r\n && this.api.getRef()[\"state\"] == VgStates.VG_PAUSED) {\r\n this.shouldPlayVideo = false;\r\n }\r\n else {\r\n this.shouldPlayVideo = true;\r\n }\r\n }\r\n\r\n private shouldPlayVideo = false;\r\n /**\r\n * 在找到指定位置后\r\n */\r\n seekedVideo() {\r\n if (this.shouldPlayVideo) {\r\n this.api.play();\r\n }\r\n }\r\n\r\n hasError = false;\r\n errorText = \"发生了未知错误,点击切换模式\";\r\n errorHandler(event) {\r\n if (!this.isPlayingAds) {\r\n var errorCode = 0;\r\n if (event && event.target && event.target.error) {\r\n errorCode = event.target.error.code;\r\n }\r\n switch (errorCode) {\r\n case 3:\r\n this.retry();\r\n break;\r\n default:\r\n this.errorContent = \"未知错误,请联系客服\";\r\n this.hasError = true;\r\n this.isSwitching = false;\r\n this.removeDetectLivePlayable();\r\n break;\r\n }\r\n\r\n }\r\n\r\n if(this.isPlayingAds)\r\n {\r\n this._toastService.showBlackToast(\"广告加载失败, 如遇持续黑屏, 请调整广告过滤插件\",{\r\n timeOut:20 * 1000\r\n });\r\n }\r\n\r\n\r\n }\r\n\r\n public timeUpdate(data) {\r\n // console.log(data);\r\n }\r\n private pendding = null;\r\n\r\n /**\r\n * 装载插播广告\r\n * @param media\r\n */\r\n public invokeInterstitial(mediaList: Array, startsecond, periodicSecond) {\r\n\r\n if (this.ppmm) {\r\n this.ppmm.invokeList(mediaList, startsecond, periodicSecond);\r\n }\r\n else {\r\n this.pendding = {\r\n mediaList: mediaList,\r\n startsecond: startsecond,\r\n periodicSecond: periodicSecond\r\n\r\n };\r\n\r\n }\r\n //this.component[\"invokeInterstitial\"](mediaList, startSecond, periodicSecond);\r\n }\r\n\r\n\r\n shouldShowInput = false;\r\n\r\n private set pauseList(value) {\r\n //console.log(value)\r\n window.dispatchEvent(new CustomEvent(\"invokePauseAds\", {\r\n detail: value\r\n }));\r\n };\r\n /**\r\n * 装载暂停广告\r\n * @param media\r\n */\r\n public invokePauseList(mediaList: Array) {\r\n this.pauseList = mediaList;\r\n // console.log(this.pauseList);\r\n }\r\n\r\n\r\n\r\n public skipEndTime = 0;\r\n /*\r\n ** 播放器无关,预播,跳过\r\n */\r\n invokePlayConfig(data) {\r\n\r\n //console.log(data)\r\n if (!!this.api && this.api[\"eventAttached\"] != false) {\r\n\r\n if (!this.isJump && data.info) {\r\n return;\r\n }\r\n if(this.shouldPlaySeoncd == 0)\r\n this.shouldPlaySeoncd = data.start || 0;\r\n\r\n if (data.info) {\r\n setTimeout(() => {\r\n this.api.showInfo('已为您跳过片头', 5, true);\r\n }, 500);\r\n }\r\n } else {\r\n this.cachePlaySecond = data;\r\n }\r\n this.skipEndTime = data.end;\r\n\r\n //console.log(data);\r\n }\r\n\r\n isLanguageSelectionOpened = false;\r\n @ViewChild(\"languageBox\", {\r\n static: false\r\n }) languageBox: ElementRef;\r\n\r\n languageOpenListUn_: Unsubscribable = null;\r\n openLanguageList() {\r\n this.isLanguageSelectionOpened = !this.isLanguageSelectionOpened;\r\n if (this.isLanguageSelectionOpened) {\r\n //console.log(this.languageBox.nativeElement)\r\n this.api.captureControls();\r\n this.languageOpenListUn_ = this._utility.openList(this.languageBox.nativeElement, null, () => {\r\n this.isLanguageSelectionOpened = false;\r\n this.languageOpenListUn_.unsubscribe();\r\n this.api.releaseControls();\r\n });\r\n }\r\n else {\r\n if (this.languageOpenListUn_) {\r\n this.languageOpenListUn_.unsubscribe();\r\n }\r\n this.api.releaseControls();\r\n }\r\n }\r\n /*\r\n ** 是否由广告管理器跳转\r\n */\r\n private isBackToPlayMedia = false;\r\n /*\r\n ** 准备播放下一个视频\r\n */\r\n onPlayNextVideo(isAds) {\r\n this.isContinuousPlay = true;\r\n if (\r\n (this.isPlayingAds ||\r\n this.ppmm != null\r\n )\r\n && !isAds\r\n && !this.isBackToPlayMedia\r\n ) {\r\n //console.log(\"public reset\");\r\n if (this.ppmm != null)\r\n this.ppmm.reset();\r\n if (this.api != null)\r\n this.api.showInfo(\"\", 0, false);\r\n }\r\n this.isBackToPlayMedia = false;\r\n this.isMuted = false;\r\n //console.log(isAds);\r\n }\r\n\r\n ///播放广告\r\n triggerCounter(itemCount, callback) {\r\n var every = 20;// environment.production? 20:1;\r\n this.totalCount = itemCount * 20;\r\n this.leftSecond = itemCount * 20;\r\n this.ppmm.startCountDown(itemCount * every, every, callback);\r\n }\r\n totalCount = 20;\r\n\r\n\r\n /*\r\n ** 拉伸视频\r\n */\r\n scaleVideo(params) {\r\n\r\n var manager = new VideoScaleManager();\r\n this.videoStyle = manager.getResult(this.api.getVideoMeta, params, this.playerHeight, this.containerRatio);\r\n this.scaled = manager.getScaled();\r\n\r\n\r\n }\r\n\r\n scaled = \"\";\r\n videoStyle = {};\r\n needUserTouch = false;\r\n toPlay() {\r\n //console.log(\"aaa\",this.api);\r\n if (this.api != null) {\r\n\r\n //console.log(\"you must play\");\r\n\r\n try {\r\n this.api.play();\r\n this.api.play(); /// the second is must\r\n\r\n }\r\n catch (ex) {\r\n\r\n }\r\n\r\n }\r\n this.hasError = false;\r\n // this.needUserTouch = false;\r\n // this.ppmm.renew();\r\n // this.isVideoSuccessPlayed = true;\r\n }\r\n retry() {\r\n //console.log(\"error occur,\")\r\n this.shouldPlaySeoncd = this.isLive?this.defaultLiveSeoncd: this.api.currentTime + 5;\r\n //console.log(this.api.totalTime,this.api.currentTime)\r\n this.hasError = false;\r\n // this.api.dispose();\r\n // this.ppmm.dispose();\r\n this.onErrorHandler.emit(true);\r\n }\r\n\r\n toggleDanmu() {\r\n this.danmuFacade.toggleDanmu(null);\r\n }\r\n\r\n reportDanmu(id) {\r\n this.danmuService.reportDanmu(id, this.reportDanmuReason).subscribe(() => {\r\n this._dnDialogService.close('reportDanmu');\r\n this._toastService.showBlackToast('举报成功!');\r\n });\r\n }\r\n\r\n onInputBlur() {\r\n // this.autoHide = true;\r\n // this._autoHide.next(true);\r\n this.api.releaseControls();\r\n }\r\n\r\n onInputFocus() {\r\n // this.autoHide = false;\r\n // this._autoHide.next(false);\r\n this.api.captureControls();\r\n }\r\n\r\n releaseControlHandler(e) {\r\n this.api.releaseControls();\r\n }\r\n\r\n toggleMediaList() {\r\n this.playerMediaListService.toggle();\r\n }\r\n\r\n showRechargeBox() {\r\n if (this.isFullscreen) {\r\n this.fullScreenService.toggleFullScreen();\r\n }\r\n this._dnDialogService.close('media-unavailable');\r\n this._dnDialogService.close('purchase-required');\r\n this._dnDialogService.close('coin-or-upgrade-to-skip-ad');\r\n this._dnDialogService.close('vip-only');\r\n this._rechargeBoxService.changeDisplayStatus(true);\r\n }\r\n\r\n closeGuide() {\r\n if (this.playerSettingGuide) {\r\n this._guide.setGuideCookie(0);\r\n this._guide.closeGuideCover(true, 'setting');\r\n this.playerSettingGuide = false;\r\n }\r\n }\r\n\r\n closeSmallPlayer() {\r\n this.onCloseSmallPlayer.emit()\r\n }\r\n\r\n toggleFloatingPlayer() {\r\n this.forbiddenFloatingPlayer = !this.forbiddenFloatingPlayer;\r\n // 向storageconfig更新切换后的画中画设置\r\n // this.storageService.SetConfig({\r\n // forbiddenFloatingPlayer: this.forbiddenFloatingPlayer ? 1 : 0\r\n // })\r\n\r\n // 向setting服务更新切换后的画中画设置,再由服务里的switchPipMode()传递到storageconfig\r\n if (this.user && this.user.id) {\r\n this.settingsService.updateOneSetting({isPipMode: !this.forbiddenFloatingPlayer});\r\n }\r\n var config = this.storageService.GetConfig();\r\n this.videoPlayerSettingsService.setPlayerSettings(config);\r\n }\r\n\r\n hlsErrorHandler(event) {\r\n this.showInfo(\"当前视频无法播放\", 5, true);\r\n this.errorContent = \"网络错误,当前视频无法播放\";\r\n this.hasError = true;\r\n\r\n }\r\n errorContent = \"\";\r\n timerShow = null;\r\n fullscreenStatusHandler(event) {\r\n this.isFullscreen = event;\r\n //this.danmuFacade.setFullScreen(event);\r\n clearTimeout(this.timerShow);\r\n if (event) {\r\n this.timerShow = setTimeout(() => {\r\n\r\n this.shouldShowInput = true;\r\n\r\n }, 50)\r\n\r\n }\r\n else {\r\n this.shouldShowInput = false;\r\n\r\n }\r\n\r\n // console.log(this.isFullscreen,\"full screen\")\r\n }\r\n isFullscreen = false;\r\n\r\n adsFullscreenClick(event: any) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n}\r\n\r\n/*\r\n*** 视频拉伸处理器\r\n*/\r\nexport class VideoScaleManager {\r\n scaled = \"\";\r\n\r\n constructor() {\r\n\r\n }\r\n getScaled() {\r\n return this.scaled;\r\n }\r\n getResult(mediaMeta, params, playerHeight, containerRatio) {\r\n var result = {};\r\n this.scaled = params;\r\n\r\n if (this.scaled) {\r\n\r\n var videoRatio = 16 / 9;\r\n switch (this.scaled) {\r\n case \"4:3\":\r\n videoRatio = 4 / 3;\r\n break;\r\n\r\n case \"16:9\":\r\n videoRatio = 16 / 9;\r\n break;\r\n\r\n case \"full\":\r\n videoRatio = 1 / 1;\r\n break;\r\n\r\n }\r\n\r\n if (videoRatio != mediaMeta.videoRatio) {\r\n var obj = {\r\n\r\n videoShouldWidth: videoRatio * playerHeight,\r\n videoShouldHeight: playerHeight,\r\n videoCanWidth: playerHeight * containerRatio,\r\n videoCanHeight: playerHeight,\r\n videoWidth: 0,\r\n videoHeight: 0\r\n };\r\n\r\n\r\n\r\n var scalex = 1;\r\n var scaley = 1;\r\n\r\n\r\n if (videoRatio == 1) {\r\n if (mediaMeta.videoRatio != obj.videoCanWidth / obj.videoCanHeight) {\r\n scalex = obj.videoCanWidth / obj.videoWidth;\r\n scaley = obj.videoCanHeight / obj.videoHeight;\r\n }\r\n\r\n }\r\n else {\r\n\r\n obj.videoWidth = obj.videoCanHeight * mediaMeta.videoRatio;\r\n obj.videoHeight = obj.videoCanHeight / mediaMeta.videoRatio;\r\n if (obj.videoWidth > obj.videoCanWidth) {\r\n obj.videoWidth = obj.videoCanWidth;\r\n obj.videoHeight = obj.videoWidth / mediaMeta.videoRatio;\r\n }\r\n\r\n if (obj.videoHeight > obj.videoCanHeight) {\r\n obj.videoHeight = obj.videoCanHeight;\r\n obj.videoWidth = obj.videoHeight * mediaMeta.videoRatio;\r\n\r\n }\r\n\r\n\r\n\r\n scalex = obj.videoShouldWidth / obj.videoWidth;\r\n scaley = obj.videoShouldHeight / obj.videoHeight;\r\n\r\n\r\n }\r\n //console.log(obj);\r\n\r\n result = {\r\n transform: \"scale(\" + scalex + \",\" + scaley + \")\"\r\n\r\n };\r\n\r\n }\r\n\r\n\r\n }\r\n\r\n return result;\r\n }\r\n\r\n}\r\n\r\n","
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n {{ comment.author }}\r\n 0\"\r\n class=\"new-vip-icon ml-2\" \r\n [ngClass]=\"{'activityStyle': hostPage === 'activity' || hostPage === 'activityLast3Child'}\"\r\n [membership]=\"getMembership(comment.gid)\"\r\n [noText]=\"true\" [newIcon]=\"true\"\r\n [canHover]=\"true\">\r\n \r\n 1\" \r\n alt=\"等级图标\"\r\n width=\"29\"\r\n height=\"13\"\r\n />\r\n \r\n \r\n {{ comment.status === 0 ? '已封号' : comment.status === 2 ? '禁言中' : '已冻结'}}\r\n \r\n \r\n
\r\n 回复\r\n \r\n @{{ comment.replyNikcName }}\r\n \r\n 1\" \r\n alt=\"等级图标\"\r\n />\r\n
\r\n
\r\n
\r\n
{{ comment.published }}
\r\n
该用户已被您拉入黑名单。' :formatContent(comment.content)\"\r\n (mouseover)=\"showReplied($event)\" *ngIf=\"!(hostPage === 'activity' || hostPage === 'activityLast3Child')\">\r\n
\r\n \r\n
该用户已被您拉入黑名单。' :formatContent(comment.content)\"\r\n (mouseover)=\"showReplied($event)\" *ngIf=\"!comment.replyUserKey\">\r\n
\r\n
该用户已被您拉入黑名单。' :formatContent(comment.rawContext)\"\r\n (mouseover)=\"showReplied($event)\" *ngIf=\"comment.replyUserKey\">\r\n
\r\n
\r\n
\r\n 0\">\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n {{ comment.reported ? '已举报': '举报' }}\r\n \r\n
\r\n
\r\n \r\n 拉黑\r\n
\r\n
\r\n \r\n 取消拉黑\r\n
\r\n
\r\n \r\n 删除评论\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n {{ comment.published }}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n 回复\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
3\">\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n\r\n\r\n \r\n\r\n
\r\n \r\n \r\n
\r\n\r\n 0 && hostPage !== 'activity'\">\r\n
\r\n \r\n \r\n \r\n \r\n\r\n
\r\n 正在加载...\r\n 查看剩余{{comment.totalReplies - comment.children.length}}条回复\r\n size\">收起\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n","import { Component, OnInit, Input, Inject, OnDestroy, TemplateRef, ViewChild, ViewContainerRef, ComponentFactoryResolver, ComponentRef, ElementRef, AfterViewInit, Output, EventEmitter } from '@angular/core';\r\nimport { CommentService } from '../../../../_service/comment/comment.service';\r\nimport { Store, Unsubscribe } from 'redux';\r\nimport { AppStore } from '../../../../app.store';\r\n// import { UsersState } from '../../../../_model/user/user.reducer';\r\n// import { RefReplyState } from '../../../../_model/reply/reply.reducer';\r\n// import * as RefReplyActions from '../../../../_model/reply/replay.actions';\r\nimport { User } from '../../../../_model/user/user.model';\r\n// import { CookieService } from 'ngx-cookie-service';\r\nimport { DnDialogService } from '../../../dn-dialog/dn-dialog.service';\r\nimport { CommentBoxService } from '../../comment-box/comment-box.service';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { Poll } from '../../../../_model/poll';\r\nimport { NotificationService } from '../../../../_service/notification/notification.service';\r\nimport { BlacklistService } from 'app/_service/blacklist/blacklist.service';\r\nimport { CommentsState } from '../../../../_model/comment/comments.reducer';\r\nimport { FILTERCOMMENTS, UNFILTERCOMMENTS } from 'app/_model/comment/comments.actions';\r\nimport { environment } from 'environments/environment';\r\nimport { UserService } from 'app/_service/user/user.service';\r\nimport { Observable, Subscription } from 'rxjs';\r\nimport { CommentBoxComponent } from '../../comment-box/comment-box.component';\r\nimport { Utility } from 'app/_service/utility';\r\nimport { ConfirmDialogService, ConfirmDialogState } from 'app/components/dialogs/confirm-dialog/confirm-dialog.service';\r\nimport { Router } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-dn-comment',\r\n templateUrl: './dn-comment.component.html',\r\n styleUrls: ['./dn-comment.component.scss']\r\n})\r\n\r\nexport class DnCommentComponent implements OnInit, OnDestroy, AfterViewInit {\r\n ngOnDestroy(): void {\r\n this.subscript.forEach(p => p());\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n }\r\n\r\n private subscript: Array = [];\r\n @Input()\r\n comment;\r\n\r\n @Input()\r\n isHot = false;\r\n\r\n @Input()\r\n isLast = false;\r\n\r\n @Input()\r\n showControls = true;\r\n\r\n @Input() replyBox: TemplateRef;\r\n @Input() level = 0\r\n @Input() isReply = false;\r\n\r\n @Output() onDeleteEvent = new EventEmitter();\r\n @Output() onSubCommentDeleteEvent = new EventEmitter();\r\n\r\n initialSize = 3;\r\n noMoreSub = false;\r\n poll: Poll;\r\n\r\n repliedComment;\r\n commentViewerId;\r\n componentsReferences = [];\r\n @ViewChild('viewContainerRef', { static: false, read: ViewContainerRef }) commentInputContainer: ViewContainerRef;\r\n\r\n user;\r\n publisher;\r\n voting = false;\r\n deleting = false;\r\n showNamecard = false;\r\n showShotcut = false;\r\n showReplyPopup = false;\r\n commentsState: CommentsState;\r\n $newCommentInputBox: Observable;\r\n subscriptions: Subscription[] = [];\r\n openList;\r\n shotcutElem: HTMLElement;\r\n @ViewChild('shotcutMenu') shotcutMenu: ElementRef;\r\n @Output() commentSuccessEvent = new EventEmitter();\r\n @Input()\r\n hostPage;\r\n @Output() childCommentEvent = new EventEmitter();\r\n @Input() childModeParent = false;\r\n @Input() childModeChild = false;\r\n constructor(\r\n private _commentService: CommentService,\r\n private _dnDialogService: DnDialogService,\r\n private _commentBoxService: CommentBoxService,\r\n private _notificationService: NotificationService,\r\n private _userService: UserService,\r\n private _confirmDialogService: ConfirmDialogService,\r\n private _dialogService: DnDialogService,\r\n private blacklistService: BlacklistService,\r\n @Inject(AppStore) private store: Store,\r\n private dialogService: DnDialogService,\r\n private resolver: ComponentFactoryResolver,\r\n private _utility: Utility,\r\n private _router: Router,\r\n\r\n ) {\r\n }\r\n ngAfterViewInit(): void {\r\n this.shotcutElem = this.shotcutMenu.nativeElement;\r\n }\r\n\r\n ngOnInit() {\r\n //console.log(this.comment)\r\n this.$newCommentInputBox = this._commentBoxService.commentId$;\r\n this.subscript.push(this.store.subscribe(() => this.readState()));\r\n this.readState();\r\n if (this.comment.pollId) {\r\n this.showControls = false;\r\n }\r\n this.subscriptions.push(\r\n this._userService.userState$.subscribe(user=>{\r\n this.user = user;\r\n }),\r\n this.$newCommentInputBox.subscribe(commentId => {\r\n if (commentId !== this.comment.commendId) {\r\n this.removeInputBox();\r\n }\r\n }));\r\n // console.log(this.comment);\r\n }\r\n\r\n getStatusText(status) {\r\n switch (status) {\r\n case 0: return \"已封号\"\r\n case 2: return \"已禁言\";\r\n case 3: return \"已冻结\";\r\n }\r\n return \"\";\r\n }\r\n\r\n readState() {\r\n this.user = this._userService.user;\r\n this.commentsState = this.store.getState()['comments'] as CommentsState;\r\n \r\n }\r\n\r\n likeComment() {\r\n if (!this.user || !this.user.id) {\r\n this._dnDialogService.open('login-required-dialog');\r\n return;\r\n }\r\n if (this.voting) {\r\n return;\r\n }\r\n if (this.comment.deleted) {\r\n // this._messageDialogService.setState({ message: '该评论已经被删除' });\r\n this._dnDialogService.open('message-dialog',{ message: '该评论已经被删除' });\r\n return;\r\n }\r\n // if (this.comment.liked) {\r\n // this._messageDialogService.setState({ message: '不可以重复按赞' });\r\n // this._dnDialogService.open('message-dialog');\r\n // return;\r\n // }\r\n\r\n this.voting = true;\r\n this._commentService.likeComment(this.comment.commendId, null, this.hostPage).subscribe(res => {\r\n this.voting = false;\r\n if (res.code === 401) {\r\n return;\r\n }\r\n if (!this.comment.liked) {\r\n this.comment.likes += 1;\r\n } else {\r\n this.comment.likes -= 1;\r\n }\r\n this.comment.liked = !this.comment.liked;\r\n });\r\n }\r\n\r\n deleteComment(comment) {\r\n\r\n if (this.comment.deleted) {\r\n // this._messageDialogService.setState({ message: '该评论已经被删除' });\r\n this._dnDialogService.open('message-dialog',{ message: '该评论已经被删除' });\r\n return;\r\n }\r\n\r\n const confirmFormId = 'delete-comment';\r\n const dialogId = 'confirm-dialog';\r\n this._confirmDialogService.setState(\r\n {\r\n id: confirmFormId,\r\n message: comment.replyId ? '
删除评论后将不可恢复,是否继续?
' : \"删除评论后,评论下的回复都会被删除。\",\r\n showIcon: false,\r\n state: ConfirmDialogState.Unknown\r\n });\r\n this._dialogService.open(dialogId);\r\n const confirmSubscribe = this._confirmDialogService.confirmDialogSource$.subscribe(r => {\r\n if (r.state !== ConfirmDialogState.Unknown) {\r\n this._dialogService.close(dialogId);\r\n confirmSubscribe.unsubscribe();\r\n }\r\n if (r.state === ConfirmDialogState.Confirmed && r.id === confirmFormId) {\r\n const commandType = 1;\r\n this.deleting = true;\r\n\r\n this.onDeleteEvent.emit(comment.commendId);\r\n this._commentService.removeComment(this.user, comment.commendId, commandType).subscribe(res => {\r\n this.deleting = false;\r\n\r\n this.comment.content = '该评论已被用户删除。';\r\n // this._messageDialogService.setState({ message: res.ShowMsg || '评论已删除。' });\r\n // this._dnDialogService.open('message-dialog');\r\n return;\r\n });\r\n confirmSubscribe.unsubscribe();\r\n }\r\n })\r\n }\r\n\r\n onAvatarMouseEnter() {\r\n this.showNamecard = true;\r\n this.showShotcut = false;\r\n this.showReplyPopup = false;\r\n }\r\n\r\n toggleShortcutMenuEnter() {\r\n this.showShotcut = !this.showShotcut;\r\n this.showNamecard = false;\r\n this.showReplyPopup = false;\r\n\r\n if (this.showShotcut) {\r\n this.openList = this._utility.openList(this.shotcutElem, null, (target) => {\r\n this.openList.unsubscribe();\r\n this.showShotcut = false;\r\n })\r\n } else {\r\n if (this.openList) {\r\n this.openList.unsubscribe();\r\n }\r\n }\r\n }\r\n\r\n onAvatarMouseLeave() {\r\n if (environment.production) {\r\n this.showNamecard = false;\r\n this.showReplyPopup = false;\r\n this.showShotcut = false;\r\n }\r\n }\r\n\r\n onUserLoaded(event) {\r\n this.publisher = event;\r\n }\r\n\r\n hideNamecard() {\r\n this.showNamecard = false;\r\n }\r\n\r\n hideReplyViewer() {\r\n this.showReplyPopup = false;\r\n }\r\n\r\n reply() {\r\n if (!this.user || !this.user.id) {\r\n this._userService.showLoginDialog(true);\r\n return;\r\n }\r\n if (this.comment.deleted) {\r\n // this._messageDialogService.setState({ message: '该评论已经被删除' });\r\n this._dnDialogService.open('message-dialog',{ message: '该评论已经被删除' });\r\n return;\r\n }\r\n\r\n if (this.user.id === this.comment.replyUserId) {\r\n this._notificationService.markANotificationsAsReadByMessageId(this.comment.commendId, this.user).subscribe(res => {\r\n if (res[0].ret === 0) {\r\n this._notificationService.changeNotificationStatus(true);\r\n }\r\n });\r\n }\r\n\r\n\r\n // this._commentBoxService.notify(this.comment.commendId)\r\n\r\n if (this.componentsReferences.length) {\r\n this.removeInputBox();\r\n return;\r\n }\r\n\r\n const componentFactory = this.resolver.resolveComponentFactory(CommentBoxComponent);\r\n const componentRef: ComponentRef = this.commentInputContainer.createComponent(componentFactory);\r\n const currentComponent = componentRef.instance;\r\n currentComponent.isReplying = true;\r\n currentComponent.reply = this.comment;\r\n currentComponent.user = this.user;\r\n currentComponent.hostPage = this.hostPage === 'activityLast3Child' ? 'activity' : this.hostPage;\r\n currentComponent.commentSuccessEvent.subscribe(e => {\r\n // 传递回复评论成功\r\n this.commentSuccessEvent.emit(true);\r\n });\r\n\r\n currentComponent.compInteraction = this;\r\n this.componentsReferences.push(componentRef);\r\n\r\n this._commentBoxService.notify(this.comment.commendId);\r\n\r\n ////新方法\r\n // this.store.dispatch({\r\n // type: RefReplyActions.REFREPLY, reply: {\r\n // author: this.comment.author,\r\n // authorId: this.comment.authorId,\r\n // avatar: this.comment.avatar,\r\n // commendId: this.comment.commendId,\r\n // content: this.comment.content,\r\n // deleted: this.comment.deleted,\r\n // floor: this.comment.floor,\r\n // liked: this.comment.liked,\r\n // likes: this.comment.likes,\r\n // published: this.comment.published,\r\n // replyId: this.comment.replyId,\r\n // userLevelSymbol: this.comment.userLevelSymbol,\r\n // videoId: this.comment.videoId,\r\n // }\r\n // });\r\n // this.replyVisible = true\r\n }\r\n\r\n replyVisible = false;\r\n report() {\r\n this.showShotcut = false;\r\n\r\n if (!this.user || !this.user.id) {\r\n this._userService.showLoginDialog(true);\r\n return;\r\n }\r\n if (this.comment.deleted) {\r\n // this._messageDialogService.setState({ message: '该评论已经被删除' });\r\n this._dnDialogService.open('message-dialog',{ message: '该评论已经被删除' });\r\n return;\r\n }\r\n if (this.comment.reported) {\r\n // this._messageDialogService.setState({ message: '您已经举报过该评论' });\r\n this._dnDialogService.open('message-dialog',{ message: '您已经举报过该评论' });\r\n return;\r\n }\r\n this.dialogService.open('reportComment', {\r\n size: { width: 280, height: 270 },\r\n id: this.comment.commendId,\r\n ToUid: this.comment.authorId\r\n });\r\n }\r\n hideReplyingBox() {\r\n this.replyVisible = false;\r\n }\r\n addBlacklist(userId: string | number) {\r\n this.showShotcut = false;\r\n if (!this.user || !this.user.id) {\r\n this._userService.showLoginDialog(true);\r\n return;\r\n }\r\n this.blacklistService.addBlacklist({ id: userId }).subscribe(\r\n (r:any) => {\r\n // console.log(r);\r\n if (r.code === 401) {\r\n return;\r\n };\r\n // this._messageDialogService.setState({ message: '用户拉黑成功' });\r\n this._dnDialogService.open('message-dialog',{ message: '用户拉黑成功' });\r\n this.store.dispatch({\r\n type: FILTERCOMMENTS, userId\r\n });\r\n return;\r\n }\r\n )\r\n }\r\n\r\n removeBlacklist(userId: string | number) {\r\n this.showShotcut = false;\r\n this.blacklistService.removeBlacklist({ id: userId }).subscribe(\r\n () => {\r\n // this._messageDialogService.setState({ message: '用户取消拉黑成功' });\r\n this._dnDialogService.open('message-dialog',{ message: '用户取消拉黑成功' });\r\n this.store.dispatch({\r\n type: UNFILTERCOMMENTS, userId\r\n });\r\n return;\r\n }\r\n )\r\n }\r\n\r\n showReplied(event) {\r\n if (this.comment.replyId === 0) {\r\n this.showNamecard = false;\r\n return;\r\n }\r\n if ((event.target.tagName === 'FONT') || (event.target.parentNode.tagName === 'FONT')) {\r\n this.commentViewerId = this.comment.replyId;\r\n this.showReplyPopup = true;\r\n this.showNamecard = false;\r\n this.showShotcut = false;\r\n } else {\r\n this.showNamecard = false;\r\n this.showReplyPopup = false;\r\n this.showShotcut = false;\r\n // const timer = setTimeout(() => {\r\n //\r\n // clearTimeout(timer);\r\n // }, 500);\r\n }\r\n }\r\n\r\n formatContent(content) {\r\n if (this.user && this.user.id === this.comment.replyUserId) {\r\n return content.replace(/回复了.*\\<\\/font>/g, '回复了@您 ');\r\n }\r\n return content.replace('回复了', '回复了@').replace(/\\<\\/font>/g, ' ');\r\n }\r\n\r\n isloading = false;\r\n page = 1;\r\n size = 10;\r\n pull_down() {\r\n if (this.isloading || this.noMoreSub) {\r\n return;\r\n }\r\n this.isloading = true;\r\n this._commentService.getCommentByParentID(this.comment.videoId,\r\n this.comment.commendId,\r\n this.comment.authorId,\r\n this.page,\r\n this.size,\r\n this.hostPage === 'album' ? true : false\r\n ).subscribe(p => {\r\n if (this.page === 1) {\r\n this.comment.children = this.comment.children.concat(p.slice(3));\r\n // this.comment.children = this.comment.children.concat(p);\r\n } else {\r\n this.comment.children = this.comment.children.concat(p);\r\n }\r\n this.isloading = false;\r\n if (p.length < this.size) {\r\n this.noMoreSub = true;\r\n }\r\n\r\n ++this.page;\r\n // this.size = this.size *2;\r\n // if(this.size >24)\r\n // {\r\n // this.size = 24;\r\n // ++this.page;\r\n // }\r\n\r\n })\r\n // console.log('load more children')\r\n }\r\n\r\n close() {\r\n this.noMoreSub = false;\r\n this.page = 2;\r\n this.comment.children = this.comment.children.slice(0, 3);\r\n }\r\n\r\n removeInputBox() {\r\n if (this.commentInputContainer.length < 1) {\r\n return;\r\n }\r\n\r\n const componentRef = this.componentsReferences[0];\r\n this.commentInputContainer.remove(0);\r\n\r\n this.componentsReferences = [];\r\n }\r\n\r\n fixVipSymbol(str) {\r\n if (!!str) {\r\n return str.split('.png')[0] + '_b.png';\r\n }\r\n }\r\n\r\n deleteSubComment(commentId: string) {\r\n this.comment.children = this.comment.children.filter(c => c.commendId != commentId);\r\n this.comment.totalReplies = this.comment.totalReplies > 0 ? this.comment.totalReplies - 1 : 0;\r\n // 传递删除子评论成功\r\n this.onSubCommentDeleteEvent.emit(true);\r\n }\r\n\r\n commentCountHandler(event) {\r\n this.commentSuccessEvent.emit(true);\r\n }\r\n\r\n openChildComments(comment) {\r\n // console.log(comment);\r\n this.childCommentEvent.emit(comment);\r\n }\r\n\r\n getMembership(gid) {\r\n let membership = '';\r\n switch (gid) {\r\n case 0:\r\n membership = 'vip';\r\n break;\r\n case 1:\r\n membership = 'gvip';\r\n break;\r\n case 2:\r\n membership = 'gvip';\r\n break;\r\n case 3:\r\n membership = 'royalVip';\r\n break;\r\n case 4:\r\n membership = 'cpvip';\r\n break;\r\n case 101:\r\n membership = 'cpvip';\r\n break;\r\n case 102:\r\n membership = 'cpvip';\r\n break;\r\n default:\r\n membership = 'vip';\r\n }\r\n return membership;\r\n }\r\n\r\n navToLevelTable() {\r\n this._router.navigate(['/help/faq'], { queryParams: {cid:6, item:58} });\r\n }\r\n}\r\n","
    \r\n
  • \r\n {{tab.name}}\r\n \r\n
  • \r\n
\r\n
\r\n 暂无评论\r\n
\r\n
\r\n \r\n
\r\n
\r\n 空荡荡的\r\n
\r\n 赶快留下您的金句吧~\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n 以上为热门评论\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n \r\n \r\n 查看全部评论\r\n ({{ commentCount }})\r\n \r\n
\r\n \r\n \r\n
\r\n 全部回复\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n 正在加载\r\n
\r\n
\r\n\r\n \r\n\r\n
\r\n
\r\n \r\n
\r\n 正在加载\r\n
\r\n\r\n
1\">\r\n 我是有底线的\r\n
\r\n
\r\n\r\n\r\n \r\n
请选择举报原因
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n 举报\r\n
\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n \r\n \r\n\r\n\r\n","import { Component, OnInit, Input, OnChanges, SimpleChanges, Inject, OnDestroy, Output, EventEmitter } from '@angular/core';\r\nimport { CommentListService } from '../../../_service/comment/comment-list.service';\r\nimport { VotingService } from '../../../_service/voting/voting.service';\r\nimport { Store, Unsubscribe } from 'redux';\r\nimport { AppStore } from '../../../app.store';\r\nimport { CommentsState } from '../../../_model/comment/comments.reducer';\r\nimport * as userComments from '../../../_model/comment/comments.actions';\r\nimport { ToastService } from 'app/_service/toast/toast.service';\r\nimport { DnDialogService } from 'app/_modules/dn-dialog/dn-dialog.service';\r\nimport { CommentService } from 'app/_service/comment/comment.service';\r\nimport { SETCOMMENTREPORTED } from '../../../_model/comment/comments.actions';\r\nimport { UserService } from '../../../_service/user/user.service';\r\n\r\n@Component({\r\n selector: 'app-dn-comments',\r\n templateUrl: './dn-comments.component.html',\r\n styleUrls: ['./dn-comments.component.scss'],\r\n})\r\n\r\nexport class DnCommentsComponent implements OnInit, OnChanges, OnDestroy {\r\n\r\n private subscrption: Array = [];\r\n @Input()\r\n videoId;\r\n\r\n @Output()\r\n onCommentsLoaded = new EventEmitter();\r\n\r\n user;\r\n comments;\r\n\r\n commentPager = 0;\r\n pageSize = 10;\r\n bottomLine = false;\r\n\r\n isLoading = false;\r\n isTryLoaded = false;\r\n reportCommentReasons = [\r\n { name: '剧透', value: 'spoiler' },\r\n { name: '人身攻击', value: 'language' },\r\n { name: '发布广告', value: 'advertise' },\r\n { name: '其它', value: 'other' },\r\n ];\r\n reportCommentReason = this.reportCommentReasons[0].name;\r\n\r\n tabsList: Array = [\r\n { id: 0, name: \"全部评论\" },\r\n { id: 1, name: \"热门评论\" },\r\n // {id:2,name:\"最新评论\"}\r\n ]\r\n @Input()\r\n hostPage;\r\n\r\n commentCount = 0;\r\n @Output() toggleChildComment = new EventEmitter();\r\n constructor(\r\n private _commentListService: CommentListService,\r\n private _toastService: ToastService,\r\n private _dnDialogService: DnDialogService,\r\n private commentService: CommentService,\r\n @Inject(AppStore) private store: Store,\r\n private _userService: UserService\r\n ) {\r\n\r\n }\r\n selectTab(tab) {\r\n this.tabsList.filter(p => p.active).forEach(p => p.active = false);\r\n tab.active = true;\r\n this.isTryLoaded = false;\r\n this.orderstyle = tab.id;\r\n this.comments = [];\r\n this.commentPager = 0;\r\n this.bottomLine = false;\r\n this.store.dispatch({ type: userComments.CLEARCOMMENTS });\r\n this.getComments(this.commentPager + 1);\r\n }\r\n private orderstyle = 0;\r\n ngOnInit() {\r\n\r\n this.subscrption.push(this.store.subscribe(() => this.readState()));\r\n this.tabsList[0].active = true;\r\n this.orderstyle = this.tabsList[0].id;\r\n\r\n }\r\n private topComment = [];\r\n readState() {\r\n\r\n this.user = this._userService.user;\r\n // const videoState: VideoState = this.store_video['video'] as VideoState;\r\n // console.log(videoState)\r\n // if (this.hostPage !== 'album' && videoState !=null) {\r\n // this.videoId = videoState.currentVideo.id;\r\n // }\r\n const commentState: CommentsState = this.store.getState()['comments'] as CommentsState;\r\n if (this.commentPager == 0) {\r\n this.comments = commentState.currentComments;\r\n this.topComment = Object.assign([], commentState.currentComments.topComments)\r\n // this.comments.topComments = Object.assign([],commentState.currentComments.topComments);\r\n }\r\n // console.log(commentState.currentComments.topComments)\r\n //console.log(\"aaa\",this.commentPager,commentState);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.comments = [];\r\n this.commentPager = 0;\r\n this.bottomLine = false;\r\n this.store.dispatch({ type: userComments.CLEARCOMMENTS });\r\n this.getComments(this.commentPager + 1);\r\n }\r\n\r\n getComments(commentPager) {\r\n if (this.isLoading) {\r\n return;\r\n }\r\n if (this.bottomLine) {\r\n return;\r\n }\r\n this.isLoading = true;\r\n this._commentListService.getComments(this.videoId, commentPager, 10, this.orderstyle, (this.hostPage === 'album' || this.hostPage === 'activity') ? true : false).subscribe(\r\n res => {\r\n this.isLoading = false;\r\n this.onCommentsLoaded.emit(res.count);\r\n this.commentCount = res.count;\r\n // res.comments.map(item => {\r\n // item.liked = this._votingService.isVoted(VotingType.LikeComment, item.commendId);\r\n // if (!!item.children) {\r\n // item.children.map(childItem => {\r\n // childItem.liked = this._votingService.isVoted(VotingType.LikeComment, childItem.commendId);\r\n // });\r\n // }\r\n // });\r\n\r\n // res.topComments.map(item => {\r\n // item.liked = this._votingService.isVoted(VotingType.LikeComment, item.commendId);\r\n // if (!!item.children) {\r\n // item.children.map(childItem => {\r\n // childItem.liked = this._votingService.isVoted(VotingType.LikeComment, childItem.commendId);\r\n // });\r\n // }\r\n // });\r\n\r\n this.store.dispatch({\r\n type: userComments.APPEND, comments: {\r\n comments: res.comments,\r\n topComments: res.topComments\r\n }\r\n });\r\n\r\n if (res.comments.length > 0) {\r\n this.commentPager += 1;\r\n }\r\n\r\n // 调整是否允许滚动取下一页的判断逻辑\r\n const stopCommentsCount = 1; // 原策略为10\r\n if (res.comments.length < stopCommentsCount) {\r\n this.bottomLine = true;\r\n } else {\r\n this.bottomLine = false;\r\n }\r\n this.isTryLoaded = true;\r\n }\r\n );\r\n // console.log(this.comments);\r\n }\r\n\r\n onScroll() {\r\n console.log('scrolled!!');\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscrption.forEach(p => p());\r\n }\r\n\r\n reportComment(id: any, ToUid: any) {\r\n this.commentService.reportComment(id, ToUid, this.reportCommentReason).subscribe((res) => {\r\n\r\n if (res.hasOwnProperty('code') && res.code === 401) {\r\n return;\r\n }\r\n this.store.dispatch({\r\n type: SETCOMMENTREPORTED, commendId: id\r\n });\r\n this._dnDialogService.close('reportComment');\r\n // this._toastService.showBlackToast('举报成功!');\r\n const reportedMgs = `\r\n 谢谢,我们已收到您的举报!\r\n

\r\n 如果发现此内容违反了我们的社区准则,我们就会将其移除。\r\n `;\r\n this._dnDialogService.open('message-dialog', { buttonText: '我知道了', message: reportedMgs, style: { 'text-algin': 'center' } });\r\n });\r\n }\r\n\r\n deleteComment(commentId: string) {\r\n this.comments.comments = this.comments.comments.filter(c => c.commendId != commentId);\r\n this.topComment = this.topComment.filter(c => c.commendId != commentId);\r\n // 评论被删除,调整总评论数\r\n this.commentCount = this.commentCount > 0 ? this.commentCount - 1 : 0;\r\n this.onCommentsLoaded.emit(this.commentCount);\r\n }\r\n\r\n deleteSubCommentHandler(event) {\r\n // 子评论被删除,调整总评论数\r\n this.commentCount = this.commentCount > 0 ? this.commentCount - 1 : 0;\r\n this.onCommentsLoaded.emit(this.commentCount);\r\n }\r\n\r\n commentCountHandler(event) {\r\n // 回复评论/子评论,调整总评论数\r\n this.commentCount += 1;\r\n this.onCommentsLoaded.emit(this.commentCount);\r\n }\r\n\r\n childComment;\r\n isChildMode = false;\r\n childCommentPager = 1;\r\n noMoreSub = false;\r\n isloading = false;\r\n onChildComment(event) {\r\n // console.log(event);\r\n this.childCommentPager = 1;\r\n this.childComment = event;\r\n this.getChildComment(this.childCommentPager);\r\n this.isChildMode = true;\r\n this.toggleChildComment.emit(this.isChildMode);\r\n }\r\n\r\n getChildComment(page) {\r\n if (this.isloading || this.noMoreSub) {\r\n return;\r\n }\r\n this.childCommentPager = page;\r\n this.isloading = true;\r\n this.commentService.getCommentByParentID(\r\n this.childComment.videoId,\r\n this.childComment.commendId,\r\n this.childComment.authorId,\r\n this.childCommentPager,\r\n this.pageSize,\r\n true,\r\n ).subscribe(p => {\r\n if (this.childCommentPager === 1) {\r\n this.childComment.children = this.childComment.children.concat(p.slice(3));\r\n // this.childComment.children = this.childComment.children.concat(p);\r\n } else {\r\n this.childComment.children = this.childComment.children.concat(p);\r\n }\r\n this.isloading = false;\r\n if (p.length < this.pageSize) {\r\n this.noMoreSub = true;\r\n }\r\n // ++this.childCommentPager;\r\n })\r\n }\r\n\r\n closeChildMode() {\r\n this.isChildMode = false;\r\n this.toggleChildComment.emit(this.isChildMode);\r\n }\r\n}\r\n","
\r\n
\r\n
{{ option.title }}
\r\n
0\">\r\n [{{ option.count }}票]\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
(optionsCount * 1.1)}\"\r\n [ngStyle]=\"{'width': option.count / total * barWidth + 'px', 'background-color': barColor}\"\r\n *ngIf=\"vote.isVoted || !vote.voteViewType || vote.uid === user.id\">\r\n
\r\n
\r\n
\r\n
\r\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-dn-poll-option',\r\n templateUrl: './dn-poll-option.component.html',\r\n styleUrls: ['./dn-poll-option.component.scss']\r\n})\r\n\r\nexport class DnPollOptionComponent implements OnInit {\r\n @Input()\r\n vote: any;\r\n\r\n @Input()\r\n user;\r\n\r\n @Input()\r\n option: any;\r\n\r\n @Input()\r\n barWidth = 400;\r\n\r\n @Input()\r\n optionsCount = 0;\r\n\r\n @Input()\r\n total = 0;\r\n\r\n @Input()\r\n barColor;\r\n\r\n @Output()\r\n selectEven = new EventEmitter();\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n onSelectOption() {\r\n if (this.vote.isVoted) {\r\n return;\r\n }\r\n this.selectEven.emit(this.option);\r\n }\r\n\r\n}\r\n","\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n 1\">可多选\r\n
\r\n
\r\n \r\n
\r\n
\r\n 还没有用户参与,来投下第一票吧\r\n 还没有用户参与\r\n 0\" class=\"mr-2\">{{poll.voteCount}}人已投票\r\n 0 && poll.isVoted && showButton\">您已经投过票了\r\n 0 && !poll.isVoted && showButton\">您也来投票吧\r\n (投票后结果可见)\r\n
\r\n
\r\n
0 && !poll.isVoted && !(selectedOptions > poll.multipleOptions)}\">投票
\r\n
\r\n
\r\n
\r\n","import { Component, OnInit, Input } from '@angular/core';\r\nimport { PollService } from '../../../_service/poll/poll.service';\r\nimport { DnDialogService } from '../../dn-dialog/dn-dialog.service';\r\nimport { ToastService } from '../../../_service/toast/toast.service';\r\n\r\n@Component({\r\n selector: 'app-dn-poll',\r\n templateUrl: './dn-poll.component.html',\r\n styleUrls: ['./dn-poll.component.scss']\r\n})\r\n\r\nexport class DnPollComponent implements OnInit {\r\n colors = [\r\n 'red',\r\n 'blue',\r\n 'purple',\r\n 'orange',\r\n 'green',\r\n 'cyan',\r\n 'teal',\r\n 'pink',\r\n ];\r\n randomColors = this.colors;\r\n\r\n @Input()\r\n pollId;\r\n\r\n @Input()\r\n user;\r\n\r\n @Input()\r\n showButton = true;\r\n\r\n @Input()\r\n isNews = 'auto';\r\n\r\n selectedOptions = 0;\r\n\r\n poll;\r\n\r\n total;\r\n\r\n barWidth = 400;\r\n\r\n loading = false;\r\n\r\n constructor(\r\n private _pollService: PollService,\r\n private _dnDialogService: DnDialogService,\r\n private _toastService: ToastService,\r\n ) { }\r\n\r\n ngOnInit() {\r\n if (this.pollId > 0) {\r\n this.getVote();\r\n }\r\n this.randomColors = this.shuffle(this.colors);\r\n }\r\n\r\n getVote() {\r\n this.loading = true;\r\n this._pollService.get(this.pollId, this.user,this.isNews).subscribe(res => {\r\n this.poll = res;\r\n this.poll.voteOptions = this.poll.voteOptions.map(o => {\r\n o.selected = o.voted;\r\n return o;\r\n });\r\n\r\n this.total = this.poll.voteOptions.reduce((a, b) => {\r\n if (a.count || a.count === 0) {\r\n return a.count + b.count;\r\n } else {\r\n return a + b.count;\r\n }\r\n });\r\n\r\n this.loading = false;\r\n });\r\n }\r\n\r\n onSelectOption(event) {\r\n if (event.selected === true) {\r\n this.poll.voteOptions.filter(o => o.id === event.id)[0].selected = false;\r\n this.selectedOptions = this.poll.voteOptions.filter(o => o.selected === true).length;\r\n return;\r\n }\r\n\r\n if (this.poll.multipleOptions === 1) {\r\n this.poll.voteOptions.map(o => {\r\n if (o.id !== event.id) {\r\n o.selected = false;\r\n } else {\r\n o.selected = true;\r\n }\r\n });\r\n this.selectedOptions = this.poll.voteOptions.filter(o => o.selected === true).length;\r\n return;\r\n }\r\n\r\n if (this.poll.voteOptions.filter(o => o.selected === true).length > this.poll.multipleOptions - 1) {\r\n // this._messageDialogService.setState({ message: '最多选择' + this.poll.multipleOptions + '个选项' });\r\n this._dnDialogService.open('message-dialog',{ message: '最多选择' + this.poll.multipleOptions + '个选项' });\r\n } else {\r\n this.poll.voteOptions.filter(o => o.id === event.id)[0].selected = true;\r\n }\r\n this.selectedOptions = this.poll.voteOptions.filter(o => o.selected === true).length;\r\n }\r\n\r\n vote() {\r\n if (!this.user || !this.user.id) {\r\n // this._messageDialogService.setState({ message: '请登录后再进行投票' });\r\n this._dnDialogService.open('message-dialog',{ message: '请登录后再进行投票' });\r\n return;\r\n }\r\n\r\n if (this.poll.isVoted) {\r\n return;\r\n }\r\n\r\n const options = [];\r\n this.poll.voteOptions.map(o => {\r\n if (o.selected) {\r\n options.push(o.id);\r\n }\r\n });\r\n\r\n if (!options.length) {\r\n // this._messageDialogService.setState({ message: '请勾选选项' });\r\n this._dnDialogService.open('message-dialog',{ message: '请勾选选项' });\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n this._pollService.vote(this.pollId, options, this.user).subscribe(r => {\r\n if (r) {\r\n this.getVote();\r\n this._toastService.showBlackToast('投票成功');\r\n }\r\n });\r\n }\r\n\r\n shuffle(array) {\r\n let currentIndex = array.length, temporaryValue, randomIndex;\r\n while (0 !== currentIndex) {\r\n randomIndex = Math.floor(Math.random() * currentIndex);\r\n currentIndex -= 1;\r\n temporaryValue = array[currentIndex];\r\n array[currentIndex] = array[randomIndex];\r\n array[randomIndex] = temporaryValue;\r\n }\r\n return array;\r\n }\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport { OnInit, ElementRef, Renderer2, Inject, Directive, Input, SimpleChanges, OnChanges, AfterViewInit } from '@angular/core';\r\n\r\n@Directive({\r\n // tslint:disable-next-line:directive-selector\r\n selector: '[FlexboxPlaceholder]'\r\n})\r\n\r\nexport class FlexboxPlaceholderDirective implements OnInit, OnChanges {\r\n\r\n @Input()\r\n FlexboxPlaceholder: { length: number, items: number, placeholder: string, valid: boolean };\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private renderer: Renderer2,\r\n @Inject(DOCUMENT) private document: any) {\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n const { length, items, placeholder, valid } = this.FlexboxPlaceholder;\r\n\r\n const num = items % length > 0 ? (length - items % length) : 0;\r\n const placeholders = this.elementRef.nativeElement.querySelectorAll('.placeholder');\r\n placeholders.forEach(old => {\r\n this.renderer.removeChild(this.elementRef.nativeElement, old);\r\n });\r\n if (!valid) {\r\n return;\r\n }\r\n for (let index = 0; index < num; index++) {\r\n const child = document.createElement('div');\r\n child.className = placeholder + ' ' + 'placeholder';\r\n this.renderer.appendChild(this.elementRef.nativeElement, child);\r\n }\r\n }\r\n\r\n}\r\n","import { Observable } from 'rxjs';\r\n\r\nexport abstract class IVideoService {\r\n like(id): Observable {\r\n return null;\r\n }\r\n dislike(id): Observable {\r\n return null;\r\n }\r\n\r\n favorite(user, id) {\r\n return null;\r\n\r\n }\r\n\r\n share(vid): Observable {\r\n return null;\r\n }\r\n}\r\n","
\r\n\r\n
\r\n 1\" [fromPlayer]=\"fromPlayer\">\r\n \r\n\r\n
\r\n
\r\n\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n","import { Component, OnInit, Input, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'app-list-by-year',\r\n templateUrl: './list-by-year.component.html',\r\n styleUrls: ['./list-by-year.component.scss']\r\n})\r\n\r\nexport class ListByYearComponent implements OnInit, OnChanges {\r\n\r\n @Input()\r\n items: Array = [];\r\n\r\n @Input()\r\n wideButton: boolean = true;\r\n\r\n @Input()\r\n fromPlayer = false;\r\n\r\n @Input()\r\n newMediaKey;\r\n\r\n parsedItems = {};\r\n activeTabIndex: number;\r\n years = [];\r\n selectedYear: number;\r\n pageSize = 50;\r\n medias: Array = [];\r\n page = 1;\r\n totalPages = 0;\r\n subscriptions: Array = [];\r\n @Input() currentKey;\r\n\r\n constructor() {\r\n\r\n }\r\n ngOnInit(): void {\r\n // this.subscriptions.push(\r\n // this.route.data.pipe(filter(params => params.id))\r\n // .subscribe(params => {\r\n // // console.log(params)\r\n // this.currentKey = params.id;\r\n // this.setCurrentTab();\r\n // }));\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.items = this.items.reverse();\r\n this.parsedItems = {};\r\n this.parseItemsToObject();\r\n }\r\n\r\n parseItemsToObject() {\r\n let lastYear = '';\r\n this.items.sort(((a, b) => {\r\n\r\n const adataString = Number(a.title.match(/\\d{8}/i));\r\n const bdataString = Number(b.title.match(/\\d{8}/i));\r\n if (adataString !== bdataString) {\r\n return bdataString - adataString\r\n } else {\r\n const aDate = new Date(a.created);\r\n const bDate = new Date(b.created);\r\n return bDate > aDate ? 1 : -1;\r\n }\r\n\r\n })).map(item => {\r\n const dataString = item.title.match(/\\d{8}/i);\r\n if (dataString && dataString[0]) {\r\n lastYear = dataString[0].substring(0, 4) + '年';\r\n if (!this.parsedItems[lastYear]) {\r\n this.parsedItems[lastYear] = [];\r\n }\r\n this.parsedItems[lastYear].push(item);// = [...this.parsedItems[year], item]\r\n }\r\n else {\r\n if (!!lastYear) {\r\n this.parsedItems[lastYear].push(item);// = [...this.parsedItems[year], item]\r\n }\r\n }\r\n // console.log(item,dataString)\r\n });\r\n // console.log(this.parsedItems)\r\n this.years = Object.keys(this.parsedItems);\r\n this.setCurrentTab();\r\n }\r\n\r\n onSelectTab(year: number) {\r\n\r\n this.selectedYear = year;\r\n this.page = 1;\r\n this.medias = this.parsedItems[this.years[year]];\r\n if (!this.fromPlayer) {\r\n this.totalPages = this.parsedItems[this.years[year]].length > 50 ? 2 : 1\r\n }\r\n }\r\n\r\n setCurrentTab() {\r\n\r\n if (!!this.currentKey) {\r\n const item = this.items.find(item => item.key === this.currentKey);\r\n if (!!item) {\r\n const dataString = item.title.match(/\\d{8}/i);\r\n if (dataString) {\r\n const year = dataString[0].substring(0, 4) + '年';\r\n this.onSelectTab(this.years.findIndex(e => e === year));\r\n }\r\n else {\r\n this.onSelectTab(0);\r\n }\r\n\r\n } else {\r\n this.onSelectTab(0);\r\n }\r\n }\r\n\r\n }\r\n\r\n loadMore() {\r\n this.page += 1;\r\n }\r\n}\r\n","\r\n
\r\n\r\n
\r\n
屏蔽位置
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
滚动
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
顶部
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
底部
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n 关键词屏蔽\r\n
\r\n
\r\n 用户屏蔽\r\n
\r\n
\r\n
\r\n
\r\n \r\n\r\n \r\n
\r\n {{ filter }}\r\n \r\n
\r\n
\r\n \r\n
还没有设置关键词
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n\r\n \r\n
\r\n \r\n {{ filter.name }}\r\n \r\n \r\n
\r\n
\r\n \r\n
还没有设置过滤用户
\r\n
\r\n
\r\n
\r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { DanmuFacade } from '../danmu.facade';\r\n\r\n@Component({\r\n selector: 'app-danmu-filter',\r\n templateUrl: './danmu-filter.component.html',\r\n styleUrls: ['./danmu-filter.component.scss']\r\n})\r\nexport class DanmuFilterComponent implements OnInit {\r\n keyword = '';\r\n tab = 1;\r\n // screenType = ScreenSize;\r\n // screenSize;\r\n\r\n constructor(\r\n public danmuFacade: DanmuFacade,\r\n // private _windowService: WindowService,\r\n ) {\r\n // this._windowService.size$.subscribe((value: any) => {\r\n // this.screenSize = value;\r\n // });\r\n }\r\n\r\n ngOnInit() {\r\n\r\n }\r\n\r\n addKeywordFilter() {\r\n //console.log(this.keyword)\r\n if (this.keyword && (this.keyword.trim() !== '')) {\r\n this.danmuFacade.addKeywordFilter(this.keyword);\r\n this.keyword = '';\r\n }\r\n }\r\n\r\n removeKeywordFilter(keyword) {\r\n this.danmuFacade.removeKeywordFilter(keyword);\r\n }\r\n\r\n removeUserFilter(filter) {\r\n this.danmuFacade.removeUserFilter(filter);\r\n }\r\n\r\n}\r\n","
\r\n
\r\n 发送者:{{ danmu.nickName }}\r\n
\r\n\r\n
\r\n
屏蔽用户
\r\n
解除屏蔽
\r\n
撤回
\r\n
举报弹幕
\r\n
\r\n\r\n
\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { DnDialogService } from 'app/_modules/dn-dialog/dn-dialog.service';\r\nimport { Observable, Subscription } from 'rxjs';\r\nimport { DanmuFacade } from '../danmu.facade';\r\nimport { DanmuMenuService } from './danmu-menu.service';\r\nimport { UserService } from '../../../_service/user/user.service';\r\n\r\n\r\nexport interface ActionInterface {\r\n removeDanmuMenu(): void;\r\n}\r\n\r\n@Component({\r\n selector: 'app-danmu-menu',\r\n templateUrl: './danmu-menu.component.html',\r\n styleUrls: ['./danmu-menu.component.scss']\r\n})\r\nexport class DanmuMenuComponent implements OnInit {\r\n //public compInteraction: ActionInterface;\r\n subscriptions: Subscription[] = [];\r\n // $newDanmuMenu: Observable;\r\n\r\n visible =false;\r\n danmu: any;\r\n // @Input()\r\n user: any;\r\n\r\n isUserFilted: boolean;\r\n\r\n @Input()\r\n position: { x: number, y: number } = {x:0,y:0};\r\n\r\n constructor(\r\n public danmuFacade: DanmuFacade,\r\n private danmuMenuService: DanmuMenuService,\r\n private dialogService: DnDialogService,\r\n private _userS:UserService\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.user = this._userS.user; \r\n this.subscriptions.push(this.danmuMenuService.danmuId$.subscribe(obj => {\r\n if(obj == null)\r\n {\r\n this.visible = false;\r\n this.danmu = null;\r\n return;\r\n }\r\n this.position = obj.position\r\n let danmu = obj.danmu;\r\n if(this.danmu ==null || this.danmu.guid != danmu.guid)\r\n {\r\n this.danmu = danmu;\r\n this.visible = true;\r\n }\r\n else\r\n {\r\n //this.removeDanmuMenu();\r\n this.danmu =null;\r\n this.visible = false;\r\n\r\n }\r\n\r\n }));\r\n }\r\n\r\n // removeDanmuMenu() {\r\n // this.compInteraction.removeDanmuMenu();\r\n // }\r\n\r\n removeDanmu() {\r\n this.danmuFacade.removeDanmu({ id: this.danmu.guid, user: this.user });\r\n }\r\n\r\n reportDanmu(id) {\r\n // if (this.fsApi.isFullscreen) {\r\n // this.fsApi.toggleFullscreen();\r\n // }\r\n // console.log(\"dispatchEvent\")\r\n window.dispatchEvent(new CustomEvent(\"quitVideoFullScreenIfany\"))\r\n if (!this.user || !this.user.id) {\r\n this.dialogService.open('login-required-dialog');\r\n } else {\r\n this.dialogService.open('reportDanmu', { size: { width: 280, height: 270 }, id });\r\n }\r\n\r\n }\r\n\r\n addUserFilter() {\r\n this.danmuFacade.addUserFilter({ id: this.danmu.uid, name: this.danmu.nickName });\r\n // this.showMenu = false;\r\n }\r\n\r\n removeUserFilter() {\r\n this.danmuFacade.removeUserFilter({ id: this.danmu.uid, name: this.danmu.nickName });\r\n // this.showMenu = false;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n }\r\n}\r\n","import { Component, OnInit, Input, OnDestroy, Inject, ViewChild, ViewContainerRef, ComponentFactoryResolver, ComponentRef, OnChanges, SimpleChanges, ElementRef } from '@angular/core';\r\nimport { DanmuFacade } from '../danmu.facade';\r\nimport { Subscription } from 'rxjs';\r\nimport { DanmuMenuComponent } from '../danmu-menu/danmu-menu.component';\r\nimport { DanmuMenuService } from '../danmu-menu/danmu-menu.service';\r\nimport { UserService } from '../../../_service/user/user.service';\r\n\r\n@Component({\r\n selector: 'app-danmu-list-content',\r\n templateUrl: './danmu-list-content.component.html',\r\n styleUrls: ['./danmu-list-content.component.scss']\r\n})\r\nexport class DanmuListContentComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input()\r\n item;\r\n // user;\r\n showMenu = false;\r\n isUserFilted = false;\r\n isKeywordFilter = false;\r\n subscritions: Array = [];\r\n content = '';\r\n AppStoreUnsubscribe;\r\n //@ViewChild(ContextMenuComponent, { static: true }) public danmuMenu: ContextMenuComponent;\r\n\r\n // @ViewChild('viewContainerRef', { static: false, read: ViewContainerRef })\r\n // danmuMenuContainer: ViewContainerRef;\r\n\r\n // danmuMenuReferences = [];\r\n\r\n // @Input()\r\n // fsApi;\r\n constructor(\r\n public danmuFacade: DanmuFacade\r\n ) {\r\n \r\n }\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (!!changes[\"item\"] && !!changes[\"item\"].currentValue) {\r\n // console.log(changes)\r\n this.content = changes[\"item\"].currentValue[\"contxt\"];\r\n this.goThrough();\r\n }\r\n }\r\n goThrough() {\r\n if (this.userFilter.length > 0 && this.userFilter.findIndex(p => p.id == this.item.uid) > -1) {\r\n this.isUserFilted = true;\r\n }\r\n else {\r\n this.isUserFilted = false;\r\n }\r\n\r\n this.isKeywordFilter = false;\r\n this.keywordFilter.map(filter => {\r\n if (this.item.contxt.indexOf(filter) > -1) {\r\n this.isKeywordFilter = true;\r\n this.content = this.item.contxt.replace(filter, '' + filter + '');\r\n }\r\n });\r\n }\r\n readState() {\r\n // const allState = this.store.getState();\r\n // const userState: UsersState = allState['users'] as UsersState;\r\n // this.user = new User(true);\r\n // Object.assign(this.user, userState.currentUser);\r\n }\r\n private userFilter = [];\r\n private keywordFilter = [];\r\n\r\n ngOnInit() {\r\n this.content = this.item.contxt;\r\n this.subscritions.push(this.danmuFacade.userFilter$.subscribe(filters => {\r\n this.userFilter = filters;\r\n this.goThrough();\r\n // if (filters.length > 0 && filters.findIndex(p => p.id == this.item.uid) > -1) {\r\n // this.isUserFilted = true;\r\n // }\r\n // else {\r\n // this.isUserFilted = false;\r\n // }\r\n }));\r\n this.subscritions.push(this.danmuFacade.keywordFilter$.subscribe(filters => {\r\n this.keywordFilter = filters;\r\n this.goThrough();\r\n\r\n }));\r\n }\r\n\r\n onMouseEnter(event) {\r\n this.showMenu = true;\r\n }\r\n onMouseLeave(event) {\r\n this.showMenu = false;\r\n // this.removeDanmuMenu()\r\n }\r\n\r\n addUserFilter() {\r\n this.danmuFacade.addUserFilter({ id: this.item.uid, name: this.item.nickName });\r\n this.showMenu = false;\r\n }\r\n\r\n removeUserFilter() {\r\n this.danmuFacade.removeUserFilter({ id: this.item.uid, name: this.item.nickName });\r\n this.showMenu = false;\r\n }\r\n\r\n // public onContextMenu($event: any, item: any): void {\r\n // this.contextMenuService.show.next({\r\n // // anchorElement: $event.target,\r\n // // Optional - if unspecified, all context menu components will open\r\n // contextMenu: this.danmuMenu,\r\n // event: $event,\r\n // item: item,\r\n // });\r\n // $event.preventDefault();\r\n // $event.stopPropagation();\r\n // }\r\n\r\n ngOnDestroy(): void {\r\n this.subscritions.forEach(s => s.unsubscribe());\r\n // this.AppStoreUnsubscribe();\r\n }\r\n\r\n\r\n\r\n getP(t) {\r\n if (t.classList.contains('')) {\r\n\r\n }\r\n }\r\n removeDanmuMenu() {\r\n\r\n // if (this.danmuMenuReferences.length < 1) {\r\n // return;\r\n // }\r\n\r\n // this.danmuMenuContainer.remove(0);\r\n\r\n // this.danmuMenuReferences = [];\r\n }\r\n\r\n}\r\n","
\r\n
{{ item?.second * 1000 | date:'HH:mm:ss':'UTC'}}\r\n
\r\n\r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n
{{ item?.addTime | date:'MM-dd' }}
\r\n \r\n
\r\n","\r\n\r\n\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n","import { Component, OnInit, OnDestroy, Input, ChangeDetectionStrategy, ChangeDetectorRef, HostListener, ViewChild, ElementRef } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { DanmuFacade } from '../danmu.facade';\r\nimport { DanmuMenuService } from '../danmu-menu/danmu-menu.service';\r\nimport { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\r\n\r\n@Component({\r\n selector: 'app-danmu-list',\r\n templateUrl: './danmu-list.component.html',\r\n styleUrls: ['./danmu-list.component.scss']\r\n})\r\n\r\nexport class DanmuListComponent implements OnInit, OnDestroy {\r\n danmu = [];\r\n subscriptions: Array = [];\r\n scrollerHeight: 480;\r\n @ViewChild(CdkVirtualScrollViewport) viewport: CdkVirtualScrollViewport;\r\n\r\n constructor(\r\n public danmuFacade: DanmuFacade,\r\n private danmuMenuService: DanmuMenuService,\r\n private ref: ElementRef,\r\n\r\n ) {\r\n // this._windowService.size$.subscribe((value: any) => {\r\n // this.screenSize = value;\r\n // });\r\n }\r\n @HostListener(\"click\")\r\n closeMenu()\r\n {\r\n this.danmuMenuService.notify(null);\r\n\r\n // console.log(\"shoud close menu\");\r\n }\r\n openMenu($event: any, item: any) {\r\n var rect = (this.ref.nativeElement as HTMLElement).getBoundingClientRect();\r\n let posY = (rect.y || rect.top);\r\n const y = $event.clientY - posY;\r\n this.danmuMenuService.notify({\r\n danmu:item,\r\n position:{x:70,y:y + 60}\r\n })\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n ngOnInit() {\r\n setTimeout(() => {\r\n this.subscriptions.push(\r\n this.danmuFacade.list$.subscribe(\r\n d => {\r\n this.danmu = d;\r\n }\r\n )\r\n );\r\n });\r\n }\r\n\r\n onDoubleClick(time) {\r\n this.danmuFacade.setCurrentTime(time - 0.5);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n }\r\n}\r\n","
\r\n {{view.title}}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n
\r\n\r\n\r\n
\r\n 弹幕字体\r\n \r\n
\r\n","import { ChangeDetectionStrategy, Component, OnInit, ViewChild } from '@angular/core';\r\n//import { Options } from '@angular-slider/ngx-slider';\r\nimport { DanmuFacade } from '../danmu.facade';\r\nimport { BulletStyleService } from '../bullet.style.service';\r\nimport { take } from 'rxjs/operators';\r\nimport { Utility } from '../../../_service/utility';\r\n\r\n\r\n@Component({\r\n selector: 'app-danmu-settings',\r\n templateUrl: './danmu-settings.component.html',\r\n styleUrls: ['./danmu-settings.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class DanmuSettingsComponent implements OnInit {\r\n // @ViewChild('speedSlider') speedSlider: any;\r\n // @ViewChild('sizeSlider') sizeSlider: any;\r\n // @ViewChild('opacitySlider') opacitySlider: any;\r\n\r\n // speedValue = 0;\r\n // fontSizeValue = 2;\r\n // opacityValue = 4;\r\n fontFamily = 4;\r\n // actualZoom = 1;\r\n\r\n\r\n\r\n speedOptions: Array = [\r\n {\r\n title: \"极慢\",\r\n value: 0\r\n },\r\n {\r\n title: \"慢\",\r\n value: 1\r\n },\r\n {\r\n title: \"适中\",\r\n value: 2\r\n },\r\n {\r\n title: \"快\",\r\n value: 3\r\n },\r\n {\r\n title: \"超快\",\r\n value: 4\r\n },\r\n\r\n // Options = {\r\n // floor: 0,\r\n // ceil: 4,\r\n // animate: false,\r\n // showTicks: false,\r\n // hideLimitLabels: true,\r\n // hidePointerLabels: true,\r\n // translate: (value: number): string => {\r\n // switch (value) {\r\n // case 0:\r\n // return '极慢';\r\n // case 1:\r\n // return '慢';\r\n // case 2:\r\n // return '适中';\r\n // case 3:\r\n // return '快';\r\n // case 4:\r\n // return '超快';\r\n // default:\r\n // return '';\r\n // }\r\n // },\r\n // };\r\n ]\r\n fontSizeOptions: Array = [\r\n {\r\n title: \"极小\",\r\n value: 0\r\n },\r\n {\r\n title: \"小\",\r\n value: 1\r\n },\r\n {\r\n title: \"适中\",\r\n value: 2\r\n },\r\n {\r\n title: \"大\",\r\n value: 3\r\n },\r\n {\r\n title: \"超大\",\r\n value: 4\r\n },\r\n ]\r\n\r\n\r\n\r\n // Options = {\r\n // floor: 0,\r\n // ceil: 4,\r\n // animate: false,\r\n // showTicks: false,\r\n // hideLimitLabels: true,\r\n // hidePointerLabels: true,\r\n // translate: (value: number): string => {\r\n // switch (value) {\r\n // case 0:\r\n // return '极小';\r\n // case 1:\r\n // return '小';\r\n // case 2:\r\n // return '适中';\r\n // case 3:\r\n // return '大';\r\n // case 4:\r\n // return '超大';\r\n // default:\r\n // return '适中';\r\n // }\r\n // },\r\n // };\r\n opacityOptions: Array = [\r\n {\r\n title: \"10%\",\r\n value: 0\r\n },\r\n {\r\n title: \"25%\",\r\n value: 1\r\n },\r\n {\r\n title: \"50%\",\r\n value: 2\r\n },\r\n {\r\n title: \"75%\",\r\n value: 3\r\n },\r\n {\r\n title: \"100%\",\r\n value: 4\r\n },\r\n\r\n ]\r\n\r\n // Options = {\r\n // floor: 0,\r\n // ceil: 4,\r\n // animate: false,\r\n // showTicks: false,\r\n // hideLimitLabels: true,\r\n // hidePointerLabels: true,\r\n // translate: (value: number): string => {\r\n // switch (value) {\r\n // case 0:\r\n // return '10%';\r\n // case 1:\r\n // return '25%';\r\n // case 2:\r\n // return '50%';\r\n // case 3:\r\n // return '75%';\r\n // case 4:\r\n // return '100%';\r\n // default:\r\n // return '';\r\n // }\r\n // },\r\n // };\r\n options = [\r\n {\r\n title: \"弹幕速度\",\r\n list: this.speedOptions,\r\n value: 0,\r\n key: \"speed\"\r\n },\r\n {\r\n title: \"字体大小\",\r\n list: this.fontSizeOptions,\r\n value: 2,\r\n key: \"font\"\r\n },\r\n {\r\n title: \"不透明度\",\r\n list: this.opacityOptions,\r\n value: 4,\r\n key: \"opacity\"\r\n }\r\n ]\r\n\r\n fontFamilyOptions;\r\n isAdjustedZoom = false;\r\n constructor(\r\n private danmuFacade: DanmuFacade,\r\n private _utility: Utility,\r\n private bulletStyleService: BulletStyleService\r\n ) {\r\n\r\n }\r\n\r\n ngOnInit() {\r\n\r\n this.fontFamilyOptions = this.bulletStyleService.fontList;\r\n\r\n // let devicePixelRatio = 1;\r\n // if (this._utility.isMac()) {\r\n\r\n // } else {\r\n // devicePixelRatio = window.innerWidth < 1366 ? (1366 / window.innerWidth) : window.innerWidth > 2560 ? (1920 / window.innerWidth) : 1; // innerWidth如果小于1366启用,使用最小尺寸;大于2560启用,使用最大尺寸\r\n // }\r\n // const body = document.getElementsByClassName('bg');\r\n // if (body[0].attributes.hasOwnProperty('style')) {\r\n // this.isAdjustedZoom = body[0].attributes[1].value.indexOf('zoom') !== -1;\r\n // // console.log(this.isAdjustedZoom);\r\n // }\r\n // this.actualZoom = this.isAdjustedZoom ? devicePixelRatio : 1;\r\n // const sliders = document.getElementsByTagName('ngx-slider');\r\n // // console.log(sliders);\r\n // for (var i = 0; i < sliders.length; i++) {\r\n // // console.log(sliders[i].getElementsByClassName('ngx-slider-bubble'));\r\n // const bubbles = sliders[i].getElementsByClassName('ngx-slider-bubble');\r\n // for (var n = 0; n < bubbles.length; n++) {\r\n // const bubble = bubbles[n] as HTMLElement;\r\n // bubble.style.transform = 'scale(' + (1 / this.actualZoom).toString() + ')';\r\n // bubble.style['margin-left'] = this.actualZoom <= 1 ? '0' : this.actualZoom <= 1.25 ? '-2px' : '-3px';\r\n // }\r\n // }\r\n this.danmuFacade.speed$.subscribe(value => {\r\n this.options.find(p => p.key == \"speed\").value = value;\r\n //this.speedValue = value;\r\n // if (this.speedSlider) {\r\n // const tricks = this.speedSlider.elementRef.nativeElement.querySelectorAll('.ngx-slider-tick');\r\n // this.setTrickColor(tricks, value)\r\n // } else {\r\n // setTimeout(() => {\r\n // const tricks = this.speedSlider.elementRef.nativeElement.querySelectorAll('.ngx-slider-tick');\r\n // this.setTrickColor(tricks, value)\r\n // });\r\n // }\r\n });\r\n\r\n this.danmuFacade.fontSize$.subscribe(value => {\r\n this.options.find(p => p.key == \"font\").value = value;\r\n\r\n //this.fontSizeValue = value;\r\n // if (this.sizeSlider) {\r\n // const tricks = this.sizeSlider.elementRef.nativeElement.querySelectorAll('.ngx-slider-tick');\r\n // this.setTrickColor(tricks, value)\r\n // } else {\r\n // setTimeout(() => {\r\n // const tricks = this.sizeSlider.elementRef.nativeElement.querySelectorAll('.ngx-slider-tick');\r\n // this.setTrickColor(tricks, value)\r\n // });\r\n // }\r\n });\r\n\r\n this.danmuFacade.opacity$.subscribe(value => {\r\n this.options.find(p => p.key == \"opacity\").value = value;\r\n\r\n //this.opacityValue = value;\r\n // if (this.opacitySlider) {\r\n // const tricks = this.opacitySlider.elementRef.nativeElement.querySelectorAll('.ngx-slider-tick');\r\n // this.setTrickColor(tricks, value)\r\n // } else {\r\n // setTimeout(() => {\r\n // const tricks = this.opacitySlider.elementRef.nativeElement.querySelectorAll('.ngx-slider-tick');\r\n // this.setTrickColor(tricks, value)\r\n // });\r\n // }\r\n });\r\n\r\n this.danmuFacade.fontFamily$.subscribe(value => {\r\n this.fontFamily = !!value ? value : 4;\r\n });\r\n }\r\n\r\n // setTrickColor(tricks, value) {\r\n // tricks.forEach((t, idx) => {\r\n // const color = idx < value ? \"#0db9f0\" : \"#fff\"\r\n // t.style.setProperty(\"background-color\", color, \"important\")\r\n // });\r\n // }\r\n\r\n // onSpeedChange(value) {\r\n // this.danmuFacade.setSpeed(value);\r\n // }\r\n\r\n // onFontSizeChange(value) {\r\n // this.danmuFacade.setFontSize(value);\r\n // }\r\n\r\n // onOpacityChange(value) {\r\n // this.danmuFacade.setOpacity(value);\r\n // }\r\n\r\n onFontFamilyChange(value) {\r\n this.danmuFacade.setFontFamily(value);\r\n }\r\n\r\n selecItem(key, index) {\r\n switch (key) {\r\n case \"speed\":\r\n this.danmuFacade.setSpeed(index);\r\n // this.onSpeedChange(index);\r\n break;\r\n case \"font\":\r\n this.danmuFacade.setFontSize(index);\r\n // this.onSpeedChange(index);\r\n break;\r\n case \"opacity\":\r\n this.danmuFacade.setOpacity(index);\r\n // this.onSpeedChange(index);\r\n break;\r\n }\r\n //console.log(itemlist,index);\r\n }\r\n\r\n getProgress(view) {\r\n if (view.mouseDown) {\r\n return view.percentage;\r\n }\r\n else {\r\n let eachPart = 100 / (view.list.length - 1);\r\n if (view.value == 0) {\r\n return 0;\r\n }\r\n if (view.value == length - 1) {\r\n return 100;\r\n }\r\n return (view.value * eachPart);\r\n }\r\n\r\n }\r\n\r\n onMouseClick($event, element: HTMLElement, view) {\r\n view.mouseDown = true;\r\n view.percentage = $event.offsetX / element.clientWidth * 100;\r\n // console.log(\"mouse click\")\r\n //console.log($event);\r\n //let percentage = $event.offsetX / element.clientWidth; //Math.max(Math.min($event.offsetX / (this.elem.scrollWidth) , 0.999), 0);\r\n //console.log(percentage);\r\n //console.log(event);\r\n\r\n }\r\n\r\n onMouseUp($event, element: HTMLElement, view) {\r\n let percentage = $event.offsetX / element.clientWidth * 100; //Math.max(Math.min($event.offsetX / (this.elem.scrollWidth) , 0.999), 0);\r\n let eachPart = 100 / (view.list.length - 1);\r\n let halfPart = (eachPart / 2);\r\n view.mouseDown = false;\r\n if (percentage < halfPart) {\r\n view.value = 0;\r\n this.selecItem(view.key, view.value);\r\n return;\r\n }\r\n if (percentage > 100 - halfPart) {\r\n view.value = view.list.length - 1;\r\n this.selecItem(view.key, view.value);\r\n return;\r\n }\r\n for (let i = 1; i < view.list.length - 1; ++i) {\r\n if (percentage < i * eachPart + halfPart) {\r\n view.value = i;\r\n this.selecItem(view.key, view.value);\r\n\r\n break;\r\n }\r\n }\r\n\r\n\r\n\r\n // console.log(percentage);\r\n }\r\n onMouseOver($event, element: HTMLElement, view) {\r\n //console.log(\"mouse move\",view.mouseDown)\r\n if (!view.mouseDown) {\r\n return;\r\n }\r\n let percentage = $event.offsetX / element.clientWidth; //Math.max(Math.min($event.offsetX / (this.elem.scrollWidth) , 0.999), 0);\r\n view.percentage = percentage * 100;\r\n // console.log(percentage);\r\n\r\n }\r\n // onMouseOut($event, element: HTMLElement, view) {\r\n // view.mouseDown = false;\r\n // console.log(\"mouse out\")\r\n // }\r\n}\r\n","
\r\n\r\n
\r\n \r\n\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
弹幕设置\r\n
\r\n
\r\n 弹幕列表({{(danmuFacade.list$ | async).length}})
\r\n
弹幕屏蔽
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n 弹幕颜色 \r\n (开通VIP或Lv.2可解锁特殊弹幕颜色)\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
弹幕位置
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {{item.name}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
弹幕前缀
\r\n
\r\n
\r\n
\r\n
\r\n 头像和昵称\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n 国家\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n","import { Component, OnInit, Output, EventEmitter, Input, OnDestroy, Inject, ElementRef, ViewChild } from '@angular/core';\r\nimport { Utility } from '../../../_service/utility';\r\nimport { BulletStyleService } from '../bullet.style.service';\r\nimport { DanmuFacade } from '../danmu.facade';\r\nimport { Subscription, Unsubscribable } from 'rxjs';\r\nimport { User } from '../../../_model/user/user.model';\r\nimport { DatePipe } from '@angular/common';\r\nimport { UserService } from '../../../_service/user/user.service';\r\nimport { NotifyService } from '../../../_service/notify/notifyService';\r\nimport { NotifyType } from '../../../_service/notify/notifyModel';\r\nimport { DnDialogService } from 'app/_modules/dn-dialog/dn-dialog.service';\r\nimport { VgAPI } from 'app/_modules/player/core';\r\nimport { RechargeBoxService } from 'app/_service/recharge-box/recharge-box.service';\r\nimport { BarrelType } from '../../player/overlay-danmu/bullet';\r\nimport { SettingsService } from 'app/user-center/settings/settings.service';\r\n\r\nconst DANMU_SETTINGS = 'danmuSettings';\r\n// const DANMU_CONFIG_WINDOW = 'danmu config window';\r\n// const DANMU_INPUT_CONFIG_WINDOW = 'danmu input config window'\r\n@Component({\r\n selector: 'app-danmu-input',\r\n templateUrl: './danmu-input.html',\r\n styleUrls: ['./danmu-input.scss'],\r\n providers: [\r\n BulletStyleService\r\n ]\r\n})\r\n\r\nexport class DanmuInputComponent implements OnInit, OnDestroy {\r\n // @Input()\r\n // api;\r\n\r\n public count = 3;\r\n public disableFont = false;\r\n subscriptions: Array = [];\r\n isShowConfig = false;\r\n // selectKey = 'advance';\r\n\r\n fontList: Array = [];\r\n colorList: Array = [];\r\n styleList: Array = [];\r\n typeList: Array = [];\r\n currentColor = 0;\r\n currentFont = 0;\r\n currentStyle = 0;\r\n currentType = 0;\r\n sampleStyle = {};\r\n text = '';\r\n user: User;\r\n disabled = false;\r\n danmuKey: any;\r\n // AppStoreUnsubscribe;\r\n timestamp: number; // 记录上一次发弹幕时间\r\n showDanmuInputSettingsBlock = false;\r\n includeAvatar = false;\r\n includeLocation = false;\r\n danmuInitialSettings = {\r\n blockLeft: false,\r\n blockTop: false,\r\n blockBottom: false,\r\n userFilters: [],\r\n keywordFilters: [],\r\n speed: 2,\r\n showDanmu: true,\r\n fontSize: 2,\r\n };\r\n dialogElem: HTMLElement;\r\n danmuInputSettingsBlockElem: HTMLElement;\r\n @ViewChild('configDialog') configDialog: ElementRef;\r\n @ViewChild('danmuInputSettingsBlock') danmuInputSettingsBlock: ElementRef;\r\n @Input() vgFor: string;\r\n\r\n private openList: Unsubscribable = null;\r\n private openList1: Unsubscribable = null;\r\n\r\n lastSettingShowDanmu; // 记录上一次Setting服务获取到的弹幕状态\r\n constructor(\r\n public styleService: BulletStyleService,\r\n public danmuFacade: DanmuFacade,\r\n private _userService: UserService,\r\n private notify: NotifyService,\r\n private _dnDialogService: DnDialogService,\r\n // public fsAPI: VgFullscreenAPI,\r\n private _rechargeBoxService: RechargeBoxService,\r\n private _utility:Utility,\r\n private _api:VgAPI,\r\n private settingsService: SettingsService,\r\n ) {\r\n\r\n this.colorList = styleService.colorList;\r\n this.fontList = styleService.fontList;\r\n this.styleList = styleService.styleList;\r\n this.typeList = [\r\n { type: BarrelType.Barrel, name: '滚动', value: 0, vipFunction: false },\r\n { type: BarrelType.FixTop, name: '顶部', value: 1, vipFunction: true },\r\n { type: BarrelType.FixBottom, name: '底部', value: 2, vipFunction: true },\r\n ];\r\n\r\n }\r\n\r\n @Output() configChange = new EventEmitter(); // 视频加载时\r\n @Output() send = new EventEmitter(); // 发送弹幕\r\n @Output() error = new EventEmitter();\r\n @Output() onFocus = new EventEmitter();\r\n @Output() onBlur = new EventEmitter();\r\n\r\n @Input() set config(value) {\r\n if (value != null) {\r\n if (value['font']) {\r\n this.currentFont = value['font'];\r\n }\r\n if (value['color']) {\r\n this.currentColor = value['color'];\r\n }\r\n if (value['style']) {\r\n this.currentStyle = value['style'];\r\n }\r\n this.onFontChanged(false);\r\n }\r\n }\r\n\r\n placeholder = '点击此处输入弹幕';\r\n\r\n textBlur() {\r\n this.placeholder = '点击此处输入弹幕';\r\n this._utility.isKeyboard = false;\r\n this.onBlur.emit();\r\n }\r\n\r\n textFocus() {\r\n this.isShowConfig = false;\r\n this.placeholder = '';\r\n this._utility.isKeyboard = true;\r\n this.onFocus.emit();\r\n }\r\n\r\n readState() {\r\n // const allState = this.store.getState();\r\n // const userState: UsersState = allState['users'] as UsersState;\r\n // if (!!userState.currentUser && (userState.currentUser?.id !== this.user?.id)) {\r\n // this.danmuFacade.getUserSettings(null);\r\n // }\r\n // this.user = new User(true);\r\n // Object.assign(this.user, userState.currentUser);\r\n // this.danmuFacade.getUserSettings(null);\r\n }\r\n\r\n ngOnInit() {\r\n const danmuSettings =this.getDamuSetting();\r\n const userFilters = typeof danmuSettings.userFilters === 'string'\r\n ? JSON.parse(danmuSettings.userFilters) : danmuSettings.userFilters;\r\n const keywordFilters = typeof danmuSettings.keywordFilters === 'string'\r\n ? JSON.parse(danmuSettings.keywordFilters) : danmuSettings.keywordFilters;\r\n if (danmuSettings.blockLeft) {\r\n this.danmuFacade.blockLeft(null);\r\n }\r\n if (danmuSettings.blockTop) {\r\n this.danmuFacade.blockTop(null);\r\n }\r\n if (danmuSettings.blockBottom) {\r\n this.danmuFacade.blockBottom(null);\r\n }\r\n this.danmuFacade.setSpeed(danmuSettings.speed);\r\n // 代码注释,禁用强制开启弹幕\r\n // if (!danmuSettings.showDanmu) {\r\n // this.danmuFacade.toggleDanmu(danmuSettings.showDanmu);\r\n // }\r\n if (userFilters) {\r\n userFilters.forEach(filter => {\r\n this.danmuFacade.addUserFilter(filter);\r\n });\r\n }\r\n if (keywordFilters) {\r\n keywordFilters.forEach(filter => {\r\n this.danmuFacade.addKeywordFilter(filter);\r\n });\r\n }\r\n this.danmuFacade.setFontSize(danmuSettings.fontSize);\r\n if (danmuSettings.opacity) {\r\n this.danmuFacade.setOpacity(danmuSettings.opacity);\r\n }\r\n if (danmuSettings['font-family']) {\r\n this.danmuFacade.setFontFamily(danmuSettings['font-family']);\r\n }\r\n this.danmuFacade.getUserSettings(null);\r\n this.subscriptions.push(this.danmuFacade.userFilter$.subscribe(uf => {\r\n this.updateLocalDanmuSettings({ userFilters: JSON.stringify(uf) });\r\n }),\r\n this.danmuFacade.keywordFilter$.subscribe(kf => {\r\n this.updateLocalDanmuSettings({ keywordFilters: JSON.stringify(kf) });\r\n }),\r\n this.danmuFacade.blockLeft$.subscribe(value => {\r\n this.updateLocalDanmuSettings({ blockLeft: value });\r\n }),\r\n this.danmuFacade.blockTop$.subscribe(value => {\r\n this.updateLocalDanmuSettings({ blockTop: value });\r\n }),\r\n this.danmuFacade.blockBottom$.subscribe(value => {\r\n this.updateLocalDanmuSettings({ blockBottom: value });\r\n }),\r\n this.danmuFacade.speed$.subscribe(value => {\r\n this.updateLocalDanmuSettings({ speed: value });\r\n }),\r\n this.danmuFacade.showDanmu$.subscribe(value => {\r\n // console.log('showDanmu$', value);\r\n this.updateLocalDanmuSettings({ showDanmu: value });\r\n }),\r\n this.danmuFacade.fontSize$.subscribe(value => {\r\n this.updateLocalDanmuSettings({ fontSize: value });\r\n }),\r\n this.danmuFacade.opacity$.subscribe(value => {\r\n this.updateLocalDanmuSettings({ opacity: value });\r\n }),\r\n this.danmuFacade.fontFamily$.subscribe(value => {\r\n this.updateLocalDanmuSettings({ 'font-family': value });\r\n }),\r\n this.danmuFacade.outputType$.subscribe(value => {\r\n this.currentType = value\r\n }),\r\n this.danmuFacade.outputColor$.subscribe(value => {\r\n this.currentColor = value\r\n }),\r\n this.danmuFacade.userSettings$.subscribe(value => {\r\n this.includeAvatar = value.includeAvatar;\r\n this.includeLocation = value.includeLocation;\r\n }),\r\n this.settingsService.settings$.subscribe(settings => {\r\n if ('isShowDanmuMode' in settings) {\r\n // 先查询cookie保存的弹幕开关状态\r\n let danmuSettings = this.getDamuSetting();\r\n // console.log('settings$', settings.isShowDanmuMode);\r\n // console.log('cookie', danmuSettings.showDanmu);\r\n // console.log('lastSettingDanmu', this.lastSettingShowDanmu);\r\n // 如果setting服务传来的状态与cookie保存的不一致\r\n if (settings.isShowDanmuMode !== danmuSettings.showDanmu) {\r\n // 并且上一次setting服务获取到的弹幕状态不存在\r\n if (this.lastSettingShowDanmu === undefined) {\r\n // 则调用原本的方式去更新\r\n this.danmuFacade.toggleDanmu(null);\r\n }\r\n }\r\n // 记录上一次Setting服务获取到的弹幕状态\r\n this.lastSettingShowDanmu = settings.isShowDanmuMode;\r\n }\r\n })\r\n \r\n );\r\n // this._popupWindowServiceService.currentWindow$.subscribe(r => {\r\n // if (r !== DANMU_CONFIG_WINDOW) {\r\n // this.isShowConfig = false;\r\n // }\r\n // if (r !== DANMU_INPUT_CONFIG_WINDOW) {\r\n // this.showDanmuInputSettingsBlock = false;\r\n // }\r\n // })\r\n this.user = this._userService.user;\r\n this.subscriptions.push(\r\n this._userService.userState$.subscribe(user=>{\r\n this.user = user;\r\n }),\r\n\r\n this.danmuFacade.DanmuKey$.subscribe(key => {\r\n if (!!key && this.danmuKey != key) {\r\n this.danmuKey = key;\r\n this.notify.sendMsg({\r\n action: NotifyType.JoinVideoRoom,\r\n data: {\r\n uniqueKey: key\r\n }\r\n });\r\n }\r\n }),\r\n this.notify.on({ action: NotifyType.SendBarrage }).subscribe(p => {\r\n var second = p.second;\r\n if (isNaN(second) || second < 0) {\r\n second = 0;\r\n }\r\n var data = {\r\n guid: p.guid || \"\",\r\n avatar: p.avatar,\r\n country: p.country,\r\n contxt: p.processContext, // PC使用processContext,APP使用contxt\r\n color: p.color || 0,\r\n font: p.font || 0,\r\n isDeleted: 0,\r\n lid: p.lid || 0,\r\n nickName: p.nickName || \"\",\r\n position: p.position || 0,\r\n second: second,\r\n uid: p.uid || 0,\r\n vid: p.vid || 0,\r\n addTime: p.addTime || \"\",\r\n prefix: p.prefix,\r\n isOfficalUP: p.IsOfficalUP\r\n };\r\n\r\n if (this.user.id !== data.uid) {\r\n this.danmuFacade.newDanmu(data);\r\n }\r\n })\r\n );\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.dialogElem = this.configDialog.nativeElement;\r\n this.danmuInputSettingsBlockElem = this.danmuInputSettingsBlock.nativeElement;\r\n }\r\n\r\n showConfig() {\r\n if (this.disabled) {\r\n this.isShowConfig = false;\r\n return;\r\n }\r\n this.isShowConfig = !this.isShowConfig;\r\n if (this.isShowConfig) {\r\n if (this._api && this._api.hiddenAPI) {\r\n this._api.hiddenAPI.captureControls();\r\n }\r\n this.openList = this._utility.openList(this.dialogElem, null, (elem) => {\r\n const classes = elem.getAttribute('class')?.split(' ') || [];\r\n if (classes.indexOf('danmu-menu-item') > -1) {\r\n return;\r\n }\r\n if (classes.indexOf('sender') > -1) {\r\n return;\r\n }\r\n this.openList.unsubscribe();\r\n if (!!this._api && this._api.hiddenAPI) {\r\n this._api.hiddenAPI.releaseControls();\r\n }\r\n this.isShowConfig = false;\r\n })\r\n } else {\r\n if (this.openList) {\r\n this.openList.unsubscribe();\r\n }\r\n if(!!this._api && this._api.hiddenAPI)\r\n this._api.hiddenAPI.releaseControls();\r\n }\r\n }\r\n\r\n // select(data) {\r\n // this.selectKey = data;\r\n // }\r\n\r\n selectFont(item) {\r\n this.currentFont = item.value;\r\n this.onFontChanged();\r\n }\r\n\r\n selectColor(item) {\r\n if (!this.user || !this.user.id) {\r\n // if (this.fsAPI.isFullscreen) {\r\n // this.fsAPI.toggleFullscreen();\r\n // }\r\n window.dispatchEvent(new CustomEvent(\"quitVideoFullScreenIfany\"))\r\n\r\n this._userService.showLoginDialog(true);\r\n return;\r\n }\r\n if (this.user.roleId === 0 && this.user.level < 2) {\r\n window.dispatchEvent(new CustomEvent(\"quitVideoFullScreenIfany\"))\r\n this._rechargeBoxService.changeDisplayStatus(true);\r\n return;\r\n }\r\n this.danmuFacade.setOutputColor(item.value);\r\n this.currentColor = item.value;\r\n this.onFontChanged();\r\n }\r\n\r\n selectStyle(item) {\r\n this.currentStyle = item.value;\r\n this.onFontChanged();\r\n }\r\n\r\n selectType(item) {\r\n\r\n if (!this.user || !this.user.id) {\r\n window.dispatchEvent(new CustomEvent(\"quitVideoFullScreenIfany\"))\r\n\r\n this._userService.showLoginDialog(true);\r\n return;\r\n }\r\n\r\n if (this.user.roleId === 0) {\r\n window.dispatchEvent(new CustomEvent(\"quitVideoFullScreenIfany\"))\r\n\r\n this._rechargeBoxService.changeDisplayStatus(true);\r\n return;\r\n }\r\n\r\n this.danmuFacade.setOutputType(item.value);\r\n this.currentType = item.value;\r\n this.onFontChanged();\r\n }\r\n\r\n tab = 'setting';\r\n private onFontChanged(notify = true) {\r\n const data = {\r\n opacity: '100',\r\n font: this.currentFont,\r\n style: this.currentStyle,\r\n color: this.currentColor,\r\n 'font-family': null\r\n };\r\n\r\n this.sampleStyle = this.styleService.getStyle(data);\r\n\r\n if (notify) {\r\n this.configChange.next(data);\r\n }\r\n }\r\n\r\n selectConfig(tab) {\r\n this.tab = tab;\r\n }\r\n sendDanmu() {\r\n if (!this.user.id) {\r\n window.dispatchEvent(new CustomEvent(\"quitVideoFullScreenIfany\"))\r\n\r\n this._userService.showLoginDialog(true);\r\n return;\r\n }\r\n\r\n if (this.text.length === 0 || this.text.length >= 25) {\r\n this._dnDialogService.open('player-message-dialog', { size: { width: 360, height: 240, }, message: '字符不能为空,或不能超过25个' });\r\n this.error.next('字符不能为空,或不能超过25个');\r\n return;\r\n }\r\n\r\n if (this.text.match(/^\\s*$/)) {\r\n // alert('字符不能为空,或不能超过25个');\r\n this._dnDialogService.open('player-message-dialog', { size: { width: 360, height: 240, }, message: '字符不能为空,或不能超过25个' });\r\n this.text = '';\r\n this.error.next('字符不能为空,或不能超过25个');\r\n return;\r\n }\r\n\r\n const currentTimestamp = new Date().getTime();\r\n\r\n // 如果少于3秒,提示稍候\r\n if (this.timestamp) {\r\n if (currentTimestamp - this.timestamp < 3000) {\r\n\r\n this._dnDialogService.open('player-message-dialog', { size: { width: 360, height: 240, }, message: '弹幕输入频率过高,请稍候再试。' });\r\n this.text = '';\r\n return;\r\n }\r\n }\r\n const datePipe = new DatePipe('en-US');\r\n let t = this.danmuFacade.currentTime;\r\n\r\n // let t = this._api.currentTime;\r\n // console.log(this._api,t);\r\n if (t === 0) {\r\n // console.log('请在弹幕开始后发送');\r\n } else {\r\n \r\n this.timestamp = new Date().getTime();\r\n // let danmu: any = { text: this.text };\r\n // if (this.includeAvatar) {\r\n // danmu = { ...danmu, avatar: this.user.avatar, name: this.user.nickname }\r\n // }\r\n // if (this.includeLocation) {\r\n // danmu = { ...danmu, location: this.user.region }\r\n // danmu['location'] = this.user.region;\r\n // }\r\n\r\n this.danmuFacade.sendDanmu({\r\n second: t,\r\n published: datePipe.transform(new Date, 'MM-dd'),\r\n font: this.currentFont,\r\n color: this.hashColor(),\r\n style: this.currentStyle,\r\n contxt: this.text,\r\n type: this.currentType,\r\n user: this.user,\r\n uniqueKey: this.danmuKey,\r\n position: this.currentType,\r\n addTime: new Date(new Date().toString().split('GMT')[0] + ' UTC').toISOString().split('.')[0]\r\n });\r\n\r\n this.text = '';\r\n }\r\n // this.subscriptions.push(this.danmuFacade.currentTime$.pipe(\r\n // take(1)).subscribe(\r\n // t => {\r\n \r\n // }\r\n // ));\r\n }\r\n\r\n textinput(event) {\r\n if (this._utility.isKeyEnter(event)) {\r\n this.sendDanmu();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n // this.AppStoreUnsubscribe();\r\n this.notify.sendMsg({\r\n action: NotifyType.LeaveVideoRoom\r\n });\r\n\r\n if(this.openList)\r\n {\r\n this.openList.unsubscribe()\r\n }\r\n\r\n if(this.openList1)\r\n {\r\n this.openList1.unsubscribe();\r\n }\r\n }\r\n\r\n isPlayPage(url) {\r\n if (url.split('?')[0].replace('/', '').toLowerCase() === 'play' || url.split('?')[0].replace('/', '').toLowerCase() === 'watch') {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n toggleDanmu() {\r\n // 向settings服务更新\r\n let danmuSettings = this.getDamuSetting();\r\n if (this.user && this.user.id) {\r\n this.settingsService.updateOneSetting({isShowDanmuMode: !danmuSettings.showDanmu});\r\n }\r\n // 向danmuFacade更新\r\n this.danmuFacade.toggleDanmu(null);\r\n }\r\n\r\n private getDamuSetting():any{\r\n if(localStorage.getItem('danmuSettings'))\r\n {\r\n return JSON.parse(localStorage.getItem('danmuSettings'));\r\n }\r\n return this.danmuInitialSettings;\r\n }\r\n toggleIncludeLocation() {\r\n if (!this.user || !this.user.id) {\r\n window.dispatchEvent(new CustomEvent(\"quiteFullScreen\"))\r\n\r\n this._userService.showLoginDialog(true);\r\n return;\r\n }\r\n\r\n if (this.user && this.user.id && this.user.roleId === 0) {\r\n window.dispatchEvent(new CustomEvent(\"quiteFullScreen\"))\r\n\r\n this._rechargeBoxService.changeDisplayStatus(true);\r\n return;\r\n }\r\n this.includeLocation = !this.includeLocation;\r\n this.danmuFacade.updateUserSettings({ includeAvatar: this.includeAvatar, includeLocation: this.includeLocation })\r\n }\r\n\r\n toggleIncludeAvatar() {\r\n if (!this.user || !this.user.id) {\r\n window.dispatchEvent(new CustomEvent(\"quiteFullScreen\"))\r\n\r\n this._userService.showLoginDialog(true);\r\n return;\r\n }\r\n\r\n if (this.user && this.user.id && this.user.roleId === 0) {\r\n window.dispatchEvent(new CustomEvent(\"quiteFullScreen\"))\r\n\r\n this._rechargeBoxService.changeDisplayStatus(true);\r\n return;\r\n }\r\n this.includeAvatar = !this.includeAvatar;\r\n this.danmuFacade.updateUserSettings({ includeAvatar: this.includeAvatar, includeLocation: this.includeLocation })\r\n }\r\n hashColor() {\r\n switch (this.currentColor) {\r\n case 0:\r\n return '#ffffff';\r\n case 1:\r\n return '#dda7e5';\r\n case 2:\r\n return '#3bc529';\r\n case 3:\r\n return '#00bacf';\r\n case 4:\r\n return '#fffc00';\r\n case 5:\r\n return '#fe0000';\r\n case 6:\r\n return '#ff7200';\r\n case 7:\r\n return '#000000';\r\n default:\r\n return '#ffffff';\r\n }\r\n\r\n }\r\n\r\n updateLocalDanmuSettings(value: any) {\r\n let danmuSettings = this.getDamuSetting();\r\n localStorage.setItem(DANMU_SETTINGS, JSON.stringify({ ...danmuSettings, ...value }));\r\n }\r\n\r\n onMouseLeave() {\r\n // this.sh\r\n }\r\n\r\n toggleDanmuInputSettingsBlock() {\r\n this.showDanmuInputSettingsBlock = !this.showDanmuInputSettingsBlock;\r\n if (this.showDanmuInputSettingsBlock) {\r\n // this._popupWindowServiceService.setCurrentWindow(DANMU_INPUT_CONFIG_WINDOW)\r\n\r\n this.openList1 = this._utility.openList(this.danmuInputSettingsBlockElem, null, (elem) => {\r\n // console.log('asdfasdfasd')\r\n const classes = elem.getAttribute('class')?.split(' ');\r\n\r\n if (classes.indexOf('iconyangshi') > -1) {\r\n return;\r\n }\r\n this.openList1.unsubscribe();\r\n this.showDanmuInputSettingsBlock = false;\r\n })\r\n }\r\n else {\r\n if (this.openList1) {\r\n this.openList1.unsubscribe();\r\n }\r\n }\r\n }\r\n}\r\n","export const ViewPollResultPermissions = [\r\n {\r\n label: '所有人可见',\r\n value: 0\r\n },\r\n {\r\n label: '投票后可见',\r\n value: 1\r\n }\r\n];\r\n\r\n// export const MultipleSelectOptions = [{\r\n// label: '单选',\r\n// value: false\r\n// },\r\n// {\r\n// label: '多选',\r\n// value: true\r\n// }\r\n// ];\r\n\r\nclass PollOption {\r\n id: number;\r\n title: string;\r\n count: number;\r\n}\r\n\r\nexport class Poll {\r\n cid: number;\r\n endDate: number;\r\n id: number;\r\n isShow: number;\r\n isVoted: number;\r\n multipleOptions: number;\r\n startDate: string;\r\n title: string;\r\n uid: number;\r\n vid: number;\r\n voteCount: number;\r\n voteOptions: Array;\r\n voteViewType: number;\r\n}\r\n","
\r\n
\r\n \r\n
\r\n
\r\n \r\n
发起投票
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
请输入标题
\r\n
最多30个字符
\r\n
\r\n
\r\n
\r\n \r\n\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n + 增加选项(最多5个)\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n","import {\r\n Component,\r\n OnInit,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n Inject,\r\n\r\n OnDestroy\r\n} from '@angular/core';\r\nimport {\r\n ViewPollResultPermissions,\r\n // MultipleSelectOptions\r\n} from '../../_model/poll';\r\nimport { FormBuilder, FormGroup, FormControl, FormArray, Validators } from '@angular/forms';\r\n//import { CustomValidators } from '../../_validator/custom-validators';\r\nimport { Store } from 'redux';\r\nimport { AppStore } from '../../app.store';\r\n// import { UsersState } from '../../_model/user/user.reducer';\r\nimport { User } from '../../_model/user/user.model';\r\nimport { VideoState } from '../../_model/video/video.reducer';\r\nimport * as userComments from '../../_model/comment/comments.actions';\r\nimport { PollService } from '../../_service/poll/poll.service';\r\nimport { ToastService } from '../../_service/toast/toast.service';\r\nimport { CommentListService } from '../../_service/comment/comment-list.service';\r\nimport { Resource } from 'app/_service/resource/resource';\r\n\r\n\r\n@Component({\r\n selector: 'app-voting-creator',\r\n templateUrl: './voting-creator.component.html',\r\n styleUrls: ['./voting-creator.component.scss']\r\n})\r\n\r\nexport class VotingCreatorComponent implements OnInit, OnDestroy {\r\n ngOnDestroy(): void {\r\n if (this.unsb != null) this.unsb();\r\n }\r\n private unsb = null;\r\n\r\n\r\n // multipleSelectOptions = MultipleSelectOptions;\r\n viewVotingsOptions = ViewPollResultPermissions;\r\n\r\n user;\r\n video;\r\n\r\n maxTitleSize = 30;\r\n maxOptionCharacterSize = 12;\r\n @Input()\r\n showing: boolean;\r\n\r\n @Output()\r\n closeEvent = new EventEmitter();\r\n // private createPollForm: FormGroup;\r\n\r\n name: string;\r\n createPollForm: FormGroup;\r\n // optionsGroup: FormGroup;\r\n fields: any;\r\n\r\n constructor(\r\n private formBuilder: FormBuilder,\r\n private _pollService: PollService,\r\n private _toastService: ToastService,\r\n private _commentListService: CommentListService,\r\n @Inject(AppStore) private store: Store,\r\n ) {\r\n\r\n }\r\n\r\n readState() {\r\n // const userState: UsersState = this.store.getState()['users'] as UsersState;\r\n const videoState: VideoState = this.store.getState()['video'] as VideoState;\r\n // this.user = new User(true);\r\n // Object.assign(this.user, userState.currentUser);\r\n this.video = new Object();\r\n Object.assign(this.video, videoState.currentVideo);\r\n }\r\n\r\n get title() {\r\n return this.createPollForm.get('title');\r\n }\r\n\r\n ngOnInit() {\r\n this.unsb = this.store.subscribe(() => this.readState());\r\n this.readState();\r\n this.createForm();\r\n }\r\n\r\n createForm() {\r\n this.fields = {\r\n isRequired: true,\r\n type: { options: [{ value: '' }, { value: '' }, { value: '' }] }\r\n };\r\n\r\n this.createPollForm = this.formBuilder.group({\r\n title: new FormControl('', [Validators.required, Validators.maxLength(30)]),\r\n multipleSelect: new FormControl(0),\r\n viewResults: new FormControl('0'),\r\n type: this.formBuilder.group({\r\n options: this.formBuilder.array(this.fields.type.options.map(o => new FormControl(o))),\r\n })\r\n });\r\n }\r\n\r\n addOption() {\r\n const controls = this.createPollForm.controls.type['controls']['options'];\r\n controls.push(this.formBuilder.group({ value: '' }));\r\n }\r\n\r\n deleteOption(index) {\r\n const controls = this.createPollForm.controls.type['controls']['options'];\r\n controls.removeAt(index);\r\n }\r\n\r\n close() {\r\n this.closeEvent.emit('true');\r\n }\r\n\r\n create() {\r\n // console.log(this.createPollForm.value);\r\n\r\n // console.log(this.createPollForm);\r\n // this.createPollForm.markAsTouched();\r\n if (!this.createPollForm.valid) {\r\n Object.keys(this.createPollForm.controls).forEach(field => {\r\n this.createPollForm.get(field).markAsTouched({ onlySelf: true });\r\n // this.createPollForm.get(field).markAsTouched({ onlySelf: true });\r\n });\r\n\r\n\r\n // this.createPollForm.controls.map(c => {\r\n // console.log(c);\r\n // });\r\n const form = this.createPollForm.controls.type['controls']['options'] as FormArray;\r\n\r\n // Object.keys(tt.controls).forEach(field => {\r\n // console.log(field);\r\n // this.createPollForm.get(controls.type['controls']['options']).markAsTouched({ onlySelf: true });\r\n // });\r\n form.markAsTouched();\r\n // console.log(tt);\r\n // tt.markAsTouched();\r\n\r\n // tt.controls.forEach(option => {\r\n // console.log(option);\r\n // tt.get(option).markAsTouched({ onlySelf: true });\r\n // });\r\n // console.log(tt);\r\n\r\n\r\n return;\r\n }\r\n\r\n this._pollService.create(this.user, this.createPollForm, this.video.id).subscribe(res => {\r\n if (res.code) {\r\n return;\r\n } else if (res[0].code === 1) {\r\n this.close();\r\n const result = res[0].ret;\r\n const voteForm = {\r\n author: result.nickName,\r\n authorId: result.uid,\r\n avatar: result.headImage,\r\n blacklist: false,\r\n children: [],\r\n commendId: result.id,\r\n content: result.context,\r\n deleted: false,\r\n level: result.userLevel,\r\n liked: false,\r\n likes: 0,\r\n pollId: result.voteId,\r\n published: result.post_Date,\r\n replyFloor: \"0\",\r\n replyId: 0,\r\n replyUserId: 0,\r\n status: result.userStatus,\r\n totalReplies: 0,\r\n userLevelSymbol: Resource.getGIDResource(result.gid),\r\n videoId: result.videoID,\r\n };\r\n this._commentListService.getComments(this.video.id, 1, 1).subscribe(r => {\r\n const newFloor = r.count + 1;\r\n const latestVote = {\r\n ...voteForm,\r\n floor: newFloor.toString(),\r\n };\r\n this.store.dispatch({\r\n type: userComments.INSERT,\r\n comments: {\r\n comments: [\r\n latestVote,\r\n ],\r\n count: newFloor,\r\n topComments: []\r\n }\r\n });\r\n });\r\n this._toastService.showBlackToast('发表成功!');\r\n this.createForm();\r\n }\r\n });\r\n }\r\n\r\n changeMultiple(index: number) {\r\n // this.createPollForm.get().setValue(index);\r\n this.createPollForm.patchValue({ multipleSelect: index });\r\n\r\n // setValue({ multipleSelect: index })\r\n }\r\n // touchAll(formGroup: FormGroup | FormArray, func = 'markAsTouched', opts = { onlySelf: false }): void {\r\n // mapValues(formGroup.controls, (c, i) => {\r\n // if (c instanceof FormGroup || c instanceof FormArray)\r\n // Helpers.touchAll(c, func, opts);\r\n // else\r\n // c[func](opts);\r\n // })\r\n // }\r\n}\r\n","import {\r\n Directive, ElementRef, Input, Output, EventEmitter, SimpleChanges, OnChanges,\r\n HostListener, Sanitizer, SecurityContext\r\n} from '@angular/core';\r\nimport { DnEmojiService } from '../../_service/dn-emojis/emoji.service';\r\n\r\n@Directive({\r\n selector: '[contenteditableModel]'\r\n})\r\nexport class ContenteditableDirective implements OnChanges {\r\n @Input() contenteditableModel: string;\r\n @Output() contenteditableModelChange ?= new EventEmitter();\r\n @Input() contenteditableHtml ?= false;\r\n\r\n constructor(\r\n private elRef: ElementRef,\r\n private sanitizer: Sanitizer,\r\n private _dnEmojiService: DnEmojiService,\r\n ) { }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['contenteditableModel']) {\r\n if (changes['contenteditableModel'].isFirstChange() && !this.contenteditableModel) {\r\n this.onInput(true);\r\n }\r\n this.refreshView();\r\n }\r\n }\r\n\r\n @HostListener('input')\r\n @HostListener('blur')\r\n @HostListener('keyup') onInput(trim = false) {\r\n let value = this.elRef.nativeElement[this.getProperty()];\r\n if (trim) {\r\n value = value.replace(/^[\\n\\s]+/, '');\r\n value = value.replace(/[\\n\\s]+$/, '');\r\n }\r\n this.contenteditableModelChange.emit(value);\r\n }\r\n\r\n @HostListener('paste', ['$event']) onPaste(e) {\r\n const oldValue = this.elRef.nativeElement.innerHTML;\r\n e.preventDefault();\r\n let html = e.clipboardData.getData('text/html');\r\n html = this._dnEmojiService.emojiHtml2String(html);\r\n const el = document.createElement('html');\r\n el.innerHTML = html;\r\n html = el.innerText.replace(/^[\\n\\s]+/, '').replace(/[\\n\\s]+$/, '').replace(/\\u00a0/g, ' ');\r\n html = this._dnEmojiService.emojiString2Html(html);\r\n document.execCommand('insertHTML', true, html);\r\n // let value = this.elRef.nativeElement[this.getProperty()];\r\n // value = value.replace(/^[\\n\\s]+/, '');\r\n // value = value.replace(/[\\n\\s]+$/, '');\r\n // this.contenteditableModelChange.emit(value);\r\n }\r\n\r\n private refreshView() {\r\n const newContent = this.sanitize(this.contenteditableModel);\r\n if (newContent !== this.elRef.nativeElement[this.getProperty()]) {\r\n this.elRef.nativeElement[this.getProperty()] = newContent;\r\n }\r\n }\r\n\r\n private getProperty(): string {\r\n // return this.contenteditableHtml ? 'innerHTML' : 'innerText';\r\n return 'innerHTML';\r\n }\r\n\r\n private sanitize(content: string): string {\r\n return this.contenteditableHtml ? this.sanitizer.sanitize(SecurityContext.HTML, content) : content;\r\n }\r\n}\r\n","\r\n\r\n
\r\n
\r\n
\r\n \r\n

正在发表...

\r\n
\r\n
\r\n
\r\n \r\n
请在此发表意见
\r\n \r\n \r\n \r\n
发表新的评论
\r\n
\r\n\r\n\r\n
\r\n\r\n
\r\n 本视频禁止评论\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n {{maxiumCharacters - charactersLeft}}/{{maxiumCharacters}}\r\n
\r\n\r\n\r\n
\r\n \r\n \r\n\r\n
发起投票
\r\n
\r\n\r\n
\r\n
您发表的内容过长,请简短发言
\r\n
\r\n {{maxiumCharacters - charactersLeft}}/{{maxiumCharacters}}\r\n
\r\n
\r\n \r\n \r\n
\r\n
取消
\r\n
发送
\r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
您还未登录,请登录后再发表评论。
\r\n 登录\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n\r\n\r\n\r\n","import { Component, OnInit, OnDestroy, AfterViewInit, Output, EventEmitter, ViewChild, ElementRef, Inject, Input } from '@angular/core';\r\nimport { EmojiPickerService } from '../../emoji-picker/emoji-picker.service';\r\nimport { Emoji } from '../../emoji-picker/emoji';\r\nimport { DnEmojiService } from '../../../_service/dn-emojis/emoji.service';\r\n// import { Store } from 'redux';\r\n// import { AppStore } from '../../../app.store';\r\nimport { Router, NavigationEnd, ActivatedRoute } from '@angular/router';\r\n// import { UsersState } from '../../../_model/user/user.reducer';\r\nimport { RefReplyState } from '../../../_model/reply/reply.reducer';\r\nimport * as RefReplyActions from '../../../_model/reply/replay.actions';\r\nimport * as userComments from '../../../_model/comment/comments.actions';\r\nimport { User } from '../../../_model/user/user.model';\r\nimport { DnDialogService } from '../../dn-dialog/dn-dialog.service';\r\nimport { CommentService } from '../../../_service/comment/comment.service';\r\nimport { CommentBoxService } from './comment-box.service';\r\nimport { Subscription, Unsubscribable } from 'rxjs';\r\nimport { ChangeDetectorRef } from '@angular/core';\r\nimport { ToastService } from '../../../_service/toast/toast.service';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { ConfirmDialogService, ConfirmDialogState } from '../../../components/dialogs/confirm-dialog/confirm-dialog.service';\r\nimport { UserService } from '../../../_service/user/user.service';\r\nimport { NotificationService } from '../../../_service/notification/notification.service';\r\nimport * as Utils from './utils';\r\nimport { PermissionService, SysName } from '../../../PermissionService';\r\nimport { CommentTransFormer } from 'app/_transformers/comment.transformer';\r\nimport { Utility } from 'app/_service/utility';\r\nimport { AppStore } from '../../../app.store';\r\nimport { Store } from 'redux';\r\nimport { PageScrollService } from '../../../_service/page-scroll/page-scroll.service';\r\n\r\nexport interface ActionInterface {\r\n removeInputBox(): void;\r\n}\r\n\r\n@Component({\r\n selector: 'app-comment-box',\r\n templateUrl: './comment-box.component.html',\r\n styleUrls: ['./comment-box.component.scss'],\r\n providers: [\r\n EmojiPickerService\r\n ]\r\n})\r\n\r\nexport class CommentBoxComponent implements OnInit, AfterViewInit, OnDestroy {\r\n // allVip = false;\r\n subscriptions: Array = [];\r\n @ViewChild('editor') editorRef: ElementRef;\r\n\r\n\r\n\r\n @Output() close = new EventEmitter();\r\n @Output() replySuccessEvent = new EventEmitter();\r\n @Output() commentSuccessEvent = new EventEmitter();\r\n public compInteraction: ActionInterface;\r\n\r\n @Input() set commentStatus(value) {\r\n if (value == 0) {\r\n this.canPublish = true;\r\n }\r\n else if (value == 1) {\r\n this.canPublish = false;\r\n }\r\n else {\r\n this.canPublish = false;\r\n }\r\n this._commentStatus = value;\r\n }\r\n private _commentStatus = 0;\r\n @Input()\r\n hostPage = 'video';\r\n\r\n @Input()\r\n isVideo = false; // 从个人中心消息打开,判断是否为回复小视频\r\n\r\n @Input()\r\n videoId;\r\n\r\n @Input()\r\n showReply = true;\r\n\r\n @Input()\r\n isReplying = false;\r\n\r\n canPublish = true;\r\n caretPos;\r\n @Input() reply: any = {};\r\n publishing = false;\r\n @Input() user: User;\r\n showEmojiPicker = false;\r\n comment = '';\r\n maxiumCharacters = 255;\r\n charactersLeft = 255;\r\n focused = false;\r\n\r\n showVotingCreator = false;\r\n AppStoreUnsubscribe;\r\n savedSelection;\r\n private openList: Unsubscribable = null;\r\n\r\n emojiPickerElem: HTMLElement;\r\n\r\n @ViewChild('EmojiPicker') EmojiPicker: ElementRef;\r\n\r\n @Input()\r\n inActivityBottom = false;\r\n\r\n constructor(\r\n private _emojiPickerService: EmojiPickerService,\r\n private _dnEmojiService: DnEmojiService,\r\n private _dnDialogService: DnDialogService,\r\n private _commentService: CommentService,\r\n private _commentBoxService: CommentBoxService,\r\n private pageScrollService: PageScrollService,\r\n private _router: Router,\r\n private _route: ActivatedRoute,\r\n private cdRef: ChangeDetectorRef,\r\n private _toastService: ToastService,\r\n private _confirmDialogService: ConfirmDialogService,\r\n private _userService: UserService,\r\n private _notificationService: NotificationService,\r\n private _permission: PermissionService,\r\n private _transform: CommentTransFormer,\r\n @Inject(AppStore) private store: Store,\r\n @Inject(DOCUMENT) private document: any,\r\n \r\n private _utility:Utility\r\n ) {\r\n\r\n }\r\n\r\n ngOnInit() {\r\n if (!this.isReplying) {\r\n // this.AppStoreUnsubscribe = this.store.subscribe(() => this.readState());\r\n // this.readState();\r\n if (this.hostPage === 'video') {\r\n }\r\n\r\n }\r\n else {\r\n this.canPublish = true;\r\n }\r\n\r\n this.focused = false;\r\n\r\n this.user = this._userService.user;\r\n this.subscriptions.push(\r\n this._userService.userState$.subscribe(user=>{\r\n this.user = user;\r\n }),\r\n this._emojiPickerService.emojiSource$.subscribe(emoji => {\r\n if (emoji && emoji.hasOwnProperty('id')) {\r\n Utils.restoreSelection(this.savedSelection);\r\n this.pasteHtmlAtCaret(Object.assign(new Emoji(), emoji).html, false);\r\n this._emojiPickerService.selectEmoji(null);\r\n this.showEmojiPicker = false;\r\n this.editorRef.nativeElement.dispatchEvent(new KeyboardEvent('keyup', {'key': 'Enter'})); // 选择表情后发送按键抬起,更新剩余字符\r\n }\r\n })\r\n );\r\n\r\n if (!this.isReplying) {\r\n this.subscriptions.push(\r\n this._router.events.subscribe((evt) => {\r\n const keepComment = this._route.snapshot.queryParams['from'];\r\n if (evt instanceof NavigationEnd) {\r\n if (!keepComment) {\r\n this._commentBoxService.clearCommentBoxReply();\r\n }\r\n }\r\n })\r\n );\r\n\r\n this.subscriptions.push(\r\n this._route.queryParams.subscribe(params => {\r\n const keepComment = this._route.snapshot.queryParams['from'];\r\n if (!keepComment) {\r\n this._commentBoxService.clearCommentBoxReply();\r\n }\r\n })\r\n );\r\n }\r\n }\r\n\r\n readState() {\r\n // const configState = this.store.getState()['config'];\r\n // if (configState.config.allVip) {\r\n // this.allVip = true;\r\n // }\r\n // const allState = this.store.getState();\r\n // const userState: UsersState = allState['users'] as UsersState;\r\n // this.user = new User(true);\r\n // Object.assign(this.user, userState.currentUser);\r\n\r\n const refReplyState: RefReplyState = this.store.getState()['refReply'] as RefReplyState;\r\n if (refReplyState.currentReply.author) {\r\n this.reply = refReplyState.currentReply;\r\n this.store.dispatch({\r\n type: RefReplyActions.CLEARREFREPLY, reply: {}\r\n });\r\n\r\n\r\n if (this.reply.notificationId) {\r\n this._notificationService.markANotificationsAsRead(this.reply.notificationId, this.user).subscribe(r => {\r\n this._notificationService.changeNotificationStatus(true);\r\n });\r\n }\r\n }\r\n //console.log(this._commentStatus ,this.user.token.gid)\r\n if (this._commentStatus == 1 && ((!!this.user.token && !!this.user.token.gid))) {\r\n this.canPublish = true;\r\n }\r\n\r\n\r\n this.showEmojiPicker = false;\r\n }\r\n\r\n removeInputBox() {\r\n this.compInteraction.removeInputBox();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.cdRef.detectChanges();\r\n this.emojiPickerElem = this.EmojiPicker.nativeElement;\r\n }\r\n\r\n stripHtml(html) {\r\n var tmp = document.createElement(\"DIV\");\r\n tmp.innerHTML = html;\r\n const result = tmp.textContent || tmp.innerText || \"\";\r\n return result;\r\n }\r\n\r\n newComment() {\r\n if (this.isEmpty(this.comment)) {\r\n this.reply = {};\r\n this.setFocus();\r\n return;\r\n }\r\n\r\n const confirmFormId = 'clear-reply-box';\r\n const dialogId = 'confirm-dialog';\r\n\r\n this._confirmDialogService.setState(\r\n {\r\n id: confirmFormId,\r\n message: '
确定要清除内容并发表新评论吗?
',\r\n showIcon: false,\r\n state: ConfirmDialogState.Unknown\r\n });\r\n\r\n this._dnDialogService.open(dialogId);\r\n this._confirmDialogService.confirmDialogSource$.subscribe(r => {\r\n if (r.state === ConfirmDialogState.Confirmed && r.id === confirmFormId) {\r\n this.reply = {};\r\n this.setFocus();\r\n this.comment = '';\r\n this._dnDialogService.close(dialogId);\r\n }\r\n if (r.state === ConfirmDialogState.Cancalled && r.id === confirmFormId) {\r\n this._dnDialogService.close(dialogId);\r\n }\r\n });\r\n }\r\n\r\n onChange($event) {\r\n this.charactersLeft = this.maxiumCharacters - this._dnEmojiService.emojiHtml2String(this.comment).length;\r\n }\r\n\r\n onFocusIn() {\r\n this.focused = true;\r\n }\r\n\r\n onFocusOut() {\r\n this.focused = false;\r\n }\r\n\r\n onDragOver(event) {\r\n event.preventDefault();\r\n }\r\n\r\n onDragLeave(event) {\r\n event.preventDefault();\r\n }\r\n\r\n onDrop(event) {\r\n event.preventDefault();\r\n }\r\n\r\n openVotingCreatorDialog() {\r\n if (this.user.roleId < 1\r\n && !this._permission.isValid(SysName.PublishVote)) {\r\n this._dnDialogService.open('vip-only');\r\n return;\r\n }\r\n this.showVotingCreator = true;\r\n }\r\n\r\n closeVotingCreatorDialog() {\r\n this.showVotingCreator = false;\r\n }\r\n\r\n toggleEmojiPicker() {\r\n this.showEmojiPicker = !this.showEmojiPicker;\r\n if (this.showEmojiPicker) {\r\n this.openList = this._utility.openList(this.emojiPickerElem, null, (target) => {\r\n if (target.getAttribute('class')) {\r\n const classes = target.getAttribute('class')?.split(' ');\r\n\r\n if (classes.indexOf('emoji-item') > -1) {\r\n return;\r\n }\r\n }\r\n this.openList.unsubscribe();\r\n this.showEmojiPicker = false;\r\n })\r\n } else {\r\n if (this.openList) {\r\n this.openList.unsubscribe();\r\n }\r\n }\r\n }\r\n\r\n setFocus() {\r\n if (this.editorRef) {\r\n this.editorRef.nativeElement.focus();\r\n }\r\n }\r\n\r\n pasteHtmlAtCaret(html, selectPastedContent) {\r\n this.editorRef.nativeElement.focus();\r\n let sel, range;\r\n if (this._utility.getWindow().getSelection) {\r\n sel = this._utility.getWindow().getSelection();\r\n if (sel.getRangeAt && sel.rangeCount) {\r\n range = sel.getRangeAt(0);\r\n if (range.commonAncestorContainer.parentNode === this.editorRef.nativeElement\r\n || range.commonAncestorContainer === this.editorRef.nativeElement) {\r\n range.deleteContents();\r\n const el = document.createElement('div');\r\n el.innerHTML = html;\r\n const frag = document.createDocumentFragment();\r\n let node, lastNode;\r\n while ((node = el.firstChild)) {\r\n lastNode = frag.appendChild(node);\r\n }\r\n const firstNode = frag.firstChild;\r\n range.insertNode(frag);\r\n if (lastNode) {\r\n range = range.cloneRange();\r\n range.setStartAfter(lastNode);\r\n if (selectPastedContent) {\r\n range.setStartBefore(firstNode);\r\n } else {\r\n range.collapse(true);\r\n }\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n login() {\r\n // this._dnDialogService.open('login');\r\n this._userService.showLoginDialog(true);\r\n }\r\n\r\n publishComment() {\r\n\r\n this.comment = this.comment.replace(/ /g, ' ').replace(/\\u00a0/g, ' ').replace(/^\\s+|\\s+$/g, '');\r\n if (this.isEmpty(this.comment)) {\r\n // this._messageDialogService.setState({ message: '不能发表空的评论' });\r\n this._dnDialogService.open('message-dialog',{ message: '不能发表空的评论' });\r\n return;\r\n }\r\n\r\n if (this._dnEmojiService.emojiHtml2String(this.comment.trim()).length > 255) {\r\n // this._messageDialogService.setState({ message: '您发表的内容过长,请简短发言' });\r\n this._dnDialogService.open('message-dialog',{ message: '您发表的内容过长,请简短发言' });\r\n return;\r\n }\r\n\r\n this.publishing = true;\r\n\r\n if (this.reply.commendId) {\r\n\r\n this.subscriptions.push(\r\n this._commentService.replyComment(\r\n this.user, this.reply.commendId, this._dnEmojiService.emojiHtml2String(this.comment.trim()), this.isVideo, (this.hostPage === 'album' || this.hostPage === 'activity') ? true : false).subscribe(res => {\r\n if (res) {\r\n res.message.nickName = this.user.nickname;\r\n\r\n this.store.dispatch({\r\n type: userComments.APPENDTOPARENT,\r\n comments: {\r\n comments: [this._transform.fromList(res.message)]\r\n },\r\n });\r\n this._toastService.showBlackToast('发表成功!');\r\n setTimeout(() => {\r\n if (this.hostPage === 'album' || this.hostPage === 'activity') {\r\n return;\r\n }\r\n this.pageScrollService.scroll({\r\n document: this.document,\r\n duration: 20,\r\n scrollOffset: 80,\r\n scrollTarget: '#comment-' + res.retID,\r\n })\r\n }, 50);\r\n this.comment = '';\r\n this.reply = {};\r\n this.onChange(null);\r\n this.commentSuccessEvent.emit(true);\r\n }\r\n this.publishing = false;\r\n this.replySuccessEvent.emit();\r\n\r\n if (this.isReplying) {\r\n this.removeInputBox();\r\n }\r\n })\r\n );\r\n } else {\r\n this.subscriptions.push(\r\n this._commentService.publishComment(\r\n this.user, this.videoId, this._dnEmojiService.emojiHtml2String(this.comment.trim()), (this.hostPage === 'album' || this.hostPage === 'activity') ? true : false).subscribe(res => {\r\n\r\n if (res) {\r\n res.message.nickName = this.user.nickname;\r\n this.store.dispatch({\r\n type: userComments.INSERT,\r\n comments: {\r\n comments: [this._transform.fromList(res.message)]\r\n }\r\n });\r\n this._toastService.showBlackToast('发表成功!');\r\n\r\n setTimeout(() => {\r\n if (this.hostPage === 'album' || this.hostPage === 'activity') {\r\n return;\r\n }\r\n this.pageScrollService.scroll({\r\n document: this.document,\r\n duration: 20,\r\n scrollOffset: 80,\r\n scrollTarget: '#comment-' + res.retID,\r\n });\r\n }, 50);\r\n\r\n\r\n this.comment = '';\r\n this.onChange(null);\r\n this.commentSuccessEvent.emit(true);\r\n }\r\n this.publishing = false;\r\n })\r\n );\r\n }\r\n\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n if (this.AppStoreUnsubscribe)\r\n this.AppStoreUnsubscribe();\r\n }\r\n\r\n isEmpty(s) {\r\n let res = s.replace(/ /g, ' ').replace(/\\u00a0/g, ' ').replace(/^\\s+|\\s+$/g, '');\r\n res = this._dnEmojiService.emojiHtml2String(this.comment.trim());\r\n res = this.stripHtml(res).trim();\r\n if (res === '') {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n onKeyEnter(event: any) {\r\n event.preventDefault();\r\n }\r\n\r\n onKeyDown(event: any) {\r\n if (event.key === 'Enter' && (event.ctrlKey || event.shiftKey)) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n onTextAreaBlur() {\r\n this.savedSelection = Utils.saveSelection();\r\n }\r\n\r\n // hideReplyingBox() {\r\n // // this.close.emit();\r\n // }\r\n\r\n}\r\n","
\r\n {{\r\n item.title }}\r\n \r\n
\r\n \"正在播放\"/\r\n \r\n \r\n
","import { Component, Input, OnInit, Inject, EventEmitter, OnDestroy, ViewChild } from '@angular/core';\r\nimport { DnDialogService } from '../../_modules/dn-dialog/dn-dialog.service';\r\nimport { ActivatedRoute } from '@angular/router';\r\n// import { Store } from 'redux';\r\n// import { AppStore } from '../../app.store';\r\n//import { UsersState } from '../../_model/user/user.reducer';\r\nimport { PurchaseRequiredDialogService } from '../../components/dialogs/purchase-required/purchase-required.service';\r\n// import { MessageDialogService, MessageDialogType } from '../../components/dialogs/message-dialog/message-dialog.service';\r\nimport { Utility } from '../../_service/utility';\r\n// import { environment } from '../../../environments/environment';\r\nimport { Subscription } from 'rxjs';\r\n// import { filter } from 'rxjs/operators';\r\nimport { PurchaseSuccessDialogService } from 'app/components/dialogs/purchase-success/purchase-success.service';\r\n\r\n@Component({\r\n selector: 'app-media-button',\r\n templateUrl: './media-button.component.html',\r\n styleUrls: ['../media-list/media-list.component.scss']\r\n})\r\n\r\nexport class MediaButtonComponent implements OnInit, OnDestroy {\r\n subscriptions: Array = [];\r\n ngOnDestroy(): void {\r\n this.subscriptions.forEach(s => s.unsubscribe());\r\n }\r\n @Input()\r\n user;\r\n @Input()\r\n item;\r\n @Input()\r\n videoId;\r\n @Input()\r\n type;\r\n @Input()\r\n wide = false;\r\n\r\n\r\n @Input() set mediaKey(value) {\r\n // console.log(value ,this.item)\r\n if (value && !!this.item.key) {\r\n this.active = this.item.key === value ? true : false;\r\n this.shouldReplace = this._utility.isUrlContains([\"play\"]);\r\n // console.log(this.active);\r\n }\r\n }\r\n\r\n // @ViewChild(\"downloadable\",{\r\n // static:true\r\n // })\r\n\r\n shouldReplace = false;\r\n // isNew = false;\r\n\r\n active;\r\n\r\n //selectMediaEvent = new EventEmitter();\r\n constructor(\r\n // private _dnDialogService: DnDialogService,\r\n // private _purchaseRequiredDialogService: PurchaseRequiredDialogService,\r\n // private _purchaseSuccessDialogService : PurchaseSuccessDialogService,\r\n private _utility:Utility\r\n // @Inject(AppStore) private store: Store,\r\n ) {\r\n\r\n }\r\n\r\n ngOnInit() {\r\n // this.subscriptions.push(\r\n // this.route.queryParams.pipe(filter(params => params.id))\r\n // .subscribe(params => {\r\n // console.log(\"123412341242134\", params.id);\r\n // this.active = params.id === this.item.key;\r\n // }));\r\n\r\n // this.unsub = this.store.subscribe(() => this.readState());\r\n //this.readState();\r\n\r\n\r\n //this.active = this.item.key === this._activatedRoute.snapshot.queryParams['id'] ? true : false;\r\n // const created = Math.round(new Date(this.item.created).getTime() / 1000);\r\n // const now = Math.floor(Date.now() / 1000);\r\n // if (now - created < 86400) {\r\n // this.isNew = true;\r\n // }\r\n // console.log(created, now , now - created);\r\n // this.listenPurchase();\r\n }\r\n\r\n // listenPurchase() {\r\n // this.subscriptions.push(\r\n // this._purchaseSuccessDialogService.purchaseSuccessDialogSource$.subscribe(state => {\r\n // if (!!state && state.mediaKey) {\r\n // if (state.mediaKey === this.item.key) {\r\n // this.item.bought = true;\r\n // }\r\n // }\r\n // })\r\n // );\r\n // }\r\n\r\n readState() {\r\n // const userState: UsersState = this.store.getState()['users'] as UsersState;\r\n // this.user = userState.currentUser;\r\n }\r\n\r\n // onClick() {\r\n // if (!this.user) {\r\n // this._dnDialogService.open('login-required-dialog');\r\n // } else if (this.user.id) {\r\n // this._purchaseRequiredDialogService.setState({ price: this.item.price, mediaId: this.item.id });\r\n // this._dnDialogService.open('purchase-required', { 'purchase-required-price': this.item.price, 'media-id': this.item.id });\r\n\r\n // // if (this.user.dnCoins < this.item.price) {\r\n // // this._dnDialogService.open('media-unavailable', { 'media-unavailable-price': this.item.price });\r\n // // } else {\r\n // // this._dnDialogService.open('purchase-required', { 'purchase-required-price': this.item.price, 'media-id': this.item.id });\r\n // // }\r\n // }\r\n\r\n // }\r\n\r\n\r\n // onDownloadClick() {\r\n // this._dnDialogService.open('vip-only');\r\n // // this._messageDialogService.setState({ type: MessageDialogType.Emoji1, message: '此功能仅限VIP会员使用' });\r\n // // this._dnDialogService.open('message-dialog');\r\n // }\r\n\r\n}\r\n","import { Component, OnInit, AfterViewInit, EventEmitter, Input, Output, Inject, OnDestroy, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { User } from '../../_model/user/user.model';\r\nimport { UserService } from '../../_service/user/user.service';\r\n\r\n// import { Store } from 'redux';\r\n// import { AppStore } from '../../app.store';\r\n// import { UsersState } from '../../_model/user/user.reducer';\r\n// import * as userActions from '../../_model/user/user.actions';\r\n// import { environment } from '../../../environments/environment';\r\n\r\n@Component({\r\n selector: 'app-namecard',\r\n templateUrl: './namecard.component.html',\r\n styleUrls: ['./namecard.component.scss']\r\n})\r\n\r\nexport class NamecardComponent implements OnInit, AfterViewInit, OnDestroy, OnChanges {\r\n ngOnDestroy(): void {\r\n if (this.unsb != null) this.unsb();\r\n }\r\n private unsb = null;\r\n // allVip = false;\r\n @Input()\r\n currentUser: any;\r\n @Input()\r\n user: User;\r\n @Input()\r\n userId: string;\r\n @Input()\r\n avatar: string;\r\n @Input()\r\n hide: Boolean;\r\n @Input()\r\n userKey:string;\r\n\r\n @Output('hideNameCardEvent')\r\n hideNameCardEvent = new EventEmitter();\r\n\r\n @Output('userLoadedEvent')\r\n userLoadedEvent = new EventEmitter();\r\n\r\n isLoading;\r\n expanded = false;\r\n @Input()\r\n status;\r\n @Input()\r\n vipSymbol;\r\n @Input()\r\n officalUp;\r\n @Input()\r\n fromPublisher = false;\r\n constructor(\r\n private _userService: UserService,\r\n // @Inject(AppStore) private store: Store,\r\n ) {\r\n\r\n }\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.userId && changes.userId.currentValue) {\r\n this.user = undefined\r\n }\r\n }\r\n readState() {\r\n // const configState = this.store.getState()['config'];\r\n // if (configState.config.allVip) {\r\n // this.allVip = true;\r\n // }\r\n }\r\n\r\n ngOnInit() {\r\n // this.unsb = this.store.subscribe(() => this.readState());\r\n // this.readState();\r\n if (this.userId && !this.user) {\r\n this.isLoading = true;\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n }\r\n\r\n loadUser() {\r\n if (this.userId && !this.user) {\r\n this._userService.getUserInfo(this.userId).subscribe(\r\n res => {\r\n this.isLoading = false;\r\n this.user = res;\r\n this.userLoadedEvent.emit(res);\r\n }\r\n );\r\n }\r\n }\r\n hideNamecard() {\r\n this.hideNameCardEvent.emit(true);\r\n }\r\n\r\n onMouseLeave() {\r\n this.hideNameCardEvent.emit(true);\r\n }\r\n\r\n logout() {\r\n //console.log(\"isme 1\");\r\n\r\n this._userService.logout();\r\n // this.store.dispatch({ type: userActions.LOGOUT, user: null });\r\n }\r\n\r\n fixVipSymbol(str) {\r\n if (!!str) {\r\n return str.split('.png')[0] + '_b.png';\r\n }\r\n }\r\n\r\n toUserSpace(user) {\r\n // console.log(user);\r\n if (user === undefined) {\r\n return;\r\n }\r\n window.open('/space/' + user?.key, '_blank')\r\n }\r\n\r\n textAbstrc(str) {\r\n return str.replace('
', ' ');\r\n }\r\n\r\n toActivity(user) {\r\n // console.log(user);\r\n if (user === undefined) {\r\n return;\r\n }\r\n window.open('/space/' + user?.key + '?type=activity&pid=' + user.lastTrend?.id , '_blank')\r\n }\r\n\r\n}\r\n","
\r\n \r\n
\r\n \"头像\"/\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
LV.{{user.level}}
\r\n
\r\n {{ user.experience | chineseCounter }}\r\n /\r\n {{ user.expToNextLevel | chineseCounter }}\r\n
\r\n
\r\n
\r\n
\r\n \r\n {{ user.nickname }}\r\n \r\n \r\n \r\n
\r\n \r\n \r\n {{ status === 0 ? '已封号' : status === 2 ? '禁言中' : '已冻结'}}\r\n \r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n {{ user.dnCoins }}\r\n {{ user.region }}\r\n\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
0?user.experience / user.expToNextLevel *100:0\">
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n\r\n\r\n
\r\n \r\n
\r\n
0\">\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
4\">\r\n + {{ user.lastTrend?.photoURLs.length - 4 }}\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
{{ user.lastTrend?.createTimeStr }}
\r\n
\r\n
\r\n \r\n \r\n
\r\n
","import { Injectable } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { delay, tap, filter, map } from 'rxjs/operators';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { ApiUrlHelper } from '../api-url-helper';\r\nimport { HttpClientHelper } from '../http-helper';\r\nimport { Utility } from '../utility';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class DanmuService {\r\n constructor(\r\n private _apiUrlHelper: ApiUrlHelper,\r\n private _httpClientHelper: HttpClientHelper,\r\n private _utility:Utility\r\n ) {\r\n\r\n }\r\n\r\n // isNewsPage() {\r\n // return Utility.isNews;\r\n // // const url = location.href;\r\n // // console.log(url);\r\n // // if (url.split('?')[0].replace('/', '').toLowerCase() === 'watch') {\r\n // // return true;\r\n // // }\r\n // // return false;\r\n // }\r\n\r\n getDanmu(key, user, page = 1, size = 12000): Observable {\r\n // const path = this.isNewsPage() ? 'news-get-barrages' : 'get-barrages';\r\n const url = this._apiUrlHelper.urlBuilder(\"get-barrages\", {\r\n page,\r\n size,\r\n uniqueKey: key,\r\n // uid: user ? user.id : undefined,\r\n // gid: user ? user.token.gid : undefined,\r\n // expire: user ? user.token.expire : undefined,\r\n // sign: user ? user.token.sign : undefined,\r\n // token: user ? user.token.token : undefined,\r\n }, this._utility.isNews ? \"NEWS_ENDPOINT\" : \"\");\r\n\r\n return this._httpClientHelper.get(url).pipe(\r\n tap(res => {\r\n if (!res['data'] || res['data'].code === 1) {\r\n return [];\r\n }\r\n const data = res['data'];\r\n // const sorted = typeof data.info[0] === 'string'\r\n // ? [...JSON.parse(data.info[0]).sort((a, b) => (a.second > b.second) ? 1 : -1)]\r\n // : [...data.info[0].sort((a, b) => (a.second > b.second) ? 1 : -1)];\r\n return data;\r\n })\r\n );\r\n }\r\n\r\n sendDanmu(key, user, contxt) {\r\n //const path = this.isNewsPage() ? 'news-send-barrage' : 'send-barrage';\r\n const url = this._apiUrlHelper.urlBuilder('send-barrage', {\r\n uniqueKey: key,\r\n // uid: user ? user.id : null,\r\n // gid: user ? user.token.gid : null,\r\n // sign:user?user.token.sign:null,\r\n // token:user?user.token.token:null,\r\n // expire:user?user.token.expire:null\r\n }, this._utility.isNews ? \"NEWS_ENDPOINT\" : \"\");\r\n\r\n const body = {\r\n Contxt: contxt.contxt,\r\n Color: contxt.color,\r\n Font: contxt.font,\r\n Second: contxt.second.toFixed(4),\r\n position: contxt.position,\r\n };\r\n return this._httpClientHelper.post(url, body, null);\r\n }\r\n\r\n removeDanmu(id, user) {\r\n\r\n //const path = this.isNewsPage() ? 'news-remove-barrage' : 'remove-barrage';\r\n\r\n const url = this._apiUrlHelper.urlBuilder('remove-barrage', {\r\n id,\r\n // uid: user ? user.id : undefined,\r\n // gid: user ? user.token.gid : undefined,\r\n // sign:user?user.token.sign:null,\r\n // token:user?user.token.token:null,\r\n // expire:user?user.token.expire:null\r\n }, this._utility.isNews ? \"NEWS_ENDPOINT\" : \"\");\r\n return this._httpClientHelper.get(url);\r\n }\r\n\r\n reportDanmu(id, reason) {\r\n const url = this._apiUrlHelper.urlBuilder('report-barrage', {\r\n id,\r\n reason,\r\n // uid: user ? user.id : undefined,\r\n // gid: user ? user.token.gid : undefined,\r\n // sign:user?user.token.sign:null,\r\n // token:user?user.token.token:null,\r\n // expire:user?user.token.expire:null\r\n });\r\n return this._httpClientHelper.get(url);\r\n }\r\n\r\n likeDanmu(id) {\r\n const url = this._apiUrlHelper.urlBuilder('like-barrage', {\r\n id,\r\n }, this._utility.isNews ? \"NEWS_ENDPOINT\" : \"\");\r\n return this._httpClientHelper.get(url);\r\n }\r\n\r\n // 领取福袋url\r\n openDanmuFudai(id) {\r\n const url = this._apiUrlHelper.urlBuilder('get-barrage-coin', {\r\n id,\r\n }, this._utility.isNews ? \"NEWS_ENDPOINT\" : \"\");\r\n return this._httpClientHelper.get(url);\r\n }\r\n\r\n // 缓存已开启的福袋id\r\n private openedFudai = new BehaviorSubject([]);\r\n openedFudai$ = this.openedFudai.asObservable();\r\n storeOpenedDanmuFudai(list) {\r\n this.openedFudai.next(list);\r\n }\r\n\r\n getUserSettings() {\r\n if(!this._httpClientHelper.token.uid)\r\n {\r\n return of({\r\n includeAvatar: false,\r\n includeLocation: false,\r\n })\r\n }\r\n const url = this._apiUrlHelper.urlBuilder('danmu-user-settings');\r\n return this._httpClientHelper.get(url).pipe(\r\n map(res => {\r\n if(res[0] == null)\r\n {\r\n return {\r\n includeAvatar: true,\r\n includeLocation: true,\r\n }\r\n }\r\n switch (res[0].prefix) {\r\n case 0:\r\n return {\r\n includeAvatar: true,\r\n includeLocation: true,\r\n }\r\n case 1:\r\n return {\r\n includeAvatar: true,\r\n includeLocation: false,\r\n }\r\n case 2:\r\n return {\r\n includeAvatar: false,\r\n includeLocation: true,\r\n }\r\n case 3:\r\n return {\r\n includeAvatar: false,\r\n includeLocation: false,\r\n }\r\n default:\r\n return {\r\n includeAvatar: true,\r\n includeLocation: true,\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n updateUserSettings(value) {\r\n const url = this._apiUrlHelper.urlBuilder('danmu-update-user-settings');\r\n let prefix = 3;\r\n if (value.includeAvatar && value.includeLocation) {\r\n prefix = 0;\r\n }\r\n if (value.includeAvatar && !value.includeLocation) {\r\n prefix = 1;\r\n }\r\n if (!value.includeAvatar && value.includeLocation) {\r\n prefix = 2;\r\n }\r\n if (!value.includeAvatar && !value.includeLocation) {\r\n prefix = 3;\r\n }\r\n return this._httpClientHelper.post(url, { prefix }, null)\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'staticLevel'\n})\nexport class StaticLevelPipe implements PipeTransform {\n\n transform(level: string): unknown {\n let currentLevel = (level || 1) > 8 ? 8 : level || 1;\n return `assets/images/user-center/lv_${currentLevel}.png`;\n }\n\n}\n","import { Component, OnInit, Input, Output, EventEmitter, ElementRef, ViewChild, SimpleChanges, AfterViewInit, HostListener } from '@angular/core';\r\nimport { ScreenSize, WindowService } from 'app/_service/screen-size.service';\r\nimport { Utility } from 'app/_service/utility';\r\n\r\n@Component({\r\n selector: 'app-expandable-tabs',\r\n templateUrl: './expandable-tabs.component.html',\r\n styleUrls: ['./expandable-tabs.component.scss']\r\n})\r\nexport class ExpandableTabsComponent implements OnInit, AfterViewInit {\r\n\r\n @Input()\r\n items: Array = [];\r\n\r\n @Input()\r\n current;\r\n\r\n @Input()\r\n activated;\r\n\r\n @Input()\r\n fixed = 3;\r\n\r\n @Input()\r\n fromPlayer = false;\r\n\r\n @Input()\r\n mode: 1 | 2 = 1;\r\n\r\n @Output() selected = new EventEmitter();\r\n\r\n expanded = false;\r\n openExpander$;\r\n expanderElem: HTMLElement;\r\n screenSize;\r\n\r\n @ViewChild('expander') expander: ElementRef;\r\n @ViewChild('hiddenNav') hiddenNav: ElementRef;\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event) {\r\n this.setFixedItems();\r\n }\r\n\r\n constructor(\r\n private _windowService: WindowService,\r\n private _utility:Utility\r\n ) {\r\n this._windowService.size$.subscribe((value: any) => {\r\n this.screenSize = value;\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n\r\n }\r\n\r\n togglePanel() {\r\n this.expanded = !this.expanded;\r\n if (!this.fromPlayer) {\r\n\r\n if (this.expanded) {\r\n setTimeout(() => {\r\n this.expanderElem = this.expander.nativeElement;\r\n this.openExpander$ = this._utility.openList(this.expanderElem, null, (elem) => {\r\n const classes = elem.getAttribute('class')?.split(' ');\r\n if (classes && classes.indexOf('ps__thumb-y') > -1) {\r\n return;\r\n }\r\n this.openExpander$.unsubscribe();\r\n this.expanded = false;\r\n })\r\n }, 50);\r\n } else {\r\n if (this.expanded) {\r\n this.openExpander$.unsubscribe();\r\n }\r\n }\r\n }\r\n }\r\n get text() {\r\n return this.activated < this.fixed ? \"全部\" : this.items[this.activated]\r\n }\r\n get highLighted() {\r\n return this.activated < this.fixed ? false : true\r\n }\r\n openPanel() {\r\n this.expanded = true;\r\n }\r\n\r\n closePanel() {\r\n this.expanded = false;\r\n }\r\n\r\n setCurrentTabIndex(index: number) {\r\n this.selected.emit(index);\r\n\r\n if (this.expanded) {\r\n this.expanded = false;\r\n if(!!this.openExpander$)\r\n this.openExpander$.unsubscribe();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n setTimeout(() => {\r\n this.setFixedItems();\r\n }, 200);\r\n }\r\n\r\n setFixedItems() {\r\n let areaWidth = 400;\r\n\r\n switch (this.screenSize) {\r\n case ScreenSize.XSmall:\r\n areaWidth = this.fromPlayer ? 250 : 740;\r\n break;\r\n case ScreenSize.Small:\r\n areaWidth = this.fromPlayer ? 190 : 740;\r\n break;\r\n case ScreenSize.Medium:\r\n areaWidth = this.fromPlayer ? 190 : 740;\r\n break;\r\n case ScreenSize.Large:\r\n areaWidth = this.fromPlayer ? 190 : 1100;\r\n break;\r\n case ScreenSize.ExtraLarge:\r\n areaWidth = this.fromPlayer ? 300 : 1360;\r\n break;\r\n default:\r\n areaWidth = this.fromPlayer ? 400 : 1360;\r\n break;\r\n }\r\n\r\n let buttonsWidth = 0;\r\n\r\n const buttons = [].slice.call(this.hiddenNav.nativeElement.children);\r\n\r\n for (let i = 0; i < buttons.length; i++) {\r\n buttonsWidth += buttons[i].offsetWidth;\r\n if (buttonsWidth > areaWidth) {\r\n setTimeout(() => {\r\n this.fixed = this.fromPlayer ? i > 0 ? i : 1 : i > 0 ? i - 1 : 1;\r\n }, 400);\r\n break;\r\n }\r\n if (i === buttons.length - 1) {\r\n this.fixed = buttons.length\r\n }\r\n }\r\n }\r\n}\r\n","\r\n\r\n\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n\r\n
\r\n\r\n \r\n\r\n
\r\n\r\n
\r\n
\r\n \r\n\r\n
\r\n
\r\n\r\n
\r\n","import { Observable } from \"rxjs\";\r\nimport { Subject } from \"rxjs\";\r\n\r\nexport class DanmuMenuService {\r\n private _danmuId: Subject;\r\n danmuId$: Observable;\r\n\r\n constructor() {\r\n this._danmuId = new Subject();\r\n this.danmuId$ = this._danmuId.asObservable();\r\n }\r\n\r\n notify(id) {\r\n this._danmuId.next(id);\r\n }\r\n}\r\n"],"sourceRoot":"webpack:///"}