Giter VIP home page Giter VIP logo

combine.fm's People

Contributors

dependabot-preview[bot] avatar dependabot[bot] avatar kudos avatar renatolond avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

combine.fm's Issues

Support links w/o going through the search page

I might not understand exactly how your app works, so just set me straight if I'm way off base here...

Because there's a pretty straight-forward conversion from open.spotify.com URLs to match.audio URLs, I thought I'd be able to infer the match.audio URL. This would be super handy because a chat bot could detect an open.spotify.com URL and respond with the inferred match.audio URL. All of that could happen without hitting the match.audio server. So there'd be no need for a API endpoint like discussed in #11.

This doesn't work at the moment unless the spotify URL has been searched for already. So there appears to be some server-side work that needs to happen before a match.audio URL is useful. Could this server side work lazily the first time a match.audio URL is hit?

I'd be happy to take a crack at this if it's not a batshit crazy idea.

Thanks for the project, by the way. I'm surprised how well you got the matching to work... ๐Ÿ‘

Support matching from Youtube links

It's impossible to automate good matching from Youtube music videos. Instead, let's use an interstitial where we offer suggestions as to what we think it might be. We can do our best to split the title into chunks and offer them as Artist - Track, Track - Artist, etc. It'll take some polishing, but I think that would do for a first pass.

The app is inaccessible (502 Bad Gateaway)

When I try to access the homepage at https://combine.fm, the app crashes with the following error:

We're sorry, but something went wrong.

If you are the application owner check the logs for more information.

According to the Browser inspector, it's a 502 Bad Gateaway.

500 in hosted match.audio, can't reproduce in localhost

Hello!
When using https://match.audio, if I try to submit this track: https://play.google.com/music/m/T72mimuffvr6gya2ol5hcp3wdym?t=Comando_Doce_Live_-_Ile_Aiye I get a 500 back from client.js:

{
  "log": {
    "version": "1.2",
    "creator": {
      "name": "WebInspector",
      "version": "537.36"
    },
    "pages": [],
    "entries": [
      {
        "startedDateTime": "2016-02-13T19:25:37.633Z",
        "time": 251.40300000020943,
        "request": {
          "method": "POST",
          "url": "https://match.audio/search",
          "httpVersion": "unknown",
          "headers": [
            {
              "name": ":path",
              "value": "/search"
            },
            {
              "name": "pragma",
              "value": "no-cache"
            },
            {
              "name": "origin",
              "value": "https://match.audio"
            },
            {
              "name": "accept-encoding",
              "value": "gzip, deflate"
            },
            {
              "name": "accept-language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "user-agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "content-type",
              "value": "application/json"
            },
            {
              "name": "accept",
              "value": "*/*"
            },
            {
              "name": "cache-control",
              "value": "no-cache"
            },
            {
              "name": ":authority",
              "value": "match.audio"
            },
            {
              "name": "cookie",
              "value": "__cfduid=d7455c0e4ea5b8bc6d7e7aa110604a2401455391520; _ga=GA1.2.2082453838.1455391528; _gat=1"
            },
            {
              "name": ":scheme",
              "value": "https"
            },
            {
              "name": "referer",
              "value": "https://match.audio/"
            },
            {
              "name": "content-length",
              "value": "100"
            },
            {
              "name": ":method",
              "value": "POST"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "__cfduid",
              "value": "d7455c0e4ea5b8bc6d7e7aa110604a2401455391520",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_ga",
              "value": "GA1.2.2082453838.1455391528",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": -1,
          "bodySize": 100,
          "postData": {
            "mimeType": "application/json",
            "text": "{\"url\":\"https://play.google.com/music/m/T72mimuffvr6gya2ol5hcp3wdym?t=Comando_Doce_Live_-_Ile_Aiye\"}"
          }
        },
        "response": {
          "status": 500,
          "statusText": "OK",
          "httpVersion": "unknown",
          "headers": [
            {
              "name": "date",
              "value": "Sat, 13 Feb 2016 19:25:37 GMT"
            },
            {
              "name": "via",
              "value": "1.1 vegur"
            },
            {
              "name": "x-content-type-options",
              "value": "nosniff"
            },
            {
              "name": "server",
              "value": "cloudflare-nginx"
            },
            {
              "name": "strict-transport-security",
              "value": "max-age=15552000; includeSubDomains; preload"
            },
            {
              "name": "content-type",
              "value": "text/plain; charset=utf-8"
            },
            {
              "name": "status",
              "value": "500"
            },
            {
              "name": "cf-ray",
              "value": "2742eb970b121497-AMS"
            },
            {
              "name": "content-length",
              "value": "21"
            }
          ],
          "cookies": [],
          "content": {
            "size": 21,
            "mimeType": "text/plain"
          },
          "redirectURL": "",
          "headersSize": -1,
          "bodySize": -1,
          "_transferSize": 223
        },
        "cache": {},
        "timings": {
          "blocked": 0.307000000248081,
          "dns": -1,
          "connect": -1,
          "send": 0.14099999862082802,
          "wait": 250.0790000012781,
          "receive": 0.8760000000624188,
          "ssl": -1
        },
        "connection": "225895"
      }
    ]
  }
}

However, cloning match.audio repo I can't reproduce this:

{
  "log": {
    "version": "1.2",
    "creator": {
      "name": "WebInspector",
      "version": "537.36"
    },
    "pages": [
      {
        "startedDateTime": "2016-02-13T19:26:24.324Z",
        "id": "page_1",
        "title": "http://localhost:3000/",
        "pageTimings": {
          "onContentLoad": 504.3919999989157,
          "onLoad": 1246.47399999958
        }
      }
    ],
    "entries": [
      {
        "startedDateTime": "2016-02-13T19:26:43.782Z",
        "time": 3306.719999998677,
        "request": {
          "method": "POST",
          "url": "http://localhost:3000/search",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Origin",
              "value": "http://localhost:3000"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "Accept",
              "value": "*/*"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Content-Length",
              "value": "100"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 497,
          "bodySize": 100,
          "postData": {
            "mimeType": "application/json",
            "text": "{\"url\":\"https://play.google.com/music/m/T72mimuffvr6gya2ol5hcp3wdym?t=Comando_Doce_Live_-_Ile_Aiye\"}"
          }
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Access-Control-Allow-Origin",
              "value": "http://localhost:3000"
            },
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:47 GMT"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Content-Length",
              "value": "666"
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "application/json; charset=utf-8"
            }
          ],
          "cookies": [],
          "content": {
            "size": 666,
            "mimeType": "application/json",
            "compression": 0
          },
          "redirectURL": "",
          "headersSize": 244,
          "bodySize": 666,
          "_transferSize": 910
        },
        "cache": {},
        "timings": {
          "blocked": 0.570000000152504,
          "dns": -1,
          "connect": -1,
          "send": 0.10599999950500205,
          "wait": 3305.3810000001226,
          "receive": 0.6629999988967938,
          "ssl": -1
        },
        "connection": "227576",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:47.135Z",
        "time": 5.715000001146109,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym.json",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "*/*"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 497,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:47 GMT"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Content-Length",
              "value": "784"
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "application/json; charset=utf-8"
            }
          ],
          "cookies": [],
          "content": {
            "size": 784,
            "mimeType": "application/json",
            "compression": 0
          },
          "redirectURL": "",
          "headersSize": 192,
          "bodySize": 784,
          "_transferSize": 976
        },
        "cache": {},
        "timings": {
          "blocked": 1.61200000002282,
          "dns": -1,
          "connect": -1,
          "send": 0.07399999958578984,
          "wait": 3.6950000012439004,
          "receive": 0.33400000029359855,
          "ssl": -1
        },
        "connection": "227576",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:47.135Z",
        "time": 173.7170000014885,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/images/twitter.png",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "image/webp,image/*,*/*;q=0.8"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 495,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:47 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "identity"
            },
            {
              "name": "Last-Modified",
              "value": "Sat, 13 Feb 2016 19:07:27 GMT"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "ETag",
              "value": "\"JRtWW5hKFdrCDSSAa34um/ZTN0TD0Gk1kcntQm39Izw=\""
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "image/png"
            },
            {
              "name": "Cache-Control",
              "value": "public, max-age=31536000"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Content-Length",
              "value": "951"
            }
          ],
          "cookies": [],
          "content": {
            "size": 951,
            "mimeType": "image/png",
            "compression": 0
          },
          "redirectURL": "",
          "headersSize": 339,
          "bodySize": 951,
          "_transferSize": 1290
        },
        "cache": {},
        "timings": {
          "blocked": 1.12000000081025,
          "dns": -1,
          "connect": -1,
          "send": 0.04199999966659007,
          "wait": 172.04599999968215,
          "receive": 0.5090000013294969,
          "ssl": -1
        },
        "connection": "227470",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:47.135Z",
        "time": 174.09299999962968,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/images/facebook.png",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "image/webp,image/*,*/*;q=0.8"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 496,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:47 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "identity"
            },
            {
              "name": "Last-Modified",
              "value": "Sat, 13 Feb 2016 19:07:27 GMT"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "ETag",
              "value": "\"8on5nRdhUtoz6YqDqSugJRVR4sIPakTwOMkLTzURwwM=\""
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "image/png"
            },
            {
              "name": "Cache-Control",
              "value": "public, max-age=31536000"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Content-Length",
              "value": "644"
            }
          ],
          "cookies": [],
          "content": {
            "size": 644,
            "mimeType": "image/png",
            "compression": 0
          },
          "redirectURL": "",
          "headersSize": 339,
          "bodySize": 644,
          "_transferSize": 983
        },
        "cache": {},
        "timings": {
          "blocked": 0.864999999976135,
          "dns": -1,
          "connect": -1,
          "send": 0.040999999328050984,
          "wait": 172.5590000005468,
          "receive": 0.6279999997786945,
          "ssl": -1
        },
        "connection": "227462",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:47.136Z",
        "time": 174.3270000006305,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/images/googleplus.png",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "image/webp,image/*,*/*;q=0.8"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 498,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:47 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "identity"
            },
            {
              "name": "Last-Modified",
              "value": "Sat, 13 Feb 2016 19:07:27 GMT"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "ETag",
              "value": "\"mWl4eHZ0oWjY0dQhO1gRIIcXhIE+0+GYfffcy5GKc7g=\""
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "image/png"
            },
            {
              "name": "Cache-Control",
              "value": "public, max-age=31536000"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Content-Length",
              "value": "1378"
            }
          ],
          "cookies": [],
          "content": {
            "size": 1378,
            "mimeType": "image/png",
            "compression": 0
          },
          "redirectURL": "",
          "headersSize": 340,
          "bodySize": 1378,
          "_transferSize": 1718
        },
        "cache": {},
        "timings": {
          "blocked": 0.601000001552166,
          "dns": -1,
          "connect": -1,
          "send": 0.03899999865097892,
          "wait": 173.05900000064887,
          "receive": 0.6279999997784955,
          "ssl": -1
        },
        "connection": "227436",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:47.142Z",
        "time": 205.80800000061572,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/images/logo-128.png",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "*/*"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 471,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:47 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "identity"
            },
            {
              "name": "Last-Modified",
              "value": "Sat, 13 Feb 2016 19:07:27 GMT"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "ETag",
              "value": "\"LtZoXqGdVemPnYuV0AqzRaKbNvZQvkkytFcgA+QSu9Y=\""
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "image/png"
            },
            {
              "name": "Cache-Control",
              "value": "public, max-age=31536000"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Content-Length",
              "value": "3276"
            }
          ],
          "cookies": [],
          "content": {
            "size": 3276,
            "mimeType": "image/png",
            "compression": 0
          },
          "redirectURL": "",
          "headersSize": 340,
          "bodySize": 3276,
          "_transferSize": 3616
        },
        "cache": {},
        "timings": {
          "blocked": 0.58800000078918,
          "dns": -1,
          "connect": -1,
          "send": 0.11499999891384494,
          "wait": 167.60700000122597,
          "receive": 37.497999999686726,
          "ssl": -1
        },
        "connection": "227576",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:47.161Z",
        "time": 151.01299999878393,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/images/google.png",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "image/webp,image/*,*/*;q=0.8"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 494,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:47 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "identity"
            },
            {
              "name": "Last-Modified",
              "value": "Sat, 13 Feb 2016 19:07:27 GMT"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "ETag",
              "value": "\"rZsQydWxcqWPOhm4MlYRm06J+e7ShFDa2cZQszMkAMI=\""
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "image/png"
            },
            {
              "name": "Cache-Control",
              "value": "public, max-age=31536000"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Content-Length",
              "value": "14440"
            }
          ],
          "cookies": [],
          "content": {
            "size": 14440,
            "mimeType": "image/png",
            "compression": 0
          },
          "redirectURL": "",
          "headersSize": 341,
          "bodySize": 14440,
          "_transferSize": 14781
        },
        "cache": {},
        "timings": {
          "blocked": 1.6219999997702,
          "dns": -1,
          "connect": -1,
          "send": 0.07299999924725009,
          "wait": 147.76499999970855,
          "receive": 1.5530000000579207,
          "ssl": -1
        },
        "connection": "227570",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:47.161Z",
        "time": 142.62199999939185,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/images/eq.svg",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "image/webp,image/*,*/*;q=0.8"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 490,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:47 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "gzip"
            },
            {
              "name": "Last-Modified",
              "value": "Sat, 13 Feb 2016 19:07:27 GMT"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "ETag",
              "value": "\"94dWoy+kEMGGSZlwDwMzOCojcQJhsFxBS7vfXNKSTLw=\""
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "image/svg+xml"
            },
            {
              "name": "Cache-Control",
              "value": "public, max-age=31536000"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Content-Length",
              "value": "347"
            }
          ],
          "cookies": [],
          "content": {
            "size": 979,
            "mimeType": "image/svg+xml",
            "compression": 632
          },
          "redirectURL": "",
          "headersSize": 339,
          "bodySize": 347,
          "_transferSize": 686
        },
        "cache": {},
        "timings": {
          "blocked": 1.10700000004726,
          "dns": -1,
          "connect": -1,
          "send": 0.039000000469969986,
          "wait": 140.51300000028277,
          "receive": 0.9629999985918403,
          "ssl": -1
        },
        "connection": "227466",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:47.304Z",
        "time": 50.44699999962177,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/images/youtube.png",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "image/webp,image/*,*/*;q=0.8"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 495,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:47 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "identity"
            },
            {
              "name": "Last-Modified",
              "value": "Sat, 13 Feb 2016 19:07:27 GMT"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "ETag",
              "value": "\"JvcIfMovdC65/nPzv6oS3SxLEAxiZuGwhSI3F96Rnuo=\""
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "image/png"
            },
            {
              "name": "Cache-Control",
              "value": "public, max-age=31536000"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Content-Length",
              "value": "7869"
            }
          ],
          "cookies": [],
          "content": {
            "size": 7869,
            "mimeType": "image/png",
            "compression": 0
          },
          "redirectURL": "",
          "headersSize": 340,
          "bodySize": 7869,
          "_transferSize": 8209
        },
        "cache": {},
        "timings": {
          "blocked": 0.702999999703025,
          "dns": -1,
          "connect": -1,
          "send": 0.13000000035390202,
          "wait": 12.334999999438873,
          "receive": 37.27900000012597,
          "ssl": -1
        },
        "connection": "227466",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:47.310Z",
        "time": 50.546000000395,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/images/xbox.png",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "image/webp,image/*,*/*;q=0.8"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 492,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:47 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "identity"
            },
            {
              "name": "Last-Modified",
              "value": "Sat, 13 Feb 2016 19:07:27 GMT"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "ETag",
              "value": "\"hYpyxNQQ/bemCNY7Zyo7wJAaFj0dFF7LFQqlps09Z0c=\""
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "image/png"
            },
            {
              "name": "Cache-Control",
              "value": "public, max-age=31536000"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Content-Length",
              "value": "11035"
            }
          ],
          "cookies": [],
          "content": {
            "size": 11035,
            "mimeType": "image/png",
            "compression": 0
          },
          "redirectURL": "",
          "headersSize": 341,
          "bodySize": 11035,
          "_transferSize": 11376
        },
        "cache": {},
        "timings": {
          "blocked": 1.44000000000233,
          "dns": -1,
          "connect": -1,
          "send": 0.10599999950499983,
          "wait": 9.23700000021197,
          "receive": 39.763000000675696,
          "ssl": -1
        },
        "connection": "227436",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:47.311Z",
        "time": 53.875999999945634,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/images/spotify.png",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "image/webp,image/*,*/*;q=0.8"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 495,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:47 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "identity"
            },
            {
              "name": "Last-Modified",
              "value": "Sat, 13 Feb 2016 19:07:27 GMT"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "ETag",
              "value": "\"r1V8lf1blJ6+zxK2FLden++avZf5xhJb7NaxfWnEOaw=\""
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "image/png"
            },
            {
              "name": "Cache-Control",
              "value": "public, max-age=31536000"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Content-Length",
              "value": "13170"
            }
          ],
          "cookies": [],
          "content": {
            "size": 13170,
            "mimeType": "image/png",
            "compression": 0
          },
          "redirectURL": "",
          "headersSize": 341,
          "bodySize": 13170,
          "_transferSize": 13511
        },
        "cache": {},
        "timings": {
          "blocked": 1.15000000005239,
          "dns": -1,
          "connect": -1,
          "send": 0.47099999937926995,
          "wait": 12.94600000073844,
          "receive": 39.30899999977554,
          "ssl": -1
        },
        "connection": "227462",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:47.311Z",
        "time": 53.3850000010716,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/images/itunes.png",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "image/webp,image/*,*/*;q=0.8"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 494,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:47 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "identity"
            },
            {
              "name": "Last-Modified",
              "value": "Sat, 13 Feb 2016 19:07:27 GMT"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "ETag",
              "value": "\"NvTSn2tDHT01wydB1lIoU6jMGrKyyARKe/G9C8yR48k=\""
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "image/png"
            },
            {
              "name": "Cache-Control",
              "value": "public, max-age=31536000"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Content-Length",
              "value": "8037"
            }
          ],
          "cookies": [],
          "content": {
            "size": 8037,
            "mimeType": "image/png",
            "compression": 0
          },
          "redirectURL": "",
          "headersSize": 340,
          "bodySize": 8037,
          "_transferSize": 8377
        },
        "cache": {},
        "timings": {
          "blocked": 1.38800000058836,
          "dns": -1,
          "connect": -1,
          "send": 0.06700000085403013,
          "wait": 13.26299999891491,
          "receive": 38.6670000007143,
          "ssl": -1
        },
        "connection": "227470",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:47.313Z",
        "time": 51.70500000167522,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/images/deezer.png",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "image/webp,image/*,*/*;q=0.8"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 494,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:47 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "identity"
            },
            {
              "name": "Last-Modified",
              "value": "Sat, 13 Feb 2016 19:07:27 GMT"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "ETag",
              "value": "\"qZNWlNaOYIUKGGLPPAR2ojxGoUuaFBwCBWP+aYU5fcU=\""
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "image/png"
            },
            {
              "name": "Cache-Control",
              "value": "public, max-age=31536000"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Content-Length",
              "value": "8122"
            }
          ],
          "cookies": [],
          "content": {
            "size": 8122,
            "mimeType": "image/png",
            "compression": 0
          },
          "redirectURL": "",
          "headersSize": 340,
          "bodySize": 8122,
          "_transferSize": 8462
        },
        "cache": {},
        "timings": {
          "blocked": 0.639000001683598,
          "dns": -1,
          "connect": -1,
          "send": 0.07999999979801997,
          "wait": 12.799999998605882,
          "receive": 38.186000001587715,
          "ssl": -1
        },
        "connection": "227570",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:49.136Z",
        "time": 4.1650000002846355,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym.json",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "*/*"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 497,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:49 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "gzip"
            },
            {
              "name": "Transfer-Encoding",
              "value": "chunked"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "application/json; charset=utf-8"
            }
          ],
          "cookies": [],
          "content": {
            "size": 1242,
            "mimeType": "application/json",
            "compression": 636
          },
          "redirectURL": "",
          "headersSize": 223,
          "bodySize": 606,
          "_transferSize": 829
        },
        "cache": {},
        "timings": {
          "blocked": 0.49600000056671,
          "dns": -1,
          "connect": -1,
          "send": 0.08799999886832599,
          "wait": 3.158999999868684,
          "receive": 0.4220000009809155,
          "ssl": -1
        },
        "connection": "227462",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:49.154Z",
        "time": 3260.772999999972,
        "request": {
          "method": "GET",
          "url": "https://i.scdn.co/image/0b1c451b8673e2b5f3fa233217d807cfade63dbb",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "i.scdn.co"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "image/webp,image/*,*/*;q=0.8"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [],
          "headersSize": 469,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:49 GMT"
            },
            {
              "name": "Last-Modified",
              "value": "Sun, 12 Apr 2015 02:20:25 GMT"
            },
            {
              "name": "Server",
              "value": "ECAcc (rtm/352E)"
            },
            {
              "name": "x-amz-request-id",
              "value": "FC1ADAE80014722F"
            },
            {
              "name": "Etag",
              "value": "\"f3b6f1e358291f99ad933ced85310ce1\""
            },
            {
              "name": "X-Cache",
              "value": "HIT"
            },
            {
              "name": "Content-Type",
              "value": "image/jpeg"
            },
            {
              "name": "Access-Control-Allow-Origin",
              "value": "*"
            },
            {
              "name": "Cache-Control",
              "value": "max-age=315360000"
            },
            {
              "name": "Accept-Ranges",
              "value": "bytes"
            },
            {
              "name": "Content-Length",
              "value": "79938"
            },
            {
              "name": "x-amz-id-2",
              "value": "+E4yC5GncHM3F5bwUPRvFpjreTC6nd6PlIJtjFG4P/PPYIXcf0aaNlef9hBXKyPjnk72Q+QYYgc="
            },
            {
              "name": "Expires",
              "value": "Tue, 10 Feb 2026 19:26:49 GMT"
            }
          ],
          "cookies": [],
          "content": {
            "size": 79938,
            "mimeType": "image/jpeg",
            "compression": 0
          },
          "redirectURL": "",
          "headersSize": 487,
          "bodySize": 79938,
          "_transferSize": 80425
        },
        "cache": {},
        "timings": {
          "blocked": 1.28600000061851,
          "dns": -1,
          "connect": -1,
          "send": 0.15300000086427,
          "wait": 1538.8979999988771,
          "receive": 1720.435999999612,
          "ssl": -1
        },
        "connection": "227020",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:51.136Z",
        "time": 4.829999999856227,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym.json",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "*/*"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 497,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:51 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "gzip"
            },
            {
              "name": "Transfer-Encoding",
              "value": "chunked"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "application/json; charset=utf-8"
            }
          ],
          "cookies": [],
          "content": {
            "size": 1735,
            "mimeType": "application/json",
            "compression": 1019
          },
          "redirectURL": "",
          "headersSize": 223,
          "bodySize": 716,
          "_transferSize": 939
        },
        "cache": {},
        "timings": {
          "blocked": 0.473000000056345,
          "dns": -1,
          "connect": -1,
          "send": 0.08600000001024499,
          "wait": 3.6120000004302697,
          "receive": 0.6589999993593674,
          "ssl": -1
        },
        "connection": "227462",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:51.150Z",
        "time": 3063.688000000184,
        "request": {
          "method": "GET",
          "url": "https://cdns-images.dzcdn.net/images/cover/28123316c34d45203a063a4a70ecb76f/200x200-000000-80-0-0.jpg",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "cdns-images.dzcdn.net"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "image/webp,image/*,*/*;q=0.8"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [],
          "headersSize": 506,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": ""
            },
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:53 GMT"
            },
            {
              "name": "Server",
              "value": "Apache"
            },
            {
              "name": "Age",
              "value": "232"
            },
            {
              "name": "Content-Type",
              "value": "image/jpeg"
            },
            {
              "name": "Access-Control-Allow-Origin",
              "value": "*"
            },
            {
              "name": "Cache-Control",
              "value": "public"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "X-Deezer-Cache",
              "value": "HIT"
            },
            {
              "name": "Content-Length",
              "value": "27638"
            },
            {
              "name": "Expires",
              "value": "Tue, 12 Jul 2016 19:23:01 GMT"
            }
          ],
          "cookies": [],
          "content": {
            "size": 27638,
            "mimeType": "image/jpeg",
            "compression": 0
          },
          "redirectURL": "",
          "headersSize": 281,
          "bodySize": 27638,
          "_transferSize": 27919
        },
        "cache": {},
        "timings": {
          "blocked": 0.470000000859727,
          "dns": 1036.9539999992403,
          "connect": 1226.5740000002602,
          "send": 0.15399999937972098,
          "wait": 745.6340000007899,
          "receive": 53.90199999965398,
          "ssl": 895.1990000005003
        },
        "connection": "229068",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:53.135Z",
        "time": 5.631999998513493,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym.json",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "*/*"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 497,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:53 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "gzip"
            },
            {
              "name": "Transfer-Encoding",
              "value": "chunked"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "application/json; charset=utf-8"
            }
          ],
          "cookies": [],
          "content": {
            "size": 1775,
            "mimeType": "application/json",
            "compression": 1053
          },
          "redirectURL": "",
          "headersSize": 223,
          "bodySize": 722,
          "_transferSize": 945
        },
        "cache": {},
        "timings": {
          "blocked": 0.594999999520951,
          "dns": -1,
          "connect": -1,
          "send": 0.0949999994190881,
          "wait": 4.505000000790461,
          "receive": 0.43699999878299245,
          "ssl": -1
        },
        "connection": "227462",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2016-02-13T19:26:55.136Z",
        "time": 7.236999999804539,
        "request": {
          "method": "GET",
          "url": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym.json",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Pragma",
              "value": "no-cache"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip, deflate, sdch"
            },
            {
              "name": "Host",
              "value": "localhost:3000"
            },
            {
              "name": "Accept-Language",
              "value": "pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "*/*"
            },
            {
              "name": "Referer",
              "value": "http://localhost:3000/google/track/T72mimuffvr6gya2ol5hcp3wdym"
            },
            {
              "name": "Cookie",
              "value": "_ga=GA1.1.1640149456.1455391591; _gat=1"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "_ga",
              "value": "GA1.1.1640149456.1455391591",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "_gat",
              "value": "1",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 497,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Sat, 13 Feb 2016 19:26:55 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "gzip"
            },
            {
              "name": "Transfer-Encoding",
              "value": "chunked"
            },
            {
              "name": "Server",
              "value": "Nintendo 64"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "application/json; charset=utf-8"
            }
          ],
          "cookies": [],
          "content": {
            "size": 1815,
            "mimeType": "application/json",
            "compression": 1091
          },
          "redirectURL": "",
          "headersSize": 223,
          "bodySize": 724,
          "_transferSize": 947
        },
        "cache": {},
        "timings": {
          "blocked": 0.55900000006659,
          "dns": -1,
          "connect": -1,
          "send": 0.09300000056100499,
          "wait": 4.771999998411045,
          "receive": 1.813000000765899,
          "ssl": -1
        },
        "connection": "227462",
        "pageref": "page_1"
      }
    ]
  }
}

