File tree Expand file tree Collapse file tree 3 files changed +79
-54
lines changed Expand file tree Collapse file tree 3 files changed +79
-54
lines changed Original file line number Diff line number Diff line change 1
- const crypto = require ( 'crypto' )
2
1
const axios = require ( 'axios' )
3
2
4
3
const { YOUTUBE_KEY } = process . env
@@ -10,33 +9,32 @@ let youtube = axios.create({
10
9
} ,
11
10
} )
12
11
13
- let videoIds = [
14
- 'Im95DcXzTEU' ,
15
- 'WXojma0u_o4' ,
16
- 'QLXWhxd85Lc' ,
17
- 'o2svfxi1Rdg' ,
18
- 'q5EU1R2M574' ,
19
- ]
12
+ exports . sourceNodes = async ( { actions : { createNodeField } , getNodes } ) => {
13
+ let videos = getNodes ( ) . filter (
14
+ n => n . internal . type === 'ContentfulPublicActivity' && n . type === 'video'
15
+ )
16
+
17
+ let videoMap = videos . reduce ( ( map , video ) => {
18
+ let [ _ , id ] = video . url . match ( / v = ( .* ) / )
19
+
20
+ return map . set ( id , video )
21
+ } , new Map ( ) )
22
+
23
+ let videoIds = Array . from ( videoMap . keys ( ) )
20
24
21
- exports . sourceNodes = async ( { actions : { createNode } } ) => {
22
25
let {
23
- data : { items : videos } ,
26
+ data : { items : youtubeSnippets } ,
24
27
} = await youtube . get ( 'videos' , {
25
28
params : { part : 'snippet' , id : videoIds . join ( ',' ) } ,
26
29
} )
27
30
28
- videos
29
- . map ( video => ( {
30
- ...video ,
31
- parent : null ,
32
- children : [ ] ,
33
- internal : {
34
- type : 'YouTubeVideo' ,
35
- contentDigest : crypto
36
- . createHash ( `md5` )
37
- . update ( JSON . stringify ( video ) )
38
- . digest ( `hex` ) ,
39
- } ,
40
- } ) )
41
- . forEach ( v => createNode ( v ) )
31
+ videoMap . forEach ( ( video , id ) => {
32
+ let snippet = youtubeSnippets . find ( s => s . id === id )
33
+
34
+ createNodeField ( {
35
+ node : video ,
36
+ name : 'snippet' ,
37
+ value : snippet ,
38
+ } )
39
+ } )
42
40
}
Original file line number Diff line number Diff line change @@ -31,35 +31,47 @@ let Img = styled.img`
31
31
}
32
32
`
33
33
34
- let VideoCard = ( { video : { id, snippet } , className } ) => {
34
+ let unique = arrOfPrimitives => Array . from ( new Set ( arrOfPrimitives ) )
35
+
36
+ let VideoCard = ( {
37
+ video : {
38
+ id,
39
+ title,
40
+ url,
41
+ tags,
42
+ snippet : { thumbnails, tags : snippetTags } ,
43
+ } ,
44
+ className,
45
+ } ) => {
35
46
let rotation = useRotation ( )
36
- let link = `https://www.youtube.com/watch?v=${ id } `
37
- let { medium, high, maxres } = snippet . thumbnails
47
+ let { medium, high, maxres } = thumbnails
48
+
49
+ tags = unique ( [ ...( tags || [ ] ) , ...( snippetTags || [ ] ) ] )
38
50
39
51
return (
40
52
< section className = { className } >
41
53
< VideoLink
42
54
{ ...rotation }
43
- href = { link }
55
+ href = { url }
44
56
target = "_blank"
45
57
rel = "noopener noreferrer"
46
58
>
47
59
< Img
48
60
src = { medium . url }
49
61
srcSet = { `${ medium . url } , ${ high . url } 1.5x, ${ maxres . url } 3x` }
50
- alt = { snippet . title }
62
+ alt = { title }
51
63
/>
52
64
53
65
< YouTubePlayButton />
54
66
</ VideoLink >
55
67
56
68
< h3 style = { scale ( 0.1 ) } >
57
- < a href = { link } > { snippet . title } </ a >
69
+ < a href = { url } > { title } </ a >
58
70
</ h3 >
59
71
60
- { snippet . tags && (
72
+ { tags . length > 0 && (
61
73
< Flex as = "ul" flexWrap = "wrap" mx = "-5px" css = { { listStyle : 'none' } } >
62
- { snippet . tags . map ( t => (
74
+ { tags . map ( t => (
63
75
< Box as = "li" key = { t } m = "5px 2px" fontSize = "12px" >
64
76
< Badge > #{ t } </ Badge >
65
77
</ Box >
Original file line number Diff line number Diff line change @@ -5,13 +5,18 @@ import { Box, Flex } from '@rebass/grid'
5
5
import Layout from '../components/layout'
6
6
import VideoCard from '../components/video-card'
7
7
8
- let PublicActivityPage = ( { data : { resp : { videos = [ ] } = { } } = { } } ) => (
8
+ let PublicActivityPage = ( {
9
+ data : { resp : { edges : videos = [ ] } = { } } = { } ,
10
+ } ) => (
9
11
< Layout >
10
12
< h2 > Talks</ h2 >
11
13
12
14
< Flex as = "ul" m = { '0 -20px' } flexWrap = "wrap" css = { { listStyle : 'none' } } >
13
15
{ videos
14
- . map ( v => v . node )
16
+ . map ( v => ( {
17
+ ...v . node ,
18
+ ...v . node . fields . snippet ,
19
+ } ) )
15
20
. map ( v => (
16
21
< Box as = "li" key = { v . id } width = { [ 1 , 'calc(50% - 20px)' ] } m = { 10 } >
17
22
< VideoCard video = { v } />
@@ -23,27 +28,37 @@ let PublicActivityPage = ({ data: { resp: { videos = [] } = {} } = {} }) => (
23
28
24
29
export let query = graphql `
25
30
query PublicActivityQuery {
26
- resp: allYouTubeVideo(
27
- sort: { fields: [snippet___publishedAt], order: DESC }
28
- ) {
29
- videos: edges {
31
+ resp: allContentfulPublicActivity {
32
+ edges {
30
33
node {
31
- id
32
- snippet {
33
- title
34
- tags
35
- thumbnails {
36
- medium {
37
- url
38
- width
39
- }
40
- high {
41
- url
42
- width
43
- }
44
- maxres {
45
- url
46
- width
34
+ title
35
+ url
36
+ tags
37
+
38
+ fields {
39
+ snippet {
40
+ id
41
+ snippet {
42
+ publishedAt
43
+ title
44
+ tags
45
+ thumbnails {
46
+ medium {
47
+ url
48
+ width
49
+ height
50
+ }
51
+ high {
52
+ url
53
+ width
54
+ height
55
+ }
56
+ maxres {
57
+ url
58
+ width
59
+ height
60
+ }
61
+ }
47
62
}
48
63
}
49
64
}
You can’t perform that action at this time.
0 commit comments