proto youtube video viewer
This commit is contained in:
parent
8633b8534b
commit
3e9ac5f2e8
|
@ -3620,6 +3620,11 @@
|
||||||
"integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
|
"integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"get-youtube-id": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/get-youtube-id/-/get-youtube-id-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-5yidLzoLXbtw82a/Wb7LrajkGn29BM6JuLWeHyNfzOGp1weGyW4+7eMz6cP23+etqj27VlOFtq8fFFDMLq/FXQ=="
|
||||||
|
},
|
||||||
"getpass": {
|
"getpass": {
|
||||||
"version": "0.1.7",
|
"version": "0.1.7",
|
||||||
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
|
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
|
||||||
|
@ -4448,6 +4453,11 @@
|
||||||
"type-check": "~0.3.2"
|
"type-check": "~0.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"load-script2": {
|
||||||
|
"version": "2.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/load-script2/-/load-script2-2.0.4.tgz",
|
||||||
|
"integrity": "sha512-WzZ2Df8QvWwGdjcJ7BYqcaojHGBC+Dg3oFsBg8gyz/mGyjCduBKdja+HkRo7BHoqt8sV5oil1Bc6Eyq6e40jfg=="
|
||||||
|
},
|
||||||
"locate-path": {
|
"locate-path": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
|
||||||
|
@ -7387,6 +7397,14 @@
|
||||||
"camelcase": "^5.0.0",
|
"camelcase": "^5.0.0",
|
||||||
"decamelize": "^1.2.0"
|
"decamelize": "^1.2.0"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"yt-player": {
|
||||||
|
"version": "3.4.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/yt-player/-/yt-player-3.4.3.tgz",
|
||||||
|
"integrity": "sha512-Ke5oM+qW8CR6aaK40mTxBff3hS4DXjyfmFkjg3eoaGt8fWQGyKFOFIpZqzNTR5c7Lu+xAG9SIvxCvbBPhCBbPg==",
|
||||||
|
"requires": {
|
||||||
|
"load-script2": "^2.0.1"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,9 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime-corejs3": "^7.7.7",
|
"@babel/runtime-corejs3": "^7.7.7",
|
||||||
"get-urls": "^9.2.0"
|
"get-urls": "^9.2.0",
|
||||||
|
"get-youtube-id": "^1.0.1",
|
||||||
|
"yt-player": "^3.4.3"
|
||||||
},
|
},
|
||||||
"browserslist": [
|
"browserslist": [
|
||||||
"last 1 chrome versions"
|
"last 1 chrome versions"
|
||||||
|
|
|
@ -7,7 +7,8 @@
|
||||||
|
|
||||||
<section class="player">
|
<section class="player">
|
||||||
{#if selectedEntry}
|
{#if selectedEntry}
|
||||||
Playing <a href={selectedEntry.url}>{selectedEntry.url}</a>
|
Playing <a href={selectedEntry.url}>{selectedEntry.id}</a>
|
||||||
|
<YoutubeViewer bind:videoId={selectedEntry.id}></YoutubeViewer>
|
||||||
{:else}
|
{:else}
|
||||||
Loading ...
|
Loading ...
|
||||||
{/if}
|
{/if}
|
||||||
|
@ -19,8 +20,8 @@
|
||||||
{:then entries}
|
{:then entries}
|
||||||
<ul>
|
<ul>
|
||||||
{#each entries as entry}
|
{#each entries as entry}
|
||||||
<li>
|
<li class="entry" class:active={entry === selectedEntry} on:click={selectEntry(entry)}>
|
||||||
<a href={entry.url}>{entry.url}</a>
|
<b>{entry.status.account.acct}</b>
|
||||||
<small>{entry.tags}</small>
|
<small>{entry.tags}</small>
|
||||||
</li>
|
</li>
|
||||||
{/each}
|
{/each}
|
||||||
|
@ -37,8 +38,9 @@
|
||||||
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte'
|
||||||
import { fetchEntries } from './util.js'
|
import { fetchEntries } from './util.js'
|
||||||
|
import YoutubeViewer from './YoutubeViewer.svelte'
|
||||||
|
|
||||||
export let domain
|
export let domain
|
||||||
export let hashtags
|
export let hashtags
|
||||||
|
@ -46,6 +48,10 @@
|
||||||
let entriesPromise = new Promise(() => {})
|
let entriesPromise = new Promise(() => {})
|
||||||
let selectedEntry = null
|
let selectedEntry = null
|
||||||
|
|
||||||
|
const selectEntry = entry => {
|
||||||
|
selectedEntry = entry
|
||||||
|
}
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
entriesPromise = fetchEntries(domain, hashtags)
|
entriesPromise = fetchEntries(domain, hashtags)
|
||||||
|
|
||||||
|
@ -89,4 +95,12 @@
|
||||||
"player queue"
|
"player queue"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.entry {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry.active {
|
||||||
|
background-color: plum;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
|
@ -0,0 +1,37 @@
|
||||||
|
<div>
|
||||||
|
<div bind:this={element}></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { onMount } from 'svelte';
|
||||||
|
import YoutubePlayer from 'yt-player'
|
||||||
|
|
||||||
|
export let videoId
|
||||||
|
|
||||||
|
let element
|
||||||
|
let player
|
||||||
|
|
||||||
|
$: if (player && videoId) {
|
||||||
|
console.log(`loada ${videoId}`)
|
||||||
|
player.load(videoId, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
player = new YoutubePlayer(element, {
|
||||||
|
width: 200,
|
||||||
|
height: 200,
|
||||||
|
autoplay: true,
|
||||||
|
controls: false, // debug only
|
||||||
|
keyboard: false,
|
||||||
|
fullscreen: false,
|
||||||
|
modestBranding: true,
|
||||||
|
related: false
|
||||||
|
})
|
||||||
|
|
||||||
|
player.on('ended', () => console.log('ended u should select next entry now uwu'))
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
|
||||||
|
</style>
|
10
src/util.js
10
src/util.js
|
@ -1,4 +1,5 @@
|
||||||
import getUrls from 'get-urls'
|
import getUrls from 'get-urls'
|
||||||
|
import getYoutubeId from 'get-youtube-id'
|
||||||
|
|
||||||
export async function fetchEntries(domain, hashtags) {
|
export async function fetchEntries(domain, hashtags) {
|
||||||
const response = await fetch(`https://${domain}/api/v1/timelines/tag/${hashtags[0]}`)
|
const response = await fetch(`https://${domain}/api/v1/timelines/tag/${hashtags[0]}`)
|
||||||
|
@ -7,11 +8,16 @@ export async function fetchEntries(domain, hashtags) {
|
||||||
const entries = statuses
|
const entries = statuses
|
||||||
.map(status => {
|
.map(status => {
|
||||||
const [url] = Array.from(getUrls(status.content)).filter(isSupportedUrl)
|
const [url] = Array.from(getUrls(status.content)).filter(isSupportedUrl)
|
||||||
const tags = intersection(status.tags.map(tag => tag.name), hashtags)
|
|
||||||
|
|
||||||
return { status, url, tags }
|
return { status, url }
|
||||||
})
|
})
|
||||||
.filter(entry => entry.url != null)
|
.filter(entry => entry.url != null)
|
||||||
|
.map(({ status, url }) => {
|
||||||
|
const id = getYoutubeId(url)
|
||||||
|
const tags = intersection(status.tags.map(tag => tag.name), hashtags)
|
||||||
|
|
||||||
|
return { status, url, id, tags }
|
||||||
|
})
|
||||||
|
|
||||||
return entries
|
return entries
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue