video_info 2.5.0 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 407deea14c1eab8be2324255ee49bde34affdf01
4
- data.tar.gz: 2ef07eb9b3fe33504a9d31fe2e1bf27959f28ecf
3
+ metadata.gz: b2cda17be09315cfde97837ef1d83079603b078c
4
+ data.tar.gz: 348006204240253cb21171460f6ece7233a7a7bb
5
5
  SHA512:
6
- metadata.gz: c5ba823f42f0798b354b3caa08ad21605e6a0c1626c07336ef04d66bd822d876150982716b4b73dd07a6d26afc7a4ce3ebbdd538037cf86f786cf6b2329a4e1b
7
- data.tar.gz: 9717f48d8ac0814af071a7eb568f1d5a420d06a2b78cfe903bf84f2f31035e10efe372216ea396cb1d0f7ae65e7f07e85946ea5dc9fd25dbb3d7bb41e2a04292
6
+ metadata.gz: 8a9698723a90069f7384a468dc2e4e7966dd24a45fa089d9db4fd12875fcbd692b883479cd7b35799e47a4fea45044a738d3289742cac52a380eb180620b5974
7
+ data.tar.gz: 9790babb47a770171278319207be12d69186e42b7cda66ab2914f3b62d127600584ef88d1711836a037aab44cb98d2602b587ca1bd4d0d2bbda427b172583924
data/.gitignore CHANGED
@@ -19,6 +19,7 @@ rdoc
19
19
  pkg
20
20
  Gemfile.lock
21
21
  spec/fixtures/
22
+ *.gem
22
23
 
23
24
  ## PROJECT::SPECIFIC
24
25
  .bundle/config
data/.travis.yml CHANGED
@@ -1,4 +1,5 @@
1
1
  language: ruby
2
+ sudo: false
2
3
  bundler_args: --without tool
3
4
  rvm:
4
5
  - 2.2.0
@@ -8,3 +9,5 @@ matrix:
8
9
  allow_failures:
9
10
  - rvm: rbx
10
11
  - rvm: jruby
