Giter VIP home page Giter VIP logo

youtubedlsharp's Introduction

YoutubeDLSharp

Build status

A simple .NET wrapper library for youtube-dl and yt-dlp.

For yt-dlp For youtube-dl
Versions >= v.1.0 Versions v.0.x
Nuget NuGet

What is it?

YoutubeDLSharp is a wrapper for the popular command-line video downloaders youtube-dl and yt-dlp. It allows you to use the extensive features of youtube-dl/ yt-dlp in a .NET project. For more about the features of youtube-dl/ yt-dlp, supported websites and anything else, visit their project pages at http://ytdl-org.github.io/youtube-dl/ and https://github.com/yt-dlp/yt-dlp.

How do I install it?

First, add the package from NuGet:

PM> Install-Package YoutubeDLSharp

Next, you would want to have the binaries for yt-dlp and FFmpeg available. If you don't have them set up already, you can either...

  • ...download them from their respective download pages manually: [yt-dlp Download] [FFmpeg Download]
  • ...use the built-in download methods:
    await YoutubeDLSharp.Utils.DownloadYtDlp();
    await YoutubeDLSharp.Utils.DownloadFFmpeg();

How do I use it?

There are two ways to use YoutubeDLSharp: the class YoutubeDL provides high level methods for downloading and converting videos while the class YoutubeDLProcess allows directer and flexibler access to the youtube-dl process.

Using the YoutubeDL class

In the simplest case, initializing the downloader and downloading a video can be achieved like this:

var ytdl = new YoutubeDL();
// set the path of yt-dlp and FFmpeg if they're not in PATH or current directory
ytdl.YoutubeDLPath = "path\\to\\yt-dlp.exe";
ytdl.FFmpegPath = "path\\to\\ffmpeg.exe";
// optional: set a different download folder
ytdl.OutputFolder = "some\\directory\\for\\video\\downloads";
// download a video
var res = await ytdl.RunVideoDownload("https://www.youtube.com/watch?v=bq9ghmgqoyc");
// the path of the downloaded file
string path = res.Data;

Instead of only downloading a video, you can also directly extract the audio track ...

var res = await ytdl.RunAudioDownload(
    "https://www.youtube.com/watch?v=QUQsqBqxoR4",
    AudioConversionFormat.Mp3
);

... or selectively download videos from a playlist:

var res = await ytdl.RunVideoPlaylistDownload(
    "https://www.youtube.com/playlist?list=PLPfak9ofGSn9sWgKrHrXrxQXXxwhCblaT",
    start: 52, end: 76
);

All of the above methods also allow you to track the download progress or cancel an ongoing download:

// a progress handler with a callback that updates a progress bar
var progress = new Progress<DownloadProgress>(p => progressBar.Value = p.Progress);
// a cancellation token source used for cancelling the download
// use `cts.Cancel();` to perform cancellation
var cts = new CancellationTokenSource();
// ...
await ytdl.RunVideoDownload("https://www.youtube.com/watch?v=_QdPW8JrYzQ",
                            progress: progress, ct: cts.Token);

As youtube-dl also allows you to extract extensive metadata for videos, you can also fetch these (without downloading the video):

var res = await ytdl.RunVideoDataFetch("https://www.youtube.com/watch?v=_QdPW8JrYzQ");
// get some video information
VideoData video = res.Data;
string title = video.Title;
string uploader = video.Uploader;
long? views = video.ViewCount;
// all available download formats
FormatData[] formats = video.Formats;
// ...

This intro does not show all available options. Refer to the method documentations for more.

The project includes a demo WPF desktop app under WpfDemoApp that uses the YoutubeDL class.

Working with options

YoutubeDLSharp uses the OptionSet class to model youtube-dl/ yt-dlp options. The names of the option properties correspond to the names of youtube-dl, so defining a set of options can look like this:

var options = new OptionSet()
{
    NoContinue = true,
    RestrictFilenames = true,
    Format = "best",
    RecodeVideo = VideoRecodeFormat.Mp4,
    Exec = "echo {}"
}

Some options of yt-dlp can be set multiple times. This is reflected in YoutubeDLSharp by passing an array of values to the corresponding option properties:

var options = new OptionSet()
{
    PostprocessorArgs = new[]
    {
        "ffmpeg:-vcodec h264_nvenc",
        "ffmpeg_i1:-hwaccel cuda -hwaccel_output_format cuda"
    }
};

OptionSet instances can be passed to many YoutubeDL methods to override the default behaviour:

