Skip to content

Commit

Permalink
Add support for upcoming livestream trailers
Browse files Browse the repository at this point in the history
  • Loading branch information
ChunkyProgrammer committed Jan 21, 2025
1 parent f52fdd7 commit eeb0c48
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 34 deletions.
10 changes: 7 additions & 3 deletions src/renderer/helpers/api/local.js
Original file line number Diff line number Diff line change
Expand Up @@ -255,15 +255,19 @@ export async function getLocalVideoInfo(id) {
return info
}

if (hasTrailer) {
/** @type {import('youtubei.js').YTNodes.PlayerLegacyDesktopYpcTrailer} */
if (hasTrailer && info.playability_status.status !== 'OK') {
/** @type {import('youtubei.js').YTNodes.PlayerLegacyDesktopYpcTrailer | import('youtubei.js').YTNodes.YpcTrailer} */
const trailerScreen = info.playability_status.error_screen

const trailerInfo = new Mixins.MediaInfo([{ data: trailerScreen.trailer.player_response }])

// don't override the timestamp of when the video will premiere for upcoming videos
if (info.playability_status.status !== 'LIVE_STREAM_OFFLINE') {
info.basic_info.start_timestamp = trailerInfo.basic_info.start_timestamp
}

info.playability_status = trailerInfo.playability_status
info.streaming_data = trailerInfo.streaming_data
info.basic_info.start_timestamp = trailerInfo.basic_info.start_timestamp
info.basic_info.duration = trailerInfo.basic_info.duration
info.captions = trailerInfo.captions
info.storyboards = trailerInfo.storyboards
Expand Down
6 changes: 5 additions & 1 deletion src/renderer/views/Watch/Watch.js
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ export default defineComponent({
infoAreaSticky: true,
blockVideoAutoplay: false,
autoplayInterruptionTimeout: null,
playabilityStatus: '',

onMountedRun: false,

Expand Down Expand Up @@ -536,6 +537,7 @@ export default defineComponent({
this.videoChapters = chapters

const playabilityStatus = result.playability_status
this.playabilityStatus = playabilityStatus.status

// The apostrophe is intentionally that one (char code 8217), because that is the one YouTube uses
const BOT_MESSAGE = 'Sign in to confirm you’re not a bot'
Expand Down Expand Up @@ -677,7 +679,9 @@ export default defineComponent({
this.upcomingTimeLeft = null
this.premiereDate = undefined
}
} else {
}

if (!this.isUpcoming || (this.isUpcoming && this.playabilityStatus === 'OK')) {
this.videoLengthSeconds = result.basic_info.duration
if (result.streaming_data) {
this.streamingDataExpiryDate = result.streaming_data.expires
Expand Down
63 changes: 35 additions & 28 deletions src/renderer/views/Watch/Watch.scss
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,41 @@
}
}

.premiereDate {
align-items: center;
background-color: rgb(0 0 0 / 80%);
border-radius: 5px;
inset-block-end: 12px;
color: #fff;
display: flex;
block-size: 60px;
inset-inline-start: 12px;
padding-block: 0;
padding-inline: 12px;

.premiereIcon {
float: var(--float-left-ltr-rtl-value);
font-size: 25px;
margin-block: 0;
margin-inline: 12px;
}

.premiereText {
margin-block: 0;
margin-inline: 12px;
min-inline-size: 200px;

.premiereTextTimestamp {
font-size: 0.85em;
font-weight: bold;
}
}
}

.trailer.premiereDate {
margin-block-start: 8px;
}

.videoLayout {
@include dual-column-template;

Expand Down Expand Up @@ -52,35 +87,7 @@
}

.premiereDate {
align-items: center;
background-color: rgb(0 0 0 / 80%);
border-radius: 5px;
inset-block-end: 12px;
color: #fff;
display: flex;
block-size: 60px;
inset-inline-start: 12px;
padding-block: 0;
padding-inline: 12px;
position: absolute;

.premiereIcon {
float: var(--float-left-ltr-rtl-value);
font-size: 25px;
margin-block: 0;
margin-inline: 12px;
}

.premiereText {
margin-block: 0;
margin-inline: 12px;
min-inline-size: 200px;

.premiereTextTimestamp {
font-size: 0.85em;
font-weight: bold;
}
}
}

.errorContainer {
Expand Down
35 changes: 33 additions & 2 deletions src/renderer/views/Watch/Watch.vue
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
>
<div class="videoAreaMargin">
<ft-shaka-video-player
v-if="!isLoading && !isUpcoming && !errorMessage"
v-if="!isLoading && (!isUpcoming || playabilityStatus === 'OK') && !errorMessage"
ref="player"
:manifest-src="manifestSrc"
:manifest-mime-type="manifestMimeType"
Expand Down Expand Up @@ -50,7 +50,38 @@
@playback-rate-updated="updatePlaybackRate"
/>
<div
v-if="!isLoading && (isUpcoming || errorMessage)"
v-if="!isLoading && isUpcoming && playabilityStatus === 'OK'"
class="trailer premiereDate"
>
<font-awesome-icon
:icon="['fas', 'satellite-dish']"
class="premiereIcon"
/>
<p
v-if="upcomingTimestamp !== null"
class="premiereText"
>
<span
class="premiereTextTimeLeft"
>
{{ $t("Video.Premieres") }} {{ upcomingTimeLeft }}
</span>
<br>
<span
class="premiereTextTimestamp"
>
{{ upcomingTimestamp }}
</span>
</p>
<p
v-else
class="premiereText"
>
{{ $t("Video.Starting soon, please refresh the page to check again") }}
</p>
</div>
<div
v-else-if="!isLoading && (isUpcoming || errorMessage)"
class="videoPlayer"
>
<img
Expand Down

0 comments on commit eeb0c48

Please sign in to comment.