Coder Social home page Coder Social logo

docker-youtube-dl's Introduction

mikenye/youtube-dl

GitHub Workflow Status Docker Pulls Docker Image Size (tag) Discord

yt-dl - download videos many online video platforms

  • Note: As of 2022-01-05 updated to use yt-dlp

Table of Contents

Multi Architecture Support

This image should pull and run on the following architectures: linux/amd64, linux/arm64/v8, linux/arm/v6, linux/arm/v7, linux/386, linux/ppc64le, linux/s390x.

Quick Start

NOTE: The docker command provided in this quick start is given as an example, and parameters should be adjusted to your needs.

It is suggested to configure an alias as follows (and place into your .bash_aliases file):

alias yt-dl='docker run \
                  --rm -i \
                  -e PGID=$(id -g) \
                  -e PUID=$(id -u) \
                  -v "$(pwd)":/workdir:rw \
                  ghcr.io/mikenye/docker-youtube-dl:latest'

HANDY HINT: After updating your .bash_aliases file, run source ~/.bash_aliases to make your changes live!

When run (eg: yt-dl <video_url>), it will download the video to the current working directory, and take any command line arguments that the normal youtube-dl binary would.

Running on Unraid

Unraid forum user Timmyx has written a fantastic guide to deploying this image on Unraid. The guide can be found here:

https://forums.unraid.net/topic/100256-youtube-dl-strategy/

Using a config file

To prevent having to specify many command line arguments every time you run youtube-dl, you may wish to have an external configuation file.

In order for the docker container to use the configuration file, it must be mapped through to the container.

docker run \
    --rm -i \
    -e PGID=$(id -g) \
    -e PUID=$(id -u) \
    -v /path/to/downloaded/videos:/workdir:rw \
    -v /path/to/yt-dlp.conf:/etc/yt-dlp.conf:ro \ 
    ghcr.io/mikenye/docker-youtube-dl:latest

