Coder Social home page Coder Social logo

spotify-url-info's Introduction

microlink logo microlink logo

Last version Coverage Status NPM Status

Get metadata from Spotify URLs.

Install

npm install spotify-url-info

Usage

In order to use the library, you have to provide the fetch agent to use:

const fetch = require('isomorphic-unfetch')
const { getData, getPreview, getTracks, getDetails } =
  require('spotify-url-info')(fetch)

There are four functions:

  • getData
    Provides the full available data, in a shape that is very similar to what the spotify API returns.

  • getPreview
    Always returns the same fields for different types of resources (album, artist, playlist, track). The preview track is the first in the Album, Playlist, etc.

  • getTracks
    Returns array with tracks. This data is passed on straight from spotify, so the shape could change.Only the first 100 tracks will be returned.

  • getDetails
    Returns both the preview and tracks. Should be used if you require information from both of them so that only one request is made.

All the methods receive a Spotify URL (play. or open.) as first argument:

getPreview('https://open.spotify.com/track/5nTtCOCds6I0PHMNtqelas').then(data =>
  console.log(data)
)

Additionally, you can provide fetch agent options as second argument:

getPreview('https://open.spotify.com/track/5nTtCOCds6I0PHMNtqelas', {
  headers: {
    'user-agent': 'googlebot'
  }
}).then(data => console.log(data))

It returns back the information related to the Spotify URL:

{
  "title": "Immaterial",
  "type": "track",
  "track": "Immaterial",
  "artist": "SOPHIE",
  "image": "https://i.scdn.co/image/d6f496a6708d22a2f867e5acb84afb0eb0b07bc1",
  "audio": "https://p.scdn.co/mp3-preview/6be8eb12ff18ae09b7a6d38ff1e5327fd128a74e?cid=162b7dc01f3a4a2ca32ed3cec83d1e02",
  "link": "https://open.spotify.com/track/5nTtCOCds6I0PHMNtqelas",
  "embed": "https://embed.spotify.com/?uri=spotify:track:5nTtCOCds6I0PHMNtqelas",
  "date": "2018-06-15T00:00:00.000Z",
  "description": "description of a podcast episode"
}

When a field can't be retrieved, the value will be undefined.

There are no guarantees about the shape of this data, because it varies with different media and scraping methods. Handle it carefully.

License

spotify-url-info © microlink.io, released under the MIT License.
Authored by Karl Sander and maintained by Kiko Beats with help from contributors.

microlink.io · GitHub microlink.io · Twitter @microlinkhq

spotify-url-info's People

Contributors

crxts avatar d3sox avatar dalibortrampota avatar dependabot-preview[bot] avatar dependabot-support avatar dependabot[bot] avatar eithoo avatar kaaax0815 avatar karlsander avatar kikobeats avatar sawa-ko 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

Watchers

 avatar  avatar  avatar  avatar  avatar

spotify-url-info's Issues

getPreview Does not return any data

Describe the bug
the method getPreview() is unable to fetch the track details

Spotify URL(s)
tried with other track ids but doesnt work. Tried the deafult one on the github page, that also doesnt work.

Your Code
getPreview("https://open.spotify.com/track/5nTtCOCds6I0PHMNtqelas").then(
(data) => console.log(data)
);

Error Message
(node:18204) UnhandledPromiseRejectionWarning: Error: Couldn't find any data in embed page that we know how to parse
at D:\Projects\Discord\Manu Nahoi\node_modules\spotify-url-info\src\index.js:62:9

TypeError: Couldn't find scripts to get the data.

Describe the bug
Just like issue #125, im using the getPreview() method with a url of a spotify track, the error sometimes appears and sometimes not.

Adding require('fs').writeFileSync('index.html', JSON.stringify(html, null, 2)) doesn't fix the problem

Spotify URL(s)
https://open.spotify.com/intl-es/track/2HZLXBOnaSRhXStMLrq9fD?si=0c23f172ebba42fb

Your Code