var options = new OptionSet()
{
    NoContinue = true,
    RestrictFilenames = true
}
var ytdl = new YoutubeDL();
var res = await ytdl.RunVideoDownload(
    "https://www.youtube.com/watch?v=bq9ghmgqoyc",
    overrideOptions: options
);

Alternatively, RunWithOptions() can be used to directly run youtube-dl/ yt-dlp with a given OptionSet:

var ytdl = new YoutubeDL();
var res = await ytdl.WithOptions("<YOUR_URL>", options);

For documentation of all options supported by yt-dlp and their effects, visit https://github.com/yt-dlp/yt-dlp#usage-and-options.

Additionally, YoutubeDLSharp allows you to pass custom options to the downloader program. This is especially useful when a forked/ modified version of youtube-dl is used. Custom can be specified like this:

// add
options.AddCustomOption<string>("--my-custom-option", "value");
// set
options.SetCustomOption<string>("--my-custom-option", "new value");

YoutubeDLProcess

To start a youtube-dl/ yt-dlp process directly with the defined options, you can also use the low-level YoutubeDLProcess class, giving you more control over the process:

var ytdlProc = new YoutubeDLProcess();
// capture the standard output and error output
ytdlProc.OutputReceived += (o, e) => Console.WriteLine(e.Data);
ytdlProc.ErrorReceived += (o, e) => Console.WriteLine("ERROR: " + e.Data);
// start running
string[] urls = new[] { "https://github.com/ytdl-org/youtube-dl#options" };
await ytdlProc.RunAsync(urls, options);

Loading/ Saving configuration

You can persist a youtube-dl/ yt-dlp configuration to a file and reload it:

// Save to file
var saveOptions = new OptionSet();
saveOptions.WriteConfigFile("path\\to\\file");

// Reload configuration
OptionSet loadOptions = OptionSet.LoadConfigFile("path\\to\\file");

The file format is compatible with the format used by youtube-dl/ yt-dlp itself. For more, read https://github.com/yt-dlp/yt-dlp#configuration.

Issues & Contributing

You are very welcome to contribute by reporting issues, fixing bugs or resolving inconsistencies to youtube-dl/ yt-dlp. If you want to contribute a new feature to the library, please open an issue with your suggestion before starting to implement it.

All issues related to downloading specific videos, support for websites or downloading/ conversion features should better be reported to https://github.com/yt-dlp/yt-dlp/issues.

Version History

See Changelog.

License

This project is licensed under BSD-3-Clause license.

youtubedlsharp's People

Contributors

adanvdo avatar alxnull avatar dependabot[bot] avatar donteatoreo avatar gpt4thewin avatar lordfirespeed avatar micah686 avatar secondnewtonlaw avatar themulti0 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

youtubedlsharp's Issues

bytestream?

I want to play a video while it's still downloading.

I've tried it using the YoutubeDLProcess (params: NoPart) and the OutputReceivedEvent. This just gives me the current state of the downloader.

In my case I want to use just the audiotrack. Conviniently I would like to use _youtubeDL.RunAudioDownload(url, YoutubeDLSharp.Options.AudioConversionFormat.Mp3)
and start it once its progress is above like 3% using CSCore

Get progress from conversion/postprocessing

When I download long audio files that don't output directly to MP3 and need to be converted, it takes a while and I don't see the progress. As far as I know, ffmpeg converts the audio. Can I get the conversion progress or the FFmpeg output?

OptionSet Bug with RunVideoDownload

The options "DownloadSections" and "ForceKeyframesAtCuts" don't work when using "RunVideoDownload" BUT DO WORK with "RunWithOptions"

Code Example:

using YoutubeDLSharp;
using YoutubeDLSharp.Options;

const string url = "https://youtu.be/4Ot0T4iCXfM";

var youtubeDl = new YoutubeDL
{
    YoutubeDLPath = "yt-dlp",
    FFmpegPath = "ffmpeg",
    OutputFileTemplate = "%(id)s.%(ext)s",
    OutputFolder = Directory.GetCurrentDirectory()
};

var options = new OptionSet
{
    DownloadSections = "*15-30",
    ForceKeyframesAtCuts = true
};

Console.WriteLine($"Options: {options}");

await youtubeDl.RunVideoDownload(url,
    mergeFormat: DownloadMergeFormat.Mp4,
    overrideOptions: options,
    ct: CancellationToken.None);

// await youtubeDl.RunWithOptions(new[] { url }, options, CancellationToken.None);

Icon asset

Hey, I derived this from yt-dlp's logo, please feel free to use it!

YoutubeDLSharp

The image is an SVG so background can easily be removed / viewbox can be resized so that it looks good as a README banner.