Any ideas?

Ability to select a default service

I think it'd be neat to be able to choose a music provider as a "default" when hitting the results page without having just submitted the form. On the next match.audio link you clicked, you'd be sent directly to that music provider if it was available, or told to select a different source. Probably there'd be a 3 second wait before redirection or something so you could change your preferred music provider. I think you could just set a cookie with the provider they selected.

This way if people were sending match.audio links frequently, you wouldn't have to "click through" each time. I'd like to use match.audio in my IRC bot (for example, during the Last.fm-backed "now playing" command to link the song they are listening to), so if people were frequently clicking links in the channel, they wouldn't have to click Spotify or YouTube every time, for example.

Update logos

Use isomorphic React to support async matching

Initial share page loads take up to 10 seconds. Instead lets do matching in the background and update the share page with the results as they come in.

I want to use isomorphic React because React is awesome, but I also don't want these public pages to take seconds to render and lack easily crawlable content.

Developer API

Hi! I remember seeing this project a while ago and really loving it. I was wondering if:

  1. You might be willing to incorporate a developer API into the project. (This would be great for an IRC bot plugin I plan to write soon, so people pasting Spotify / GMusic links won't annoy users of the other service.)
  2. I see you haven't made a ton of changes to this project lately (I know how side projects go :)), so I was wondering, if point number 1 is acceptable, if you'd be interested in me trying to write this functionality and submitting a pull request. :)