// Spotify
const SpotifyFetch = require('isomorphic-unfetch')
const { getData, getPreview, getTracks } = require('spotify-url-info')(SpotifyFetch);

// More code

if (url.includes("spotify.com/") && url.includes("track/")) {
    getPreview(url).then(data => {  ...

Error Message

TypeError: Couldn't find scripts to get the data.
Please report the problem at https://github.com/microlinkhq/spotify-url-info/issues.
    at throwError (/home/iperona/DiscordBot/GatoFeli/node_modules/spotify-url-info/src/index.js:24:9)
    at parseData (/home/iperona/DiscordBot/GatoFeli/node_modules/spotify-url-info/src/index.js:32:37)
    at /home/iperona/DiscordBot/GatoFeli/node_modules/spotify-url-info/src/index.js:76:10
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5) Promise {
  <rejected> TypeError: Couldn't find scripts to get the data.
  Please report the problem at https://github.com/microlinkhq/spotify-url-info/issues.
      at throwError (/home/iperona/DiscordBot/GatoFeli/node_modules/spotify-url-info/src/index.js:24:9)
      at parseData (/home/iperona/DiscordBot/GatoFeli/node_modules/spotify-url-info/src/index.js:32:37)
      at /home/iperona/DiscordBot/GatoFeli/node_modules/spotify-url-info/src/index.js:76:10
      at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
}

Error: Couldn't find any data in embed page that we know how to parse

Describe the bug
When trying to pull data from a spotify URL, I get the error "Couldn't find any data in embed page that we know how to parse"

Spotify URL(s)
https://open.spotify.com/track/6Wz9kNEppcp9U6jHptH6sQ, though it happens with every single spotify URL I've tried

Your Code
await getData(trackLink).then(data => { url = data.external_urls.spotify; data.type == 'track' ? songArt = data.album.images[0].url : songArt = data.images[0].url; name = data.name; artists = data.artists.map(artist => artist.name); if (data.type == 'track' || data.type == 'single') { trackUris.push(data.uri); // Used to add to playlist } else if (data.type == 'album') { for (let i = 0; i < data.tracks.items.length; i++) { trackUris.push(data.tracks.items[i].uri); } if (!name.includes(' EP') && !name.includes(' LP')) { name = (data.album_type == 'single') ? name += ' EP' : name += ' LP'; } } }).catch((err) => { console.log(err); });

Error Message
Error: Couldn't find any data in embed page that we know how to parse

`getTracks` returning `duration` instead of `duration_ms` for some tracks.

Describe the bug
When calling getTracks(), some tracks will not include the property duration_ms as it is officially documented in type Tracks but instead include the property duration which is not documented in your types. This causes the duration to be undefined and is not usable for further processing.

I am using spotify-url-info version 3.1.9 and isomorphic-unfetch version 0.7.10

Spotify URL(s)

Your Code

import fetch from "isomorphic-unfetch";
import spotify, { Tracks } from "spotify-url-info";

const { getTracks, getData } = spotify(fetch);

// when fetching tracks
const tracks = await getTracks(query);
tracks.forEach(track => {
  console.log(track.duration_ms); // will be undefined for some tracks
  console.log((track as Tracks & {duration?: number}).duration); // is included in some tracks but not all
});

Example object response

{
  type: 'track',
  name: 'fool4love',
  uri: 'spotify:track:3j7ttprPTsaqGMcpUfZuOA',
  id: '3j7ttprPTsaqGMcpUfZuOA',
  title: 'fool4love',
  artists: [ { name: 'ericdoa', uri: 'spotify:artist:4hR6Bm9YYtktXzjmKhb1Cn' } ],
  coverArt: {
    extractedColors: { colorDark: [Object], colorLight: [Object] },
    sources: [ [Object], [Object], [Object] ]
  },
  releaseDate: { isoString: '2022-05-20T00:00:00Z' },
  duration: 128571,
  maxDuration: 128571,
  isPlayable: true,
  isExplicit: false,
  audioPreview: {
    url: 'https://p.scdn.co/mp3-preview/26a10276e66e450a19ace6bf181178c36e1e57b6',
    format: 'MP3_96'
  },
  hasVideo: false,
  },
  hasVideo: false,
  relatedEntityUri: 'spotify:artist:4hR6Bm9YYtktXzjmKhb1Cn',
  external_urls: { spotify: 'https://open.spotify.com/track/3j7ttprPTsaqGMcpUfZuOA' }
}

getTracks doesn't work anymore

Describe the bug
getTracks() gives an error when being run on this album

Spotify URL(s)
https://open.spotify.com/album/6YuNt7ueupL1klxLJiTqTJ?si=HLEtPLJoTaqprBmRm7qkCQ

Your Code
(trackLink is a variable holding that link above)

if (trackLink.includes('album')) {
    const tracks = await getTracks(trackLink);
    console.log(tracks);
}

Error Message
TypeError: Cannot read properties of undefined (reading 'items')
at getTracks (/Users/jeffturpin/Documents/GitHub/Waveform/discord-bot/node_modules/spotify-url-info/src/index.js:145:26)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async Object.execute (/Users/jeffturpin/Documents/GitHub/Waveform/discord-bot/commands/sendmail.js:71:28)
at async Client. (/Users/jeffturpin/Documents/GitHub/Waveform/discord-bot/index.js:225:9)

Providing a Spotify link to a deleted track or playlist crashes the app

Describe the bug
When providing a link to an old playlist or track that has since been removed or deleted, the library would crash the app.
If I'm not mistaken, when trying to access the html element of the page (which doesn't exist when the playlist doesn't exist) the .children property is being accessed from an undefined result of the .find method.
This happens in line 26 in index.js.

Spotify URL(s)
The specific Spotify URL you are having issues with.

Your Code
I am currently using the getData method as follows:

getTracks(url: string) {
  try {
    data = await getData(url);
  } catch (e) {
    console.log(e);
    return;
  }
}

Error Message

TypeError: Cannot read properties of undefined (reading 'children')
    at [REDACTED]\node_modules\spotify-url-info\src\index.js:27:5
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async Function.getTracks ([REDACTED]/spotify.ts:20:20)

Thank you.

Provide a way to get preview and tracks with one request

Currently, if I want to get both the preview and the tracks I have to call both getPreview and getTracks which unnecessarily makes two requests. It would be nice if there was a method that returns both like

getDetails(url: string, options?: object): Promise<{ preview: Preview, tracks: Tracks[] }>;

Only support 30 seconds of audio?

So i just started using this package and idk if this is intended or not, but the audio link from getPreview is only about 30 seconds?

example:

const data = await getPreview('https://open.spotify.com/track/7eQvvCRBECiZoJkX3r6q1L')

console.log(data.audio)

I would get the audio link, but only 30 seconds long

Not able to console.log returned JSON object

Using version 1.4.0, using the following code to return JSON object of a Spotify URL:
await getPreview(this.post.URL).then((result) => { console.log(result.image); });

Getting this error in console when trying to log result.image/any other property of the object. Also when trying to print the object itself: https://imgur.com/a/20cfpEz

this.post.URL is definitely a valid Spotify URL, it is parsed previously in the function.

[BUG] TypeError: Cannot read properties of undefined (reading 'map')

Describe the bug
I did a few tries after the error popped up. I think if the first song in a playlist is an episode, there is an error in the artists part.

Spotify URL(s)
I created a playlist for you to check the error more easily

First Track is Episode (Error) : https://open.spotify.com/playlist/0I4mmS9EzRzqaGaYZc4DqV
First Track is Song : https://open.spotify.com/playlist/277H1jS7KALrvJlKtrDbtN

Error Message
TypeError: Cannot read properties of undefined (reading 'map')

People who don't want a problem until the bug is fixed they can use the code like this :

const artist = track.artists ? track.artists.map(a => a.name).join(' & ') : undefined
  
  return Promise.resolve({
    date,
    title: data.name,
    type: data.type,
    track: track.name,
    description: data.description || undefined,
    artist: artist,
    image: images.reduce((a, b) => (a.width > b.width ? a : b)).url,
    audio: track.preview_url,
    link: data.external_urls.spotify,
    embed: `https://embed.spotify.com/?uri=${data.uri}`
  })

not able to fetch

Error: Couldn't find any data in embed page that we know how to parse

Spotify URL(s) Spotify Playlist is not playing

Describe the bug
A clear and concise description of what the bug is.

Spotify URL(s)
The specific spotify URLs you are having issues with. Even If it's broken for all URLs, please put at least one that caused an error.

Your Code
The part of your code where you use the functions you imported from the library and the surrounding lines / function.

Error Message
The error message you get when running the code.

spotify.getData is not a function

Describe the bug
I get this error in this new update, it did not happen in the previous one and the code that this package uses has not been changed.

Spotify URL(s)
https://open.spotify.com/track/4tRluQ3OVRGDE9CMTALg3t?si=d7db95dd2a694aa7

Your Code

import * as spotify from 'spotify-url-info';
await spotify.getData(url);

Error Message

PS E:\Proyectos\Personal\Naeko\naeko> yarn start
SyntaxError: The requested module 'spotify-url-info' does not provide an export named 'getData'
    at ModuleJob._instantiate (node:internal/modules/esm/module_job:127:21)
    at async ModuleJob.run (node:internal/modules/esm/module_job:193:5)
    at async Promise.all (index 0)
    at async ESMLoader.import (node:internal/modules/esm/loader:337:24)
    at async loadESM (node:internal/process/esm_loader:88:5)
    at async handleMainPromise (node:internal/modules/run_main:61:12)

Node.js v17.5.0

How can i get all the total songs from a playlist instead of 100 limited songs from using your library.

Ok so, I used your library to fetch songs from the playlist which has 100+ songs. Any way I can get all the songs? Here's my current code: make sure to read from the song.startsWith('https://open.spotify.com/playlist') part.

const {
    getData,
    getPreview,
    getTracks
} = require('spotify-url-info');

const {
    getData,
    getPreview,
    getTracks
} = require('spotify-url-info');
const ytsr = require('ytsr');

async function spotifyToYoutube(song){
    if(song.startsWith('https://open.spotify.com/track')){
        //Some code here.
    } else if(song.startsWith('https://open.spotify.com/playlist')){
        //Read from here.
        const playlistData = await getTracks(song);
        let songArray = [];
        for(let i = 0; i < playlistData.length; i++){
            songArray.push(playlistData[i].name);
        }
        console.log(songArray);
    } else if(!song){
        console.log('No song parameter given.');
    }
}

spotifyToYoutube('https://open.spotify.com/playlist/1GDDjhXuuL8iqjfVzIdWrM?si=4f5373ee1ec44d61').then(data => {});```

TypeError: require(...) is not a function

Describe the bug
When I try to do what the readme say I get a error.

Your Code

const fetch = require('isomorphic-unfetch')
const { getData, getPreview, getTracks, getDetails } = require('spotify-url-info')(fetch)

Error Message
0|bettyBOT | TypeError: require(...) is not a function
0|bettyBOT | at Object. (/root/bettyBOT/base/audio-events.js:30:49)
0|bettyBOT | at Module._compile (node:internal/modules/cjs/loader:1254:14)
0|bettyBOT | at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
0|bettyBOT | at Module.load (node:internal/modules/cjs/loader:1117:32)
0|bettyBOT | at Module._load (node:internal/modules/cjs/loader:958:12)
0|bettyBOT | at Module.require (node:internal/modules/cjs/loader:1141:19)
0|bettyBOT | at require (node:internal/modules/cjs/helpers:110:18)
0|bettyBOT | at Timeout._onTimeout (/root/bettyBOT/base/audio-player.js:62:5)
0|bettyBOT | at listOnTimeout (node:internal/timers:569:17)
0|bettyBOT | at process.processTimers (node:internal/timers:512:7) uncaughtException

getTracks() scrap limit?

Hi, I have been using this package for my discord bot, and I realized that when I input a 300 songs playlist only the first 100 came back. Is that a limitation of this package or am I doing something wrong?

Can't find any data | Never works for me

I keep getting this error again and again. Never works for me
My version is latest
Screenshot 2020-12-04 at 11 18 06 AM
My code is -

               const song = await getPreview(args[0])
               const songname = song.title

it gives error at line - const song = await getPreview(args[0])

How I defined - var { getData, getPreview } = require("spotify-url-info");

Problem getting tracks, may be me

when trying to gettracks i receieve the following error

SyntaxError: Unexpected token e in JSON at position 0
at JSON.parse ()
at C:\node_modules\spotify-url-info\src\index.js:36:18

Spotify URL(s)
(https://open.spotify.com/playlist/37i9dQZF1E37tA0YCiV36c?si=d13a383ec4294e07)

Your Code
try{
let songs = await getTracks(args[1]);
}
catch(err)
{
console.log(err);
}

i was using a older version i believe on discord.js v12 and im having to update everything i used to call

let songs = await spAPI.getTracks(args[1]);

Can't get after 'artists'

when i want to get the 'duration_ms' its say 'undefined'
`

`

It is neither possible to get the release date of a song/album nor distinguish between an album and a single

Bug description

Hello everyone,

I have used this library since August, 2022 and I haven't had any problems until January approximately. Right now, I have the following problems:

  1. It is not possible to get the release date of any song/album. The JSON object returned by the library has always a null value in this field.

  2. It is not possible to know if a parsed url contains either a single song or an album whereas some months ago, with older versions, it was by checking the field "album_type" of the JSON object. This field has currently disappeared.

In order to solve the problem, I thought that to get the information with the format I needed, using an old version was possible, however, it is neither possible due to the fact that the error message "Couldn't find any data in embed page that we know how to parse" appears when I use a version previous to 3.1.4 (which was the version that I used without any problems).

An example of what I am explaining is below, with the url specified I get the JSON object that is shown here (with a null release date and without any "album_type" field):

Example of an execution of the problem above

Spotify URL(s)

https://open.spotify.com/album/0akDdsW5I5D6ZpQU4B6Kre?highlight=spotify:track:4raY0xxADxSo4sachP0rFr

JSON object obtanied

{
type: "album",
name: "Quasi",
uri: "spotify:album:0akDdsW5I5D6ZpQU4B6Kre",
id: "0akDdsW5I5D6ZpQU4B6Kre",
title: "Quasi",
subtitle: "Pablo López",
coverArt: {
extractedColors: {
colorDark: {
hex: "#2080A0",
},
},
sources: [
{
height: 640,
width: 640,
url: "https://i.scdn.co/image/ab67616d0000b2732e16e335d5e8aba0a80086d5",
},
{
height: 300,
width: 300,
url: "https://i.scdn.co/image/ab67616d00001e022e16e335d5e8aba0a80086d5",
},
{
height: 64,
width: 64,
url: "https://i.scdn.co/image/ab67616d000048512e16e335d5e8aba0a80086d5",
},
],
},
releaseDate: null,
duration: 0,
maxDuration: 0,
isPlayable: true,
isExplicit: false,
hasVideo: false,
relatedEntityUri: "",
trackList: [
{
uri: "spotify:track:4raY0xxADxSo4sachP0rFr",
uid: "12608b072eae0f6d2ab1",
title: "Quasi",
subtitle: "Pablo López",
isExplicit: false,
duration: 209700,
isPlayable: true,
audioPreview: {
format: "MP3_96",
url: "https://p.scdn.co/mp3-preview/325857d492a70bcc97c19aa93290b1bbd82bc0d8",
},
},
],
}

I don't know if this happens due to spotify changes, but is there a solution? Could I get the information I need by doing something different?

I would be grateful if someone could help me with this problem, this library is very helpful and I really need it to let a Mp3Tagger program I have developed to work.

Regards.

Couldn't find scripts to get the data

Describe the bug
using the getData() method, trying to actually get the data, but get this error every time, no matter which URL i'm using. Sometimes it does work and sometimes it doesn't, it is just randomly..

Spotify URL(s)
https://open.spotify.com/track/6TfBA04WJ3X1d1wXhaCFVT?si=08711e6dbb394d85

My Code

    /**
     * Determine if a URL is for a track or a playlist.
     *
     * @param {string} url - Spotify URL.
     * @returns {Promise<{ type: string, data: any }>} - Object containing the type ("track" or "playlist") and the fetched data.
     * @throws {Error} If an error occurs during validation.
     */
    async getTrackType(url) {
        if (!url) throw new Error('You did not specify the URL of the Spotify song!');

        // Assuming this.validateURL() is a method that validates the Spotify URL.

        await this.validateURL(url);

        const data = await getData(url, {
            headers: {
                'user-agent': 'bingbot'
            }
        });

        return {
            type: data.type,
            data: data
        };
    }

Error Message

Error while queuing Spotify track/playlist: TypeError: Couldn't find scripts to get the data.
Please report the problem at https://github.com/microlinkhq/spotify-url-info/issues.
    at throwError (/home/ilan/Documents/Edvin Music Bot/node_modules/spotify-url-info/src/index.js:24:9)
    at parseData (/home/ilan/Documents/Edvin Music Bot/node_modules/spotify-url-info/src/index.js:31:37)
    at /home/ilan/Documents/Edvin Music Bot/node_modules/spotify-url-info/src/index.js:75:10
    at processTicksAndRejections (/home/ilan/Documents/Edvin Music Bot/lib/internal/process/task_queues.js:96:5)
    at async Spotify.getTrackType (/home/ilan/Documents/Edvin Music Bot/music/Spotify.js:169:22)
    at async Object.run (/home/ilan/Documents/Edvin Music Bot/commands/play.js:65:35) {stack: 'TypeError: Couldn't find scripts to get the d…ments/Edvin Music Bot/commands/play.js:65:35)', message: 'Couldn't find scripts to get the data.
Pleas…hub.com/microlinkhq/spotify-url-info/issues.'}```

💡Idea - Fetch All Tracks From Spotify URL Playlist

My idea is to fetch all tracks from the spotify playlist, I've seen that we get an api url from the data in getData, then we can call the api to fetch the next 100 songs, however I wasn't able to fetch those songs calling the api from within spotify-url-info project, because an accessToken is needed, and even if i generate one, it would expire every hour.

image

Does anyone have any idea how we can get the accessToken from the XHR requests? because when the page is loaded we scrap the embed html, meanwhile XHR requests are made to fetch the playlist, if we could somehow retrieve the accessToken from the XHR request headers then we would be able to fetch the remaining songs from the playlist.

TypeError: Couldn't find any data in embed page that we know how to parse.

Describe the bug
TypeError: Couldn't find any data in embed page that we know how to parse.
Please report the problem at https://github.com/microlinkhq/spotify-url-info/issues.
at throwError (/home/buffolollo/DrummerTS/node_modules/spotify-url-info/src/index.js:22:9)
at /home/buffolollo/DrummerTS/node_modules/spotify-url-info/src/index.js:65:10
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

Spotify URL(s)

  1. https://open.spotify.com/track/5M830cD7MNeiiwIGHzH9TV?si=a3a9ddbfa3534627
  2. https://open.spotify.com/track/5E6bTiJ2rB18M1DNqkm1V4?si=ab46872c0e454ed6
    Sometimes it happens with any link
    I have to try many times for it not to give this error

Your Code
const fetch = require("isomorphic-unfetch");
const spotify = require("spotify-url-info")(fetch);
const data = await spotify.getPreview(query);
const res = await searcher.search(${data.title} ${data.artist}, {
type: "video",
limit: 1,
});

Error Message
the error is above in the description

Suggestion: ES Module import

Hello,

Is there a way to get any of these functions of this package using import as a module? I keep getting errors that it dont has named exports. I have a discord bot depending on this, so any help would be helpful.

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.