var cgGcfmAudioLoaded = false; var cgGcfmLoadAttempts = 0; var cgGcfmPlayAttemptInterval = null; var cgGcfmPositionTrackerInterval = null; var cgGcfmTimeWritten = false; var cgGcfmXDown = null; var cgGcfmYDown = null; var cgGcfmPlayerUrl = 'https://player.godcaster.fm'; var cgGcfmAssetsUrl = 'https://assets.godcaster.fm'; var cgGcfmProgbarBackground = null; /* Set sources */ if (document.currentScript.src.indexOf('lightfeed.org') !== -1) { cgGcfmPlayerUrl = 'https://player.lightfeed.org'; cgGcfmAssetsUrl = 'https://assets.lightfeed.org'; } /* Set up listeners */ document.addEventListener('click', gcfmHandlePlayerClick); document.addEventListener('change', gcfmHandlePlayerChange); document.addEventListener('input', gcfmHandleSliderClick); document.addEventListener('error', gcfmHandlePlayerError, true); document.addEventListener('touchstart', gcfmHandleTouchStart, false); document.addEventListener('touchmove', gcfmHandleTouchMove, false); function gcfmLoadPlayer() { let lgPlayerContainer = document.getElementById('gcfm-player-container'); lgPlayerContainer.setAttribute('style', 'z-index:99999'); if (!lgPlayerContainer.classList.contains('gcfm-player-2b1bb1b2-iso')) { lgPlayerContainer.classList.add('class', 'gcfm-player-2b1bb1b2-iso'); } lgPlayer = document.createElement('div'); lgPlayer.setAttribute('id', 'gcfm-player'); lgPlayerContainer.appendChild(lgPlayer); gcfmPlayerInit(); } function gcfmPlayerInit() { let playerStyle = gcfmGetPlayerStyleFromUrl(); let isPwa = gcfmGetPwaStatus(); url = new URL(cgGcfmPlayerUrl + '/publicplayer/widget'); url.searchParams.append('pid', gcfmGetPlayerId()); url.searchParams.append('did', gcfmGetPlayerDid()); url.searchParams.append('eid', gcfmGetEpisodeIdFromUrl()); url.searchParams.append('page', gcfmGetPageNumberFromUrl()); url.searchParams.append('fid', gcfmGetFeedIdFromUrl()); url.searchParams.append('shared', gcfmEpisodeWasShared(false)); if (playerStyle !== null) { url.searchParams.append('style', playerStyle); } if (isPwa) { url.searchParams.append('pwa', 1); } fetch(url.href) .then(response => { // When the page is loaded convert it to text return response.text() }) .then(html => { lgPlayer = document.getElementById('gcfm-player'); lgPlayer.outerHTML = html; gcfmPlayerEnvironmentInit(); gcfmPlayerBodyInit(); }) .catch(error => { console.error('Failed to load the player: ', error) }) } function gcfmPlayerEnvironmentInit() { controlsPosition = gcfmGetControlsPosition(); if (controlsPosition == 2) { let audioBar = document.getElementById('gcfm-audio-bar'); if (audioBar) { document.body.appendChild(audioBar); } } cgGcfmProgbarBackground = document.getElementById('gcfm-progbar-background'); cgGcfmProgbarBackground.addEventListener('click', gcfmHandleProgbarClick); cgGcfmProgbarBackground = document.getElementById('gcfm-progbar-foreground'); cgGcfmProgbarBackground.addEventListener('click', gcfmHandleProgbarClick); } function gcfmGetControlsPosition() { lgPlayer = document.getElementById('gcfm-player'); controlsPosition = lgPlayer.getAttribute('data-controlsposition'); return controlsPosition; } function gcfmPlayerBodyInit() { /* gcfmPlayerBodyChange( gcfmGetFeedIdFromUrl(), gcfmGetPageNumberFromUrl(), gcfmGetPlayerStyle(), gcfmEpisodeWasShared(), gcfmGetEpisodeIdFromUrl(), ); */ } function gcfmPlayerBodyChange(feedId, page, style, shared, episodeId, collection) { if (page == 0) page = 1; var url = new URL(cgGcfmPlayerUrl + '/publicplayer/body'); url.searchParams.append('pid', gcfmGetPlayerId()); url.searchParams.append('did', gcfmGetPlayerDid()); url.searchParams.append('page', page); if (feedId) { url.searchParams.append('fid', feedId); } if (episodeId && episodeId !== "null") { url.searchParams.append('eid', episodeId); } url.searchParams.append('shared', shared); if (style !== null) { url.searchParams.append('style', style); } if (collection) { url.searchParams.append('collection', collection); } else { let coll = gcfmGetPlayerCollection(); if (coll && coll !== 'null') { url.searchParams.append('collection', coll); } } fetch(url.href) .then(response => { // When the page is loaded convert it to text return response.text() }) .then(html => { lgPlayerBody = document.getElementById('gcfm-body-wrapper'); lgPlayerBody.outerHTML = html; gcfmSetPlayerStyle(style); gcfmSetPaginationStates(page); }) .catch(error => { console.error('Failed to load player content: ', error) }) } function gcfmGetPageNumberFromUrl() { let url = new URL(window.location.href); let page = url.searchParams.get('gcfm-page'); return page || 0; } function gcfmGetPlayerStyleFromUrl() { let url = new URL(window.location.href); let style = url.searchParams.get('gcfm-style'); return style || null; } function gcfmGetPlayerStyle() { let elStyle = document.getElementById('gcfm-body-style-toggle'); if (elStyle) { return elStyle.getAttribute('data-style'); } else { return 0; } } function gcfmGetPwaStatus() { let lgPlayerContainer = document.getElementById('gcfm-player-container'); if (lgPlayerContainer) { let pwa = lgPlayerContainer.getAttribute('data-pwa'); if (pwa && pwa == 'true') { return true; } } return false; } function gcfmGetPlayerTitle() { let lgPlayerTitle = document.getElementById('gcfm-player-title'); if (lgPlayerTitle) { return lgPlayerTitle.innerText; } else { return ''; } } function gcfmGetPlayerCollection() { let lgPlayerCollections = document.getElementById('gcfm-collections'); if (lgPlayerCollections) { let collectionId = lgPlayerCollections.getAttribute('data-collectionid'); if (collectionId) { return collectionId; } } return null; } function gcfmSetPlayerCollection(collectionId) { let lgPlayerCollections = document.getElementById('gcfm-collections'); if (lgPlayerCollections) { lgPlayerCollections.setAttribute('data-collectionid', collectionId); } } function gcfmGetPlatform() { var lgPlayer = document.getElementById('gcfm-player'); var lgPlatform = lgPlayer.getAttribute('data-platform').trim().toLowerCase(); if (lgPlatform.indexOf('ios') < 0 && lgPlatform.indexOf('android') < 0) { lgPlatform = 'web'; } return lgPlatform; } function gcfmSetPlayerStyle(style) { let lgStyleToggle = document.getElementById('gcfm-body-style-toggle'); if (!lgStyleToggle) { return false; } lgStyleToggle.setAttribute('data-style', style); let styleIcons = document.getElementsByClassName('gcfm-body-style-toggle-icon') for (var i = 0; i < styleIcons.length; i++) { if (styleIcons[i].id == 'gcfm-body-style-toggle-icon-' + style) { styleIcons[i].style.display = ''; } else { styleIcons[i].style.display = 'none'; } } } function gcfmGetFeedIdFromUrl() { let url = new URL(window.location.href); let feedId = url.searchParams.get('gcfm-fid'); return feedId || 0; } function gcfmGetEpisodeIdFromUrl() { let url = new URL(window.location.href); let episodeId = url.searchParams.get('gcfm-eid'); return episodeId || 0; } function gcfmGetStartTime() { let url = new URL(window.location.href); let ts = url.searchParams.get('gcfm-ts'); return ts || 0; } function gcfmEpisodeWasShared(strip) { let url = new URL(window.location.href); let wasShared = url.searchParams.get('gcfm-shared'); if (strip) { gcfmStripSharingFromUrl(url); } return wasShared || "false"; } function gcfmStripSharingFromUrl(url) { let newUrl = new URL(url); newUrl.searchParams.delete('gcfm-shared'); newUrl.searchParams.delete('gcfm-eid'); newUrl.searchParams.delete('gcfm-ts'); window.history.replaceState(null, '', newUrl); } function gcfmGetNextPage() { let elPrevPage = document.getElementById('gcfm-paginator-prev'); let elNextPage = document.getElementById('gcfm-paginator-next'); if (elNextPage === null || elPrevPage === null) { return 0; } if (elPrevPage.getAttribute('data-page') == elNextPage.getAttribute('data-lastpage')) { return elNextPage.getAttribute('data-lastpage'); } return parseInt(elPrevPage.getAttribute('data-page')) + 1; } function gcfmGetPrevPage() { let elPrevPage = document.getElementById('gcfm-paginator-prev'); if (elPrevPage === null || parseInt(elPrevPage.getAttribute('data-page')) <= 1) { return 1; } return parseInt(elPrevPage.getAttribute('data-page')) - 1; } function gcfmSetPaginationStates(pageRequested) { let elPrevPage = document.getElementById('gcfm-paginator-prev'); let elNextPage = document.getElementById('gcfm-paginator-next'); style = gcfmGetPlayerStyle(); if (style == 1 || style == '1') { gcfmShowPageNavigation(false); } else { gcfmShowPageNavigation(true); } if (elNextPage === null || elPrevPage === null) { return 0; } elPrevPage.setAttribute('data-page', pageRequested); if (pageRequested == 1) { elPrevPage.style.display = 'none'; } else { elPrevPage.style.display = ''; } if (pageRequested == parseInt(elNextPage.getAttribute('data-lastpage'))) { elNextPage.style.display = 'none'; } else { elNextPage.style.display = ''; } return 0; } function gcfmShowPageNavigation(visible) { let lgPaginatorHiddenLinks = document.getElementById('gcfm-paginator-hidden-links'); let lgPaginatorLinks = document.getElementById('gcfm-paginator-links'); if (lgPaginatorHiddenLinks && lgPaginatorLinks) { lgPaginatorLinks.replaceWith(lgPaginatorHiddenLinks); lgPaginatorHiddenLinks.id = 'gcfm-paginator-links'; } let lgPageNav = document.getElementById('gcfm-player-page-nav'); if (!lgPageNav) { return false; } if (visible) { lgPageNav.style.display = ''; } else { lgPageNav.style.display = 'none'; } } function gcfmGetPlayerId() { let elPlayer = document.getElementById('gcfm-player-container'); return elPlayer.getAttribute('data-playerid'); } function gcfmGetPlayerDid() { let elPlayer = document.getElementById('gcfm-player-container'); return elPlayer.getAttribute('data-did'); } function gcfmHandleSliderClick(event) { var element = event.target; if (element.id === 'gcfm-audio-control-slider') { if (element.readOnly == true) { return false; } let lgAudioPlayer = document.getElementById('gcfm-player-audio'); lgAudioPlayer.currentTime = element.value; } } function gcfmHandleProgbarClick(event) { lgProgbarBackground = document.getElementById('gcfm-progbar-background'); const rect = lgProgbarBackground.getBoundingClientRect(); const x = event.clientX - rect.left; // x coordinate inside the element const y = event.clientY - rect.top; // y coordinate inside the element let percentage = x / lgProgbarBackground.clientWidth; let lgAudioPlayer = document.getElementById('gcfm-player-audio'); if (lgAudioPlayer.readyState >= 4) { let setToTime = Math.floor(lgAudioPlayer.duration * percentage); lgAudioPlayer.currentTime = setToTime; console.log(percentage); console.log(lgAudioPlayer.duration); console.log(setToTime); } } function gcfmHandlePlayerError(event) { var element = event.target; if (element.id === 'gcfm-player-audio-source' && element.src !== '') { let s = ""; let lgAudioPlayer = document.getElementById('gcfm-player-audio'); let lgAudioPlayerSource = document.getElementById('gcfm-player-audio-source'); if (lgAudioPlayer.readyState === 0 && lgAudioPlayer.networkState === 3) { gcfmDisplayErrorMessage("This media file can't be loaded because of a network issue or a publisher-side server issue."); clearInterval(cgGcfmPlayAttemptInterval); lgAudioPlayerSource.setAttribute('src', ''); gcfmHideAllEpisodeLoadingIcons(); } } } function gcfmHandlePlayerChange(event) { var element = event.target; /* Collection selector */ if (element.id === 'gcfm-collection') { gcfmPlayerBodyChange(0, 0, gcfmGetPlayerStyle(), false, 0, gcfmGetPlayerCollection()); } } function gcfmHandlePlayerClick(event) { var element = event.target; /* Player body style toggle */ if (element.id === 'gcfm-body-style-toggle') { var style = document.getElementById('gcfm-body-style-toggle') .getAttribute('data-style'); if (style == 0 || style == 1) { gcfmPlayerBodyChange(false, 0, (1 - style), 0, 0, gcfmGetPlayerCollection()); } } /* Collections panel toggle button was clicked */ if (element.id === 'gcfm-collections-button') { var lgCollections = document.getElementById('gcfm-collections'); let lgFooter = document.getElementById('gcfm-footer'); if (lgCollections) { lgCollections.style.height = (lgFooter.offsetTop - lgCollections.offsetTop) + 'px'; if ( lgCollections.style.width === '0' || lgCollections.style.width === '0px' ) { lgCollections.style.padding = '16px'; lgCollections.style.width = lgCollections.style.maxWidth; } else { lgCollections.style.padding = '0'; lgCollections.style.width = '0'; } } } /* Collection link was clicked in collection panel */ if (element.classList.contains('gcfm-collection-option')) { let collectionId = element.getAttribute('data-collectionid'); gcfmSetPlayerCollection(collectionId); var lgCollectionsBtn = document.getElementById('gcfm-collections-button'); if (lgCollectionsBtn) { lgCollectionsBtn.click(); } gcfmPlayerBodyChange(0, 0, gcfmGetPlayerStyle(), false, 0, gcfmGetPlayerCollection()); } /* Feed tile was clicked */ if (element.classList.contains('gcfm-program-link')) { let feedId = element.getAttribute('data-feedid'); let pageNumber = element.getAttribute('data-page'); gcfmPlayerBodyChange(feedId, pageNumber, gcfmGetPlayerStyle(), false, 0, gcfmGetPlayerCollection()); } /* Body back button was clicked */ if ( element.id === 'gcfm-back-button' || element.id === 'gcfm-back-button-div' || element.id === 'gcfm-back-button-span' || element.id === 'gcfm-back-button-icon' ) { let pageNumber = document.getElementById('gcfm-back-button').getAttribute('data-page'); gcfmPlayerBodyChange(false, pageNumber, gcfmGetPlayerStyle(), false, 0, gcfmGetPlayerCollection()); } if (element.id === 'gcfm-paginator-prev') { gcfmPlayerBodyChange(false, gcfmGetPrevPage(), gcfmGetPlayerStyle(), false); } if (element.id === 'gcfm-paginator-next') { gcfmPlayerBodyChange(false, gcfmGetNextPage(), gcfmGetPlayerStyle(), false); } if (element.classList.contains('gcfm-paginator-button')) { let pageNumber = element.getAttribute('data-page'); gcfmPlayerBodyChange(false, pageNumber, gcfmGetPlayerStyle(), false); } if (element.id === 'gcfm-close-video') { gcfmCloseVideo(); } if (element.id === 'gcfm-episode-play-icon' || element.id === 'gcfm-episode-pause-icon' || element.id === 'gcfm-episode-art-playbutton' ) { document.getElementById('gcfm-widget-play-button').click(); } /* Episode play button in the feed view */ if (element.classList.contains('gcfm-button-episode-play')) { let playTriggerNode = element; gcfmPlayMedia(playTriggerNode); } /* Audio control bar play pause toggle button */ if (element.id === 'gcfm-audio-control-playpause') { let lgAudioPlayer = document.getElementById('gcfm-player-audio'); if (lgAudioPlayer.paused) { gcfmResumeMedia(); } else { gcfmPauseMedia(); } } /* Audio control bar jump ahead button */ if (element.id === 'gcfm-audio-control-forward') { let lgAudioPlayer = document.getElementById('gcfm-player-audio'); if (lgAudioPlayer.readyState >= 4) { lgAudioPlayer.currentTime = lgAudioPlayer.currentTime + 30; } } /* Audio control bar jump backward button */ if (element.id === 'gcfm-audio-control-back') { let lgAudioPlayer = document.getElementById('gcfm-player-audio'); if (lgAudioPlayer.readyState >= 4) { lgAudioPlayer.currentTime = lgAudioPlayer.currentTime - 10; } } /* Share button in the share modal */ if (element.id === 'gcfm-share-modal-submit') { let modal = document.getElementById('gcfm-share-modal'); let shareTriggerNode = document.getElementById(modal.getAttribute('data-share-trigger-node-id')); /* Get the user supplied data */ let userMessage = document.getElementById('gcfm-share-modal-message').value.trim(); let userName = document.getElementById('gcfm-share-modal-name').value.trim(); /* Assemble the destination url that the receiver of this share will be sent to */ let shareEpisodeTitle = shareTriggerNode.getAttribute('data-episodetitle'); var shareDestinationUrl = new URL(window.location.href); shareDestinationUrl.searchParams.append('gcfm-did', gcfmGetPlayerDid()); shareDestinationUrl.searchParams.append('gcfm-pid', shareTriggerNode.getAttribute('data-playerid')); shareDestinationUrl.searchParams.append('gcfm-fid', shareTriggerNode.getAttribute('data-feedid')); shareDestinationUrl.searchParams.append('gcfm-eid', shareTriggerNode.getAttribute('data-episodeid')); shareDestinationUrl.searchParams.append('gcfm-shared', 'true'); if (document.getElementById('gcfm-share-modal-timestamp').checked) { let startAt = Math.floor(document.getElementById('gcfm-player-audio').currentTime); shareDestinationUrl.searchParams.append('gcfm-ts', startAt); document.getElementById('gcfm-share-modal-timeshow').value = gcfmFormatCurrentSecondsAsTime(Math.floor(startAt)); } /* Assemble the share tracking url that will then forward the receiver to the final destination */ let shareTrackUrlString = document.getElementById('gcfm-share-modal').getAttribute('data-shareurl'); var shareTrackUrl = new URL(shareTrackUrlString); shareTrackUrl.searchParams.append('dest_url', shareDestinationUrl.href); shareTrackUrl.searchParams.append('did', gcfmGetPlayerDid()); shareTrackUrl.searchParams.append('pid', shareTriggerNode.getAttribute('data-playerid')); shareTrackUrl.searchParams.append('fid', shareTriggerNode.getAttribute('data-feedid')); shareTrackUrl.searchParams.append('title', shareEpisodeTitle); if (userMessage.trim()) { shareTrackUrl.searchParams.append('message', userMessage); } if (userName.trim()) { shareTrackUrl.searchParams.append('name', userName); } if (document.getElementById('gcfm-share-modal-timestamp').checked) { let startAt = Math.floor(document.getElementById('gcfm-player-audio').currentTime); shareTrackUrl.searchParams.append('ts', startAt); } /* Set each share to link to be the constructed share tracking url we just made */ document.getElementById('gcfm-share-modal-to-mobile').setAttribute( 'data-shareurl', shareTrackUrlString + '/' + gcfmBase64urlEncode(shareTrackUrl.href) ); document.getElementById('gcfm-share-modal-to-mobile').setAttribute( 'data-sharetext', shareTrackUrlString + '/' + gcfmBase64urlEncode(shareTrackUrl.href) ); document.getElementById('gcfm-share-modal-to-link').setAttribute( 'href', shareTrackUrlString + '/' + gcfmBase64urlEncode(shareTrackUrl.href) ); document.getElementById('gcfm-share-modal-to-facebook').setAttribute( 'href', 'https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(shareTrackUrlString + '/' + gcfmBase64urlEncode(shareTrackUrl.href)) ); document.getElementById('gcfm-share-modal-to-x').setAttribute( 'href', 'https://twitter.com/intent/tweet?url=' + encodeURIComponent(shareTrackUrlString + '/' + gcfmBase64urlEncode(shareTrackUrl.href)) + '&text=' + encodeURIComponent(userMessage) + '&hashtags=godcaster' ); var emailSubject = userName + ' shared "' + shareEpisodeTitle + '"'; if (!userName.trim()) { emailSubject = 'Sharing "' + shareEpisodeTitle + '" with you...'; } var emailBody = userName + ' wrote: "' + userMessage + '"'; if (!userMessage.trim() && !userName.trim()) { emailBody = 'Someone shared "' + shareEpisodeTitle + '" with you...'; } else if (!userMessage.trim()) { emailBody = userName + ' shared "' + shareEpisodeTitle + '" with you...'; } else if (!userName.trim()) { emailBody = 'The sharer wrote: "' + userMessage + '"'; } document.getElementById('gcfm-share-modal-to-email').setAttribute( 'href', 'mailto:?subject=' + encodeURIComponent(emailSubject) + '&body=' + encodeURIComponent(emailBody) + '%0D%0A%0D%0A' + encodeURIComponent(shareTrackUrlString + '/' + gcfmBase64urlEncode(shareTrackUrl.href)) ); /* Set up stage 2 of the sharing modal to show the destinations */ document.getElementById('gcfm-share-modal-destinations').classList.remove('hidden'); document.getElementById('gcfm-share-modal-submit').classList.add('hidden'); document.getElementById('gcfm-share-modal-name-section').classList.add('hidden'); document.getElementById('gcfm-share-modal-message-section').classList.add('hidden'); document.getElementById('gcfm-share-modal-timestamp-section').classList.add('hidden'); } if (element.id === 'gcfm-share-modal-to-mobile') { let shareHref = document.getElementById('gcfm-share-modal-to-mobile').getAttribute('data-shareurl'); let shareText = document.getElementById('gcfm-share-modal-to-mobile').getAttribute('data-sharetext'); navigator.share( { url: shareHref, text: shareText, } ) return false; } /* Share button in the feed view */ if (element.classList.contains('gcfm-button-episode-share')) { let shareTriggerNode = element; let shareTimestamp = document.getElementById('gcfm-share-modal-timestamp'); var modal = document.getElementById('gcfm-share-modal'); modal.setAttribute('data-share-trigger-node-id', shareTriggerNode.id); shareTimestamp.disabled = true; if (document.getElementById('gcfm-player-audio').currentTime > 0) { shareTimestamp.disabled = false; } modal.classList.remove('hidden'); return false; } if (element.id === 'gcfm-share-modal-close') { document.getElementById('gcfm-share-modal-to-link').removeAttribute('href'); document.getElementById('gcfm-share-modal-destinations').classList.add('hidden'); document.getElementById('gcfm-share-modal-message').value = ''; document.getElementById('gcfm-share-modal-timestamp').checked = false; document.getElementById('gcfm-share-modal-timeshow').value = ''; document.getElementById('gcfm-share-modal-destinations').classList.add('hidden'); document.getElementById('gcfm-share-modal-submit').classList.remove('hidden'); document.getElementById('gcfm-share-modal-name-section').classList.remove('hidden'); document.getElementById('gcfm-share-modal-message-section').classList.remove('hidden'); document.getElementById('gcfm-share-modal-timestamp-section').classList.remove('hidden'); } /* Follow button in the player */ if (element.id === 'gcfm-follow-player-feed') { fetch(gcfmGetActionUrl() + '?' + 'action=widget:follow' + '&did=' + gcfmGetPlayerDid() + '&pid=' + gcfmGetPlayerId() ); var lgModal = document.getElementById('gcfm-follow-modal'); var lgPlatform = gcfmGetPlatform(); let links = lgModal.getElementsByClassName('gcfm-follow-target'); for (let i = 0; i < links.length; i++) { if (links[i].classList.contains(lgPlatform)) { links[i].classList.remove('hidden'); } } lgModal.classList.remove('hidden'); return false; } if (element.id === 'gcfm-follow-modal-close') { document.getElementById('gcfm-follow-modal').classList.add('hidden'); } } function gcfmCloseVideo() { let lgVideoPanel = document.getElementById('gcfm-video-panel'); if (lgVideoPanel.classList.contains('hidden')) { return false; } let lgVideoPlayer = document.getElementById('gcfm-player-video'); let lgVideoPlayerSource = document.getElementById('gcfm-player-video-source'); lgVideoPlayer.pause(); lgVideoPlayerSource.setAttribute('src', ''); lgVideoPlayerSource.setAttribute('type', ''); lgVideoPanel.classList.add('hidden'); return false; } function gcfmResumeMedia() { let lgAudioPlayer = document.getElementById('gcfm-player-audio'); let playTriggerNode = document.getElementById(lgAudioPlayer.getAttribute('episode')); var lgIsLive = 0; if (playTriggerNode) { lgIsLive = playTriggerNode.getAttribute('data-live'); } if (lgIsLive == 1) { gcfmPlayMedia(playTriggerNode, true); return true; } document.getElementById('gcfm-audio-control-slider').readOnly = false; if (lgAudioPlayer.readyState === 4) { lgAudioPlayer.play(); fetch(gcfmGetActionUrl() + '?' + 'action=widget:resume' + '&did=' + gcfmGetPlayerDid() + '&pid=' + gcfmGetPlayerId() + '&fid=' + lgAudioPlayer.getAttribute('data-feedtitle') + '&eid=' + lgAudioPlayer.getAttribute('data-title') + '&ts=' + Math.floor(lgAudioPlayer.currentTime) ); let elEpisode = document.getElementById(lgAudioPlayer.getAttribute('episode')); if (elEpisode) { elEpisode.getElementsByClassName('play-icon')[0].classList.add('hidden'); elEpisode.getElementsByClassName('pause-icon')[0].classList.remove('hidden'); elEpisode.getElementsByClassName('loading-icon')[0].classList.add('hidden'); } document.getElementById('gcfm-audio-control-play-icon').classList.add('hidden'); document.getElementById('gcfm-audio-control-pause-icon').classList.remove('hidden'); document.getElementById('gcfm-audio-control-loading-icon').classList.add('hidden'); } } function gcfmPlayMedia(playTriggerNode, force) { let lgAudioPlayer = document.getElementById('gcfm-player-audio'); let lgAudioPlayerSource = document.getElementById('gcfm-player-audio-source'); var lgAudioPlayerEpisodeId = null; lgAudioPlayerEpisodeId = lgAudioPlayer.getAttribute('episode'); urlToLoad = gcfmBuildEnclosureUrlWithULID(playTriggerNode.getAttribute('data-enclosureurl')); urlMimeType = playTriggerNode.getAttribute('data-enclosuretype'); let lgIsLive = playTriggerNode.getAttribute('data-live'); /* Video support */ if (urlToLoad.indexOf('.mp4') > -1 && (urlMimeType.indexOf('octet') > -1 || urlMimeType.indexOf('video') > -1)) { let lgVideoPanel = document.getElementById('gcfm-video-panel'); let lgVideoPlayer = document.getElementById('gcfm-player-video'); let lgVideoPlayerSource = document.getElementById('gcfm-player-video-source'); lgVideoPlayerSource.setAttribute('src', urlToLoad); lgVideoPlayerSource.setAttribute('type', 'video/mp4'); lgVideoPanel.classList.remove('hidden'); gcfmPauseMedia(); if (gcfmGetControlsPosition() == 2) { document.getElementById('gcfm-audio-bar').classList.add('hidden'); } lgVideoPlayer.load(); lgVideoPlayer.play(); return false; } else { gcfmCloseVideo(); } /* If this is a live stream, disable the progress slider */ if (lgIsLive == 1) { document.getElementById('gcfm-audio-control-slider').readOnly = true; } else { document.getElementById('gcfm-audio-control-slider').readOnly = false; } if (playTriggerNode.id == lgAudioPlayerEpisodeId && !force) { document.getElementById('gcfm-audio-control-playpause').click(); return false; } /* If the same episode is clicked again then just treat it as a play/pause toggle */ /* Unless it's a live stream which needs to be torn down and restarted */ if (lgAudioPlayerSource.getAttribute('src') == urlToLoad && !force) { document.getElementById('gcfm-audio-control-playpause').click(); return false; } /* Set the media url to load */ lgAudioPlayerSource.setAttribute('src', urlToLoad); lgAudioPlayerSource.setAttribute('type', playTriggerNode.getAttribute('data-enclosuretype')); /* Display the initial media metadata */ /* document.getElementById('gcfm-audio-control-episode-title').innerHTML = playTriggerNode.getAttribute('data-title'); document.getElementById('gcfm-audio-control-image').setAttribute('src', playTriggerNode.getAttribute('data-imageurl')); */ /* UI transition */ gcfmHideAllEpisodePauseIcons(); gcfmSetEpisodeLoadingIcon(playTriggerNode); /* Load the media */ lgAudioPlayer.load(); /* Ping the mothership for stats */ fetch(gcfmGetActionUrl() + '?' + 'action=widget:play' + '&did=' + gcfmGetPlayerDid() + '&pid=' + gcfmGetPlayerId() + '&fid=' + playTriggerNode.getAttribute('data-feedtitle') + '&eid=' + playTriggerNode.getAttribute('data-title') + '&ts=' + Math.floor(lgAudioPlayer.currentTime) ); /* Save a reference to the triggering episode element in the audio element so we can have it later */ lgAudioPlayer.setAttribute('episode', playTriggerNode.id); lgAudioPlayer.setAttribute('data-feedtitle', playTriggerNode.getAttribute('data-feedtitle')); lgAudioPlayer.setAttribute('data-title', playTriggerNode.getAttribute('data-title')); /* Set metadata for mobile device lock screens, carplay and android auto */ if ('mediaSession' in navigator) { let lgPlayerTitle = gcfmGetPlayerTitle(); var mediaTitle = playTriggerNode.getAttribute('data-title'); if (lgPlayerTitle !== '') { mediaTitle = lgPlayerTitle + ' - ' + mediaTitle; } navigator.mediaSession.metadata = new MediaMetadata({ title: 'Loading...', artist: playTriggerNode.getAttribute('data-feedtitle'), album: lgPlayerTitle, artwork: [ { src: playTriggerNode.getAttribute('data-imageurl') }, ] }); navigator.mediaSession.setActionHandler('play', function () { gcfmResumeMedia(); }); navigator.mediaSession.setActionHandler('pause', function () { gcfmPauseMedia(); }); navigator.mediaSession.setActionHandler('seekbackward', function () { document.getElementById('gcfm-audio-control-back').click(); }); navigator.mediaSession.setActionHandler('seekforward', function () { document.getElementById('gcfm-audio-control-forward').click(); }); navigator.mediaSession.setActionHandler('previoustrack', function () { document.getElementById('gcfm-audio-control-back').click(); }); navigator.mediaSession.setActionHandler('nexttrack', function () { document.getElementById('gcfm-audio-control-forward').click(); }); } /* Wait for the media to load before playing and changing state */ cgGcfmLoadAttempts = 0; cgGcfmPlayAttemptInterval = setInterval(function () { let lgAudioPlayer = document.getElementById('gcfm-player-audio'); let lgAudioPlayerSource = document.getElementById('gcfm-player-audio-source'); let playTriggerNode = document.getElementById(lgAudioPlayer.getAttribute('episode')); if (lgAudioPlayer.readyState >= 3) { let lgIsLive = playTriggerNode.getAttribute('data-live'); let timeStartAt = playTriggerNode.getAttribute('data-startat'); let timeLastStored = localStorage.getItem(lgAudioPlayerSource.getAttribute('src')); if (timeStartAt > 0 && lgIsLive == 0) { lgAudioPlayer.currentTime = timeStartAt; } else if (timeLastStored > 0 && lgIsLive == 0) { lgAudioPlayer.currentTime = timeLastStored; } else { lgAudioPlayer.currentTime = 0; } let lgPlayerTitle = gcfmGetPlayerTitle(); var mediaTitle = playTriggerNode.getAttribute('data-title'); if (lgPlayerTitle !== '') { mediaTitle = lgPlayerTitle + ' - ' + mediaTitle; } if ('mediaSession' in navigator) { navigator.mediaSession.metadata.title = mediaTitle; } lgAudioPlayer.play(); document.getElementById('gcfm-audio-control-slider').removeAttribute('disabled'); controlsPosition = gcfmGetControlsPosition(); if (controlsPosition > 0) { document.getElementById('gcfm-audio-bar').classList.remove('hidden'); } clearInterval(cgGcfmPlayAttemptInterval); document.getElementById('gcfm-audio-control-play-icon').classList.add('hidden'); document.getElementById('gcfm-audio-control-pause-icon').classList.remove('hidden'); document.getElementById('gcfm-audio-control-loading-icon').classList.add('hidden'); /* TODO: This will need to change later for the tailwind build pipeline */ document.getElementById('gcfm-audio-bar-wrapper').classList.remove('opacity-25'); lgAudioPlayer.addEventListener('timeupdate', gcfmUpdateTrackTime); } else if (cgGcfmLoadAttempts >= 100) { alert("Could not load the selected media to play."); clearInterval(cgGcfmPlayAttemptInterval); lgAudioPlayerSource.setAttribute('src', ''); gcfmHideAllEpisodeLoadingIcons(); } else { cgGcfmLoadAttempts = cgGcfmLoadAttempts + 1; } }, 300); } function gcfmPauseMedia() { let lgAudioPlayer = document.getElementById('gcfm-player-audio'); if (!lgAudioPlayer.paused) { lgAudioPlayer.pause(); } gcfmHideAllEpisodePauseIcons(); document.getElementById('gcfm-audio-control-pause-icon').classList.add('hidden'); document.getElementById('gcfm-audio-control-play-icon').classList.remove('hidden'); document.getElementById('gcfm-audio-control-loading-icon').classList.add('hidden'); return true; } function gcfmGetActionUrl() { return document.getElementById('gcfm-player-app').getAttribute('data-actionurl'); } function gcfmUpdateTrackTime(event) { let currTimeDiv = document.getElementById('gcfm-audio-control-current'); let durationDiv = document.getElementById('gcfm-audio-control-duration'); let widgetCurrTimeDiv = document.getElementById('gcfm-widget-current'); let widgetDurationDiv = document.getElementById('gcfm-widget-duration'); let currTime = Math.floor(event.target.currentTime); let duration = Math.floor(event.target.duration); gcfmSetProgressBarPosition(currTime, duration); currTimeDiv.innerHTML = gcfmFormatCurrentSecondsAsTime(currTime); widgetCurrTimeDiv.innerHTML = gcfmFormatCurrentSecondsAsTime(currTime); /* Write the current time to localStorage every 5 seconds */ if (currTime > 0 && currTime % 5 == 0) { if (!cgGcfmTimeWritten) { let lgAudioPlayer = document.getElementById('gcfm-player-audio'); let lgAudioPlayerSource = document.getElementById('gcfm-player-audio-source'); localStorage.setItem( lgAudioPlayerSource.getAttribute('src'), lgAudioPlayer.currentTime ); cgGcfmTimeWritten = true; } } else if (cgGcfmTimeWritten) { cgGcfmTimeWritten = false; } if (currTime >= duration) { gcfmHideAllEpisodePauseIcons(); document.getElementById('gcfm-audio-control-pause-icon').classList.add('hidden'); document.getElementById('gcfm-audio-control-play-icon').classList.remove('hidden'); document.getElementById('gcfm-audio-control-loading-icon').classList.add('hidden'); } gcfmUpdateEpisodeTiles(event); durationDiv.innerHTML = gcfmFormatDurationSecondsAsTime(duration); widgetDurationDiv.innerHTML = gcfmFormatDurationSecondsAsTime(duration); } function gcfmFormatDurationSecondsAsTime(secs) { if (secs == Infinity) { return 'Streaming'; } if (isNaN(secs)) { return '00:00'; } var hr = Math.floor(secs / 3600); var min = Math.floor((secs - (hr * 3600)) / 60); var sec = Math.floor(secs - (hr * 3600) - (min * 60)); if (min < 10) { min = "0" + min; } if (sec < 10) { sec = "0" + sec; } if (isNaN(hr)) { hr = 0; } if (isNaN(min)) { min = "00"; } if (isNaN(sec)) { sec = "00"; } if (hr > 0) { return hr + ':' + min + ':' + sec; } return min + ':' + sec; } function gcfmFormatCurrentSecondsAsTime(secs) { if (isNaN(secs)) { return '00:00'; } var hr = Math.floor(secs / 3600); var min = Math.floor((secs - (hr * 3600)) / 60); var sec = Math.floor(secs - (hr * 3600) - (min * 60)); if (min < 10) { min = "0" + min; } if (sec < 10) { sec = "0" + sec; } if (isNaN(hr)) { hr = 0; } if (isNaN(min)) { min = "00"; } if (isNaN(sec)) { sec = "00"; } if (hr > 0) { return hr + ':' + min + ':' + sec; } return min + ':' + sec; } function gcfmHideAllEpisodePauseIcons() { let pauseIcons = document.getElementsByClassName('pause-icon'); for (i = 0; i < pauseIcons.length; i++) { pauseIcons[i].classList.add('hidden'); pauseIcons[i].parentNode.getElementsByClassName('play-icon')[0].classList.remove('hidden'); pauseIcons[i].parentNode.getElementsByClassName('loading-icon')[0].classList.add('hidden'); } } function gcfmHideAllEpisodeLoadingIcons() { let loadingIcons = document.getElementsByClassName('loading-icon'); for (i = 0; i < loadingIcons.length; i++) { loadingIcons[i].classList.add('hidden'); loadingIcons[i].parentNode.getElementsByClassName('play-icon')[0].classList.remove('hidden'); loadingIcons[i].parentNode.getElementsByClassName('pause-icon')[0].classList.add('hidden'); } } function gcfmSetEpisodePlayingIcon(elEpisode) { elEpisode.getElementsByClassName('play-icon')[0].classList.add('hidden'); elEpisode.getElementsByClassName('pause-icon')[0].classList.remove('hidden'); elEpisode.getElementsByClassName('loading-icon')[0].classList.add('hidden'); } function gcfmSetEpisodeLoadingIcon(elEpisode) { elEpisode.getElementsByClassName('play-icon')[0].classList.add('hidden'); elEpisode.getElementsByClassName('pause-icon')[0].classList.add('hidden'); elEpisode.getElementsByClassName('loading-icon')[0].classList.remove('hidden'); document.getElementById('gcfm-audio-control-play-icon').classList.add('hidden'); document.getElementById('gcfm-audio-control-pause-icon').classList.add('hidden'); document.getElementById('gcfm-audio-control-loading-icon').classList.remove('hidden'); } function gcfmSetEpisodePausedIcon(elEpisode) { elEpisode.getElementsByClassName('play-icon')[0].classList.add('hidden'); elEpisode.getElementsByClassName('pause-icon')[0].classList.remove('hidden'); elEpisode.getElementsByClassName('loading-icon')[0].classList.add('hidden'); } function gcfmUpdateEpisodeTiles(event) { let elEpisode = document.getElementById(event.target.getAttribute('episode')); if (elEpisode && !event.target.paused) { elEpisode.getElementsByClassName('play-icon')[0].classList.add('hidden'); elEpisode.getElementsByClassName('pause-icon')[0].classList.remove('hidden'); elEpisode.getElementsByClassName('loading-icon')[0].classList.add('hidden'); } } function gcfmGetTouches(evt) { return evt.touches; } function gcfmHandleTouchStart(evt) { const firstTouch = gcfmGetTouches(evt)[0]; cgGcfmXDown = firstTouch.clientX; cgGcfmYDown = firstTouch.clientY; } function gcfmHandleTouchMove(evt) { if (!cgGcfmXDown || !cgGcfmYDown) { return; } var xUp = evt.touches[0].clientX; var yUp = evt.touches[0].clientY; var xDiff = cgGcfmXDown - xUp; var yDiff = cgGcfmYDown - yUp; if (Math.abs(xDiff) > Math.abs(yDiff)) {/*most significant*/ if (xDiff > 0) { /* right swipe */ /* page forward through the program listing */ let bb = document.getElementById('gcfm-back-button'); let np = document.getElementById('gcfm-paginator-next'); if (!bb && gcfmIsTouchInBounds(evt.target) && np) { np.click(); } } else { /* left swipe */ /* return from feed page to program listing */ let bb = document.getElementById('gcfm-back-button'); if (bb && gcfmIsTouchInBounds(evt.target)) { bb.click(); } else { /* page back through the program listing */ let pp = document.getElementById('gcfm-paginator-prev'); if (pp && gcfmIsTouchInBounds(evt.target)) { pp.click(); } } } } else { if (yDiff > 0) { /* down swipe */ } else { /* up swipe */ } } /* reset values */ cgGcfmXDown = null; cgGcfmYDown = null; } function gcfmSetProgressBarPosition(position, duration) { let widgetProgressBar = document.getElementById('gcfm-progbar-foreground'); let widgetProgressBarBackground = document.getElementById('gcfm-progbar-background'); let widgetProgbarWidth = widgetProgressBarBackground.getBoundingClientRect().width; if (duration > 0 && position < duration) { let progressFraction = position / duration; widgetProgressBar.style.width = Math.floor(widgetProgbarWidth * progressFraction) + 'px'; } let progressBar = document.getElementById('gcfm-audio-control-slider'); if (progressBar.readOnly == true) { progressBar.value = 0; return; } if (duration > 0) { progressBar.max = duration; } progressBar.value = position; } function gcfmIsTouchInBounds(targetEl) { return ( ( targetEl.className.includes('gcfm-program') || targetEl.parentNode.className.includes('gcfm-program') || targetEl.className.includes('gcfm-episode') || targetEl.parentNode.className.includes('gcfm-episode') || targetEl.className.includes('gcfm-body') || targetEl.parentNode.className.includes('gcfm-body') ) && gcfmGetPlayerStyle() == 0 ) } function gcfmBuildEnclosureUrlWithULID(enclosureUrl) { /* This function is currently inactive */ return enclosureUrl; } function gcfmDisplayErrorMessage(message) { alert(message); } function gcfmBase64urlEncode(urlToEncode) { let lgEnc = new TextEncoder(); let buffer = lgEnc.encode(urlToEncode); return btoa(Array.from(new Uint8Array(buffer), b => String.fromCharCode(b)).join('')) .replace(/\+/g, '-') .replace(/\//g, '_') .replace(/=+$/, ''); } /* Load the player */ if (document.readyState === 'loading') { document.addEventListener("DOMContentLoaded", gcfmLoadPlayer()); } else { gcfmLoadPlayer(); }