Alternatively, I also see that I could use the endpoint used in the Chrome extension. Would you prefer that fact isn't utilized? (i.e. Should I assume that is meant only for internal use, and it would be rude to use?)

Thanks!

Sometimes `type` is not returned

For example, submitting https://play.google.com/music/m/Bjvfq7gmxrxra6rmwkvqwqjbm3i?t=Nighttime_Stories_-_Pelican returns the following payload with no top-level type property (in this case it should be "album"):

artist: {id: 5055, name: "Pelican", streamUrl: null, purchaseUrl: null, artworkSmall: null, artworkLarge: null,โ€ฆ}
artistId: 5055
createdAt: "2019-06-14T15:32:26.596Z"
deletedAt: null
externalId: "Bjvfq7gmxrxra6rmwkvqwqjbm3i"
id: "Bjvfq7gmxrxra6rmwkvqwqjbm3i"
matches: [,โ€ฆ]
name: "Nighttime Stories"
service: "google"
updatedAt: "2019-06-14T15:32:26.596Z"

The URL is then changed to https://combine.fm/google/undefined/Bjvfq7gmxrxra6rmwkvqwqjbm3i which returns Invalid type.

This appears to be the case more frequently when sharing an album for not the first time.

Match failing for some albums between spotify and google music

I've had this issue with two albums I've tried, and they don't seem to have anything in common. The album exists in both services, but match.audio seems to not be able to match them.