Where:

  • /path/to/downloaded/videos is where youtube-dl will download videos to (use "$(pwd)" to download to current working directory.
  • /path/to/yt-dlp.conf is the path to your yt-dlp.conf file.

Authentication using .netrc

If you want to download videos that require authentication (or your youtube subscriptions for example, see below), it is recommended to use a .netrc file.

You can create a file with the following syntax:

machine youtube login USERNAME password PASSWORD

Where:

  • USERNAME is replaced with your youtube account username
  • PASSWORD is replaced with your youtube account password

You may need to disable some account security settings (such as '2-Step Verification' and 'Use your phone to sign in', so it is suggested to make a long, complex password (eg: 32 random characters).

This file can then be mapped through to the container as a .netrc file, eg:

docker run \
    --rm -i \
    -e PGID=$(id -g) \
    -e PUID=$(id -u) \
    -v /path/to/downloaded/videos:/workdir:rw \
    -v /path/to/youtube-dl.conf:/etc/youtube-dl.conf:ro \
    -v /path/to/netrc_file:/home/dockeruser/.netrc:ro
    ghcr.io/mikenye/docker-youtube-dl:latest

Configuration Files

Container Path Permissions Description
/config/youtube-dl.conf ro If this file exists at container startup, it is symlinked to /etc/youtube-dl.conf at container startup. The youtube-dl process will look in this location for a configuration file by default.
/config/.netrc ro If this file exists at container startup, it is symlinked to /home/dockeruser/.netrc at container startup. The youtube-dl process will look in this location for a .netrc file (if --netrc is specified on the command line or via a configuration file).
/config/.cache rw If this directory exists at container startup, it is symlinked to /home/dockeruser/.cache/youtube-dl at container startup. The youtube-dl process automatically uses this path for caching.

You can place any other configuration files within /config, and then specify them on the command line, eg: --batch-file /config/batch-file.conf.

Data Volumes

There are no data volumes explicity set in the Dockerfile, however:

Container Path Permissions Description
/workdir rw The youtube-dl process is executed with a working directory of /workdir. Thus, unless you override the output directory with the --output argument on the command line or via a configuration file, videos will end up in this directory.

Environment Variables

To customize some properties of the container, the following environment variables can be passed via the -e parameter (one for each variable). This paramater has the format <VARIABLE_NAME>=<VALUE>.

Variable Description Recommended Setting
PGID The Group ID that the youtube-dl process will run as $(id -u) for the current user's GID
PUID The User ID that the youtube-dl process will run as $(id -g) for the current user's UID
UMASK Optional. Set's the umask for files created by youtube-dl
UPDATE_YOUTUBE_DL Set to any value and youtube-dl -U will be run on container start

Ports

No port mappings are required for this container.

Scheduled download of youtube subscriptions

In order to perform a scheduled download of youtube subscriptions, it is recommended to use the following command to be executed via cron on a regular basis (eg: daily).

docker run \
    --rm
    -i
    --name youtube-dl-cron
    -e PGID=GID
    -e PUID=UID
    --cpus CPUS
    -v /path/to/netrc:/home/dockeruser/.netrc:ro
    -v /path/to/youtube/subscriptions:/workdir:rw
    -v /path/to/youtube-dl.conf:/etc/youtube-dl.conf:ro
    ghcr.io/mikenye/docker-youtube-dl:latest \
    :ytsubscriptions \
    --dateafter now-5days \
    --download-archive /workdir/.youtube-dl-archive \
    --cookies /workdir/.youtube-dl-cookiejar \
    --netrc \
    --limit-rate 5000 2>> /path/to/logs/youtube-dl.err >> /path/to/logs/youtube-dl.log

Where:

  • GID: a group ID to run as (if in a normal user's crontab, use $(id -g)
  • UID: a user ID to run as (if in a normal user's crontab, use $(id -u)
  • CPUS: the number of CPUs to constrain the docker container to. This may be required to prevent impacting system performance if transcoding takes place. If not, the --cpus argument can be completely omitted.
  • /path/to/netrc: the path to the file containing your youtube credentials, see above.
  • /path/to/youtube/subscriptions: the path where videos will be saved.
  • /path/to/youtube-dl.conf: the path to your youtube-dl.conf file, where settings such as output file naming, quality, etc can be determined.
  • /path/to/logs/youtube-dl.err: the path to the error log, if desired
  • /path/to/logs/youtube-dl.log: the path to the application log, if desired

Notes:

  • --rm is given so the container is destroyed when execution is finished. This will prevent your drive from slowly filling up with exited containers.
  • --name youtube-dl-cron is given so that multiple instances are not started by cron. In the event the previous container is still running, docker will simply exit with an error that the container name is already taken.
  • --dateafter now-5days is given to limit youtube-dl to only download recent videos. Feel free to adjust as required.
  • --limit-rate is given to prevent impacting your internet connection. Feel free to adjust as required.

In the example above, a configuration file is used. This allows us to easily add commands to select a specific quality, and name the videos with a specific format. For example, to download the videos into a format recognised by Plex, you could use the following:

-v
--ignore-errors
--no-overwrites
--continue
--no-post-overwrites
--add-metadata
--write-thumbnail
--playlist-reverse
--write-description
--write-info-json
--write-annotations
--format "best[height<=?1080]"
--fixup fix
--output '/workdir/%(uploader)s/%(uploader)s - %(upload_date)s - %(title)s - %(id)s.%(ext)s'

The above example config file will:

  • Ignore errors
  • Will not overwrite existing videos
  • Will continue downloading in the event a download is interrupted
  • Will download metadata and embed into the resulting video, so that Plex will be able to display this information
  • Will download oldest videos first, so videos can be sorted by "date added" in Plex
  • Will download the best quality up to a maximum of 1080p (prevent 4K downloads)
  • Will format videos with a separate folder for each uploader.

Docker Image Update

If the system on which the container runs doesn't provide a way to easily update the Docker image (eg: watchtower), simply pull the latest version of the container:

docker pull ghcr.io/mikenye/docker-youtube-dl:latest

Shell access

To get shell access to a running container, execute the following command:

docker exec -ti CONTAINER sh

Where CONTAINER is the name of the running container.

To start a container with a shell (instead of youtube-dl), execute the following command:

docker run --rm -ti --entrypoint=/bin/sh ghcr.io/mikenye/docker-youtube-dl:latest

Support or Contact

Having troubles with the container or have questions? Please create a new issue.

docker-youtube-dl's People

Contributors

dependabot[bot] avatar ideabucket avatar kagami avatar manojkarthick avatar mikenye avatar neilcronin avatar niekcandaele avatar raydixon avatar revilo951 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

docker-youtube-dl's Issues

403 forbidden due to no tls 1.3 support

Hello,

some pages (like crunchyroll) are dishing out 403 forbidden responses when trying to download via youtube-dl recently. The issue seems to be that either TLS 1.3 isn't enabled by the system or the Python version used is too old. Some people seem to succeed when using Python 3.8.2. Could you check this out and see if you can do something about this container-side?
ytdl-org/youtube-dl#25481
Thanks. I do have a setup to reproduce this issue, so let me know if I can test something for you or help in some other way.

Uses Python 2 rather than Python 3

Rather odd bug, but it looks like Python 2 is what is running youtube-dl, rather than python 3. I know you install python 3, but in the log from youtube-dl, it says it's running off of python 2 as you can see here:

[debug] System config: []
[debug] User config: []
[debug] Custom config: []
[debug] Command-line args: [u'-f', u'bestaudio[ext=m4a]', u'--add-metadata', u'-v', u'https://www.bbc.co.uk/sounds/play/m000qwyj']
[debug] Encodings: locale UTF-8, fs UTF-8, out None, pref UTF-8
[debug] youtube-dl version 2021.01.08
[debug] Python version 2.7.16 (CPython) - Linux-3.16.85-62-aarch64-with-debian-10.7
[debug] exe versions: ffmpeg 4.1.6-1, ffprobe 4.1.6-1, rtmpdump 2.4
[debug] Proxy map: {}
[bbc.co.uk] m000qwyj: Downloading video page

Any ideas?

[Feature request] change directory names

Hello,

Could you possibly change the configuration so that configs files can be in one directory and videos be in another. So, your example on the readme could look like this:

docker run \
    --rm -i \
    -e PGID=$(id -g) \
    -e PUID=$(id -u) \
    -v /path/to/downloaded/videos:/videos:rw \
    -v /path/to/youtube-dlc/config:/etc/youtube-dlc/config:ro \
    -v /path/to/youtube-dlc/data:/etc/youtube-dlc/data:rw \
    mikenye/youtube-dl

I currently have to specify a volume mapping for each of the youtube files like .netrc, .youtube-dl-archive, etc. because i don't want them to be in the videos/workdir/subscriptions directory.

Examples to execute from other apps?

i.e. I use WordPress docker container:

services:
    wordpress:
        image: wordpress:latest
        depends_on:
         - db
        networks:
         - myNetwork
         - backend
        restart: always
    db:
        ...

networks: 
    myNetwork:
        external: true
    backend:
        driver: bridge

From there (php file), I tried to execute exec('yt-dl ....') I get the error in logs, that yt-dl doesn't exist (same if do with exec ('youtube-dl ...'). Can you give a hint, how to make this available in my WP container?

About GID/PID permissions

hello,I'm in trouble.
When I execute using root, the response is:

Addgroup: The GID '0' is already in use.
Adduser: The UID 0 is already in use.
Setpriv: failed to parse reuid: 'dockeruser'

When I use another user or another ID, the response is:

File: index - index. Mp4, part: Permission denied

useradd warning: dockeruser's uid 1000 outside of the SYS_UID_MIN 100 and SYS_UID_MAX 999 range.

hello there,
I had the youtube-dl docker image long time disabled, last week I needed a video downloaded so I started the image, downloaded the video and after that watchtower automatically re-created the image with the latest version.

Now if I want to start the yt-dl process I have this warning

useradd warning: dockeruser's uid 1000 outside of the SYS_UID_MIN 100 and SYS_UID_MAX 999 range.

and the configuration is ignored.

Any suggestion?

Permissions seem to be hard-coded

Hello,

i have my PGID and PUID set in a docker-compose, but it seems like they are being ignored. I keep getting errors when the app tries to update the archive file. here's my compose:

  youtube-dl-cron:
    image: mikenye/youtube-dl:latest
    container_name: youtube-dl-cron
    # need compose v2 cpus: 1
    restart: "no"
    volumes:
      #- ${CONFIG_DIR}/youtube-dl-server/data:/youtube-dl
      - ${VIDEOS}/youtube:/workdir
      - ${CONFIG_DIR}/youtube/youtube-dl.conf:/etc/youtube-dl.conf:ro
      - ${CONFIG_DIR}/youtube/.youtube-dl-archive:/etc/.youtube-dl-archive
      - ${CONFIG_DIR}/youtube/.cache:/etc/.cache
      - ${CONFIG_DIR}/youtube/.youtube-dl-cookiejar:/etc/.youtube-dl-cookiejar
      - ${CONFIG_DIR}/youtube/channels.txt:/etc/channels.txt
      - ${CONFIG_DIR}/youtube/.netrc:/home/dockeruser/.netrc:ro
    environment:
      - PUID: 1024
      - PGID: 100
      - TZ: $TZ
      - LC_ALL=C.UTF-8

and here's the perms of my files:

drwxrwxr-x   4 synoadmin users  4096 Aug 17 00:49 ./
drwxrwxr-x 100 synoadmin users  4096 Aug  5 19:51 ../
drwxrwxr-x   3 synoadmin users  4096 Aug 17 22:05 .cache/
-rw-rw-r--   1 synoadmin users  2677 Sep  5 21:20 channels.txt
drwxrwxr-x   2 synoadmin users  4096 Jul 12 16:40 logs/
-rw-rw-r--   1 synoadmin users    90 Jul 12 16:40 .netrc
-rw-rw-r--   1 synoadmin users 32280 Sep 11 21:39 .youtube-dl-archive
-rw-rw-r--   1 synoadmin users  1130 Sep  5 19:47 youtube-dl.conf
-rw-rw-r--   1 synoadmin users   584 Sep  8 00:03 .youtube-dl-cookiejar
-rw-rw-r--   1 synoadmin users   331 Aug 17 00:35 youtube.sh

synoadmin=1024 and users=100. And here are the errors i'm getting:

ERROR: [Errno 13] Permission denied: '/etc/.youtube-dl-archive'
today at 9:48 PM Traceback (most recent call last):
today at 9:48 PM File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 808, in extract_info
today at 9:48 PM return self.process_ie_result(ie_result, download, extra_info)
today at 9:48 PM File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 863, in process_ie_result
today at 9:48 PM return self.process_video_result(ie_result, download=download)
today at 9:48 PM File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 1644, in process_video_result
today at 9:48 PM self.process_info(new_info)
today at 9:48 PM File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 2004, in process_info
today at 9:48 PM self.record_download_archive(info_dict)
today at 9:48 PM File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 2121, in record_download_archive
today at 9:48 PM with locked_file(fn, 'a', encoding='utf-8') as archive_file:
today at 9:48 PM File "/usr/local/bin/youtube-dl/youtube_dl/utils.py", line 3279, in __init__
today at 9:48 PM self.f = io.open(filename, mode, encoding=encoding)
today at 9:48 PM IOError: [Errno 13] Permission denied: '/etc/.youtube-dl-archive'

Am i doing something wrong or do i have to use 1000:1000. Note, i may have previously chown to this before, but i'm restoring from a backup and now running into this issue and would prefer not to change just this folder again.

thanks

Feature: Email notification via SMTP

Hello @mikenye

I have idea if possible to add feature
Email notification via SMTP whenever new videos are downloaded which can include list of videos newly downloaded.

Thanks. Have a good day.

Issue with Spaces

Hi @mikenye!

I switched over to your docker, and am having trouble with a command I've been using.

I download videos (simplified for the part that doesn't work) using
ytdl -o "CelebriDnD.S01E001.Terry Crews.%(ext)s" https://youtu.be/1ntfXLb5eFk
The space between Terry Crews works when using youtube-dl installed manually, but not when using this repo (I also tried without the alias for completeness)

Any idea where it gets swallowed up?

ghrc.io unauthorized

HI
I've added alias and tried to download video.

I've got the error
docker: Error response from daemon: Head "https://ghcr.io/v2/mikenye/docker-youtube-dl/manifests/latest": unauthorized.

How can I resolve it?

issue after latest update yt-dlp: error: option --fixup:

youtube-dl-cron | yt-dlp: error: option --fixup: invalid choice: 'fix' (choose from 'never', 'ignore', 'warn', 'detect_or_warn', 'force')

there is a issue after update to latest version. before it was working fine.
can you please tell me how to fix it ?

thanks

QNAP Installation

Hi,

Please forgive me for the newbie question, but I'm having trouble running this on my QNAP NAS. I tried to install youtube-dl via "pip" first, but I came upon a Python3 error that looks too complicated for me to fix:

[~] # youtube-dl
/opt/bin/python3: /opt/lib/libc.so.6: version GLIBC_2.26' not found (required by /opt/lib/libpython3.8.so.1.0)
/opt/bin/python3: /opt/lib/libc.so.6: version GLIBC_2.27' not found (required by /opt/lib/libpython3.8.so.1.0)

So I came upon your docker container and when I ran it as local container I got the following error each time I tried to start the container via Container Station app:
Usage: youtube-dl [OPTIONS] URL [URL...]

youtube-dl: error: You must provide at least one URL.
Type youtube-dl --help to see a list of all options.

So I went back to your Github page and then ran the following command:
docker run --rm -ti --entrypoint=/bin/sh mikenye/youtube-dl

This finally got me to downloading a YouTube video, but I couldn't find it within my QNAP file system. Now I've been trying my best at figuring out how to effectively set this up on my QNAP. I'm new to running things via CLI, but I'm willing to learn if I could be graciously given some guidance at how to set this up effectively.

Thanks for the consideration!!

Error with --xattrs

Hi @mikenye

First off I'd like to congratulate you for this docker container. I've been using it for a while and it's been a pretty positive experience.

The thing is I found an interesting parameter, "--xattrs", which allow youtube-dl to write additional metadata as file attributes after download the videos. But when I try to use it with your container I get the following message:

ERROR: Couldn't find a tool to set the xattrs. Install either the python 'pyxattr' or 'xattr' modules, or the GNU 'attr' package (which contains the 'setfattr' tool).

I believe that if your image had one of these modules would solve this issue.

Would you please add this in the next versions of your images?

I'd be much appreciated. Thanks.

Download fresh youtube-dl on start

Should be easy to download latest youtube-dl build in init script (or run youtube-dl -U) so that users can just restart containers for update. Might be useful in case of often API breakages, sometimes youtube-dl has few releases per day.

What do you think?

[Feature request] Change directory structure

Hello,

Could you possibly change the configuration so that configs files can be in one directory and videos and data be in another? So, your example on the readme could look like this:

docker run \
    --rm -i \
    -e PGID=$(id -g) \
    -e PUID=$(id -u) \
    -v /path/to/downloaded/videos:/videos:rw \
    -v /path/to/youtube-dlc/config:/etc/youtube-dlc/config:ro \
    -v /path/to/youtube-dlc/data:/etc/youtube-dlc/data:rw \
    mikenye/youtube-dl

I currently have to specify a volume mapping for each of the youtube files like .netrc, .youtube-dl-archive, etc. because i don't want them to be in the videos/workdir/subscriptions directory.

Feature: Native Scheduler

Would it be difficult to add in a native scheduler for the container to run internally instead of relying on manual or cron execution?

UPDATE_YOUTUBE_DL and "yt-dlp -U" doesn't work

running the docker image with -e UPDATE_YOUTUBE_DL=true doesn't seem to work

Latest version: 2022.02.04, Current version: 2021.12.27
ERROR: It looks like you installed yt-dlp with a package manager, pip, setup.py or a tarball; Use that to update

Upgrade to 2020.06.16.1?

Hi,

I was wondering if you were planning on upgrading to the latest version or not. I'm trying to run your container and it seems to be getting an error that is supposed to be fixed in the latest version. Any guidance would be greatly appreciated.

ERROR: u'content_html' Traceback (most recent call last): File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 808, in extract_info return self.process_ie_result(ie_result, download, extra_info) File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 969, in process_ie_result ie_entries, playliststart, playlistend)) File "/usr/local/bin/youtube-dl/youtube_dl/extractor/youtube.py", line 313, in _entries content_html = more['content_html'] KeyError: u'content_html'

Config path /etc/youtube-dl.conf not found?

For some reason when using path "/etc/youtube-dl.conf" as the config path it doesn't work

Output comes out to:

Usage: yt-dlp [OPTIONS] URL [URL...]

yt-dlp: error: You must provide at least one URL.
Type yt-dlp --help to see a list of all options.

No matter what..

Like the file is gets empty because of the symlink?

# if the symlink already exists, remove it
    if [[ -L "/etc/youtube-dl.conf" ]]; then
        rm -v "/etc/youtube-dl.conf"
    fi

Not sure but i had to use path /home/dockeruser/ and push youtube-dl.conf to that in a -v for it to work as

yt-dlp configuration lists Home Configuration as an option.

Not a big issue just wanted to bring it up incase if anyone is using the Unraid Guide for the cron

Podman support?

Should this image work with Podman?

I tried the following commands:

podman run --rm -i -e PGID=$(id -g) -e PUID=$(id -u) -v "$(pwd)":/workdir:rw mikenye/youtube-dl <url>
podman run --rm -i -v "$(pwd)":/workdir mikenye/youtube-dl <url>

but they always result in this error:

[download] Unable to open file: [Errno 13] Permission denied:

Feature Request: Add Ability to Keep Container Running

On some systems like for example those running Kubernetes to manage Docker containers (ie: TrueNAS Scale and other enterprise systems) it takes a good 60+ seconds to start a Docker container. Having to do that every time you want to download a video that might take just a few seconds to download isn't ideal. It would be nice if there was an option that can be specified that would allow the container to keep running without actually doing anything and one would interact with it by issuing "docker container exec ..." commands on the host to trigger video downloads.

YTDL Command Line Assistance + Locales

Sorry to open an issue, but i have a question about performance but I don't know if it is a YTDL or this container. When i run this with multiple subs and some of the subs may have 1-2K videos, it seems to take 9 hours for this container to run as it always starts at video 1 to see if the video meets the date criteria? Is there a way for this to start at the last video and stop sooner?

UMASK setting

Hi,

Great docker.
Would be nice to have a setting for UMASK, similar to PUID and PGUI variables.
So that you can control what permissions downloaded files have. By default it's 022 which isn't always appropriate.

Thanks.

Switch To YT-DLP?

I was trying to use your container and was having issues downloading videos from my subscriptions. After a bit of debugging, it's apparently a known issue with youtube-dl. Looking a little deeper, youtube-dl hasn't been updated in almost 2 months and the last release is from June. Given that they historically released updates weekly (if not more), I'm starting the think the project is dying off.

YT-DLP has taken over and is staying on top off issues and PRs.

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.