This commit is contained in:
Mattéo Delabre 2020-11-28 23:52:13 +01:00
父節點 8a75f58f46
當前提交 24b41da6d1
簽署人: matteo
GPG Key ID: AE3FBD02DC583ABB
共有 2 個文件被更改,包括 460 次插入2 次删除

查看文件

@ -1,7 +1,7 @@
# YouTube Maze
Some YouTube creators have made video “gamebooks” by creating videos in which viewers can make choices that influence the course of the narration.
This is generally implemented by breaking up the video into short and interlinked segments.
This is generally implemented by breaking up the video into short interlinked segments.
This project aims at automatically exploring those video mazes and creating a visual representation of the underlying network.
[See it live →](https://youtube-maze.cloud.delab.re)
@ -9,7 +9,7 @@ This project aims at automatically exploring those video mazes and creating a vi
## How Does it Work?
The [algorithm](lib/explore.mjs) starts at the first video and explores the links recursively using a breadth-first search approach, keeping track of the links as it goes.
The [Graphviz](http://www.graphviz.org/) library is used to automatically layout the graph so that as few edges cross as possible.
The [Graphviz](http://www.graphviz.org/) library is used to automatically lay out the graph so that as few edges cross as possible.
## Running Locally

458
files/logo.svg Normal file
查看文件

@ -0,0 +1,458 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="0 0 528 528"
version="1.1"
id="svg41"
sodipodi:docname="logo.svg"
width="528"
height="528"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
inkscape:export-filename="/home/matteo/Downloads/logo.png"
inkscape:export-xdpi="95.260002"
inkscape:export-ydpi="95.260002">
<metadata
id="metadata47">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs45">
<marker
style="overflow:visible"
id="marker1336"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1334" />
</marker>
<marker
style="overflow:visible"
id="marker1326"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1324" />
</marker>
<marker
style="overflow:visible"
id="marker1316"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1314" />
</marker>
<marker
style="overflow:visible"
id="marker1306"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1304" />
</marker>
<marker
style="overflow:visible"
id="marker1296"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1294" />
</marker>
<marker
style="overflow:visible"
id="marker1286"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1284" />
</marker>
<marker
style="overflow:visible"
id="marker1276"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1274" />
</marker>
<marker
style="overflow:visible"
id="marker1266"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1264" />
</marker>
<marker
style="overflow:visible"
id="marker1256"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1254" />
</marker>
<marker
style="overflow:visible"
id="marker1246"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1244" />
</marker>
<marker
style="overflow:visible"
id="marker1236"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1234" />
</marker>
<marker
style="overflow:visible"
id="marker1226"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1224" />
</marker>
<marker
style="overflow:visible"
id="marker1216"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1214" />
</marker>
<marker
style="overflow:visible"
id="marker1206"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="matrix(0.8,0,0,0.8,10,0)"
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1204" />
</marker>
</defs>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1376"
id="namedview43"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:zoom="1.675813"
inkscape:cx="128.15285"
inkscape:cy="311.51936"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:current-layer="svg41"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0">
<sodipodi:guide
position="264,520"
orientation="-1,0"
id="guide55"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="136,520"
orientation="-1,0"
id="guide57"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="392,520"
orientation="-1,0"
id="guide59"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="72,520"
orientation="-1,0"
id="guide61"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="200,520"
orientation="-1,0"
id="guide63"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="328,520"
orientation="-1,0"
id="guide65"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="456,520"
orientation="-1,0"
id="guide67"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,264"
orientation="0,1"
id="guide906"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,456"
orientation="0,1"
id="guide908"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,392"
orientation="0,1"
id="guide910"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,328"
orientation="0,1"
id="guide912"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,200"
orientation="0,1"
id="guide914"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,136"
orientation="0,1"
id="guide916"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="8,72"
orientation="0,1"
id="guide918"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
</sodipodi:namedview>
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 72,8 v 64 m 0,256 v 64"
id="path69"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 136,72.191265 V 328 m 0,128 v 64"
id="path894"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 200,328 v 64"
id="path896"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 264,8 v 128 m 0,320 v 64"
id="path898"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 328,72 v 128 m 0,192 v 128"
id="path900"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 392,8 v 64 m 0,128 v 192"
id="path902"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 456,72 v 128 m 0,64 v 64 m 0,128 v 64"
id="path904"
sodipodi:nodetypes="cccccc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 136,72 h 64"
id="path920"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 8,136 h 64 m 127.63842,0 H 264 m 64,0 h 64"
id="path922"
sodipodi:nodetypes="cccccc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 8,200 h 64 m 64,0 h 320"
id="path924"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 72,264 h 64 m 320,0 h 64"
id="path926"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 8,328 h 64 m 64,0 h 256"
id="path928"
sodipodi:nodetypes="cccc" />
<g
id="g53"
transform="matrix(1.3272317,0,0,1.3272317,158.11495,191.00226)">
<path
d="M 154.3,17.5 A 19.6,19.6 0 0 0 140.5,3.7 C 128.4,0.4 79.7,0.4 79.7,0.4 79.7,0.4 31,0.5 18.9,3.8 A 19.6,19.6 0 0 0 5.1,17.6 C 1.44,39.1 0.02,71.86 5.2,92.5 A 19.6,19.6 0 0 0 19,106.3 c 12.1,3.3 60.8,3.3 60.8,3.3 0,0 48.7,0 60.8,-3.3 a 19.6,19.6 0 0 0 13.8,-13.8 c 3.86,-21.53 5.05,-54.27 -0.1,-75 z"
fill="#ff0000"
id="path28" />
<path
fill="#ffffff"
d="M 64.2,78.4 104.6,55 64.2,31.6 Z"
id="path30" />
</g>
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 72,392 h 64 m 128,0 h 64 m 64,0 h 64"
id="path930"
sodipodi:nodetypes="cccccc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 72,456 h 128 m 128,0 h 64"
id="path932"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 8,8 V 520"
id="path1602"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 520,8 V 520"
id="path1604"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 8,520 H 456"
id="path1606"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#1a1a1a;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 72.033994,8 H 520"
id="path1608"
sodipodi:nodetypes="cc" />
</svg>

After

Width:  |  Height:  |  大小: 15 KiB