The first was the get down soundtrack:
https://match.audio/spotify/album/0UqBp39R5ARECBnxnVk25l
https://match.audio/google/album/Bzudnfixxsk647fqpbftbclgety

The second is from a Brazilian duo:
https://match.audio/spotify/album/4P09BJFkwTM9QW89RvyQy5
https://match.audio/google/album/Bfybhxorsk3m3g7xooyihpwghri

But looking at other albums currently at the recently shared, it seems they share the same issue.

Auto open preferred service

I like this idea but I think it could be even more useful if users could set a preferred music service, and when they click the Match Audio link, they automatically get redirected to their preferred service.

If you want to make it clear they were hitting Match Audio, you could even have a "You will be redirected in a few seconds..." page where they can get more information.

Probably the preferred service would be stored as a long-term cookie.

If this idea is popular, I may be willing to implement it and submit a PR.

Google Play Music EOL

Google Play Music will join the Google Graveyard before 2020 ends.

This means a new service for its replacement, Youtube Music, must be added.
There is no publicly documented API but some effort was put in a thoroughly documented python library (ytmusicapi) which could greatly help in implementing the few calls combine.fm should need.
It seems there is no need for authentication to perform searches.

This task is up for grabs, I might find the motivation next time I need to share a track.

Link wrong when sharing track from Google Play