Youtube Now returns Quality as decimal instead of int

A .NET Crash occurs when attempting to fetch a list of formats for Youtube videos because they have started returning the Format.Quality property as a decimal value which cannot be parsed to an Int by Newtonsoft.

Changing the FormatData.Quality property to a double appears to fix the issue, but I have not tested with other hosts.

RunVideoDataFetch temporarily blocks main thread

public async Task<RunResult<VideoData>> RunVideoDataFetch(string url,

I am using your library in a WinForms app. Although I am calling await ytdl.RunVideoDataFetch(url) the UI thread is temporarily blocked and the program freezes for a couple seconds.

It seems like one or more lines between line 122 and 131 are taking longer than expected and blocking the UI. I did not dig into it much, but this was the only thing I noticed at a glance that could possibly be blocking the thread.

var opts = GetDownloadOptions();

Moving GetDownloadOptions to an async Task and awaiting that task for the options may fix the issue.

All methods never complete

I am using .NetCore 6.0. When I try to run any operation wether that be RunVideoFetch or RunVideoDownload etc, nothing ever happens. If I pass in a function for the progress callback, I always remain at 0%. What I find more odd about this is the WPF demo does work and I have tried replicating that too but no luck.

YoutubeDL ytdl = new YoutubeDL();
ytdl.YoutubeDLPath = ytdlPath; //Both paths are valid, no error.
ytdl.FFmpegPath = ffmpegPath;
await ytdl.RunVideoDownload(
    $"https://www.youtube.com/watch?v={videoID}",
    progress: new Progress<DownloadProgress>(downloadProgress => Console.Write($"\r{downloadProgress.Progress * 100}%"))
);
//Never completes, no errors.

I am truly confused here as to why this isn't working.

FlatPlaylist Option does not work with RunAudioPlaylistDownload/RunVideoPlaylistDownload

I might not be using the library the correct way, so I admit this might not be a problem, but what I want to do is essentially list all the videos/audio in a playlist and just return the urls. The reason for this is because several of the watchlists I want to download have overlapping videos and it seems to be redundant. When I try the code below with the FlatPlaylist option all that happens is an empty[]. Maybe I'm not using the library correctly?

// See https://aka.ms/new-console-template for more information
using YoutubeDLSharp;
using YoutubeDLSharp.Metadata;
using YoutubeDLSharp.Options;

string basePath = System.AppDomain.CurrentDomain.BaseDirectory;
var ytdl = new YoutubeDL();
ytdl.YoutubeDLPath = Path.Combine($"{basePath}yt-dlp.exe");
ytdl.FFmpegPath = Path.Combine($"{basePath}ffmpeg.exe");
ytdl.OutputFolder = @"H:\Youtube\Test";
var optionsSet = new OptionSet()
{
    FlatPlaylist = true
};
string vid_target = "mywatchlist";
string[] vid_targets = new string[] { vid_target };

var ytdlProc = new YoutubeDLProcess();
var proc = await ytdlProc.RunAsync(vid_targets, optionsSet);
var res = await ytdl.RunAudioPlaylistDownload(vid_target, 1, 100, null, AudioConversionFormat.Mp3, default, null, null, optionsSet);
Console.ReadLine();

image

How do I download an already merged video?

I don't want bestvideo and audio. I want to download a video by its format id, whereby using commandline would be -f 22 (720p)

I can't figure it out.

EDIT:
I've found that passing "mp4" as format argument gets me the best quality .mp4 file, (720p in the cases I've tested on). But what if I want 480p, or 360p? I still haven't figured that out.

EDIT: I think I have it.
await ytdl.RunVideoDownload(textBoxUrl.Text, format: "22", progress: progress, ct: cts.Token, mergeFormat: DownloadMergeFormat.Mp4);

Integrate full yt-dlp support from micah686/YoutubeDLSharp/tree/ytdlp/master

So, on my fork ytdlp/master, I have basically implemented all of the updated features of yt-dlp.

However, as I did this, there were Options that got removed because they were no longer applicable, as well as some methods that got rearranged/moved around. This fork also uses .net 6, and removes Newtonsoft.Json in favor of the built in (.net 6) System.Text.Json.

Would you like to proceed with using the new YtDlpSharpLib? Or would you rather have me work on maintaining it as a seperate project/nuget package?

Not working in Asp.Net core in Azure

Hi i am using the library and working locally, but not working when i publish to azure app service.

Asp Version
Asp core mvc 2.2
Azure app service

Error:
[youtube-dl ERROR] PermissionError: [WinError 5] Access is denied

How I can use this repo to do the job yt-dlp can do?

