{"id":21526,"date":"2017-05-17T16:22:41","date_gmt":"2017-05-17T16:22:41","guid":{"rendered":"http:\/\/bounce_hacking_jazzfest_with_social_videos"},"modified":"2024-08-15T14:06:17","modified_gmt":"2024-08-15T21:06:17","slug":"bounce_hacking_jazzfest_with_social_videos","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos","title":{"rendered":"Bounce! Hacking Jazzfest With Social Videos"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Last week, I was invited to an exclusive hackathon to build apps for musicians. The app team I was assigned to was tasked with building a video upload site for Bounce videos. Bounce is a style of music that originated in New Orleans. The app would be called BounceDotCom.com and there were plans to have <a href=\"http:\/\/www.bigfreedia.com\/\">Big Freedia<\/a>, the Queen of Bounce, promote it. I knew the organizer could make things happen, so I jumped at the chance.<\/p>\n<h2>A Video Sharing App in 48 Hours<\/h2>\n<p>On the team was me, Brad Huber, and Doron Sherman, from Cloudinary. We had about 48 hours to make something happen. I showed up Monday evening, after the team had begun work, to figure out the plan and how I could help. There was a basic backend in Rails. I was going to come in early the next day and get to work on the frontend in JavaScript and React.<\/p>\n<p>Now, people may know that I prefer ClojureScript myself over JavaScript. But I\u2019m also a pragmatist. Although I think I could have done the job in ClojureScript in probably less time and code, I know that finding another ClojureScripter would be a difficult. It would tie the app to me. Any updates would depend on my schedule. Doing it in pure JavaScript would give much more flexibility, particularly for something where resources are tight and the future is unknown.<\/p>\n<p>The next morning, I got to work setting up the React frontend so I could test it. I used <a href=\"https:\/\/github.com\/facebookincubator\/create-react-app\">create-react-app<\/a> to get started. It comes with a dev setup so you can automatically reload your code as you save it. I\u2019m a big fan of fast feedback. The save-and-reload workflow is not as good as you get in ClojureScript, but good enough for a small project like this. In ClojureScript, you don\u2019t lose your current state when new code is reloaded, so there\u2019s much less clicking.<\/p>\n<h2>The Challenge<\/h2>\n<p>My main focus at first was to get video uploads to work. I knew this would be the biggest challenge. Uploading files from multiple devices and posting to an API I was not familiar with was not something I wanted to mess around with on a short timeline. Plus, the app would be worthless without it. If people couldn\u2019t upload a video, the main concept of the site would not exist. Doron was a big help, providing the documentation when I needed it. Cloudinary offers many different solutions, including posting the video yourself or going through one of their widgets. For a 48-hour project, I chose a widget. There was no way I was going to trust that I could do it better in 48 hours.<\/p>\n<p>When you\u2019re working under sane conditions, spending a day to research your best option is well worth the investment. However, hackathon\u2019s are not sane. You want to quickly find something acceptable and move on. I found three different widgets that looked like they might work for our use case and our stack. In the end, the one that worked first was super easy. Just include this in the HTML:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>&lt;script src=&quot;\/\/widget.cloudinary.com\/global\/all.js&quot; type=&quot;text\/javascript&quot;&gt;\n<\/code><\/pre>\n<p>Here\u2019s what it looks like:\n<img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/w_700,c_fill\/Picture1.png\" alt=\"Upload\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"700\" height=\"548\"\/><\/p>\n<p>And on mobile:\n<img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/w_300,c_fill\/Picture2.png\" alt=\"Mobile Upload\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"300\" height=\"534\"\/><\/p>\n<p>That will fetch a script with everything you need. Here is how I show the widget.<\/p>\n<pre class=\"js-syntax-highlighted\"><code>window.cloudinary.openUploadWidget({\n\tcloud_name: CLOUD_NAME,\n\tupload_preset: 'default',\n}, (err, result) =&gt; {\n\n});\n<\/code><\/pre>\n<p>You get the Cloud Name from your Cloudinary account. I had to create a preset in the dashboard that allowed for unsigned uploads so anyone could upload a video from their phone using only the frontend.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/w_700,c_fill\/Picture3.png\" alt=\"Dashboard\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"700\" height=\"256\"\/><\/p>\n<p>To display the videos, I tried cloudinary-react and it worked very easily.<\/p>\n<pre class=\"js-syntax-highlighted\"><code>import {Image, Video, Transformation, CloudinaryContext} from 'cloudinary-react';\n\n&lt;Video\n\tcloudName={CLOUD_NAME}\n\tpublicId={VIDEO_ID}\n\tposter={`https:\/\/res.cloudinary.com\/${CLOUD_NAME}\/video\/upload\/${VIDEO_ID}.jpg`}\n\tref={(v)=&gt;this.video = ReactDOM.findDOMNode(v)}\n\tonPlay={()=&gt;this.setState({playing:true})}\n\tonEnded={()=&gt;this.setState({playing:false})}\n\tonPause={()=&gt;this.setState({playing:false})}\n\/&gt;\n<\/code><\/pre>\n<p>The component worked right out of the box, but we did have to fix some issues. It worked fine on desktop, but on my iPhone, the poster wasn\u2019t showing up. That\u2019s why I added the poster attribute manually in that code snippet. Problem solved. Luckily, Cloudinary is smart. If you ask for the .jpg file, it will give it to you and generate it if it needs to. If you ask for the .png, it does the same. It works better than you expect, because most services don\u2019t do this kind of transformation on the fly. But Cloudinary does, and it works the way you want it to work.<\/p>\n<p>Notice that I set up a React ref for the video. I wanted to be able to stop and start the video in my scripts, so I needed a direct reference to the video element. The react-cloudinary components render out to regular HTML video elements.<\/p>\n<h2>How Do I Know?<\/h2>\n<p>I read the code. Yep, it\u2019s readable code. And when you\u2019re on the super tight deadline of a hackathon, you don\u2019t have time to read inefficient English text documentation. You go straight to the render() method. Code doesn\u2019t lie.<\/p>\n<p>Another thing I learned from the code was that if the react-cloudinary components don\u2019t understand a prop, they just pass them right down into the video element. So I could put onPlay, onEnded, and onPause callbacks right in there. A really nice touch.<\/p>\n<h2>Then I Hit a Snag<\/h2>\n<p>The Cloudinary upload widget lets you upload videos and images. But there\u2019s no way to limit it to only videos. Well, not that I could find. If you said \u201conly .mp4 files\u201d, it still lets you take a picture and try to upload it. Then it fails and you lose your picture. For our use case, that is a terrible user experience. People are having fun at a party, they take a really awesome picture they want to share with their friends, but instead the app drops the photo on the floor. The uploader works fine, but our app was never meant to host images. I could write a custom uploader, but I didn\u2019t want to spend the time.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/w_300,c_fill\/Picture4.png\" alt=\"Upload\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"300\" height=\"533\"\/><\/p>\n<p>So what did I do?<\/p>\n<p>I made an executive decision: We would support photos. This required a small backend change that I could not make, since I am clueless when it comes to Rails and Ruby. We needed to record whether it was an image or a video along with the media id. I made the changes to the frontend that I could, and allowed images to be displayed, and recorded an issue for the necessary backend changes in the backlog.<\/p>\n<p>Here\u2019s how you display an image from Cloudinary:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>&lt;Image\n\t\tcloudName={CLOUD_NAME}\n\t\tpublicId={IMAGE_ID}\n\t\/&gt;\n<\/code><\/pre>\n<p>Super easy. The only thing I wish for here is that you could tell whether it was an image or a video from the id. I could query the API, but we wanted to minimize the number of requests to keep latency low. Plus, on mobile, each HTTP request is just another chance to fail.<\/p>\n<h2>By Lunchtime, What Did We Have?<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/w_700,c_fill\/Picture5.png\" alt=\"Video\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"700\" height=\"438\"\/><\/p>\n<p>We could list videos (with inline playing and nice thumbnails) and upload new videos. We had a login system so we could identify users. Was it a nice app yet? No. Was it completely easy and straightforward? No, I can\u2019t say it was. But it was mostly forward progress. I mean, that was basically four hours of work to get video uploading with transcoding to multiple formats. Oh, and remember, it worked on desktop, iPhone, and Android with the same code. Not bad. And by \u201cnot bad\u201d, I mean wow! A video app in a morning! I did not imagine this was possible before I met Cloudinary.<\/p>\n<p>After lunch we started to put it on the open internet so we could have some kind of deployment pipeline. Until then, it was just me serving it from my laptop. We had some snags with that, too. For example, Heroku decided to upgrade its DNS to support SSL which did not allow us to add custom domains for a few hours. But in the end, we had everything hosted on Heroku.<\/p>\n<p>At this point, it was 6 p.m. I had been adding a bunch of stuff to the backend backlog, since as I said, I don\u2019t know Rails. Lucky for us, Brad Huber, my teammate, knew plenty. I had to run but I would be back. I was hopeful to have all of my backend requests finished when I returned.<\/p>\n<p>When I came back, it was on again. It was after 10 p.m. Some of my changes had been implemented, but not all. One of the things I requested was to be able to store arbitrary JSON data with users and with videos. In a hackathon, you just don\u2019t have time to mess around with designing a data model, and you certainly want to remove any reason to coordinate with the backend team. They have better things to do than add this field and that field to the model. It\u2019s much better to just let the frontend store whatever they want.<\/p>\n<p>The break from coding had given me a new perspective on the app. I had been thinking about it mostly as a desktop web app. And our backend reflected that. It required users to register and  login to upload a video. But after taking a break and seeing some issues logging in on some phones, I decided we needed to focus 100 percent on the main use case: the app would be demoed at a party the next night. People would want to pull out their phones, film some badass dancing, and upload it to share. They don\u2019t care about logging in. If they had to do that, they wouldn\u2019t have as much fun.<\/p>\n<h2>How Did We Solve It?<\/h2>\n<p>We got rid of the login. You go to BounceDotCom.com, you click a button, record some video, and upload it. It shows up. You rock. That night, we recruited a couple of designers to draw some designs and implement it.<\/p>\n<p>And then we passed the point of no return.<\/p>\n<p>I hadn\u2019t eaten dinner. There was some food left I could scavenge from. And then Doron offered me a bubble tea. Great, I thought. It looked milky and those tapioca balls could sustain me. I started drinking it. And then I realized, too late, that it was coffee. I\u2019m super sensitive to caffeine, especially that late at night. I doubted I would sleep that night.<\/p>\n<p>And I didn\u2019t.<\/p>\n<p>I stayed up all night coding on this app. There were several things I needed to do. We wanted a strong viral component, so I added Facebook sharing. To do that you need some Open Graph metadata in your HTML and some JavaScript for Like buttons. I hacked on that through the night. But Cloudinary made this really easy. Here\u2019s a snippet from the HTML template:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>&lt;meta property=&quot;og:image&quot; content=&quot;{{&amp;image}}&quot; \/&gt;\n{{#video}}\n&lt;meta property=&quot;og:video&quot; content=&quot;{{&amp;video}}&quot; \/&gt;\n{{\/video}}\n\n\nThat {{&amp;image}} and {{&amp;video}} get replaced on the backend by this:\n\nif(pid &amp;&amp; type === 'image') {\n\timage = `https:\/\/res.cloudinary.com\/${CLOUD_NAME}\/image\/upload\/${pid}.jpg`;\n}\nif(pid &amp;&amp; type === 'video') {\n\timage = `https:\/\/res.cloudinary.com\/${CLOUD_NAME}\/video\/upload\/${pid}.jpg`;\n\tvideo = `https:\/\/res.cloudinary.com\/${CLOUD_NAME}\/video\/upload\/${pid}.mp4`;\n}\n<\/code><\/pre>\n<p>That is, we can generate image URLs and video URLs pretty easily for Facebook to use. Liking and sharing work pretty well. And it was thanks to Cloudinary\u2019s ease of use.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/w_300,c_fill\/Picture6.png\" alt=\"Social Share\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"300\" height=\"36\"\/><\/p>\n<h2>Then, a Surprise<\/h2>\n<p>Travis Laurendine, the organizer, showed me that if you send a link over iMessage, it embedded the video right in there. Hello!! That was totally unexpected.<\/p>\n<p>I crashed pretty hard around 10 a.m. I took a four-hour nap. When I woke up, I loaded the app to find it purple and beautiful, thanks to those designers. I fixed some CSS and added a play button. Everything was coming together. I worked on it a little that afternoon, but nothing so intense as before.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/w_700,c_fill\/Picture7.png\" alt=\"Demo Test\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"700\" height=\"477\"\/><\/p>\n<iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/ovmDJtEEQpU\" frameborder=\"0\" allowfullscreen><\/iframe>\n<h2>What Became of Our Demo?<\/h2>\n<p>In the end, the demo party never happened. It rained pretty hard and Jazz Fest kind of took over everything. But the app is there, still running and waiting.<\/p>\n<p>With the main functionality of the app working, what\u2019s next?<\/p>\n<p>We have plans to migrate away from Heroku and onto a serverless cloud service. We don\u2019t really do much on the backend that couldn\u2019t be done cheaper and better on Google Cloud Platform or AWS. Using Lambda and Cloudinary, we basically have no overhead.<\/p>\n<p>Low overhead is important for an app like this: if it doesn\u2019t take off, it costs next to nothing. But if it does, it will scale effortlessly. The other thing we might do is rewrite the uploading code. We\u2019re using the Cloudinary widget and we might want more control of the user experience. We\u2019ll want something customized where you click a button and it opens the camera, ready to record. However, I think that it will be complicated to get something working so well on all devices. It will have to wait. The Cloudinary widget works very well. It just does more than we need and those extra features could get confusing at a party.<\/p>\n<p>I have to emphasize again that no one on the team had used Cloudinary before, except Doron, our contact at Cloudinary. Any app has engineering decisions that need to be made. Cloudinary\u2019s employees, documentation, and code helped us stay on track. I am still surprised by how much we figured out and built in less than a day. The tools they give you, including the libraries, dashboard, and APIs, are where it really shines.<\/p>\n<p>I look forward to hacking on this app in the future. And I\u2019ll be dreaming up new ways to put Cloudinary to use.<\/p>\n<table>\n<tr>\n<td style = \"padding: 5px;\">\n<img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/c_thumb,w_500\/Picture8.png\" alt=\"Eric Normand\" title=\"Eric Normand\"><\/img><\/td><td style = \"padding: 10px;\"><i><a href=\"https:\/\/purelyfunctional.tv\/\" target=\"_new\">Eric Normand<\/a>  is a long time functional programmer excited to see it entering the mainstream. He loves teaching and cooking. You can learn Functional Programming and Clojure from him at <a href=\"https:\/\/purelyfunctional.tv\/\" target=\"_new\">PurelyFunctional.tv<\/a> and get inspired by <a href=\"https:\/\/purelyfunctional.tv\/newsletter\/\" target=\"_new\">The PurelyFunctional.tv Newsletter<\/a>. If you visit him in New Orleans, you can meet his wife and daughter. He&#8217;ll even make you some gumbo if you tell him you&#8217;re coming.<\/i><\/td>\n<\/tr>\n<\/table>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":21527,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[332,134,135],"class_list":["post-21526","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-api","tag-guest-post","tag-hackathon"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Bounce! Hacking Jazzfest with Social Videos<\/title>\n<meta name=\"description\" content=\"A video sharing app in 48 Hours! Jazzfest Hackathon, building apps for musicians.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bounce! Hacking Jazzfest With Social Videos\" \/>\n<meta property=\"og:description\" content=\"A video sharing app in 48 Hours! Jazzfest Hackathon, building apps for musicians.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-05-17T16:22:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-08-15T21:06:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649723326\/Web_Assets\/blog\/Jazz_Hackathon\/Jazz_Hackathon-png?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1540\" \/>\n\t<meta property=\"og:image:height\" content=\"847\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Bounce! Hacking Jazzfest With Social Videos\",\"datePublished\":\"2017-05-17T16:22:41+00:00\",\"dateModified\":\"2024-08-15T21:06:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos\"},\"wordCount\":6,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723326\/Web_Assets\/blog\/Jazz_Hackathon\/Jazz_Hackathon.png?_i=AA\",\"keywords\":[\"API\",\"Guest Post\",\"Hackathon\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2017\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos\",\"url\":\"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos\",\"name\":\"Bounce! Hacking Jazzfest with Social Videos\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723326\/Web_Assets\/blog\/Jazz_Hackathon\/Jazz_Hackathon.png?_i=AA\",\"datePublished\":\"2017-05-17T16:22:41+00:00\",\"dateModified\":\"2024-08-15T21:06:17+00:00\",\"description\":\"A video sharing app in 48 Hours! Jazzfest Hackathon, building apps for musicians.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723326\/Web_Assets\/blog\/Jazz_Hackathon\/Jazz_Hackathon.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723326\/Web_Assets\/blog\/Jazz_Hackathon\/Jazz_Hackathon.png?_i=AA\",\"width\":1540,\"height\":847},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bounce! Hacking Jazzfest With Social Videos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Bounce! Hacking Jazzfest with Social Videos","description":"A video sharing app in 48 Hours! Jazzfest Hackathon, building apps for musicians.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos","og_locale":"en_US","og_type":"article","og_title":"Bounce! Hacking Jazzfest With Social Videos","og_description":"A video sharing app in 48 Hours! Jazzfest Hackathon, building apps for musicians.","og_url":"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos","og_site_name":"Cloudinary Blog","article_published_time":"2017-05-17T16:22:41+00:00","article_modified_time":"2024-08-15T21:06:17+00:00","og_image":[{"width":1540,"height":847,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649723326\/Web_Assets\/blog\/Jazz_Hackathon\/Jazz_Hackathon-png?_i=AA","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos"},"author":{"name":"","@id":""},"headline":"Bounce! Hacking Jazzfest With Social Videos","datePublished":"2017-05-17T16:22:41+00:00","dateModified":"2024-08-15T21:06:17+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos"},"wordCount":6,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723326\/Web_Assets\/blog\/Jazz_Hackathon\/Jazz_Hackathon.png?_i=AA","keywords":["API","Guest Post","Hackathon"],"inLanguage":"en-US","copyrightYear":"2017","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos","url":"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos","name":"Bounce! Hacking Jazzfest with Social Videos","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723326\/Web_Assets\/blog\/Jazz_Hackathon\/Jazz_Hackathon.png?_i=AA","datePublished":"2017-05-17T16:22:41+00:00","dateModified":"2024-08-15T21:06:17+00:00","description":"A video sharing app in 48 Hours! Jazzfest Hackathon, building apps for musicians.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723326\/Web_Assets\/blog\/Jazz_Hackathon\/Jazz_Hackathon.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723326\/Web_Assets\/blog\/Jazz_Hackathon\/Jazz_Hackathon.png?_i=AA","width":1540,"height":847},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/bounce_hacking_jazzfest_with_social_videos#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Bounce! Hacking Jazzfest With Social Videos"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723326\/Web_Assets\/blog\/Jazz_Hackathon\/Jazz_Hackathon.png?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21526","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=21526"}],"version-history":[{"count":4,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21526\/revisions"}],"predecessor-version":[{"id":35216,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21526\/revisions\/35216"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/21527"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21526"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21526"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21526"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}