Hello!

I've tried to share a track from google play today: https://play.google.com/music/m/Tfdfxstnbkqwnzeg5xtkg64sjgy?signup_if_needed=1
Which goes to this link: https://match.audio/google/track/Tfdfxstnbkqwnzeg5xtkg64sjgy

But looking at the json returned: https://match.audio/google/track/Tfdfxstnbkqwnzeg5xtkg64sjgy.json

You can see that the track is giving out the wrong type album. I've started match.audio locally and did some debugging, and it seems that this.getDataValue('trackId') which is used in the comparison at models/track.js:32 is never there. Given that this is inside the Track model, can it be an album at some point? I've tried changing this to getter to something like this instead:

      type() {
        return 'track';
      },  

And did a similar thing in the album getter, and it seems the answers become right. There's a similar issue in lib/share.js:77. In there I changed to:

          models.match.create({
            trackId: share.$modelOptions.name.singular == 'track' ? share.id : null,
            albumId: share.$modelOptions.name.singular == 'album' ? share.id : null,
            externalId: null,
            service: match.service,
            name: null,
            streamUrl: null,
            purchaseUrl: null,
            artworkSmall: null,
            artworkLarge: null,
          });

Does this makes sense to you?
You can see the diff in here:
master...renatolond:music_type_fix

Search box only appears from internal links

If I open match.audio straight from the link bar, I don't have the search box, see attached screenshot:
image

But if I visit a recently searched album and then come back to the main page using the match.audio link at the top, the search bar is back:
image

This was not the case a few days ago, when I could just hit up match.audio and search directly. It seems that the search is being removed in the entry-client.js, when it does replaceState. Which seems it's not called when navigating from an existing page.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.