Hello:
I found one web site, which I can see live sports video, and using the tool yt-dlp, I can download the underlying m3u8 link.
One example is something like:

yt-dlp https://m3u8.1proxy.xyz/media/g_18/playlist.m3u8 --downloader ffmpeg --referer "https://bingsport.com/"

You can find some live streams from the following URL:
(# can be a number from 1 to 20 or 30 depend on how many live games have for today).
https://bingsport.com/1proxy.php?id=g_#

Let me know if I can do the job like yt-dlp does with this repo with some type of custom arguments? As I need API library in C# for my project.
Thanks,

Bad JSON parsing

The following exception will be thrown if you attempt to get the VideoData of a finished Premier and/or finished Live stream.

Faulty Package Version: 1.0.0-beta5

Thrown Exception:

Unhandled exception. System.InvalidCastException: Unable to cast object of type 'System.Int64' to type 'System.Double'.
   at YoutubeDLSharp.Converters.UnixTimestampConverter.ReadJson(JsonReader reader, Type objectType, Nullable`1 existingValue, Boolean hasExistingValue, JsonSerializer serializer)
   at Newtonsoft.Json.JsonConverter`1.ReadJson(JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter converter, JsonReader reader, Type objectType, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value)
   at YoutubeDLSharp.YoutubeDL.<>c__DisplayClass38_0.<RunVideoDataFetch>b__0(Object o, DataReceivedEventArgs e)
   at YoutubeDLSharp.YoutubeDLProcess.<>c__DisplayClass24_0.<RunAsync>b__0(Object o, DataReceivedEventArgs e)
   at System.Diagnostics.AsyncStreamReader.FlushMessageQueue(Boolean rethrowInNewThread)
--- End of stack trace from previous location ---
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading.PortableThreadPool.WorkerThread.WorkerThreadStart()

[Bug] New YT-DLP version breaks Newtonsoft JsonReader

It seems like the new yt-dlp version broke the jsonreader

I'm using version 1.0.0-beta2

Unhandled exception. Newtonsoft.Json.JsonReaderException: Input string '1.0' is not a valid integer. Path 'formats[3].quality', line 1, position 9500.
   ...

Sample Code:

using YoutubeDLSharp;
using YoutubeDLSharp.Options;

YoutubeDL youtubeDl = new()
{
    YoutubeDLPath = "yt-dlp",
    FFmpegPath = "ffmpeg",
    OutputFolder = Path.GetTempPath(),
    OutputFileTemplate = "%(id)s.%(ext)s",
};

const string url = "https://youtu.be/sca4VG9b0NY";

var videoDataFetch = await youtubeDl.RunVideoDataFetch(url, flat: true);

var duration = videoDataFetch.Data.Duration;
var tags = videoDataFetch.Data.Tags;

Console.WriteLine($"Duration: {duration}");
Console.WriteLine($"Tags: {string.Join(", ", tags)}");

await youtubeDl.RunAudioDownload(url, AudioConversionFormat.Opus);

How to use Paths

I'm trying to figure out how to use Paths. From an example I saw for the CLI you can do -P "home:final/path" -P "temp:ssd/path" -o "file-name.%(ext)s". When I try this with the Paths property, I can only set it once not multiple times which is leading to my confusion on how to use it, or if it was forgotten to include multiple values?

Support custom arguments

Hi there! I've been using this library and I'm very pleased.

However I have recently started using yt-dlp instead of youtube-dl (by just giving this library the path to yt-dlp instead of youtube-dl binary), and given this fork has arguments not supported in youtube-dl I would love to have the option to pass custom string arguments.

Thanks!

Does it work on Linux?

Hi
Is YoutubeDLSharp suppose to work on Linux?, it works fine on windows but fails on Linux I have this error
An error occurred trying to start process 'yt-dlp.exe' with working directory '/home/...'. No such file or directory

I'm using

And
await YoutubeDL.DownloadYtDlpBinary(); await YoutubeDL.DownloadFFmpegBinary();

Thank you

403 Forbidden

When using library it returns 403 forbidden as on image below. Running yt-dlp standalone works correctly and downloads the file.

var ytdl = new YoutubeDL
    {
        OutputFolder = convertedDir
    };

   var result = await ytdl.RunVideoDownload(
                new Uri(videoUrl).ToString());

image
image

Improving RunVideoDataFetch speed?

Hi, is it possible to improve the fetch speed for video information in the following call somehow?
var res = await ytdl.RunVideoDataFetch("https://www.youtube.com/watch?v=_QdPW8JrYzQ");

I was wondering if you could limit the information you want to get.
For example, you wand just search for the title, thumbnail and the format list of a single video.

Is it possible to restrict/convert the image file-type of a thumbnail when using --embed-thumbnail ?

This is really a problem in yt-dlp, but I was curious if we might be able to add support for either restricting the file-type of the thumbnail used when using --embed-thumbnail, or converting an available thumbnail to a specific file-type before it is embedded?

The problem is that when you download OPUS audio from a YT url the thumbnails are in webp format which cannot be embedded. I do not know if the ThumbnailData contains multiple file-types we can choose from or not. If it doesnt, the next thing I can think of is to convert the existing Thumbnail to JPG.

Nullable Enums are set to default(T) instead of null when their value is null

I noticed when looking at the VideoData for a deserialised playlist, the availability of each entry was listed as Private. I knew they were public videos and I checked the raw output from yt-dlp and it was returning null. It seems even though Availability is specified as nullable in VideoData, the StringToEnumConverter that deserializes it returns default(T) when the value is null. I would think if the enum is nullable, null should be returned instead.

filename options

I noticed that sometimes the file name is not generated correctly. In this case I get file names that look like the following example "index-v1-a1 [index-v1-a1].mp4". The title is actually determined correctly in the fetch result, only when creating the filename there sometimes seems to be problems. Is there a way to configure a custom title for the filename? Actually I would like to have a filename like in this example.

string videoTitle = "This is a video title without special characters";
string videoQuality = "720p";
string myFileName = $"{videoTitle} [{videoQuality}].%(ext)s"

Cancellation does not kill task in UWP Xamarin-Forms App

In my Xamarin forms app, I realized that cancellation of the CancellationTokenSource does not stop the download. Only no more progress updates are passed to the application, but in task manager you see the download-process is still running. Also for 30 seconds you see the taskkill.exe process, but then it times out. Any ideas to fix this? Canceling downloads is essential to youtube dl apps.

Exception for paths with spaces

I am currently using version 1.0.0.beta3 with yt-dlp and have encountered an error that had baffled me for a good while. When creating a new youtubedl object, my path had a space in it (C:\Project Repo\Project\asdf\yt-dlp.exe), causing an error. Hope this can get fixed soon, thanks ;)

Unrecognized option '-hls-prefer-native'.

Hi, I'm getting the following error output during RunVideoDataFetch or RunVideoDownload.
I configured ffmpeg 6 and the latest version of yt-dlp
Can someone give me an advice how to solve this problem?

image

Crashes on a Youtube timelink

If you use a timelink, YoutubeDLSharp crashes with a JsonReaderException.

I work around this problem with this code:
if (videolink.Contains("t=") && videolink.ToLower().Contains("youtu")) { for (int i = 0; i < videolink.Length - 1; i++) { if (videolink[i] == 't' && videolink[i + 1] == '=') { videolink = videolink.Remove(i); } } }

It would be nice if you fix the problem :)