12
+ before_install:
13
+ - gem update bundler
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/video_info.svg)](http://badge.fury.io/rb/video_info) [![Build Status](https://travis-ci.org/thibaudgg/video_info.svg?branch=master)](https://travis-ci.org/thibaudgg/video_info) [![Dependency Status](https://gemnasium.com/thibaudgg/video_info.svg)](https://gemnasium.com/thibaudgg/video_info) [![Code Climate](https://codeclimate.com/github/thibaudgg/video_info.svg)](https://codeclimate.com/github/thibaudgg/video_info) [![Coverage Status](https://coveralls.io/repos/thibaudgg/video_info/badge.svg?branch=master)](https://coveralls.io/r/thibaudgg/video_info)
4
4
 
5
- Simple Ruby Gem to get video info from Dailymotion, VK, Vimeo (with playlist), Wistia and YouTube (with playlist).
5
+ Simple Ruby Gem to get video info from Dailymotion, VK, Vimeo, Wistia and YouTube (with playlist).
6
6
 
7
7
  Tested against Ruby 2.2.0 and the latest versions of JRuby & Rubinius.
8
8
 
@@ -16,18 +16,19 @@ gem install video_info
16
16
  Usage
17
17
  -----
18
18
 
19
- ## Note for YouTube usage!
20
- Youtube recently updated their API to require an API key.
19
+ ### Note for YouTube and Vimeo usage!
21
20
 
22
- To get around this, a scraper was implemented. However, the scraper can only get the date the video was posted, while the API is able to get the date and the exact time the video was posted.
21
+ Youtube and Vimeo have recently updated their APIs to require API keys.
23
22
 
24
- You may also wish to use the API to protect against potential HTML changes that could break the scraper.
23
+ Scrapers has been implemented for both Youtube and Vimeo. However, the Youtube scraper can only get the date the video was posted, while the API is able to get the date and the exact time the video was posted. You may also wish to use the API to protect against potential HTML changes that could break the scrapesr.
25
24
 
26
- To get an API key, [follow the instructions here](https://developers.google.com/youtube/registering_an_application)
25
+ To get a Youtube API key, [follow the instructions here](https://developers.google.com/youtube/registering_an_application)
27
26
 
28
- To set the API key, do the following:
27
+ To get a Vimeo API key, [follow the instructions here](https://developer.vimeo.com/api/start)
28
+
29
+ To set the API keys, do the following:
29
30
  ``` ruby
30
- VideoInfo.provider_api_keys = { youtube: 'YOUR_API_KEY' }
31
+ VideoInfo.provider_api_keys = { youtube: 'YOUR_YOUTUBE_API_KEY', vimeo: 'YOUR_VIMEO_API_KEY' }
31
32
  ```
32
33
 
33
34
 
@@ -103,19 +104,6 @@ playlist = VideoInfo.new("http://www.youtube.com/playlist?p=PL9hW1uS6HUftLdHI6RI
103
104
  # playlist.embed_code => "<iframe src='//www.youtube.com/embed/videoseries?list=PL9hW1uS6HUftLdHI6RIsaf-iXTm09qnEr' frameborder='0' allowfullscreen='allowfullscreen'></iframe>"
104
105
  # playlist.videos => [VideoInfo.new('http://www.youtube.com/watch?v=_Bt3-WsHfB0'), VideoInfo.new('http://www.youtube.com/watch?v=9g2U12SsRns'), VideoInfo.new('http://www.youtube.com/watch?v=8b0aEoxqqC0'), VideoInfo.new('http://www.youtube.com/watch?v=6c3mHikRz0I'), VideoInfo.new('http://www.youtube.com/watch?v=OQVHWsTHcoc')]
105
106
 
106
- playlist = VideoInfo.new("http://vimeo.com/album/2755718")
107
- # playlist.available? => true
108
- # playlist.playlist_id => '2755718'
109
- # playlist.provider => 'Vimeo'
110
- # playlist.title => 'The Century Of Self'
111
- # playlist.thumbnail_small => 'http://b.vimeocdn.com/ts/443/595/443595474_100.jpg'
112
- # playlist.thumbnail_medium => 'http://b.vimeocdn.com/ts/443/595/443595474_200.jpg'
113
- # playlist.thumbnail_large => 'http://b.vimeocdn.com/ts/443/595/443595474_640.jpg'
114
- # playlist.embed_url => 'player.vimeo.com/hubnut/album/2755718'
115
- # playlist.embed_code => "<iframe src='//player.vimeo.com/hubnut/album/2755718?autoplay=0&byline=0&portrait=0&title=0' frameborder='0'></iframe>"
116
- # playlist.videos => [VideoInfo.new('http://vimeo.com/67977038'), VideoInfo.new('http://vimeo.com/68843810'), VideoInfo.new('http://vimeo.com/69949597'), VideoInfo.new('http://vimeo.com/70388245')]
117
- ```
118
-
119
107
  Options
120
108
  -------
121
109
 
data/foo.txt ADDED
@@ -0,0 +1,33 @@
1
+ Run options: include {:focus=>true}
2
+
3
+ All examples were filtered out; ignoring {:focus=>true}
4
+ .........F...............Document(
5
+ doctype: Doctype(name: "html")
6
+ children: NodeSet(Text("\n"), Element(name: "html" attributes: [Attribute(name: "lang" value: "en")] children: NodeSet(Text("\n "), Element(name: "head" children: NodeSet(Text("\n "), Element(name: "meta" attributes: [Attribute(name: "charset" value: "utf-8")]), Text("\n\n\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "viewport"), Attribute(name: "content" value: "width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no")]), Text("\n \n"), Element(name: "link" attributes: [Attribute(name: "rel" value: "preconnect"), Attribute(name: "href" value: "//player.vimeo.com")]), Text("\n"), Element(name: "link" attributes: [Attribute(name: "rel" value: "preconnect"), Attribute(name: "href" value: "//i.vimeocdn.com")]), Text("\n"), Element(name: "meta" attributes: [Attribute(name: "property" value: "fb:app_id"), Attribute(name: "content" value: "19884028963")]), Text("\n\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:site_name"), Attribute(name: "content" value: "Vimeo")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:url"), Attribute(name: "content" value: "https://vimeo.com/898029")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:type"), Attribute(name: "content" value: "video")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:title"), Attribute(name: "content" value: "Cherry Bloom - King Of The Knife")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:description"), Attribute(name: "content" value: "The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout http://www.cherrybloom.net")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:image"), Attribute(name: "content" value: "https://i.vimeocdn.com/video/34373130_1280x720.jpg")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:image:width"), Attribute(name: "content" value: "1280")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:image:height"), Attribute(name: "content" value: "720")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:url"), Attribute(name: "content" value: "https://player.vimeo.com/video/898029?autoplay=1")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:secure_url"), Attribute(name: "content" value: "https://player.vimeo.com/video/898029?autoplay=1")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:type"), Attribute(name: "content" value: "text/html")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:width"), Attribute(name: "content" value: "1280")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:height"), Attribute(name: "content" value: "720")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:url"), Attribute(name: "content" value: "https://vimeo.com/moogaloop.swf?clip_id=898029&autoplay=1")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:secure_url"), Attribute(name: "content" value: "https://vimeo.com/moogaloop.swf?clip_id=898029&autoplay=1")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:type"), Attribute(name: "content" value: "application/x-shockwave-flash")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:width"), Attribute(name: "content" value: "1280")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:height"), Attribute(name: "content" value: "720")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "al:ios:app_name"), Attribute(name: "content" value: "Vimeo")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "al:ios:app_store_id"), Attribute(name: "content" value: "425194759")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "al:ios:url"), Attribute(name: "content" value: "vimeo://app.vimeo.com/videos/898029")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "al:android:app_name"), Attribute(name: "content" value: "Vimeo")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "al:android:package"), Attribute(name: "content" value: "com.vimeo.android.videoapp")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "al:android:url"), Attribute(name: "content" value: "vimeo://app.vimeo.com/videos/898029")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "al:web:should_fallback"), Attribute(name: "content" value: "true")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "video:tag"), Attribute(name: "content" value: "cherry bloom")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "video:tag"), Attribute(name: "content" value: "secret sounds")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "video:tag"), Attribute(name: "content" value: "king of the knife")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "video:tag"), Attribute(name: "content" value: "rock")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "video:tag"), Attribute(name: "content" value: "alternative")]), Text("\n \n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "description"), Attribute(name: "content" value: "The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout http://www.cherrybloom.net")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:card"), Attribute(name: "content" value: "player")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:site"), Attribute(name: "content" value: "@vimeo")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:title"), Attribute(name: "content" value: "Cherry Bloom - King Of The Knife")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:description"), Attribute(name: "content" value: "The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout http://www.cherrybloom.net")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:image"), Attribute(name: "content" value: "https://i.vimeocdn.com/video/34373130_1280x720.jpg")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:player"), Attribute(name: "content" value: "https://player.vimeo.com/video/898029")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:player:width"), Attribute(name: "content" value: "1280")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:player:height"), Attribute(name: "content" value: "720")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:name:iphone"), Attribute(name: "content" value: "Vimeo")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:id:iphone"), Attribute(name: "content" value: "425194759")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:url:iphone"), Attribute(name: "content" value: "vimeo://app.vimeo.com/videos/898029")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:name:ipad"), Attribute(name: "content" value: "Vimeo")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:id:ipad"), Attribute(name: "content" value: "425194759")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:url:ipad"), Attribute(name: "content" value: "vimeo://app.vimeo.com/videos/898029")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:name:googleplay"), Attribute(name: "content" value: "Vimeo")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:id:googleplay"), Attribute(name: "content" value: "com.vimeo.android.videoapp")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:url:googleplay"), Attribute(name: "content" value: "vimeo://app.vimeo.com/videos/898029")]), Text("\n\n\n\n\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "alternate"), Attribute(name: "href" value: "https://vimeo.com/api/oembed.json?url=https%3A%2F%2Fvimeo.com%2F898029"), Attribute(name: "type" value: "application/json+oembed"), Attribute(name: "title" value: "Cherry Bloom - King Of The Knife")]), Text("\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "alternate"), Attribute(name: "href" value: "https://vimeo.com/api/oembed.xml?url=https%3A%2F%2Fvimeo.com%2F898029"), Attribute(name: "type" value: "text/xml+oembed"), Attribute(name: "title" value: "Cherry Bloom - King Of The Knife")]), Text("\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "pingback"), Attribute(name: "href" value: "https://vimeo.com/_pingback")]), Text("\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "canonical"), Attribute(name: "href" value: "/898029")]), Text("\n\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "apple-touch-icon-precomposed"), Attribute(name: "href" value: "https://i.vimeocdn.com/favicon/main-touch_180")]), Text("\n\n"), Element(name: "link" attributes: [Attribute(name: "rel" value: "mask-icon"), Attribute(name: "href" value: "https://f.vimeocdn.com/svg/iris/iris_icon_v_64.svg"), Attribute(name: "color" value: "#17272e")]), Text("\n"), Element(name: "link" attributes: [Attribute(name: "rel" value: "shortcut icon"), Attribute(name: "href" value: "https://f.vimeocdn.com/images_v6/favicon.ico"), Attribute(name: "data-play" value: "https://i.vimeocdn.com/favicon/play_32"), Attribute(name: "data-pause" value: "https://i.vimeocdn.com/favicon/pause_32")]), Text("\n\n"), Element(name: "meta" attributes: [Attribute(name: "name" value: "msapplication-TileImage"), Attribute(name: "content" value: "https://i.vimeocdn.com/favicon/main-touch_144")]), Text("\n"), Element(name: "meta" attributes: [Attribute(name: "name" value: "msapplication-TileColor"), Attribute(name: "content" value: "#00adef")]), Text("\n\n"), Element(name: "link" attributes: [Attribute(name: "rel" value: "search"), Attribute(name: "type" value: "application/opensearchdescription+xml"), Attribute(name: "href" value: "/search/opensearch.xml"), Attribute(name: "title" value: "Vimeo search")]), Text("\n"), Element(name: "link" attributes: [Attribute(name: "rel" value: "logo"), Attribute(name: "type" value: "image/svg"), Attribute(name: "href" value: "https://f.vimeocdn.com/logo.svg")]), Text("\n "), Element(name: "title" children: NodeSet(Text("Cherry Bloom - King Of The Knife on Vimeo"))), Text("\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "stylesheet"), Attribute(name: "href" value: "https://f.vimeocdn.com/styles/css_opt/global/icon_fonts.min.css?ae2b7e8565")]), Text("\n\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "stylesheet"), Attribute(name: "href" value: "https://f.vimeocdn.com/styles/css_opt/clip_beta_combined.min.css?4fa63289")]), Text("\n\n\n "), Element(name: "style" children: NodeSet(Text("\n #ribbon, .body_ribbon, .svg_ribbon, .default_lightbox header>.lightbox_heading, .default_lightbox .masthead, .default_lightbox.feather:before, .upload_progress .inner .bar, .vod_lightbox:before { background:url(data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22500%22%3E%3Crect%20x%3D%220%22%20width%3D%2226%22%20height%3D%22100%25%22%20style%3D%22fill%3A%2328a1d8%22%2F%3E%3Crect%20x%3D%2226%22%20width%3D%2243%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23248bc7%22%2F%3E%3Crect%20x%3D%2269%22%20width%3D%2221%22%20height%3D%22100%25%22%20style%3D%22fill%3A%231e3955%22%2F%3E%3Crect%20x%3D%2290%22%20width%3D%2215%22%20height%3D%22100%25%22%20style%3D%22fill%3A%232f5132%22%2F%3E%3Crect%20x%3D%22105%22%20width%3D%2255%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23416828%22%2F%3E%3Crect%20x%3D%22160%22%20width%3D%2272%22%20height%3D%22100%25%22%20style%3D%22fill%3A%237eaa29%22%2F%3E%3Crect%20x%3D%22232%22%20width%3D%2214%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23dcbd42%22%2F%3E%3Crect%20x%3D%22246%22%20width%3D%229%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23dcad27%22%2F%3E%3Crect%20x%3D%22255%22%20width%3D%220%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23e39a23%22%2F%3E%3Crect%20x%3D%22255%22%20width%3D%2221%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23cc554c%22%2F%3E%3Crect%20x%3D%22276%22%20width%3D%2280%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23ca473f%22%2F%3E%3Crect%20x%3D%22356%22%20width%3D%2232%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23a72834%22%2F%3E%3Crect%20x%3D%22388%22%20width%3D%2237%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23735675%22%2F%3E%3Crect%20x%3D%22425%22%20width%3D%2253%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23653e66%22%2F%3E%3Crect%20x%3D%22478%22%20width%3D%2222%22%20height%3D%22100%25%22%20style%3D%22fill%3A%233b315b%22%2F%3E%3C%2Fsvg%3E%0A) repeat-x top left; }\n "))), Text("\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "subresource"), Attribute(name: "href" value: "https://f.vimeocdn.com/p/2.11.0/js/player.js")]), Text("\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "subresource"), Attribute(name: "href" value: "https://f.vimeocdn.com/p/2.11.0/css/player.css")]), Text("\n "), Element(name: "script" children: NodeSet(Text("\n var playerAssetUrls = {\"js\":\"https:\\/\\/f.vimeocdn.com\\/p\\/2.11.0\\/js\\/player.js\",\"moog\":\"https:\\/\\/f.vimeocdn.com\\/p\\/flash\\/moogaloop\\/6.2.9\\/moogaloop.swf\",\"moog_js\":\"https:\\/\\/f.vimeocdn.com\\/p\\/2.11.0\\/js\\/moogaloop.js\",\"css\":\"https:\\/\\/f.vimeocdn.com\\/p\\/2.11.0\\/css\\/player.css\",\"player_url\":\"player.vimeo.com\"};\n "))), Text("\n \n\n\n "), Element(name: "script" children: NodeSet(Text("\nwindow.NREUM||(NREUM={}),__nr_require=function(t,e,n){function r(n){if(!e[n]){var o=e[n]={exports:{}};t[n][0].call(o.exports,function(e){var o=t[n][1][e];return r(o?o:e)},o,o.exports)}return e[n].exports}if(\"function\"==typeof __nr_require)return __nr_require;for(var o=0;o<n.length;o++)r(n[o]);return r}({QJf3ax:[function(t,e){function n(t){function e(e,n,a){t&&t(e,n,a),a||(a={});for(var c=s(e),f=c.length,u=i(a,o,r),d=0;f>d;d++)c[d].apply(u,n);return u}function a(t,e){f[t]=s(t).concat(e)}function s(t){return f[t]||[]}function c(){return n(e)}var f={};return{on:a,emit:e,create:c,listeners:s,_events:f}}function r(){return{}}var o=\"nr@context\",i=t(\"gos\");e.exports=n()},{gos:\"7eSDFh\"}],ee:[function(t,e){e.exports=t(\"QJf3ax\")},{}],3:[function(t){function e(t,e,n,i,s){try{c?c-=1:r(\"err\",[s||new UncaughtException(t,e,n)])}catch(f){try{r(\"ierr\",[f,(new Date).getTime(),!0])}catch(u){}}return\"function\"==typeof a?a.apply(this,o(arguments)):!1}function UncaughtException(t,e,n){this.message=t||\"Uncaught error with no additional information\",this.sourceURL=e,this.line=n}function n(t){r(\"err\",[t,(new Date).getTime()])}var r=t(\"handle\"),o=t(5),i=t(\"ee\"),a=window.onerror,s=!1,c=0;t(\"loader\").features.err=!0,window.onerror=e,NREUM.noticeError=n;try{throw new Error}catch(f){\"stack\"in f&&(t(1),t(4),\"addEventListener\"in window&&t(2),window.XMLHttpRequest&&XMLHttpRequest.prototype&&XMLHttpRequest.prototype.addEventListener&&t(3),s=!0)}i.on(\"fn-start\",function(){s&&(c+=1)}),i.on(\"fn-err\",function(t,e,r){s&&(this.thrown=!0,n(r))}),i.on(\"fn-end\",function(){s&&!this.thrown&&c>0&&(c-=1)}),i.on(\"internal-error\",function(t){r(\"ierr\",[t,(new Date).getTime(),!0])})},{1:8,2:5,3:9,4:7,5:20,ee:\"QJf3ax\",handle:\"D5DuLP\",loader:\"G9z0Bl\"}],4:[function(t){function e(){}if(window.performance&&window.performance.timing&&window.performance.getEntriesByType){var n=t(\"ee\"),r=t(\"handle\"),o=t(2);t(\"loader\").features.stn=!0,t(1),n.on(\"fn-start\",function(t){var e=t[0];e instanceof Event&&(this.bstStart=Date.now())}),n.on(\"fn-end\",function(t,e){var n=t[0];n instanceof Event&&r(\"bst\",[n,e,this.bstStart,Date.now()])}),o.on(\"fn-start\",function(t,e,n){this.bstStart=Date.now(),this.bstType=n}),o.on(\"fn-end\",function(t,e){r(\"bstTimer\",[e,this.bstStart,Date.now(),this.bstType])}),n.on(\"pushState-start\",function(){this.time=Date.now(),this.startPath=location.pathname+location.hash}),n.on(\"pushState-end\",function(){r(\"bstHist\",[location.pathname+location.hash,this.startPath,this.time])}),\"addEventListener\"in window.performance&&(window.performance.addEventListener(\"webkitresourcetimingbufferfull\",function(){r(\"bstResource\",[window.performance.getEntriesByType(\"resource\")]),window.performance.webkitClearResourceTimings()},!1),window.performance.addEventListener(\"resourcetimingbufferfull\",function(){r(\"bstResource\",[window.performance.getEntriesByType(\"resource\")]),window.performance.clearResourceTimings()},!1)),document.addEventListener(\"scroll\",e,!1),document.addEventListener(\"keypress\",e,!1),document.addEventListener(\"click\",e,!1)}},{1:6,2:8,ee:\"QJf3ax\",handle:\"D5DuLP\",loader:\"G9z0Bl\"}],5:[function(t,e){function n(t){i.inPlace(t,[\"addEventListener\",\"removeEventListener\"],\"-\",r)}function r(t){return t[1]}var o=(t(1),t(\"ee\").create()),i=t(2)(o),a=t(\"gos\");if(e.exports=o,n(window),\"getPrototypeOf\"in Object){for(var s=document;s&&!s.hasOwnProperty(\"addEventListener\");)s=Object.getPrototypeOf(s);s&&n(s);for(var c=XMLHttpRequest.prototype;c&&!c.hasOwnProperty(\"addEventListener\");)c=Object.getPrototypeOf(c);c&&n(c)}else XMLHttpRequest.prototype.hasOwnProperty(\"addEventListener\")&&n(XMLHttpRequest.prototype);o.on(\"addEventListener-start\",function(t){if(t[1]){var e=t[1];\"function\"==typeof e?this.wrapped=t[1]=a(e,\"nr@wrapped\",function(){return i(e,\"fn-\",null,e.name||\"anonymous\")}):\"function\"==typeof e.handleEvent&&i.inPlace(e,[\"handleEvent\"],\"fn-\")}}),o.on(\"removeEventListener-start\",function(t){var e=this.wrapped;e&&(t[1]=e)})},{1:20,2:21,ee:\"QJf3ax\",gos:\"7eSDFh\"}],6:[function(t,e){var n=(t(2),t(\"ee\").create()),r=t(1)(n);e.exports=n,r.inPlace(window.history,[\"pushState\"],\"-\")},{1:21,2:20,ee:\"QJf3ax\"}],7:[function(t,e){var n=(t(2),t(\"ee\").create()),r=t(1)(n);e.exports=n,r.inPlace(window,[\"requestAnimationFrame\",\"mozRequestAnimationFrame\",\"webkitRequestAnimationFrame\",\"msRequestAnimationFrame\"],\"raf-\"),n.on(\"raf-start\",function(t){t[0]=r(t[0],\"fn-\")})},{1:21,2:20,ee:\"QJf3ax\"}],8:[function(t,e){function n(t,e,n){var r=t[0];\"string\"==typeof r&&(r=new Function(r)),t[0]=o(r,\"fn-\",null,n)}var r=(t(2),t(\"ee\").create()),o=t(1)(r);e.exports=r,o.inPlace(window,[\"setTimeout\",\"setInterval\",\"setImmediate\"],\"setTimer-\"),r.on(\"setTimer-start\",n)},{1:21,2:20,ee:\"QJf3ax\"}],9:[function(t,e){function n(){c.inPlace(this,d,\"fn-\")}function r(t,e){c.inPlace(e,[\"onreadystatechange\"],\"fn-\")}function o(t,e){return e}var i=t(\"ee\").create(),a=t(1),s=t(2),c=s(i),f=s(a),u=window.XMLHttpRequest,d=[\"onload\",\"onerror\",\"onabort\",\"onloadstart\",\"onloadend\",\"onprogress\",\"ontimeout\"];e.exports=i,window.XMLHttpRequest=function(t){var e=new u(t);try{i.emit(\"new-xhr\",[],e),f.inPlace(e,[\"addEventListener\",\"removeEventListener\"],\"-\",function(t,e){return e}),e.addEventListener(\"readystatechange\",n,!1)}catch(r){try{i.emit(\"internal-error\",[r])}catch(o){}}return e},window.XMLHttpRequest.prototype=u.prototype,c.inPlace(XMLHttpRequest.prototype,[\"open\",\"send\"],\"-xhr-\",o),i.on(\"send-xhr-start\",r),i.on(\"open-xhr-start\",r)},{1:5,2:21,ee:\"QJf3ax\"}],10:[function(t){function e(t){if(\"string\"==typeof t&&t.length)return t.length;if(\"object\"!=typeof t)return void 0;if(\"undefined\"!=typeof ArrayBuffer&&t instanceof ArrayBuffer&&t.byteLength)return t.byteLength;if(\"undefined\"!=typeof Blob&&t instanceof Blob&&t.size)return t.size;if(\"undefined\"!=typeof FormData&&t instanceof FormData)return void 0;try{return JSON.stringify(t).length}catch(e){return void 0}}function n(t){var n=this.params,r=this.metrics;if(!this.ended){this.ended=!0;for(var i=0;c>i;i++)t.removeEventListener(s[i],this.listener,!1);if(!n.aborted){if(r.duration=(new Date).getTime()-this.startTime,4===t.readyState){n.status=t.status;var a=t.responseType,f=\"arraybuffer\"===a||\"blob\"===a||\"json\"===a?t.response:t.responseText,u=e(f);if(u&&(r.rxSize=u),this.sameOrigin){var d=t.getResponseHeader(\"X-NewRelic-App-Data\");d&&(n.cat=d.split(\", \").pop())}}else n.status=0;r.cbTime=this.cbTime,o(\"xhr\",[n,r,this.startTime])}}}function r(t,e){var n=i(e),r=t.params;r.host=n.hostname+\":\"+n.port,r.pathname=n.pathname,t.sameOrigin=n.sameOrigin}if(window.XMLHttpRequest&&XMLHttpRequest.prototype&&XMLHttpRequest.prototype.addEventListener&&!/CriOS/.test(navigator.userAgent)){t(\"loader\").features.xhr=!0;var o=t(\"handle\"),i=t(2),a=t(\"ee\"),s=[\"load\",\"error\",\"abort\",\"timeout\"],c=s.length,f=t(1);t(4),t(3),a.on(\"new-xhr\",function(){this.totalCbs=0,this.called=0,this.cbTime=0,this.end=n,this.ended=!1,this.xhrGuids={}}),a.on(\"open-xhr-start\",function(t){this.params={method:t[0]},r(this,t[1]),this.metrics={}}),a.on(\"open-xhr-end\",function(t,e){\"loader_config\"in NREUM&&\"xpid\"in NREUM.loader_config&&this.sameOrigin&&e.setRequestHeader(\"X-NewRelic-ID\",NREUM.loader_config.xpid)}),a.on(\"send-xhr-start\",function(t,n){var r=this.metrics,o=t[0],i=this;if(r&&o){var f=e(o);f&&(r.txSize=f)}this.startTime=(new Date).getTime(),this.listener=function(t){try{\"abort\"===t.type&&(i.params.aborted=!0),(\"load\"!==t.type||i.called===i.totalCbs&&(i.onloadCalled||\"function\"!=typeof n.onload))&&i.end(n)}catch(e){try{a.emit(\"internal-error\",[e])}catch(r){}}};for(var u=0;c>u;u++)n.addEventListener(s[u],this.listener,!1)}),a.on(\"xhr-cb-time\",function(t,e,n){this.cbTime+=t,e?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&\"function\"==typeof n.onload||this.end(n)}),a.on(\"xhr-load-added\",function(t,e){var n=\"\"+f(t)+!!e;this.xhrGuids&&!this.xhrGuids[n]&&(this.xhrGuids[n]=!0,this.totalCbs+=1)}),a.on(\"xhr-load-removed\",function(t,e){var n=\"\"+f(t)+!!e;this.xhrGuids&&this.xhrGuids[n]&&(delete this.xhrGuids[n],this.totalCbs-=1)}),a.on(\"addEventListener-end\",function(t,e){e instanceof XMLHttpRequest&&\"load\"===t[0]&&a.emit(\"xhr-load-added\",[t[1],t[2]],e)}),a.on(\"removeEventListener-end\",function(t,e){e instanceof XMLHttpRequest&&\"load\"===t[0]&&a.emit(\"xhr-load-removed\",[t[1],t[2]],e)}),a.on(\"fn-start\",function(t,e,n){e instanceof XMLHttpRequest&&(\"onload\"===n&&(this.onload=!0),(\"load\"===(t[0]&&t[0].type)||this.onload)&&(this.xhrCbStart=(new Date).getTime()))}),a.on(\"fn-end\",function(t,e){this.xhrCbStart&&a.emit(\"xhr-cb-time\",[(new Date).getTime()-this.xhrCbStart,this.onload,e],e)})}},{1:\"XL7HBI\",2:11,3:9,4:5,ee:\"QJf3ax\",handle:\"D5DuLP\",loader:\"G9z0Bl\"}],11:[function(t,e){e.exports=function(t){var e=document.createElement(\"a\"),n=window.location,r={};e.href=t,r.port=e.port;var o=e.href.split(\"://\");return!r.port&&o[1]&&(r.port=o[1].split(\"/\")[0].split(\":\")[1]),r.port&&\"0\"!==r.port||(r.port=\"https\"===o[0]?\"443\":\"80\"),r.hostname=e.hostname||n.hostname,r.pathname=e.pathname,\"/\"!==r.pathname.charAt(0)&&(r.pathname=\"/\"+r.pathname),r.sameOrigin=!e.hostname||e.hostname===document.domain&&e.port===n.port&&e.protocol===n.protocol,r}},{}],gos:[function(t,e){e.exports=t(\"7eSDFh\")},{}],\"7eSDFh\":[function(t,e){function n(t,e,n){if(r.call(t,e))return t[e];var o=n();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(t,e,{value:o,writable:!0,enumerable:!1}),o}catch(i){}return t[e]=o,o}var r=Object.prototype.hasOwnProperty;e.exports=n},{}],D5DuLP:[function(t,e){function n(t,e,n){return r.listeners(t).length?r.emit(t,e,n):(o[t]||(o[t]=[]),void o[t].push(e))}var r=t(\"ee\").create(),o={};e.exports=n,n.ee=r,r.q=o},{ee:\"QJf3ax\"}],handle:[function(t,e){e.exports=t(\"D5DuLP\")},{}],XL7HBI:[function(t,e){function n(t){var e=typeof t;return!t||\"object\"!==e&&\"function\"!==e?-1:t===window?0:i(t,o,function(){return r++})}var r=1,o=\"nr@id\",i=t(\"gos\");e.exports=n},{gos:\"7eSDFh\"}],id:[function(t,e){e.exports=t(\"XL7HBI\")},{}],loader:[function(t,e){e.exports=t(\"G9z0Bl\")},{}],G9z0Bl:[function(t,e){function n(){var t=p.info=NREUM.info;if(t&&t.agent&&t.licenseKey&&t.applicationID&&c&&c.body){p.proto=\"https\"===d.split(\":\")[0]||t.sslForHttp?\"https://\":\"http://\",a(\"mark\",[\"onload\",i()]);var e=c.createElement(\"script\");e.src=p.proto+t.agent,c.body.appendChild(e)}}function r(){\"complete\"===c.readyState&&o()}function o(){a(\"mark\",[\"domContent\",i()])}function i(){return(new Date).getTime()}var a=t(\"handle\"),s=window,c=s.document,f=\"addEventListener\",u=\"attachEvent\",d=(\"\"+location).split(\"?\")[0],p=e.exports={offset:i(),origin:d,features:{}};c[f]?(c[f](\"DOMContentLoaded\",o,!1),s[f](\"load\",n,!1)):(c[u](\"onreadystatechange\",r),s[u](\"onload\",n)),a(\"mark\",[\"firstbyte\",i()])},{handle:\"D5DuLP\"}],20:[function(t,e){function n(t,e,n){e||(e=0),\"undefined\"==typeof n&&(n=t?t.length:0);for(var r=-1,o=n-e||0,i=Array(0>o?0:o);++r<o;)i[r]=t[e+r];return i}e.exports=n},{}],21:[function(t,e){function n(t){return!(t&&\"function\"==typeof t&&t.apply&&!t[i])}var r=t(\"ee\"),o=t(1),i=\"nr@wrapper\",a=Object.prototype.hasOwnProperty;e.exports=function(t){function e(t,e,r,a){function nrWrapper(){var n,i,s,f;try{i=this,n=o(arguments),s=r&&r(n,i)||{}}catch(d){u([d,\"\",[n,i,a],s])}c(e+\"start\",[n,i,a],s);try{return f=t.apply(i,n)}catch(p){throw c(e+\"err\",[n,i,p],s),p}finally{c(e+\"end\",[n,i,f],s)}}return n(t)?t:(e||(e=\"\"),nrWrapper[i]=!0,f(t,nrWrapper),nrWrapper)}function s(t,r,o,i){o||(o=\"\");var a,s,c,f=\"-\"===o.charAt(0);for(c=0;c<r.length;c++)s=r[c],a=t[s],n(a)||(t[s]=e(a,f?s+o:o,i,s,t))}function c(e,n,r){try{t.emit(e,n,r)}catch(o){u([o,e,n,r])}}function f(t,e){if(Object.defineProperty&&Object.keys)try{var n=Object.keys(t);return n.forEach(function(n){Object.defineProperty(e,n,{get:function(){return t[n]},set:function(e){return t[n]=e,e}})}),e}catch(r){u([r])}for(var o in t)a.call(t,o)&&(e[o]=t[o]);return e}function u(e){try{t.emit(\"internal-error\",e)}catch(n){}}return t||(t=r),e.inPlace=s,e.flag=i,e}},{1:20,ee:\"QJf3ax\"}]},{},[\"G9z0Bl\",3,10,4]);\n;NREUM.info={beacon:\"bam.nr-data.net\",errorBeacon:\"bam.nr-data.net\",licenseKey:\"689d5b4562\",applicationID:\"2011224\",sa:1,agent:\"js-agent.newrelic.com/nr-476.min.js\"}\n"))), Text("\n\n "), Element(name: "script" children: NodeSet(Text("\n var googletag = googletag || {},\n gptadslots = [];\n googletag.cmd = googletag.cmd || [];\n\n (function() {\n var gads = document.createElement('script'),\n useSSL = 'https:' == document.location.protocol,\n node;\n gads.async = true;\n gads.type = 'text/javascript';\n gads.src = (useSSL ? 'https:' : 'http:') + '//www.googletagservices.com/tag/js/gpt.js';\n node = document.getElementsByTagName('script')[0];\n node.parentNode.insertBefore(gads, node);\n })();\n\n googletag.cmd.push(function() {\n \n googletag.pubads().setTargeting('sec', ['false']);\n\n googletag.pubads().setTargeting('logged_in', ['false']);\n\n googletag.pubads().setTargeting('rpv', (Math.floor(Math.random()*100)+1).toString());\n\n googletag.pubads().enableAsyncRendering();\n googletag.enableServices();\n });\n "))), Text("\n\n"), Element(name: "script" children: NodeSet(Text("\n!function(){var e=\"undefined\"!=typeof window?window:exports,r=[];if(e.performance||(e.performance={}),e.performance.now||(e.performance.now=performance.now||performance.webkitNow||performance.msNow||performance.mozNow),!e.performance.now){var n=Date.now?Date.now():+new Date;performance.timing&&performance.timing&&(n=performance.timing.navigationStart),e.performance.now=function(){var e=Date.now?Date.now():+new Date;return e-n}}e.performance.mark||(e.performance.mark=e.performance.webkitMark?e.performance.webkitMark:function(n){r.forEach(function(e,r,a){e.name===n&&a.splice(r,1)}),r.push({name:n,entryType:\"mark\",startTime:e.performance.now(),duration:0})}),e.performance.getEntriesByType||(e.performance.getEntriesByType=e.performance.webkitGetEntriesByType?e.performance.webkitGetEntriesByType:function(e){var n=function(r){return r.entryType===e};return-1!==[\"mark\",\"measure\"].indexOf(e)?r.filter(n):void 0}),e.performance.getEntriesByName||(e.performance.getEntriesByName=e.performance.webkitGetEntriesByName?e.performance.webkitGetEntriesByName:function(e){return r.filter(function(r){return r.name===e})}),e.performance.clearMeasures||(e.performance.clearMeasures=e.performance.webkitClearMeasures?e.performance.webkitClearMeasures:function(){r.forEach(function(e,r,n){\"measure\"===e.entryType&&n.splice(r,1)}),r=[]}),e.performance.clearMarks||(e.performance.clearMarks=e.performance.webkitClearMarks?e.performance.webkitClearMarks:function(){r.forEach(function(e,r,n){\"mark\"===e.entryType&&n.splice(r,1)}),r=[]}),e.performance.measure||(e.performance.measure=e.performance.webkitMeasure?e.performance.webkitMeasure:function(e,n,a){var t=function(e){return function(r){return r.name===e&&\"mark\"===r.entryType}},o=r.filter(t(n))[0],m=r.filter(t(a))[0],i=m.startTime-o.startTime;r.push({name:e,entryType:\"measure\",startTime:o.startTime,duration:i})})}(),window.markUserTime=function(e){var r=window.requestAnimationFrame||function(e){setTimeout(e,0)};r(function(){window.performance.mark(e),window.console&&console.timeStamp&&console.timeStamp(e)})};\n\n(function() {\n window.markUserTime = function(label) {\n window._gaq = window._gaq || [];\n\n // Exit early if the browser can't handle new things\n if (typeof performance === 'undefined' || typeof performance.mark !== 'function' || typeof performance.getEntriesByName !== 'function' || typeof performance.clearMarks !== 'function') {\n return;\n }\n\n var uid = parseInt(Math.random().toString().split('0.')[1]) + new Date().getTime(),\n mark_name = label + '_' + uid,\n parts = label.split('|'),\n category = parts[0],\n variable = parts[1],\n label = parts[2],\n mark_time;\n\n performance.mark(mark_name);\n mark_time = performance.getEntriesByName(mark_name)[0].startTime;\n\n window._gaq.push(['_trackTiming', category, variable, mark_time / 1000, label, 0.5]);\n }\n}());\n"))), Text("\n\n\n\n\n "))), Text("\n "), Element(name: "body" attributes: [Attribute(name: "class" value: "onsite ")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "id" value: "wrap"), Attribute(name: "class" value: "outer_wrap")] children: NodeSet(Text("\n \n "), Element(name: "div" attributes: [Attribute(name: "class" value: "body_ribbon")]), Text("\n\n \n \n\n\n"), Element(name: "div" attributes: [Attribute(name: "id" value: "topnav_desktop"), Attribute(name: "class" value: "topnav_desktop "), Attribute(name: "role" value: "banner")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "topnav_desktop_wrapper")] children: NodeSet(Text("\n\n "), Element(name: "a" attributes: [Attribute(name: "class" value: "topnav_desktop_logo"), Attribute(name: "href" value: "//vimeo.com"), Attribute(name: "alt" value: "Go to Vimeo home page"), Attribute(name: "title" value: "Go to Vimeo home page"), Attribute(name: "aria-label" value: "Go to Vimeo home page"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:vimeo_home"), Attribute(name: "data-ga-event-click" value: "top_nav|home"), Attribute(name: "data-gtm-click" value: "top_nav_home_click")] children: NodeSet(Text("\n "), Element(name: "svg" attributes: [Attribute(name: "alt" value: "Vimeo"), Attribute(name: "width" value: "100"), Attribute(name: "height" value: "40")] children: NodeSet(Element(name: "path" attributes: [Attribute(name: "d" value: "M22.448 14.575c-.104 2.17-1.618 5.146-4.544 8.912-3.03 3.942-5.59 5.912-7.686 5.912-1.297 0-2.397-1.204-3.3-3.6-.6-2.2-1.202-4.398-1.794-6.598-.664-2.396-1.38-3.6-2.147-3.6-.166 0-.747.354-1.753 1.05l-1.048-1.35c1.1-.965 2.19-1.93 3.257-2.905 1.463-1.265 2.573-1.94 3.3-2.002 1.732-.166 2.8 1.017 3.205 3.558.435 2.74.736 4.44.902 5.115.498 2.27 1.048 3.402 1.65 3.402.466 0 1.172-.737 2.105-2.21.934-1.473 1.432-2.593 1.504-3.37.133-1.277-.365-1.91-1.506-1.91-.53 0-1.08.125-1.65.364 1.1-3.59 3.186-5.333 6.277-5.23 2.273.073 3.35 1.556 3.227 4.46m13.755 7.034c-.933 1.764-2.22 3.37-3.86 4.803-2.24 1.93-4.47 2.905-6.7 2.905-1.037.002-1.826-.33-2.376-.994-.55-.663-.81-1.535-.777-2.603.03-1.1.372-2.8 1.025-5.104.654-2.303.976-3.537.976-3.703 0-.86-.3-1.297-.902-1.297-.198 0-.77.353-1.702 1.048l-1.152-1.35c1.07-.962 2.137-1.927 3.206-2.902 1.43-1.266 2.5-1.94 3.205-2.002 1.1-.103 1.91.23 2.428.976.518.747.705 1.722.58 2.915-.435 2.034-.902 4.607-1.4 7.73-.03 1.43.488 2.146 1.556 2.146.467 0 1.297-.498 2.5-1.483.996-.82 1.815-1.598 2.45-2.324l.942 1.244m-4.357-17.8c-.03.83-.446 1.628-1.255 2.395-.9.86-1.97 1.296-3.204 1.296-1.9 0-2.822-.83-2.75-2.49.032-.86.54-1.69 1.526-2.49.985-.797 2.074-1.19 3.278-1.19.705 0 1.286.27 1.753.82.467.54.684 1.1.653 1.66m35.612 17.8c-.933 1.763-2.22 3.37-3.86 4.802-2.24 1.93-4.47 2.904-6.7 2.904-2.168.002-3.216-1.202-3.153-3.598.03-1.07.238-2.355.622-3.85.384-1.503.59-2.665.623-3.505.03-1.265-.353-1.898-1.152-1.898-.87 0-1.91 1.036-3.112 3.1-1.276 2.168-1.96 4.274-2.064 6.308-.073 1.43.072 2.54.425 3.298-2.324.064-3.963-.32-4.886-1.15-.83-.737-1.212-1.95-1.15-3.652.03-1.068.198-2.137.488-3.205.29-1.07.457-2.023.488-2.853.062-1.234-.384-1.857-1.35-1.857-.84 0-1.74.955-2.706 2.853-.966 1.9-1.505 3.89-1.61 5.956-.06 1.867.053 3.174.364 3.9-2.293.062-3.92-.415-4.876-1.452-.798-.86-1.16-2.18-1.1-3.942.032-.86.188-2.075.457-3.62.28-1.546.425-2.75.457-3.62.062-.603-.083-.903-.446-.903-.197 0-.768.34-1.702 1.015l-1.203-1.348c.168-.135 1.216-1.1 3.156-2.905 1.4-1.297 2.354-1.97 2.852-2.002.872-.073 1.567.29 2.106 1.08.53.787.8 1.69.8 2.727 0 .332-.032.654-.105.954.497-.766 1.08-1.43 1.752-2 1.537-1.34 3.26-2.086 5.157-2.252 1.64-.135 2.8.25 3.505 1.152.57.736.83 1.784.8 3.153.237-.198.486-.416.746-.654.767-.903 1.514-1.62 2.25-2.148 1.235-.902 2.52-1.4 3.86-1.504 1.597-.135 2.75.25 3.454 1.152.602.726.87 1.774.8 3.143-.032.933-.26 2.28-.675 4.065-.416 1.773-.624 2.8-.624 3.07-.03.695.03 1.182.197 1.442.166.27.57.394 1.203.394.467 0 1.297-.497 2.5-1.482.996-.82 1.816-1.598 2.45-2.324l.963 1.254m18.765-.052c-.965 1.598-2.874 3.195-5.706 4.793-3.538 2.032-7.127 3.05-10.758 3.05-2.706 0-4.636-.904-5.808-2.7-.83-1.233-1.234-2.696-1.203-4.407.03-2.698 1.234-5.27 3.6-7.71 2.603-2.665 5.674-4.003 9.21-4.003 3.27 0 5 1.328 5.208 3.994.135 1.702-.798 3.445-2.8 5.24-2.137 1.96-4.824 3.215-8.06 3.744.6.83 1.504 1.245 2.707 1.245 2.396 0 5.02-.613 7.863-1.837 2.033-.86 3.63-1.753 4.803-2.676l.945 1.265m-11.36-5.228c.032-.892-.33-1.35-1.1-1.35-.994 0-2.01.686-3.048 2.066-1.038 1.38-1.567 2.697-1.598 3.962-.02 0-.02.218 0 .643 1.63-.6 3.05-1.514 4.242-2.738.966-1.058 1.463-1.92 1.505-2.583m24.946 1.868c-.135 3.072-1.265 5.717-3.402 7.947-2.135 2.23-4.79 3.35-7.955 3.35-2.635 0-4.637-.85-6.006-2.55-.997-1.267-1.557-2.854-1.65-4.752-.166-2.863.86-5.498 3.1-7.894 2.408-2.665 5.427-3.993 9.057-3.993 2.334 0 4.098.788 5.3 2.344 1.132 1.443 1.65 3.29 1.557 5.55m-5.664-.185c.03-.903-.094-1.733-.374-2.48-.28-.747-.695-1.13-1.224-1.13-1.702 0-3.102.923-4.202 2.76-.933 1.503-1.43 3.11-1.504 4.812-.03.84.114 1.577.446 2.21.364.736.882 1.1 1.556 1.1 1.505 0 2.79-.883 3.86-2.656.892-1.472 1.38-3.008 1.44-4.615h.002z"), Attribute(name: "fill" value: "#112233")]))), Text("\n "))), Text("\n \n "), Element(name: "nav" attributes: [Attribute(name: "class" value: "topnav_desktop_menu"), Attribute(name: "role" value: "navigation"), Attribute(name: "aria-label" value: "Main menu")] children: NodeSet(Text("\n "), Element(name: "ul" attributes: [Attribute(name: "class" value: "topnav_menu_desktop_main"), Attribute(name: "role" value: "menubar")] children: NodeSet(Text("\n\n \n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "class" value: "topnav_menu_join"), Attribute(name: "data-ga-event-click" value: "top_nav|join"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:join"), Attribute(name: "data-gtm-click" value: "top_nav_join_click"), Attribute(name: "href" value: "/join"), Attribute(name: "title" value: "Become a Vimeo member"), Attribute(name: "tabindex" value: "0"), Attribute(name: "rel" value: "toggle"), Attribute(name: "role" value: "button"), Attribute(name: "aria-owns" value: "topnav_join")] children: NodeSet(Text("\n Join "))), Text("\n\n "))), Text("\n \n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-lightbox"), Attribute(name: "data-lightbox-options" value: "id=registration_modal|cache=false"), Attribute(name: "data-ga-event-click" value: "top_nav|login"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:login"), Attribute(name: "data-gtm-click" value: "top_nav_login_click"), Attribute(name: "href" value: "/log_in"), Attribute(name: "title" value: "Log in to your account"), Attribute(name: "tabindex" value: "0"), Attribute(name: "rel" value: "toggle"), Attribute(name: "role" value: "button"), Attribute(name: "aria-owns" value: "topnav_login")] children: NodeSet(Text("\n Log in "))), Text("\n\n "))), Text("\n \n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "class" value: "topnav_has_dropdown topnav_icon_chevron_a"), Attribute(name: "data-ga-event-click" value: "top_nav|create|create"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:create|keyword:create"), Attribute(name: "data-gtm-click" value: "top_nav_create_click"), Attribute(name: "href" value: "/create"), Attribute(name: "title" value: ""), Attribute(name: "tabindex" value: "0"), Attribute(name: "rel" value: "toggle"), Attribute(name: "role" value: "button"), Attribute(name: "aria-owns" value: "topnav_create")] children: NodeSet(Text("\n Create "))), Text("\n\n "), Element(name: "ul" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown"), Attribute(name: "role" value: "menu"), Attribute(name: "aria-hidden" value: "true"), Attribute(name: "id" value: "topnav_create")] children: NodeSet(Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|create|membership_options"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:create|keyword:membership_options"), Attribute(name: "data-gtm-click" value: "top_nav_create_membership_options_click"), Attribute(name: "href" value: "/upgrade"), Attribute(name: "title" value: "Upgrade, or compare our plans")] children: NodeSet(Text("Membership options"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|create|sell"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:create|keyword:sell"), Attribute(name: "data-gtm-click" value: "top_nav_create_sell_click"), Attribute(name: "href" value: "/ondemand/startselling"), Attribute(name: "title" value: "Sell directly to your fans with Vimeo On Demand")] children: NodeSet(Text("Sell videos"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|create|video_school"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:create|keyword:video_school"), Attribute(name: "data-gtm-click" value: "top_nav_create_video_school_click"), Attribute(name: "href" value: "/videoschool"), Attribute(name: "title" value: "Learn how to make better videos")] children: NodeSet(Text("Video School"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|create|cameo"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:create|keyword:cameo"), Attribute(name: "data-gtm-click" value: "top_nav_create_cameo_click"), Attribute(name: "href" value: "/cameo"), Attribute(name: "title" value: "Create cinematic videos on your phone")] children: NodeSet(Text("Cameo"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|create|more"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:create|keyword:more"), Attribute(name: "data-gtm-click" value: "top_nav_create_more_click"), Attribute(name: "href" value: "/create"), Attribute(name: "title" value: "Discover more tools for video creators")] children: NodeSet(Text("More…"))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n \n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "class" value: "topnav_has_dropdown topnav_icon_chevron_a"), Attribute(name: "data-ga-event-click" value: "top_nav|watch|watch"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:watch|keyword:watch"), Attribute(name: "data-gtm-click" value: "top_nav_watch_click"), Attribute(name: "href" value: "/watch"), Attribute(name: "title" value: ""), Attribute(name: "tabindex" value: "0"), Attribute(name: "rel" value: "toggle"), Attribute(name: "role" value: "button"), Attribute(name: "aria-owns" value: "topnav_watch")] children: NodeSet(Text("\n Watch "))), Text("\n\n "), Element(name: "ul" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown"), Attribute(name: "role" value: "menu"), Attribute(name: "aria-hidden" value: "true"), Attribute(name: "id" value: "topnav_watch")] children: NodeSet(Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|watch|staff_picks"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:watch|keyword:staff_picks"), Attribute(name: "data-gtm-click" value: "top_nav_watch_staff_picks_click"), Attribute(name: "href" value: "/channels/staffpicks"), Attribute(name: "title" value: "The best videos on Vimeo, curated daily by our team")] children: NodeSet(Text("Staff Picks"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|watch|categories"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:watch|keyword:categories"), Attribute(name: "data-gtm-click" value: "top_nav_watch_categories_click"), Attribute(name: "href" value: "/categories"), Attribute(name: "title" value: "Browse videos by interest, genre, and more")] children: NodeSet(Text("Categories"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|watch|channels"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:watch|keyword:channels"), Attribute(name: "data-gtm-click" value: "top_nav_watch_channels_click"), Attribute(name: "href" value: "/channels"), Attribute(name: "title" value: "View video playlists created and curated by other members")] children: NodeSet(Text("Channels"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|watch|groups"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:watch|keyword:groups"), Attribute(name: "data-gtm-click" value: "top_nav_watch_groups_click"), Attribute(name: "href" value: "/groups"), Attribute(name: "title" value: "Watch and discuss videos with others")] children: NodeSet(Text("Groups"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|watch|apps"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:watch|keyword:app"), Attribute(name: "data-gtm-click" value: "top_nav_watch_apps_click"), Attribute(name: "href" value: "/everywhere"), Attribute(name: "title" value: "Watch Vimeo videos on TVs, phones, tablets, and more")] children: NodeSet(Text("Apps"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|watch|more"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:watch|keyword:more"), Attribute(name: "data-gtm-click" value: "top_nav_watch_more_click"), Attribute(name: "href" value: "/watch"), Attribute(name: "title" value: "Discover more ways to watch on Vimeo")] children: NodeSet(Text("More…"))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n \n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "class" value: "topnav_has_dropdown topnav_is_ondemand topnav_icon_chevron_a"), Attribute(name: "data-ga-event-click" value: "top_nav|ondemand|ondemand"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:on_demand|keyword:on_demand"), Attribute(name: "data-gtm-click" value: "top_nav_ondemand_click"), Attribute(name: "href" value: "/ondemand"), Attribute(name: "title" value: "Watch movies, series, and more"), Attribute(name: "tabindex" value: "0"), Attribute(name: "rel" value: "toggle"), Attribute(name: "role" value: "button"), Attribute(name: "aria-owns" value: "topnav_ondemand")] children: NodeSet(Text("\n On Demand "))), Text("\n\n "), Element(name: "ul" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown"), Attribute(name: "role" value: "menu"), Attribute(name: "aria-hidden" value: "true"), Attribute(name: "id" value: "topnav_ondemand")] children: NodeSet(Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|ondemand|whats_new"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:on_demand|keyword:whats_new"), Attribute(name: "data-gtm-click" value: "top_nav_ondemand_whats_new_click"), Attribute(name: "href" value: "/ondemand"), Attribute(name: "title" value: "See new and noteworthy titles added to On Demand")] children: NodeSet(Text("What’s new"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|ondemand|discover"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:on_demand|keyword:discover"), Attribute(name: "data-gtm-click" value: "top_nav_ondemand_discover_click"), Attribute(name: "href" value: "/ondemand/discover"), Attribute(name: "title" value: "Discover titles our team recommends")] children: NodeSet(Text("Discover"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|ondemand|genres"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:on_demand|keyword:genres"), Attribute(name: "data-gtm-click" value: "top_nav_ondemand_genres_click"), Attribute(name: "href" value: "/ondemand/browse"), Attribute(name: "title" value: "Browse titles by genre")] children: NodeSet(Text("Genres"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|ondemand|start_selling"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:on_demand|keyword:start_selling"), Attribute(name: "data-gtm-click" value: "top_nav_ondemand_sell_click"), Attribute(name: "href" value: "/ondemand/startselling"), Attribute(name: "title" value: "Sell directly to your fans with Vimeo On Demand")] children: NodeSet(Text("Start selling"))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n \n "))), Text("\n "))), Comment(" /.topnav_desktop_menu "), Text("\n \n "), Element(name: "div" attributes: [Attribute(name: "class" value: "topnav_menu_right")] children: NodeSet(Text("\n\n "), Element(name: "form" attributes: [Attribute(name: "class" value: "topnav_menu_search"), Attribute(name: "action" value: "/search"), Attribute(name: "method" value: "get"), Attribute(name: "role" value: "search"), Attribute(name: "data-ds-protection")] children: NodeSet(Text("\n "), Element(name: "input" attributes: [Attribute(name: "class" value: "topnav_menu_search_input js-topnav_menu_search_input js-search_autocomplete"), Attribute(name: "type" value: "text"), Attribute(name: "name" value: "q"), Attribute(name: "value" value: ""), Attribute(name: "aria-label" value: "Search videos, people, and more"), Attribute(name: "placeholder" value: "Search videos, people, and more"), Attribute(name: "autocomplete" value: "off")]), Element(name: "button" attributes: [Attribute(name: "class" value: "topnav_menu_search_submit topnav_icon_search_b"), Attribute(name: "type" value: "submit")]), Text("\n "))), Text("\n \n \n \n "), Element(name: "a" attributes: [Attribute(name: "class" value: "topnav_desktop_upload topnav_icon_upload_b"), Attribute(name: "href" value: "/upload"), Attribute(name: "title" value: "Upload your videos"), Attribute(name: "role" value: "button"), Attribute(name: "data-fatal-attraction" value: "component:top_nav|keyword:upload"), Attribute(name: "data-ga-event-click" value: "button|navbar_upload"), Attribute(name: "data-gtm-click" value: "top_nav_upload_click")] children: NodeSet(Element(name: "span" children: NodeSet(Text("Upload"))))), Text("\n "))), Comment(" /.topnav_menu_right "), Text("\n "))), Comment(" /.topnav_desktop_wrapper "), Text("\n"))), Text("\n\n "), Element(name: "nav" attributes: [Attribute(name: "id" value: "topnav_mobile"), Attribute(name: "class" value: "topnav_mobile "), Attribute(name: "role" value: "banner")] children: NodeSet(Text("\n\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "topnav_mobile_bar")] children: NodeSet(Text("\n "), Element(name: "button" attributes: [Attribute(name: "class" value: "topnav_mobile_button topnav_mobile_pull_left topnav_mobile_header_logo js-topnav_mobile_header_logo topnav_icon_mobile_vlogo_b")] children: NodeSet(Text("\n "))), Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/search"), Attribute(name: "class" value: "topnav_mobile_button topnav_mobile_pull_right topnav_mobile_header_search topnav_icon_mobile_search_b")] children: NodeSet(Text(" "))), Text("\n "), Element(name: "h1" attributes: [Attribute(name: "class" value: "topnav_mobile_header_title")]), Text("\n "))), Text("\n\n "), Element(name: "section" attributes: [Attribute(name: "class" value: "topnav_mobile_menu js-topnav_mobile_menu_main")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "topnav_mobile_bar")] children: NodeSet(Text("\n "), Element(name: "button" attributes: [Attribute(name: "class" value: "topnav_mobile_button topnav_mobile_pull_left js-topnav_mobile_header_close topnav_icon_mobile_x_b")] children: NodeSet(Text(" "))), Text("\n "), Element(name: "button" attributes: [Attribute(name: "class" value: "topnav_mobile_button topnav_mobile_pull_right js-topnav_mobile_header_settings topnav_icon_mobile_gear_b")] children: NodeSet(Text(" "))), Text("\n "))), Text("\n\n "), Element(name: "ul" children: NodeSet(Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "menu.close"), Attribute(name: "class" value: "topnav_icon_mobile_channel_b "), Attribute(name: "href" value: "/")] children: NodeSet(Text("\n Staff Picks "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "last_page"), Attribute(name: "data-breeze-ignore"), Attribute(name: "class" value: "topnav_icon_mobile_avatar_b "), Attribute(name: "href" value: "/join")] children: NodeSet(Text("\n "), Element(name: "span" attributes: [Attribute(name: "class" value: "menu_auth")] children: NodeSet(Text("Join or log in"))), Text(" "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-breeze-ignore"), Attribute(name: "class" value: "topnav_icon_mobile_star_b"), Attribute(name: "href" value: "/watch")] children: NodeSet(Text("\n Watch "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "onclick" value: "vimeo.mobile.desktop_shared._upload(this); return false;"), Attribute(name: "data-breeze-ignore"), Attribute(name: "class" value: "topnav_icon_mobile_upload_b"), Attribute(name: "href" value: "/upload")] children: NodeSet(Text("\n Upload "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-breeze-ignore"), Attribute(name: "class" value: "topnav_icon_mobile_vod_b "), Attribute(name: "href" value: "/ondemand")] children: NodeSet(Text("\n On Demand "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "menu.close"), Attribute(name: "class" value: "topnav_icon_mobile_forgot_b "), Attribute(name: "href" value: "/help/faq")] children: NodeSet(Text("\n Help "))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n\n "), Element(name: "section" attributes: [Attribute(name: "class" value: "topnav_mobile_menu topnav_mobile_menu_settings js-topnav_mobile_menu_settings")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "topnav_mobile_bar")] children: NodeSet(Text("\n "), Element(name: "button" attributes: [Attribute(name: "class" value: "topnav_mobile_button topnav_mobile_pull_left js-topnav_mobile_header_settins_close topnav_icon_mobile_arrowleft_b")] children: NodeSet(Text(" "))), Text("\n "), Element(name: "h2" attributes: [Attribute(name: "class" value: "topnav_mobile_header_title")] children: NodeSet(Text("More stuff"))), Text("\n "))), Text("\n\n "), Element(name: "ul" children: NodeSet(Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "menu.close"), Attribute(name: "class" value: " "), Attribute(name: "href" value: "/terms")] children: NodeSet(Text("\n Terms of Service "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "menu.close"), Attribute(name: "class" value: " "), Attribute(name: "href" value: "/privacy")] children: NodeSet(Text("\n Privacy Policy "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "menu.close"), Attribute(name: "class" value: " "), Attribute(name: "href" value: "/dmca")] children: NodeSet(Text("\n Copyright "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "menu.close"), Attribute(name: "class" value: " "), Attribute(name: "href" value: "/cookie_policy")] children: NodeSet(Text("\n Cookies "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "desktop"), Attribute(name: "onclick" value: "vimeo.mobile.desktop_shared._s2ds(); return false"), Attribute(name: "href" value: "javascript:void(0)")] children: NodeSet(Text("\n Desktop site "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "language"), Attribute(name: "href" value: "#")] children: NodeSet(Text("\n Language "))), Text("\n "), Element(name: "select" attributes: [Attribute(name: "onchange" value: "vimeo.mobile.desktop_shared._s2l(this)"), Attribute(name: "title" value: "Choose a different language"), Attribute(name: "class" value: "topnav_mobile_menu_settings_language")] children: NodeSet(Text("\n "), Element(name: "option" attributes: [Attribute(name: "class" value: "selected"), Attribute(name: "selected"), Attribute(name: "value" value: "en"), Attribute(name: "name" value: "select_language")] children: NodeSet(Text("\n English "))), Text("\n "), Element(name: "option" attributes: [Attribute(name: "value" value: "es"), Attribute(name: "name" value: "select_language")] children: NodeSet(Text("\n Español "))), Text("\n "), Element(name: "option" attributes: [Attribute(name: "value" value: "de-DE"), Attribute(name: "name" value: "select_language")] children: NodeSet(Text("\n Deutsch "))), Text("\n "), Element(name: "option" attributes: [Attribute(name: "value" value: "fr-FR"), Attribute(name: "name" value: "select_language")] children: NodeSet(Text("\n Français "))), Text("\n "), Element(name: "option" attributes: [Attribute(name: "value" value: "ja-JP"), Attribute(name: "name" value: "select_language")] children: NodeSet(Text("\n 日本語 "))), Text("\n "), Element(name: "option" attributes: [Attribute(name: "value" value: "pt-BR"), Attribute(name: "name" value: "select_language")] children: NodeSet(Text("\n Português "))), Text("\n "), Element(name: "option" attributes: [Attribute(name: "value" value: "ko-KR"), Attribute(name: "name" value: "select_language")] children: NodeSet(Text("\n 한국어 "))), Text("\n "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "menu.close"), Attribute(name: "class" value: " "), Attribute(name: "href" value: "/faq")] children: NodeSet(Text("\n FAQ "))), Text("\n "))), Text("\n "))), Text("\n\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "topnav_mobile_menu_copyright")] children: NodeSet(Text("TM + © 2015 Vimeo, LLC"))), Text("\n "))), Text("\n"))), Text("\n\n"), Element(name: "script" children: NodeSet(Text("\n!function(e,t){e.vimeo=e.vimeo||{},vimeo.mobile=vimeo.mobile||{},Vimeo=vimeo.mobile||{},Vimeo.desktop_shared=Vimeo.desktop_shared||{};var o=t.getElementById(\"topnav_desktop\"),n=\"ontouchstart\"in e?\"touchstart\":e.PointerEvent?\"pointerdown\":e.MSPointerEvent?\"MSPointerDown\":\"click\";\"click\"!==n&&o.addEventListener(n,function(e){var t=\"img\"===e.target.tagName.toLowerCase()?e.target.parentNode:e.target;t.classList.contains(\"topnav_has_dropdown\")&&(e.preventDefault(),e.stopPropagation())},!1),Vimeo.desktop_shared._upload=function(o){if(/iPad|iPhone|iPod/.test(navigator.userAgent)){var n,a,i=\"vimeo://app.vimeo.com/upload?ref=mobileweb\",s=\"/upload\",r=[\"_trackEvent\",\"vimeo\",\"mobile_menu\",\"upload\"];return n=function(){t.webkitHidden||(e.location=s)},a=function(){e.location=i,setTimeout(n,25),e._gaq.push([\"_set\",\"hitCallback\",null])},e._gaq?(e._gaq.push([\"_set\",\"hitCallback\",a]),e._gaq.push(r)):a(),!1}e.location=o.href},Vimeo.desktop_shared._s2ds=function(){t.cookie=\"opt_out_mobile=1;expires=Fri, 31 Dec 9999 23:59:59 GMT;domain=\"+vimeo.domain,e.location.reload()},Vimeo.desktop_shared._s2l=function(t){var o=t.value,n=new XMLHttpRequest;n.open(\"POST\",\"/settings/locale\"),n.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\"),n.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded\"),n.send(\"locale=\"+o+\"&token=\"+vimeo.xsrft),n.onload=function(){200===n.status&&e.location.reload()}};var a=\"click\",i=\"block\",s=\"none\",r=t.querySelector(\".js-topnav_mobile_header_logo\");r&&r.addEventListener(a,function(e){e.stopPropagation(),e.preventDefault();var o=t.querySelector(\".js-topnav_mobile_menu_main\");o.style.display=i;var n=t.querySelector(\".js-topnav_mobile_header_close\");n.addEventListener(a,function(e){e.stopPropagation(),e.preventDefault(),o.style.display=s});var r=t.querySelector(\".js-topnav_mobile_menu_settings\"),l=t.querySelector(\".js-topnav_mobile_header_settings\");l.addEventListener(a,function(e){e.stopPropagation(),e.preventDefault(),r.style.display=i,o.style.display=s;var n=t.querySelector(\".js-topnav_mobile_header_settins_close\");n.addEventListener(a,function(e){e.stopPropagation(),e.preventDefault(),r.style.display=s,o.style.display=i})})},!1),setTimeout(function(){function e(e){var t=new XMLHttpRequest;t.open(\"POST\",\"/settings/nav\"),t.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\"),t.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded\"),t.send(\"message_state=\"+e+\"&token=\"+vimeo.xsrft),t.onload=function(){}}var o=t.getElementById(\"topnav_menu_avatar\");if(o){var n=o.querySelector(\".topnav_menu_avatar_bubble\"),a=(o.querySelector(\"#topnav_user_dropdown\"),!1);n&&n.classList.add(\"on\"),o.addEventListener(\"mouseover\",function(){a||(a=!0,n&&n.classList.remove(\"on\"),e(1))},!1)}},1e3)}(window,document);\n"))), Text("\n\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "wrap_content")] children: NodeSet(Text("\n \n"), Element(name: "script" children: NodeSet(Text("\n!function(i){if(void 0===i.vimeo||void 0===i.vimeo.clips){i.vimeo=i.vimeo||{},i.vimeo.clips=i.vimeo.clips||{};var e=new XMLHttpRequest;e.open(\"GET\",\"https://player.vimeo.com/video/898029/config?autoplay=0&byline=0&collections=1&context=clip.main_beta&default_to_hd=1&outro=beginning&portrait=0&title=0&watch_trailer=0&s=4011bdbdf85ab88f7a2543448d3a3bf0d767d9da\",!0),e.onload=function(){i.vimeo.clips[\"898029\"]=JSON.parse(e.responseText)},e.withCredentials=!0,e.send()}}(window);\n"))), Text("\n\n\n"), Element(name: "main" attributes: [Attribute(name: "id" value: "main"), Attribute(name: "class" value: "is_loading")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "player_area")] children: NodeSet(Text("\n "), Element(name: "noscript" children: NodeSet(Text("\n "), Element(name: "img" attributes: [Attribute(name: "src" value: "https://i.vimeocdn.com/video/34373130.jpg?mw=1920&mh=1080&q=70"), Attribute(name: "alt" value: ""), Attribute(name: "style" value: "display: block; margin: 0 auto; max-height: 540px;")]), Text("\n "))), Text("\n \n "))), Text("\n\n "), Element(name: "noscript" children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "clip-content")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "medium-24 clip-content-main columns u-collapse")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "row u-collapse clip-notification"), Attribute(name: "style" value: "margin-top: 1em; margin-bottom: 1.5em;")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "iris_notification iris_notification-clip iris_notification-clip--caution iris_notification--no-close clearfix"), Attribute(name: "style" value: "margin-bottom: 0;")] children: NodeSet(Text("\n "), Element(name: "p" children: NodeSet(Text("Please enable JavaScript to experience Vimeo in all of its glory."))), Text("\n "))), Text("\n "))), Text("\n\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "row")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "medium-24 columns")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "clip_info")] children: NodeSet(Text("\n "), Element(name: "h1" attributes: [Attribute(name: "class" value: "clip_info-header")] children: NodeSet(Text("Cherry Bloom - King Of The Knife"))), Text("\n "))), Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "clip_info-subline--watch clip_info-subline--inline")] children: NodeSet(Text("\n "), Element(name: "p" attributes: [Attribute(name: "class" value: "userbyline-subline userbyline-subline--lg")] children: NodeSet(Text("\n "), Element(name: "span" children: NodeSet(Text("from"))), Text("\n "), Element(name: "span" attributes: [Attribute(name: "class" value: "userlink userlink--md")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/octave")] children: NodeSet(Text("Octave Zangs"))), Text("\n "), Element(name: "span" attributes: [Attribute(name: "style" value: "display: inline-block")] children: NodeSet(Text("\n "))), Text("\n "))), Text("\n "))), Text("\n "), Element(name: "span" attributes: [Attribute(name: "class" value: "clip_info-time")] children: NodeSet(Element(name: "time" attributes: [Attribute(name: "datetime" value: "2008-04-14T13:10:39-04:00"), Attribute(name: "title" value: "Monday, April 14, 2008 at 1:10 PM")] children: NodeSet(Text("7 years ago"))))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "medium-24 columns u-collapse")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "clip_details iris_divider--dark iris_divider-top iris_divider-top--m iris_divider-bot iris_divider-bot--m u-collapse clearfix")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "row u-collapse")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "medium-24 columns")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "clip_details-description description-wrapper iris_desc")] children: NodeSet(Text("\n "), Element(name: "p" attributes: [Attribute(name: "class" value: "first")] children: NodeSet(Text("The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout "), Element(name: "a" attributes: [Attribute(name: "href" value: "http://www.cherrybloom.net"), Attribute(name: "target" value: "_blank"), Attribute(name: "rel" value: "nofollow")] children: NodeSet(Text("cherrybloom.net"))))), Text(" "))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n \n "), Element(name: "script" children: NodeSet(Text("\n window.vimeo = window.vimeo || {};\n window.vimeo.clip_page_config = {\"clip\":{\"id\":898029,\"title\":\"Cherry Bloom - King Of The Knife\",\"description\":\"<p class=\\\"first\\\">The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout <a href=\\\"http:\\/\\/www.cherrybloom.net\\\" target=\\\"_blank\\\" rel=\\\"nofollow\\\">cherrybloom.net<\\/a><\\/p>\",\"uploaded_on\":\"2008-04-14 13:10:39\",\"uploaded_on_relative\":\"7 years ago\",\"uploaded_on_full\":\"Monday, April 14, 2008 at 1:10 PM EST\",\"privacy\":{\"is_public\":true,\"type\":\"anybody\",\"description\":\"Public\"},\"duration\":{\"raw\":175,\"formatted\":\"02:55\"},\"is_liked\":false},\"owner\":{\"id\":206215,\"display_name\":\"Octave Zangs\",\"account_type\":\"\",\"badge\":null,\"portrait\":{\"src\":\"https:\\/\\/i.vimeocdn.com\\/portrait\\/2577152_75x75.jpg\",\"src_2x\":\"https:\\/\\/i.vimeocdn.com\\/portrait\\/2577152_150x150.jpg\"},\"url\":\"\\/octave\",\"is_following\":false},\"ondemand\":null,\"brand_channel\":null,\"cur_user\":null,\"status\":{\"state\":\"ready\"},\"copyright_status\":{\"is_blocked\":false,\"title\":null,\"message\":null,\"infringements\":null},\"content_block_status\":{\"is_blocked\":false,\"message\":null,\"continuous_play_enabled\":false},\"player\":{\"config_url\":\"https:\\/\\/player.vimeo.com\\/video\\/898029\\/config?autoplay=0&byline=0&collections=1&context=clip.main_beta&default_to_hd=1&outro=beginning&portrait=0&title=0&watch_trailer=0&s=4011bdbdf85ab88f7a2543448d3a3bf0d767d9da\",\"player_url\":\"player.vimeo.com\",\"dimensions\":{\"height\":540,\"width\":960},\"poster\":{\"url\":\"https:\\/\\/i.vimeocdn.com\\/video\\/34373130.jpg?mw=2000&mh=1080&q=70\"}},\"continuous_play_enabled\":true,\"thumbnail\":{\"src\":\"https:\\/\\/i.vimeocdn.com\\/video\\/34373130_190x107.jpg\",\"src_2x\":\"https:\\/\\/i.vimeocdn.com\\/video\\/34373130_380x214.jpg\",\"width\":190,\"height\":107},\"ads\":{\"sponsored_links\":{\"pub_id\":\"iwon-vimeo\",\"keywords\":\"cherry bloom secret sounds king of the knife rock alternative\"},\"display_ad\":{\"network_id\":\"54549544\",\"unit_name\":\"clip\",\"sizes\":[300,250],\"custom_targeting\":{\"content_rating\":{}}}},\"content_rating\":null,\"stat_counts\":{\"total_likes\":{\"raw\":11,\"formatted\":\"11\"},\"total_credits\":{\"raw\":1,\"formatted\":\"1\"},\"total_collections\":{\"raw\":1,\"formatted\":\"1\"},\"total_plays\":{\"raw\":4707,\"formatted\":\"4,707\"}},\"notifications\":[],\"categories_config\":{\"categories\":null,\"total_categories\":0},\"music_track\":null,\"credits\":{\"total_credits\":0},\"tags\":[\"cherry bloom\",\"secret sounds\",\"king of the knife\",\"rock\",\"alternative\"],\"api_app\":null,\"cc_license\":null,\"additional_content\":{\"clips\":[],\"context_name\":\"\",\"context_url\":\"\",\"view_all_url\":\"\"}};\n "))), Text("\n"))), Text("\n\n"), Element(name: "div" attributes: [Attribute(name: "class" value: "hide")] children: NodeSet(Text("\n "))), Text("\n\n"), Element(name: "script" children: NodeSet(Text("\nconsole.log('%c \\n\\\n⎜ @@@& @@@@@@\\n\\\n⎜ \#@@@@@@@ &@@@@@@@@ Built using:\\n\\\n⎜ \#@@@@@@@@@. %%&@@@@@@@ • React + Flux\\n\\\n⎜ &@@@@@% (@@@@@( • ES6\\n\\\n⎜ @@@@@@ @@@@@@ • Fetch API\\n\\\n⎜ %@@@@@( .@@@@@( • Flexbox\\n\\\n⎜ @@@@@@(@@@@@@\\n\\\n⎜ /@@@@@@@@@@% Like playing with new technology, too?\\n\\\n⎜ &@@@@@@@% https://vimeo.com/jobs\\n\\\n⎜ @@@@@#\\n\\\n\\n\\\n', 'color: #00adef;');\n"))), Text("\n "))), Text("\n\n "), Element(name: "footer" attributes: [Attribute(name: "id" value: "mobile_footer_container"), Attribute(name: "class" value: "site_footer js-comment_scroller_floor")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "row l-clearfix")] children: NodeSet(Text("\n "), Element(name: "section" attributes: [Attribute(name: "class" value: "footer_pillar medium-4 column l-collapse-lts")] children: NodeSet(Text("\n "), Element(name: "h4" attributes: [Attribute(name: "class" value: "blue js-footer_heading")] children: NodeSet(Text("Vimeo"))), Text("\n "), Element(name: "ul" children: NodeSet(Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/about"), Attribute(name: "data-ga-event-click" value: "footer|about_vimeo"), Attribute(name: "data-gtm-click" value: "footer_link_about_click")] children: NodeSet(Text("\n About Vimeo "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/blog"), Attribute(name: "data-ga-event-click" value: "footer|vimeo_blog"), Attribute(name: "data-gtm-click" value: "footer_link_vimeo_blog_click")] children: NodeSet(Text("\n Vimeo Blog "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/help/guidelines"), Attribute(name: "data-ga-event-click" value: "footer|vimeo_guidelines"), Attribute(name: "data-gtm-click" value: "footer_link_vimeo_guidelines_click")] children: NodeSet(Text("\n Vimeo Guidelines "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "http://developer.vimeo.com"), Attribute(name: "data-ga-event-click" value: "footer|developers"), Attribute(name: "data-gtm-click" value: "footer_link_developers_click")] children: NodeSet(Text("\n Developers "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/jobs"), Attribute(name: "data-ga-event-click" value: "footer|jobs"), Attribute(name: "data-gtm-click" value: "footer_link_jobs_click")] children: NodeSet(Text("\n Jobs "))), Text("\n "))), Text("\n "))), Text("\n"))), Text("\n\n"), Element(name: "section" attributes: [Attribute(name: "class" value: "footer_pillar medium-4 column")] children: NodeSet(Text("\n "), Element(name: "h4" attributes: [Attribute(name: "class" value: "yellow js-footer_heading")] children: NodeSet(Text("Help"))), Text("\n "), Element(name: "ul" children: NodeSet(Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/help"), Attribute(name: "data-ga-event-click" value: "footer|help_center"), Attribute(name: "data-gtm-click" value: "footer_link_help_center_click")] children: NodeSet(Text("\n Help Center "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "))), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/videoschool"), Attribute(name: "data-ga-event-click" value: "footer|video_school"), Attribute(name: "data-gtm-click" value: "footer_link_video_school_click")] children: NodeSet(Text("\n Video School "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/help/faq"), Attribute(name: "data-ga-event-click" value: "footer|faq"), Attribute(name: "data-gtm-click" value: "footer_link_faq_click")] children: NodeSet(Text("\n FAQ "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/forums"), Attribute(name: "data-ga-event-click" value: "footer|forums"), Attribute(name: "data-gtm-click" value: "footer_link_forums_click")] children: NodeSet(Text("\n Forums "))), Text("\n "))), Text("\n "))), Text("\n"))), Text("\n\n"), Element(name: "section" attributes: [Attribute(name: "class" value: "footer_pillar medium-4 column")] children: NodeSet(Text("\n "), Element(name: "h4" attributes: [Attribute(name: "class" value: "green js-footer_heading")] children: NodeSet(Element(name: "span" children: NodeSet(Text("More"))))), Text("\n "), Element(name: "ul" children: NodeSet(Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/ondemand"), Attribute(name: "data-ga-event-click" value: "footer|on_demand"), Attribute(name: "data-gtm-click" value: "footer_link_on_demand_click")] children: NodeSet(Text("\n On Demand "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/everywhere"), Attribute(name: "data-ga-event-click" value: "footer|everywhere"), Attribute(name: "data-gtm-click" value: "footer_link_everywhere_click")] children: NodeSet(Text("\n Everywhere "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/upload"), Attribute(name: "data-ga-event-click" value: "footer|upload"), Attribute(name: "data-gtm-click" value: "footer_link_upload_click")] children: NodeSet(Text("\n Upload "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/site_map"), Attribute(name: "data-ga-event-click" value: "footer|site_map"), Attribute(name: "data-gtm-click" value: "footer_link_site_map_click")] children: NodeSet(Text("\n Site Map "))), Text("\n "))), Text("\n "))), Text("\n"))), Text("\n\n"), Element(name: "section" attributes: [Attribute(name: "class" value: "footer_pillar medium-4 column")] children: NodeSet(Text("\n "), Element(name: "h4" attributes: [Attribute(name: "class" value: "pink js-footer_heading")] children: NodeSet(Text("Upgrade"))), Text("\n "), Element(name: "ul" children: NodeSet(Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/plus?v=footer"), Attribute(name: "data-ga-conversion-id" value: "9295"), Attribute(name: "data-ga-event-click" value: "footer|vimeo_plus"), Attribute(name: "data-gtm-click" value: "footer_link_vimeo_plus_click")] children: NodeSet(Text("\n Vimeo Plus "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/pro?v=footer"), Attribute(name: "data-ga-conversion-id" value: "9296"), Attribute(name: "data-ga-event-click" value: "footer|vimeo_pro"), Attribute(name: "data-gtm-click" value: "footer_link_vimeo_pro_click")] children: NodeSet(Text("\n Vimeo PRO "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/business"), Attribute(name: "data-ga-conversion-id" value: "9297"), Attribute(name: "data-ga-event-click" value: "footer|vimeo_for_business"), Attribute(name: "data-gtm-click" value: "footer_link_vimeo_for_business_click")] children: NodeSet(Text("\n Vimeo for Business "))), Text("\n "))), Text("\n "))), Text("\n"))), Text("\n\n "), Element(name: "aside" attributes: [Attribute(name: "id" value: "footer_tip"), Attribute(name: "class" value: "footer_tip medium-8 column"), Attribute(name: "aria-live" value: "polite")] children: NodeSet(Text("\n "), Element(name: "h4" children: NodeSet(Text("Did you know?"))), Text("\n "), Element(name: "button" attributes: [Attribute(name: "type" value: "button"), Attribute(name: "class" value: "iconify_resume_b get_tip"), Attribute(name: "data-ga-event-click" value: "button|refresh|did_you_know"), Attribute(name: "data-gtm-click" value: "footer_tip_refresh_click"), Attribute(name: "id" value: "get_tip")] children: NodeSet(Element(name: "span" attributes: [Attribute(name: "class" value: "offstage")] children: NodeSet(Text("Show another tip"))))), Text("\n "), Element(name: "p" attributes: [Attribute(name: "class" value: "active")] children: NodeSet(Text("Your video’s thumbnail and description matter. "), Element(name: "a" attributes: [Attribute(name: "href" value: "/videoschool/lesson/272/vimeo-curator-tips-your-thumbnails-and-descriptions")] children: NodeSet(Text("Our curators tell you why."))))), Text("\n "), Element(name: "p" children: NodeSet(Text("Frame rate and shutter speed are commonly confused. It’s time to "), Element(name: "a" attributes: [Attribute(name: "href" value: "/videoschool/lesson/56/frame-rate-vs-shutter-speed-setting-the-record-straight")] children: NodeSet(Text("set the record straight"))), Text("!"))), Text("\n"))), Text("\n "))), Text("\n"))), Text("\n \n \n "), Element(name: "footer" attributes: [Attribute(name: "class" value: "footers_footer")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "row")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "legal small-24 medium-16 column")] children: NodeSet(Text("\n "), Element(name: "p" attributes: [Attribute(name: "class" value: "footer_copyright")] children: NodeSet(Text("TM + © 2015 "), Element(name: "a" attributes: [Attribute(name: "href" value: "/")] children: NodeSet(Text("Vimeo"))), Text(", LLC. All rights reserved."))), Text("\n "), Element(name: "ul" attributes: [Attribute(name: "class" value: "inline_list dot_list")] children: NodeSet(Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/terms"), Attribute(name: "title" value: "Terms & Conditions")] children: NodeSet(Text("\n Terms "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/privacy"), Attribute(name: "title" value: "Privacy Policy")] children: NodeSet(Text("\n Privacy "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/dmca"), Attribute(name: "title" value: "Copyright Information")] children: NodeSet(Text("\n Copyright "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/cookie_policy"), Attribute(name: "title" value: "Learn more about how Vimeo uses cookies")] children: NodeSet(Text("\n Cookies "))), Text("\n "))), Text("\n\n "))), Text("\n "), Element(name: "p" attributes: [Attribute(name: "class" value: "with_love")] children: NodeSet(Text("\n Made with "), Element(name: "a" attributes: [Attribute(name: "href" value: "/love"), Attribute(name: "class" value: "iconify loveo"), Attribute(name: "title" value: "Love")] children: NodeSet(Text("k"))), Text(" in "), Element(name: "abbr" attributes: [Attribute(name: "title" value: "New York City")] children: NodeSet(Text("NYC"))), Text(". "))), Text("\n "))), Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "column small-24 medium-8")] children: NodeSet(Text("\n "), Element(name: "span" attributes: [Attribute(name: "class" value: "contentfilter iconify_lens_b")] children: NodeSet(Text("Mature content filter: "), Element(name: "a" attributes: [Attribute(name: "href" value: "javascript:void(0)"), Attribute(name: "onclick" value: "vimeo.Modal.create({content: '/settings/contentrating'})"), Attribute(name: "title" value: "Change your mature content filter")] children: NodeSet(Text("None"))))), Text("\n \n "), Element(name: "span" attributes: [Attribute(name: "class" value: "language")] children: NodeSet(Text("\n Language:\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "#language"), Attribute(name: "onclick" value: "vimeo.Modal.create({content: '/settings/locale', size: 'small'}); return false;"), Attribute(name: "title" value: "Choose a different language")] children: NodeSet(Text("\n English "))), Text("\n "))), Text("\n\n "))), Text("\n "))), Text("\n"))), Text("\n\n "))), Text("\n\n \n \n "), Element(name: "script" attributes: [Attribute(name: "type" value: "application/ld+json")] children: NodeSet(Text("\n [{\"url\":\"https://vimeo.com/898029\",\"thumbnailUrl\":\"https://i.vimeocdn.com/video/34373130_1280x720.jpg\",\"embedUrl\":\"https://player.vimeo.com/video/898029\",\"name\":\"Cherry Bloom - King Of The Knife\",\"description\":\"The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout http://www.cherrybloom.net\",\"height\":360,\"width\":640,\"playerType\":\"HTML5 Flash\",\"videoQuality\":\"SD\",\"duration\":\"PT00H02M55S\",\"uploadDate\":\"2008-04-14T13:10:39-04:00\",\"interactionCount\":4707,\"thumbnail\":{\"@type\":\"ImageObject\",\"url\":\"https://i.vimeocdn.com/video/34373130_1280x720.jpg\",\"width\":1280,\"height\":720},\"author\":{\"@type\":\"Person\",\"name\":\"Octave Zangs\",\"url\":\"https://vimeo.com/octave\"},\"potentialAction\":{\"@type\":\"ViewAction\",\"target\":\"vimeo://app.vimeo.com/videos/898029\"},\"keywords\":[\"cherry bloom\",\"secret sounds\",\"king of the knife\",\"rock\",\"alternative\"],\"@type\":\"VideoObject\",\"@context\":\"http://schema.org\"},{\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@id\":\"https://vimeo.com/octave\",\"name\":\"Octave Zangs\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@id\":\"https://vimeo.com/octave/videos\",\"name\":\"Videos\"}}],\"@type\":\"BreadcrumbList\",\"@context\":\"http://schema.org\"}] "))), Text("\n\n"), Element(name: "script" children: NodeSet(Text("\n var __fa = __fa || [];\n __fa.push(['trackPageview']);\n\n // Analytics Setup\n var _comscore = _comscore || [],\n _gaq = _gaq || [],\n _gtm = _gtm || [],\n _initial_gtm_state = {\"clip_id\":898029,\"creator_id\":206215,\"category\":\"\",\"staff_pick\":\"no\",\"language\":\"en\",\"user_status\":\"logged_out\",\"ga_universal_id\":\"UA-76641-64\",\"ga_classic_id\":\"UA-76641-8\"};\n\n _comscore.push({\n c1: \"2\",\n c2: \"10348289\"\n });\n\n _gaq.push(['_require', 'inpage_linkid', '//www.google-analytics.com/plugins/ga/inpage_linkid.js']);\n _gaq.push(['_setAccount', \"UA-76641-8\"]);\n _gaq.push(['_gat._anonymizeIp']);\n\n _gaq.push(['_setDomainName', 'vimeo.com']);\n \n _gaq.push(['_setAllowLinker', true]);\n _gaq.push(['_setAllowAnchor', true]);\n\n \n function trackHouseAd() {\n var ga_l = document.location;\n var ga_r = document.referrer;\n var ga_s = ga_l.search;\n\n if (ga_s.indexOf('house_ad') > -1) {\n var house_ad_value = ga_s.match(/house_ad=([^&]+)/)[1];\n\n _gaq.push(['_trackEvent', 'engagement:house-ad', house_ad_value, ga_r, undefined, true]);\n _gaq.push(['_setCustomVar', 8, 'house_ad', house_ad_value, 1]);\n }\n }\n\n trackHouseAd();\n\n \n _gaq.push(['_setCustomVar', 1, 'user_status', 'logged_out', 3]);\n _gaq.push(['_setCustomVar', 4, 'language', 'en', 3]);\n _gaq.push(['_setCustomVar', 3, 'ms', '0', 1]);\n _gaq.push(['_setCustomVar', 10, 'vuid', document.cookie.replace(/(?:(?:^|.*;\\s*)vuid\\s*\\=\\s*([^;]*).*$)|^.*$/, \"$1\"), 1]);\n\n _gaq.push(['_setCustomVar', 44, 'clip_redesign', '2', 1]);\n _gaq.push(['_setCustomVar', 44, 'clip_redesign', '2', 1]);\n _gaq.push(['_setCustomVar', 44, 'clip_redesign', '2', 1]);\n _gaq.push(['_setCustomVar', 44, 'clip_redesign', '2', 1]);\n \n _gaq.push(['_trackPageview']);\n\n \n \n _initial_gtm_state['vuid'] = document.cookie.replace(/(?:(?:^|.*;\\s*)vuid\\s*\\=\\s*([^;]*).*$)|^.*$/, \"$1\");\n _initial_gtm_state['gtm.start'] = new Date().getTime();\n _initial_gtm_state['event'] = 'gtm.js';\n _gtm.push(_initial_gtm_state);\n \n var _extend = function(){for(var r=arguments[0],n=1,e=arguments.length;e>n;n++){var t=arguments[n];for(var a in t)t.hasOwnProperty(a)&&(r[a]=t[a])}return r};\n\n\n var CSS_DIR = 'https://f.vimeocdn.com/styles/css_opt/',\n JS_DIR = 'https://f.vimeocdn.com/js_opt/',\n IMAGE_DIR = 'https://f.vimeocdn.com/images_v6/',\n SVG_DIR = 'https://f.vimeocdn.com/svg/',\n BUILD_HASH = 'ba7be';\n\n var vimeo = _extend((window.vimeo || {}), {\"app_version\":\"v6\",\"domain\":\"vimeo.com\",\"url\":\"vimeo.com\",\"cur_user\":false,\"is_mobile\":false,\"config\":{\"autocomplete_enabled\":true}});\n\n vimeo.config = _extend((vimeo.config || {}), []);\n\n\n var localeConfig = {\n lang: 'en',\n 'Date': {\n months: [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],\n months_abbr: [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],\n days: [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\n days_abbr: [\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\n\n // Culture's date order: MM/DD/YYYY\n dateOrder: ['date', 'month', 'year'],\n shortDate: '%d/%m/%Y',\n shortTime: '%I:%M%p',\n AM: 'AM',\n PM: 'PM',\n firstDayOfWeek: 0,\n\n // Date.Extras\n ordinal: function(dayOfMonth){\n return dayOfMonth;\n }\n },\n 'DatePicker': {\n select_a_time: \"Select a time\",\n use_mouse_wheel: \"Use the mouse wheel to quickly change value\",\n time_confirm_button: \"OK\",\n apply_range: \"Apply\",\n cancel: \"Cancel\",\n week: \"Wk\" },\n 'Number': {\n decimal: '.',\n group: ',',\n currency: {\n prefix: '$'\n }\n },\n 'FormValidator': {\"required\":\"This field is required.\",\"requiredChk\":\"This field is required.\"} };\n\n var fullLocale = '';\n\n \n var Copy = {translate:function(t,i,u){var e='object'!=typeof this.dict[t]?this.dict[t]:i?this.dict[t].plural:this.dict[t].singular;return'object'==typeof u&&(e=this.substitute(e,u)),e},substitute:function(t,i){return void 0!==t.substitute?t.substitute(i):t.replace(/\\\\?\\{([^{}]+)\\}/g,function(t,u){return'\\\\'==t.charAt(0)?t.slice(1):null!=i[u]?i[u]:''})},dict:{}};\n Copy.dict = {\"did_you_mean_email\":\"Did you mean <em>{SUGGEST}<\\/em>?\",\"email_password_mismatch\":\"Email and password do not match\",\"just_now\":\"just now\",\"seconds_ago\":{\"singular\":\"{COUNT} second ago\",\"plural\":\"{COUNT} seconds ago\"},\"minutes_ago\":{\"singular\":\"{COUNT} minute ago\",\"plural\":\"{COUNT} minutes ago\"},\"hours_ago\":{\"singular\":\"{COUNT} hour ago\",\"plural\":\"{COUNT} hours ago\"},\"open_comment_box\":\"Add new comment instead &raquo;\",\"url_unavailable\":\"Sorry, this url is unavailable.\",\"unsaved_changes_generic\":\"You have unsaved changes, are you sure you wish to leave?\",\"add\":\"Add\",\"remove\":\"Remove\",\"select\":\"Select\",\"no_followers_for_letter\":\"You don&rsquo;t follow anyone that begin with the letter &ldquo;{PAGE_LETTER}&rdquo;\",\"share_limit_reached\":\"You have reached the maximum number of users to share with.\",\"old_code\":\"Use old embed code\",\"new_code\":\"Use new embed code\",\"at_least_one\":\"There must be at least one user.\",\"available\":\"Available\",\"unavailable\":\"Unavailable\",\"browse_error_generic\":\"Sorry, there was an error\",\"browse_error_no_videos\":\"Sorry, no videos found\",\"follow\":\"Follow\",\"following\":\"Following\",\"unfollow\":\"Unfollow\",\"unfollowing\":\"Unfollowing\",\"count_comments\":{\"singular\":\"{COUNT} comment\",\"plural\":\"{COUNT} comments\"},\"first_comment\":\"Be the first to comment&hellip;\",\"no_comments_for_you\":\"Forbidden. You cannot post comments on this page.\",\"oops\":\"Oops!\",\"player_try_again\":\"That wasn't supposed to happen. Please try again in a few minutes.\",\"duration_input_min_duration\":\"The duration cannot be less than {MIN_DURATION}.\",\"duration_input_max_duration\":\"The duration cannot be greater than {MAX_DURATION}.\",\"duration_input_invalid_characters\":\"0-9 and : are the only acceptable inputs.\",\"close\":\"Close\",\"expand\":\"Expand\",\"loading\":\"Loading...\",\"top\":\"top\",\"advanced_search\":\"Advanced Search\",\"no_suggestions\":\"No suggestions\",\"recent_searches\":\"Recent Searches\",\"search_all\":\"Search All of Vimeo\",\"1 Track\":\"1 Track\",\"About this video\":\"About this video\",\"Add comment\":\"Add comment\",\"Add reply\":\"Add reply\",\"Add to collections\":\"Add to collections\",\"Add\":\"Add\",\"Albums\":\"Albums\",\"Approximate Time Remaining\":\"Approximate Time Remaining\",\"Are you sure you want delete this comment permanently?\":\"Are you sure you want delete this comment permanently?\",\"Autoplay off\":\"Autoplay off\",\"Autoplay on\":\"Autoplay on\",\"Buy {DISPLAY_PRICE}\":\"Buy {DISPLAY_PRICE}\",\"by {ARTIST_NAME}\":\"by {ARTIST_NAME}\",\"Cancel\":\"Cancel\",\"Change settings.\":\"Change settings.\",\"Change your content filter preference\":\"Change your content filter preference\",\"Channels\":\"Channels\",\"Click here to add a new comment\":\"Click here to add a new comment\",\"Collection name\":\"Collection name\",\"Comments are disabled.\":\"Comments are disabled.\",\"Creative Commons License:\":\"Creative Commons License:\",\"Delete comment\":\"Delete comment\",\"Delete\":\"Delete\",\"Dimensions\":\"Dimensions\",\"Download Link\":\"Download Link\",\"Download\":\"Download\",\"Edit Settings\":\"Edit Settings\",\"Edit\":\"Edit\",\"Exit fullscreen\":\"Exit fullscreen\",\"Fetch\":\"Fetch\",\"File Size\":\"File Size\",\"File\":\"File\",\"Finishes\":\"Finishes\",\"Follow\":\"Follow\",\"Following\":\"Following\",\"from {USER_NAME}\":\"from {USER_NAME}\",\"from {VOD_TITLE}\":\"from {VOD_TITLE}\",\"Get me out of here!\":\"Get me out of here!\",\"Groups\":\"Groups\",\"Incorrect rating\":\"Incorrect rating\",\"Learn about other violations\":\"Learn about other violations\",\"Learn more\":\"Learn more\",\"Leave the first comment:\":\"Leave the first comment:\",\"Like what you saw? See the full title.\":\"Like what you saw? See the full title.\",\"Like\":\"Like\",\"Liked\":\"Liked\",\"Likes\":\"Likes\",\"Load {COUNT} previous comment\":{\"singular\":\"Load {COUNT} previous comment\",\"plural\":\"Load {COUNT} previous comments\"},\"Loading\":\"Loading\",\"Moneymaker\":\"Moneymaker\",\"more\":\"more\",\"Next video\":\"Next video\",\"Not playing nice\":\"Not playing nice\",\"Only visible to you\":\"Only visible to you\",\"Original file is in the archive\":\"Original file is in the archive\",\"Permalink to this comment\":\"Permalink to this comment\",\"Plays\":\"Plays\",\"Portfolios\":\"Portfolios\",\"Presented by {BRAND_NAME}\\u2019s {CAMPAIGN_TITLE}\":\"Presented by {BRAND_NAME}\\u2019s {CAMPAIGN_TITLE}\",\"Previous video\":\"Previous video\",\"Public Domain Dedication\":\"Public Domain Dedication\",\"Read more\\u2026\":\"Read more\\u2026\",\"Remember to be cool and play nice!\":\"Remember to be cool and play nice!\",\"Remove credit\":\"Remove credit\",\"Rent {DISPLAY_PRICE}\":\"Rent {DISPLAY_PRICE}\",\"Reply to this comment\":\"Reply to this comment\",\"Reply\":\"Reply\",\"Report this video\":\"Report this video\",\"Report this video?\":\"Report this video?\",\"Retry upload\":\"Retry upload\",\"Settings\":\"Settings\",\"Share\":\"Share\",\"Show me the video\":\"Show me the video\",\"Show more\\u2026\":\"Show more\\u2026\",\"Source files not accessed for 30 days are automatically stored in our secret underground storage archive. As such, it may take a few hours to retrieve the file. Still want the original source file?\":\"Source files not accessed for 30 days are automatically stored in our secret underground storage archive. As such, it may take a few hours to retrieve the file. Still want the original source file?\",\"Spam\":\"Spam\",\"Sponsored Links\":\"Sponsored Links\",\"Stats\":\"Stats\",\"Subscribe {DISPLAY_PRICE}\\/{BILLING_PERIOD}\":\"Subscribe {DISPLAY_PRICE}\\/{BILLING_PERIOD}\",\"The original source file is hosted on Dropbox.\":\"The original source file is hosted on Dropbox.\",\"The person who associated a work with this deed has dedicated the work to the public domain by waiving all of his or her rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law. You can copy, modify, distribute and perform the work, even for commercial purposes, all without asking permission.\":\"The person who associated a work with this deed has dedicated the work to the public domain by waiving all of his or her rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law. You can copy, modify, distribute and perform the work, even for commercial purposes, all without asking permission.\",\"The person who uploaded this video obviously didn\\u2019t make it (it\\u2019s a TV show, movie trailer, or ripped from elsewhere the web.)\":\"The person who uploaded this video obviously didn\\u2019t make it (it\\u2019s a TV show, movie trailer, or ripped from elsewhere the web.)\",\"This license allows for redistribution, commercial and non-commercial, as long as it is passed along unchanged and in whole, with credit to you.\":\"This license allows for redistribution, commercial and non-commercial, as long as it is passed along unchanged and in whole, with credit to you.\",\"This license is the most restrictive of our six main licenses, only allowing others to download your works and share them with others as long as they credit you, but they can\\u2019t change them in any way or use them commercially.\":\"This license is the most restrictive of our six main licenses, only allowing others to download your works and share them with others as long as they credit you, but they can\\u2019t change them in any way or use them commercially.\",\"This license lets others distribute, remix, tweak, and build upon your work, even commercially, as long as they credit you for the original creation. This is the most accommodating of licenses offered. Recommended for maximum dissemination and use of licensed materials.\":\"This license lets others distribute, remix, tweak, and build upon your work, even commercially, as long as they credit you for the original creation. This is the most accommodating of licenses offered. Recommended for maximum dissemination and use of licensed materials.\",\"This license lets others remix, tweak, and build upon your work even for commercial purposes, as long as they credit you and license their new creations under the identical terms. This license is often compared to &ldquo;copyleft&rdquo; free and open source software licenses. All new works based on yours will carry the same license, so any derivatives will also allow commercial use. This is the license used by Wikipedia, and is recommended for materials that would benefit from incorporating content from Wikipedia and similarly licensed projects.\":\"This license lets others remix, tweak, and build upon your work even for commercial purposes, as long as they credit you and license their new creations under the identical terms. This license is often compared to &ldquo;copyleft&rdquo; free and open source software licenses. All new works based on yours will carry the same license, so any derivatives will also allow commercial use. This is the license used by Wikipedia, and is recommended for materials that would benefit from incorporating content from Wikipedia and similarly licensed projects.\",\"This license lets others remix, tweak, and build upon your work non-commercially, and although their new works must also acknowledge you and be non-commercial, they don\\u2019t have to license their derivative works on the same terms.\":\"This license lets others remix, tweak, and build upon your work non-commercially, and although their new works must also acknowledge you and be non-commercial, they don\\u2019t have to license their derivative works on the same terms.\",\"This license lets others remix, tweak, and build upon your work non-commercially, as long as they credit you and license their new creations under the identical terms.\":\"This license lets others remix, tweak, and build upon your work non-commercially, as long as they credit you and license their new creations under the identical terms.\",\"This source file has been lovingly stored in our archive.\":\"This source file has been lovingly stored in our archive.\",\"This video contains harassment, incites hatred, or depicts extreme or real-life violence.\":\"This video contains harassment, incites hatred, or depicts extreme or real-life violence.\",\"This video contains pornography, advertises a product or service of an erotic nature, or seems primarily focused on sexual stimulation.\":\"This video contains pornography, advertises a product or service of an erotic nature, or seems primarily focused on sexual stimulation.\",\"This video is an advertisement, commercial, or is a video that actively sells a product or service.\":\"This video is an advertisement, commercial, or is a video that actively sells a product or service.\",\"This video is primarily designed to drive traffic to third party sites, use Search Engine Optimization (SEO) to manipulate search rankings, or otherwise deceive or mislead the audience.\":\"This video is primarily designed to drive traffic to third party sites, use Search Engine Optimization (SEO) to manipulate search rankings, or otherwise deceive or mislead the audience.\",\"This video should be marked as \\u201cMature\\u201d due to nudity, profanity, violence, or drug\\/alcohol use.\":\"This video should be marked as \\u201cMature\\u201d due to nudity, profanity, violence, or drug\\/alcohol use.\",\"Unfollow\":\"Unfollow\",\"Unlike\":\"Unlike\",\"Up next\":\"Up next\",\"update your content rating preferences\":\"update your content rating preferences\",\"Upgrade and we\\u2019ll hold on to your original video files.\":\"Upgrade and we\\u2019ll hold on to your original video files.\",\"Uploaded by {USER}\":\"Uploaded by {USER}\",\"Uploader did not make this\":\"Uploader did not make this\",\"via {APP_NAME}\":\"via {APP_NAME}\",\"via {CAMEO}\":\"via {CAMEO}\",\"View all\":\"View all\",\"View channel\":\"View channel\",\"View stats dashboard\":\"View stats dashboard\",\"View title\":\"View title\",\"Viewer downloading for this video is disabled.\":\"Viewer downloading for this video is disabled.\",\"Watch it again\":\"Watch it again\",\"We\\u2019re on it! Please check back later, as it could take a few hours.\":\"We\\u2019re on it! Please check back later, as it could take a few hours.\",\"When you add this private video to a collection, the video will be viewable within that album, group, etc.\":\"When you add this private video to a collection, the video will be viewable within that album, group, etc.\",\"Why are you reporting this video?\":\"Why are you reporting this video?\",\"XXX-rated\":\"XXX-rated\",\"Yes, fetch original file\":\"Yes, fetch original file\",\"You can {UPDATE_YOUR_PREFERENCES_LINK} at any time.\":\"You can {UPDATE_YOUR_PREFERENCES_LINK} at any time.\",\"{COUNT} Category\":{\"singular\":\"{COUNT} Category\",\"plural\":\"{COUNT} Categories\"},\"{COUNT} Collection\":{\"singular\":\"{COUNT} Collection\",\"plural\":\"{COUNT} Collections\"},\"{COUNT} Comment\":{\"singular\":\"{COUNT} Comment\",\"plural\":\"{COUNT} Comments\"},\"{COUNT} Credit\":{\"singular\":\"{COUNT} Credit\",\"plural\":\"{COUNT} Credits\"},\"{COUNT} Like\":{\"singular\":\"{COUNT} Like\",\"plural\":\"{COUNT} Likes\"},\"{COUNT} Photo\":{\"singular\":\"{COUNT} Photo\",\"plural\":\"{COUNT} Photos\"},\"{COUNT} Play\":{\"singular\":\"{COUNT} Play\",\"plural\":\"{COUNT} Plays\"}};\n"))), Text("\n\n "), Element(name: "script" attributes: [Attribute(name: "src" value: "https://f.vimeocdn.com/js_opt/utils/player_manager/player_manager.min.js?bd8b4bb2")]), Text("\n "), Element(name: "script" children: NodeSet(Text("\n if (typeof playerAssetUrls !== 'undefined') {\n PlayerManager.run(playerAssetUrls);\n }\n "))), Text("\n\n "), Element(name: "script" attributes: [Attribute(name: "src" value: "https://f.vimeocdn.com/js_opt/logging_combined.min.js?2fc31521")]), Text("\n "), Element(name: "script" attributes: [Attribute(name: "src" value: "https://f.vimeocdn.com/js_opt/ablincoln_combined.min.js?baae8e04")]), Text("\n "), Element(name: "script" attributes: [Attribute(name: "src" value: "https://f.vimeocdn.com/js_opt/clip_beta_libs_prod_combined.min.js?79a7a4b5")]), Text("\n "), Element(name: "script" attributes: [Attribute(name: "src" value: "https://f.vimeocdn.com/js_opt/_bundles/clip.bundle.min.js?3bbac8ac")]), Text("\n\n "), Element(name: "script" attributes: [Attribute(name: "async"), Attribute(name: "src" value: "//sb.scorecardresearch.com/beacon.js")]), Text("\n "), Element(name: "script" attributes: [Attribute(name: "async"), Attribute(name: "src" value: "//www.googletagmanager.com/gtm.js?id=GTM-RBKK&l=_gtm")]), Text("\n "), Element(name: "script" attributes: [Attribute(name: "async"), Attribute(name: "src" value: "//stats.g.doubleclick.net/dc.js")]), Text("\n "), Element(name: "script" children: NodeSet(Text("\n function onVimeoDomReady(e) {\n \n window.CE_SNAPSHOT_NAME = 'clip_new';\n \n setTimeout(function() {\n var a = document.createElement('script'),\n b = document.getElementsByTagName('script')[0];\n\n a.src = document.location.protocol + '//script.crazyegg.com/pages/scripts/0014/1514.js?' + Math.floor(new Date().getTime() / 3600000);\n a.async = true;\n a.type = 'text/javascript';\n b.parentNode.insertBefore(a, b);\n }, 1);\n \n if (!vimeo.bypass_player_responsive_delegates) {\n vimeo.player_responsive_delegates = vimeo.player_responsive_delegates || {};\n vimeo.player_responsive_delegates.willOpenShareOverlay = vimeo.player_responsive_delegates.willOpenShareOverlay || function(id) {\n PlayerManager.pauseAllPlayers();\n vimeo.share.Popup(id);\n return false;\n };\n\n vimeo.player_responsive_delegates.willOpenLoginForm = vimeo.player_responsive_delegates.willOpenLoginForm || function(id, context) {\n PlayerManager.pauseAllPlayers();\n\n new vimeo.ui.Lightbox({\n url: '/log_in' + (context ? '?player=1&clip_id=' + id + '&context=' + context : ''),\n max_width: 500,\n onOpen: function() {\n vimeo.Global.insertAssets();\n }\n }).open();\n\n return false;\n };\n\n if (PlayerManager) {\n PlayerManager.setDefaultDelegate(vimeo.player_responsive_delegates);\n }\n }\n \n if (PlayerManager) {\n PlayerManager.dispatchReadySignals();\n }\n \n }\n\n $(document).ready(onVimeoDomReady);\n "))), Text("\n\n\n "))), Text("\n"))), Text("\n"))
7
+ )
8
+ F.................
9
+
10
+ Failures:
11
+
12
+ 1) VideoInfo::Providers::Vimeo#available? with 'password required' video #available? should not be available
13
+ Failure/Error: it { is_expected.to_not be_available }
14
+ expected `#<VideoInfo:0x000000031b0578 @provider=#<VideoInfo::Providers::Vimeo:0x000000031aff38 @options={"User-Agent"=>"VideoInfo/2.5.0"}, @url="http://vimeo.com/74636562", @video_id="74636562">>.available?` to return false, got true
15
+ # ./spec/lib/video_info/providers/vimeo_spec.rb:68:in `block (5 levels) in <top (required)>'
16
+
17
+ 2) VideoInfo::Providers::Vimeo with video 898029 #author_thumbnail should eq "https://i.vimeocdn.com/portrait/2577152_75x75.jpg"
18
+ Failure/Error: it { is_expected.to eq 'https://i.vimeocdn.com/portrait/2577152_75x75.jpg' }
19
+
20
+ expected: "https://i.vimeocdn.com/portrait/2577152_75x75.jpg"
21
+ got: []
22
+
23
+ (compared using ==)
24
+ # ./spec/lib/video_info/providers/vimeo_spec.rb:153:in `block (4 levels) in <top (required)>'
25
+
26
+ Finished in 1.57 seconds (files took 0.36192 seconds to load)
27
+ 43 examples, 2 failures
28
+
29
+ Failed examples:
30
+
31
+ rspec ./spec/lib/video_info/providers/vimeo_spec.rb:68 # VideoInfo::Providers::Vimeo#available? with 'password required' video #available? should not be available
32
+ rspec ./spec/lib/video_info/providers/vimeo_spec.rb:153 # VideoInfo::Providers::Vimeo with video 898029 #author_thumbnail should eq "https://i.vimeocdn.com/portrait/2577152_75x75.jpg"
33
+
data/lib/video_info.rb CHANGED
@@ -2,15 +2,28 @@ require 'video_info/version'
2
2
  require 'video_info/provider'
3
3
  require 'forwardable'
4
4
  require 'net/http'
5
+ require 'logger'
5
6
 
6
7
  class VideoInfo
7
- class UrlError < StandardError; end
8
+ class Error < StandardError; end
9
+ class UrlError < Error; end
10
+ class HttpError < Error; end
11
+
12
+ class << self
13
+ attr_writer :logger
14
+
15
+ def logger
16
+ @logger ||= Logger.new($stdout).tap do |lgr|
17
+ lgr.progname = name
18
+ end
19
+ end
20
+ end
21
+
8
22
  extend Forwardable
9
23
 
10
24
  PROVIDERS = %w[
11
25
  Dailymotion Vkontakte Wistia
12
- Vimeo VimeoPlaylist
13
- Youtube YoutubePlaylist
26
+ Vimeo Youtube YoutubePlaylist
14
27
  ]
15
28
  PROVIDERS.each { |p| require "video_info/providers/#{p.downcase}" }
16
29
 
@@ -24,7 +37,7 @@ class VideoInfo
24
37
  def_delegators :@provider, :playlist_id, :videos
25
38
  def_delegators :@provider, :author, :author_thumbnail
26
39
  def_delegators :@provider, :data=
27
-
40
+
28
41
  def initialize(url, options = {})
29
42
  @provider = _select_provider(url, options)
30
43
  end
@@ -33,7 +33,7 @@ class VideoInfo
33
33
  end
34
34
 
35
35
  def available?
36
- !%w[403 404].include?(_response_code)
36
+ !%w[403 404 400].include?(_response_code)
37
37
  end
38
38
 
39
39
  private
@@ -74,6 +74,27 @@ class VideoInfo
74
74
  end
75
75
 
76
76
  def _set_data_from_api(api_url = _api_url)
77
+ _set_data_from_api_impl(api_url)
78
+ rescue OpenURI::HTTPError, *NetHttpTimeoutErrors.all => e
79
+ if e.instance_of?(OpenURI::HTTPError) &&
80
+ e.respond_to?(:io) &&
81
+ e.io.respond_to?(:status)
82
+ response_code = e.io.status[0]
83
+ if response_code == '400'
84
+ log_warn('your API key is probably invalid. Please verify it.')
85
+ end
86
+ end
87
+
88
+ msg = 'unexpected network error while
89
+ fetching information about the video'
90
+ raise VideoInfo::HttpError.new(msg)
91
+ end
92
+
93
+ def log_warn(message)
94
+ VideoInfo.logger.warn(message)
95
+ end
96
+
97
+ def _set_data_from_api_impl(api_url)
77
98
  uri = open(api_url, options)
78
99
  MultiJson.load(uri.read)
79
100
  end
@@ -1,6 +1,19 @@
1
+ require_relative 'vimeo_api'
2
+ require_relative 'vimeo_scraper'
3
+
1
4
  class VideoInfo
2
5
  module Providers
3
6
  class Vimeo < Provider
7
+ def initialize(url, options = {})
8
+ if VideoInfo.provider_api_keys[:vimeo].nil?
9
+ extend VimeoScraper
10
+ else
11
+ extend VimeoAPI
12
+ end
13
+
14
+ super(url, options)
15
+ end
16
+
4
17
  def self.usable?(url)
5
18
  url =~ /(vimeo\.com\/(?!album|hubnut\/album).*)/
6
19
  end
@@ -9,99 +22,12 @@ class VideoInfo
9
22
  'Vimeo'
10
23
  end
11
24
 
12
- def api_key
13
- VideoInfo.provider_api_keys[:vimeo]
14
- end
15
-
16
- %w[description].each do |method|
17
- define_method(method) { _video[method] }
18
- end
19
-
20
- %w[duration width height].each do |method|
21
- define_method(method) { _video[method].to_i }
22
- end
23
-
24
- def title
25
- _video['name']
26
- end
27
-
28
- def author
29
- _video['user']['name']
30
- end
31
-
32
- def author_thumbnail_id
33
- author_uri = _video['user']['pictures']['uri']
34
- @author_thumbnail_id ||= _parse_picture_id(author_uri)
35
- end
36
-
37
- def author_thumbnail(width = 75)
38
- "https://i.vimeocdn.com/portrait/#{author_thumbnail_id}_#{width}x#{width}.jpg"
39
- end
40
-
41
- def thumbnail_id
42
- @thumbnail_id ||= _parse_picture_id(_video['pictures']['uri'])
43
- end
44
-
45
- def thumbnail(width = 200, height = nil)
46
- base_uri = "https://i.vimeocdn.com/video/#{thumbnail_id}"
47
- height ? base_uri + "_#{width}x#{height}.jpg" : base_uri + "_#{width}.jpg"
48
- end
49
-
50
- def thumbnail_small
51
- thumbnail(100, 75)
52
- end
53
-
54
- def thumbnail_medium
55
- thumbnail(200, 150)
56
- end
57
-
58
- def thumbnail_large
59
- thumbnail(640)
60
- end
61
-
62
- def keywords
63
- keywords_array.join(', ')
64
- end
65
-
66
- def keywords_array
67
- _video['tags'].map { |t| t['tag'] }
68
- end
69
-
70
25
  def embed_url
71
26
  "//player.vimeo.com/video/#{video_id}"
72
27
  end
73
28
 
74
- def date
75
- Time.parse(_video['created_time'], Time.now.utc).utc
76
- end
77
-
78
- def view_count
79
- _video['stats']['plays'].to_i
80
- end
81
-
82
29
  private
83
30
 
84
- def _clean_options(options)
85
- headers = [super, _authorization_headers, _api_version_headers]
86
- headers.inject(&:merge)
87
- end
88
-
89
- def _api_version
90
- '3.2'
91
- end
92
-
93
- def _authorization_headers
94
- { 'Authorization' => "bearer #{api_key}" }
95
- end
96
-
97
- def _api_version_headers
98
- { 'Accept' => "application/vnd.vimeo.*+json;version=#{_api_version}" }
99
- end
100
-
101
- def _video
102
- data
103
- end
104
-
105
31
  def _url_regex
106
32
  /.*\.com&&
107
33
  |\/(?:(?:groups\/[^\/]+\/videos\/)
@@ -111,18 +37,6 @@ class VideoInfo
111
37
  /x
112
38
  end
113
39
 
114
- def _api_base
115
- 'api.vimeo.com'
116
- end
117
-
118
- def _api_path
119
- "/videos/#{video_id}"
120
- end
121
-
122
- def _api_url
123
- "https://#{_api_base}#{_api_path}"
124
- end
125
-
126
40
  def _default_iframe_attributes
127
41
  {}
128
42
  end
@@ -133,10 +47,6 @@ class VideoInfo
133
47
  portrait: 0,
134
48
  autoplay: 0 }
135
49
  end
136
-
137
- def _parse_picture_id(uri)
138
- /\/pictures\/(\d+)/.match(uri)[1]
139
- end
140
50
  end
141
51
  end
142
52
  end
@@ -0,0 +1,110 @@
1
+ class VideoInfo
2
+ module Providers
3
+ module VimeoAPI
4
+ def api_key
5
+ VideoInfo.provider_api_keys[:vimeo]
6
+ end
7
+
8
+ %w[description].each do |method|
9
+ define_method(method) { _video[method] }
10
+ end
11
+
12
+ %w[duration width height].each do |method|
13
+ define_method(method) { _video[method].to_i }
14
+ end
15
+
16
+ def title
17
+ _video['name']
18
+ end
19
+
20
+ def author
21
+ _video['user']['name']
22
+ end
23
+
24
+ def author_thumbnail_id
25
+ author_uri = _video['user']['pictures']['uri']
26
+ @author_thumbnail_id ||= _parse_picture_id(author_uri)
27
+ end
28
+
29
+ def author_thumbnail(width = 75)
30
+ "https://i.vimeocdn.com/portrait/#{author_thumbnail_id}_#{width}x#{width}.jpg"
31
+ end
32
+
33
+ def thumbnail_id
34
+ @thumbnail_id ||= _parse_picture_id(_video['pictures']['uri'])
35
+ end
36
+
37
+ def thumbnail(width = 200, height = nil)
38
+ base_uri = "https://i.vimeocdn.com/video/#{thumbnail_id}"
39
+ height ? base_uri + "_#{width}x#{height}.jpg" : base_uri + "_#{width}.jpg"
40
+ end
41
+
42
+ def thumbnail_small
43
+ thumbnail(100, 75)
44
+ end
45
+
46
+ def thumbnail_medium
47
+ thumbnail(200, 150)
48
+ end
49
+
50
+ def thumbnail_large
51
+ thumbnail(640)
52
+ end
53
+
54
+ def keywords
55
+ keywords_array.join(', ')
56
+ end
57
+
58
+ def keywords_array
59
+ _video['tags'].map { |t| t['tag'] }
60
+ end
61
+
62
+ def date
63
+ Time.parse(_video['created_time'], Time.now.utc).utc
64
+ end
65
+
66
+ def view_count
67
+ _video['stats']['plays'].to_i
68
+ end
69
+
70
+ private
71
+
72
+ def _clean_options(options)
73
+ headers = [super, _authorization_headers, _api_version_headers]
74
+ headers.inject(&:merge)
75
+ end
76
+
77
+ def _api_version
78
+ '3.2'
79
+ end
80
+
81
+ def _authorization_headers
82
+ { 'Authorization' => "bearer #{api_key}" }
83
+ end
84
+
85
+ def _api_version_headers
86
+ { 'Accept' => "application/vnd.vimeo.*+json;version=#{_api_version}" }
87
+ end
88
+
89
+ def _video
90
+ data
91
+ end
92
+
93
+ def _api_base
94
+ 'api.vimeo.com'
95
+ end
96
+
97
+ def _api_path
98
+ "/videos/#{video_id}"
99
+ end
100
+
101
+ def _api_url
102
+ "https://#{_api_base}#{_api_path}"
103
+ end
104
+
105
+ def _parse_picture_id(uri)
106
+ /\/pictures\/(\d+)/.match(uri)[1]
107
+ end
108
+ end
109
+ end
110
+ end