Download data does not represent file name correctly

I think this doesn't work for non-ASCII characters. Take racing into the night (夜に駆ける), for example. While it does save the file name correctly, taking RunResult.Data returns a file path of C:\...\bin\Debug\net6.0-windows\output\.mp3. As you can see, I can no longer get the file path of the audio file.
image_2022-10-24_110445459

Issue With YT-DLP But not with YT-DL

So I have the following code:

var ytdl = new YoutubeDL();
ytdl.FFmpegPath = @"..\ffmpeg.exe";
ytdl.YoutubeDLPath = @"..\youtube-dl.exe";
ytdl.OutputFolder = @"..\Downloads\";

Progress<DownloadProgress> dlprogress = new(p => Console.WriteLine(p.Progress * 100));
var dledpath = await ytdl.RunAudioDownload("https://www.youtube.com/watch?v=a4YwJCZRh5M", AudioConversionFormat.Mp3, progress: dlprogress);
var awaitdata = await ytdl.RunVideoDataFetch("https://www.youtube.com/watch?v=a4YwJCZRh5M");
VideoData Data = awaitdata.Data;

Console.WriteLine(Data.Title);
Console.ReadLine();

This code works fine and with no errors, however if I change the
ytdl.YoutubeDLPath = @"..\youtube-dl.exe";
to
ytdl.YoutubeDLPath = @"..\yt-dlp.exe";
I'll get this error

Newtonsoft.Json.JsonReaderException: 'Input string '1.0' is not a valid integer. Path 'formats[3].quality', line 1, position 4175.'

Am I doing something wrong? how should I go about this?

using version 1.0.0-beta2 didn't fix the problem

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.