Giter VIP home page Giter VIP logo

fe80grau / ytdlp2strm Goto Github PK

View Code? Open in Web Editor NEW
197.0 13.0 18.0 87.9 MB

A little script to serve Youtube / Twitch / Crunchyroll videos without storage it. Uses yt-dlp HTTP data throught Flask and dynamic URLs. We can use this dynamic URLs to set STRM files.

Home Page: https://github.com/fe80Grau/ytdlp2STRM

License: MIT License

Python 80.90% HTML 15.48% JavaScript 2.92% CSS 0.49% Dockerfile 0.22%
jellyfin youtube yt-dlp flask python strm crunchyroll ffmpeg twitch youtube-dl

ytdlp2strm's People

Contributors

9glenda avatar dcflachs avatar fe80grau avatar inpopportune avatar jasperaelvoet avatar pixelroll avatar theawesomepossum avatar tresillo2017 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  avatar  avatar  avatar  avatar  avatar

ytdlp2strm's Issues

cookies

Is it possible to pass cookies to ytdlp2strm?

Help requested - Service Failed to start

Hi!, first I'd like to thank you for your work...

I've tried to install with the instructions... everything installs without errors, but service won't start:

● ytdlp2strm.service - ytdlp2STRM Service
     Loaded: loaded (/etc/systemd/system/ytdlp2strm.service; enabled; preset: enabled)
     Active: activating (auto-restart) (Result: exit-code) since Mon 2024-01-15 13:37:36 CST; 1s ago
    Process: 32809 ExecStart=/usr/bin/python3 /opt/ytdlp2STRM/main.py (code=exited, status=1/FAILURE)
   Main PID: 32809 (code=exited, status=1/FAILURE)
        CPU: 209ms

Jan 15 13:37:36 jelly-server systemd[1]: ytdlp2strm.service: Main process exited, code=exited, status=1/FAILURE
Jan 15 13:37:36 jelly-server systemd[1]: ytdlp2strm.service: Failed with result 'exit-code'.

I've tried uninstalling and installing again, but same result...

PD: I can't wait to see a Jellyfin Plugin integration with this!... thanks in advance!

ERROR [youtube] p7zmysRHeyw This video is available to this channel's members

When importing from the channel https://www.youtube.com/@bigthink, the script creates the following folder:

@bigthink [ERROR [youtube] p7zmysRHeyw This video is available to this channel'\''s members on level Think Even Bigger (or any higher level). Join this channel to get access to members-only content and other exclusive perks.]

with no videos in it.

I have tried different youtube_configs, including reducing days_dateafter to 1 so it doesn't consider the member only videos at all. Everything results in the same folder with no videos.

Running the docker image from docker hub.

Side note: thank you so much for the awesome project!

Youtube plugin - audio only option?

Hi man,
first of all let me say: amazing work, I’m truly loving it so far.

Now I’d like to ask if there is or will ever be implemented a way to generate audio only streams: I know yt-dlp support this option, so it would be a nice to have.

Thanks for your time.

Youtube mix/playlist request?

Documentation is not really clear on how to compose a Youtube request: you might want to add a section in the readme file.

As far as I'm aware the existing request methods are the following:

Request output

  • http://localhost:5005/youtube/direct/<youtubeID> → A simple redirect to final stream URL. (faster, no disk usage, sponsorblock not works)
  • http://localhost:5005/youtube/bridge/<youtubeID> → Remuxing on fly. (fast, no disk usage)
  • http://localhost:5005/youtube/download/<youtubeID> → First download full video then it's served. (slow, temp disk usage)

Request output type

  • http://localhost:5005/youtube/direct/<youtubeID>-audio → Return an audio only streaming
  • http://localhost:5005/youtube/direct/list-<youtubeID> → Return a streaming of an entire playlist (?)
  • http://localhost:5005/youtube/direct/list-<youtubeID>-audio → Return an audio only streaming of an entire playlist (?)

I'm not currently able to make the latest two in list works, hence the title of the issue: how shall I compose a request starting from a Youtube playlist such as https://www.youtube.com/playlist?list=PL6kFT_LlrYKW32II058F7c_NcJ3uCMNh6 ?
Also please feel free to expand the list if any other request possible is missing.

Thanks again for your time and the amazing work put into this app.

only pulls one video

i setup the config to the best of my knowledge and it gets all the info, says its getting videos, but in the end only does 1 video or maybe 2 of the entire channel. no matter of fiddling gets it to download anymore than that

Friendly ping to update dockerhub image

Hello!

Just a friendly ping to post the updated image with ffmpeg nightly to the dockerhub image!

Thats all! Thanks a lot for your project, loving it so far 🥇

can this service stream audio only from youtube

This awesome plugin deserves a lot more attention.

Many want to listen to youtube's audio stream only. Can this service stream audio only ?
Many other solutions require downloading files and use ffmpeg to generate and save an audio file.
I see your self-hosted service as a great solution to youtube audio listening without saving audio files. Could you comment on audio streaming ?

Now that I have it installed and up running. I can see from the web interface, lots of powerful features. But it's not clear what I need to do in jellyfin to utilize this youtube plugin ? Can you add in your MD file what the user needs to do ?

For example, in your sample youtube channels, you have

Is the keyword-kbase for any keyword search ?
what is extractaudio doing ? Does it extract audio of all files from the channel ?

Add ARM/aarch64 compatible image on Docker hub

I was trying to deploy via docker-compose (in Portainer) on a Raspberry Pi and despite the stack building successfully and the showing as "running" the GUI never becomes accessible. Looking at the logs revealed the problem: exec /usr/local/bin/python: exec format error. It seems the image in Docker Hub is for amd64/x86_64 only. I'm ignorant on the difficulty involved in creating a new image or making the current multi-architecture, but if it's not too much trouble I'd love if this were something that could be done!

movies block updates on Crunchyroll

example:
for jujutsu kaisen, the film jujutsu kaisen 0 is in season 10 (ytdlp2strm detects it as 44 oddly enough) , so the last episode is marked further back than season 2, which is currently airing and therefore no longer updates.

en image :
image
last_episode.txt : 347 while the real last episode is 43

Crunchyroll broke again ?

Hi !
Look like crunchyroll broke something again because yesterday no new episode was downloaded. Didn't get an error message, just a list of Preparing channel and that's it.
I looked around a bit and found yt-dlp/yt-dlp#9994 and this yt-dlp/yt-dlp#10005
Maybe we need to update the version (and the docker image) ? :)

Have a nice day ! :)

Option to place live stream in different season

It would be nice to have an option to place the live stream .strm file in a subfolder separate from the other available streams. Particularly i would like a subfolder named some variant of s0, season-0, etc. That would make jellyfin place the live stream in a separate season than the others making it easier to find for some channels.

Crunchyroll Updates

  • Requires yt-dlp nightly build to work. yt-dlp >=2024.05.22.232749.dev0
  • Only works with login auth.
  • mutate_values.json A particular file for this plugin. Overwrites the value of a specified field. For example, in cases where the season given by yt-dlp - season_number does not correspond to the actual season of the series. The available fields are as follows: season_number, season, episode_number, and episode.
  • direct mode. On Crunchyroll, the direct mode inherits the functionality of the download mode.
  • bridge mode. Given the latest updates, it is necessary to obtain the audio and video streams separately, redirect their output, and remux both tracks to finally serve them over HTTP. Experimental, sometimes it may fail to start playback and you need to try playing it again. There is no timestamp and it is not possible to navigate through the video's timeline.
  • With download mode, the audio and video streams will be downloaded separately, and after downloading, they will be remuxed to finally serve a final video/mp4 file. The files will be downloaded to ./temp/ and their lifespan will be 24 hours. This is configurable in config.json -> ytdlp2strm_temp_file_duration. The Crunchyroll plugin in download mode will automatically download the latest discovered episode of each series declared in channel_list.json.
  • In the config.json file, and specifically for the Crunchyroll plugin, there are 4 parameters: jellyfin_preload_last_episode, jellyfin_base_url, jellyfin_user_id, and jellyfin_api_key. When configured with their correct values, they allow detecting if an episode is being played and pre-downloading the next one to achieve a seamless playback flow without interruptions.

Sponsorblock does not work in bridge mode

Hey there,

hope I'm not hopelessly annoying you by now.
I just absolutely love the idea of having ytdlp2strm replace my tubearchivist instance.

Sadly, the sponsorblock integration does not seem to work for me in bridge mode currently.

This is my youtube config:

{"strm_output_folder": "/media/youtube", "channels_list_file": "./plugins/youtube/channel_list.json", "days_dateafter": "10", "videos_limit": "10", "sponsorblock": "true", "sponsorblock_cats": "sponsor"}

I also tried it with 'True' (with it being capitalized), but this didnt change anything.

I used https://www.youtube.com/@halfasinteresting as a test. Short videos with sponsors at the end. They dont get skipped here. They do in my tubearchivist instance.

With the latest video about NTP, the sponsor segment starts shortly after minute 6:40 (if you want to test).

Please dont hesitate to write if you need more information.

Sponsorblock??

Any chance to some sponsorblock implementation in? I have some videos that I could care less about the invid adverts.

Cheers

[Question] Will this work with many users?

Hi, thanks for the plugin, I was wondering if each jellyfin user would be able to set their own channels to follow, or if all channels would be available for all users

Thanks

Docker Image On Docker Hub

I'm running Docker on a NAS that doesn't allow me to option to build Docker images. If it's not too much asking, please have option of hosting Docker images on Docker Hub.

can we add all of crunchyroll?

Hello,
I wanted to know if we could add all crunchyroll at once?
I'd like to add the crunchyroll catalog to my jellyfin.
thanks in advance.

Playback Errors

Thanks for the great project.

My instance seems to import videos but it won't play anything. I get playback errors every time I try to play something. Any suggestions?

Screenshot 2024-07-04 171732

Needs Tutorial

How do I get this program to work, I have tried for 4 days and no bueno, could you be a liitle bit more specific with the readme and actually leave a good example for the json files. This is a great idea I want to use it but am not able to. Please break it down Barney style.

Live Twitch streams fail to transcode

I keep running into an issue with live Twitch streams. Many live streams that show an ad at the beginning fail to work. The streams start ok initially playing the "Commercial Break in progress" screen but after that there is only black. Grabbing the stream directly in VLC works fine but through jellyfin not so much. The ffmpeg transcode log for the session shows an error like this.

[mpegts @ 0x5628b2994540] Packet corrupt (stream = 1, dts = 6748380). [hls @ 0x5628b268a6c0] Packet corrupt (stream = 1, dts = 6745320). http://127.0.0.1:5000/twitch/direct/Mousie@40904378728: corrupt input packet in stream 1 frame= 449 fps= 32 q=11.0 size=N/A time=00:00:13.03 bitrate=N/A speed=0.926x More than 1000 frames duplicated

youtube .strm files not playable in jellyfin

I used the docker image and it seems to work fine. After the youtube channels are generated and .strm files are there. I copy them to jellyfin lib folder and did a lib scan.

Jellyfin appears to show these media files, but none are playable. When I play it, it complained about it's not a playable format or recognized format.

What did I miss ?

Crunchyroll is broken

yt-dlp/yt-dlp#10207
It looks like Crunchyroll is already applying DRM to Switch endpoints. Let's wait and see if the yt-dlp team finds a solution, but I think the dark ages are just beginning.

Docker compose YAML template

Here's a compose template based on fe80grau/ytdlp2strm that you might want to add to your README:

---
version: "2.1"
services:
ytdlp2strm:
    image: fe80grau/ytdlp2strm
    container_name: ytdlp2STRM
    environment:
      - AM_I_IN_A_DOCKER_CONTAINER=Yes
      - DOCKER_PORT=5005
    volumes:
      - /local/path/to/media:/media
      - /local/path/to/channel_list.json:/opt/ytdlp2STRM/plugins/youtube/channel_list.json
      - /local/path/to/yt_config.json:/opt/ytdlp2STRM/plugins/youtube/config.json
      - /local/path/to/config.json:/opt/ytdlp2STRM/config/config.json
      - /local/path/to/crons.json:/opt/ytdlp2STRM/config/crons.json
      - ytdlp2strm-data:/opt/ytdlp2STRM
    ports:
      - 5005:5000
    restart: always
volumes:
  ytdlp2strm-data:

Where:

  • /local/path/to/media is the local folder where the .strm file will be created
  • /local/path/to/config.json is optional and will set your ytdlp2STRM general settings; formatted as config.example.json
  • /local/path/to/crons.json is optional and will set your ytdlp2STRM cronjob settings; formatted as crons.example.json
  • /local/path/to/channel_list.json is optional and will set your Youtube channel list; formatted as channel_list.example.json
  • /local/path/to/yt_config.json is optional and will set your Youtube plugin settings; formatted as config.example.json

Also I'm not sure if the environment variable DOCKER_PORT is still needed, can you confirm this?
Thanks again for the amazing job!

issue with Jellyfin and strm files on Raspberry Pi3b+

I get this error when i execute the cron job, but I think I installed the sanitize filename via requirements.txt ?

Traceback (most recent call last):
File "/opt/ytdlp2STRM/cli.py", line 8, in
from sanitize_filename import sanitize
ModuleNotFoundError: No module named 'sanitize_filename'

@fe80Grau edit:

  • sanitize problem solved.
  • title edit
  • current issue #5 (comment)

Limited on 480p

It's in title, not the same issue as "higher quality" because is significant lower and not depend of the max flow for unificated files avaible...

Add timezone field to configure in cron

I have used the docker method and configured the channels and configs. But when i went into the output directory(bind to /media) there were no files. So I added a cron job to run it for the first time. After trying a few more times. I ran the cli.py from the container, this time the strm files were properly created.
I had tried to look for cron logs but couldn't find it. Can u tell me how to switch the logging to debug? Should i edit the main.py?
Thanks in advance..

[Feature Request] get /@live/streams

Please help me with some information?
I installed it and added the Youtube url but I believe that the Youtube folder should be generated within Media but this did not happen

systemd file doesnt work

systemd file exits with the following error

     Loaded: loaded (/etc/systemd/system/ytdlp2strm.service; enabled; vendor preset: enabled)
     Active: activating (auto-restart) (Result: exit-code) since Mon 2023-11-06 07:04:02 GMT; 1s ago
    Process: 228880 ExecStart=/usr/bin/python3 /opt/ytdlp2STRM/main.py (code=exited, status=1/FAILURE)
   Main PID: 228880 (code=exited, status=1/FAILURE)
        CPU: 352ms

could be with how you starting it i recommend specifying a user and using the following exec start

ExecStart=/bin/bash -c cd /opt/ytdlp2STRM/ && python3 main.py

Bridge Mode: Server Error

Hey there,

thanks for the great software.

Im using the most current version in Docker and am trying to use the bridge mode (so that sponsorblock works), but the application runs into the following error:

[download]   0.0% of   31.12MiB at  Unknown B/s ETA Unknown10.1.0.171 - - [23/Apr/2024 23:17:26] "GET /youtube/bridge/u4RMsjieSI4 HTTP/1.1" 500 -
Error on request:
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/werkzeug/serving.py", line 335, in run_wsgi
    execute(self.server.app)
  File "/usr/local/lib/python3.9/site-packages/werkzeug/serving.py", line 324, in execute
    for data in application_iter:
  File "/usr/local/lib/python3.9/site-packages/werkzeug/wsgi.py", line 500, in __next__
    return self._next()
  File "/usr/local/lib/python3.9/site-packages/werkzeug/wrappers/response.py", line 50, in _iter_encoded
    for item in iterable:
  File "/usr/local/lib/python3.9/site-packages/flask/helpers.py", line 149, in generator
    yield from gen
  File "/opt/ytdlp2STRM/plugins/youtube/youtube.py", line 699, in generate
    line = process.stdout.read(1024)
  File "/usr/local/lib/python3.9/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xdc in position 27: invalid continuation byte

The website just displays a 500 Internal Server Error.

Thanks!

Guide maybe? lol

Hey bro, huge Jellyfin fan here annd your git repo is exciting! But I need a little bit of help. It's installed andn everything but I need a bit of help on what to input in Crunchyroll, Jellyfin base URL, API, etc. I know you can get an API from the dashboard and I know how to get the user ID, but I nneed more details, sort of like, is there a certain plugin to install? How is it going to appear in my medias or display?

Please assist bro!

Can't fix "Request blocked by Cloudflare"

Hi guys !

I think I just miss something but, after hours failling to find a fix, I'm out of idea.
I installed the docker image a few week ago on a LXC in my proxmox server. I struggle a bit but, finally, everything was working wonderfully well. I could get crunchyroll on my jellyfin.
But, yesterday, it stopped working and I saw in logs the classic:

Request blocked by Cloudflare; navigate to Crunchyroll in your browser, then pass the fresh cookies (with --cookies-from-browser or --cookies) and your browser's User-Agent (with --user-agent)

From here, I tried to udpate my cookies again and nothing worked. I have tried to get cookies and user-agent from 3 differents browser from my usual client and still get error. I also tried to use the "browser" authentication method with firefox in a container + bind mount and it don't work as either.

Did I miss something ? Or my use case cause all of this ?

In any case, thank a lot for your work!

'Youtube' object has no attribute 'channel_id'

When manually executing "python3 cli.py --media youtube --params direct", I always receive the same error...
Output in terminal:

 python3 cli.py --media youtube --params direct
09/11/2023 16:42:54
Running youtube with ['direct'] params
Preparing channel https://www.youtube.com/@CreativoenJapon
@CreativoenJapon
Working channel URL: https://www.youtube.com/@CreativoenJapon/videos
Getting channel ID...
Traceback (most recent call last):
  File "C:\ProgramData\ytdlp2STRM\cli.py", line 48, in <module>
    main()
  File "C:\ProgramData\ytdlp2STRM\cli.py", line 45, in main
    r = eval("{}.{}.{}".format("plugins",method,"to_strm"))(*params)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\ProgramData\ytdlp2STRM\plugins\youtube\youtube.py", line 617, in to_strm
    channel_strm(
  File "C:\ProgramData\ytdlp2STRM\plugins\youtube\youtube.py", line 394, in channel_strm
    yt = Youtube(
         ^^^^^^^^
  File "C:\ProgramData\ytdlp2STRM\plugins\youtube\youtube.py", line 24, in __init__
    self.channel_id = self.get_id()
                      ^^^^^^^^^^^^^
  File "C:\ProgramData\ytdlp2STRM\plugins\youtube\youtube.py", line 76, in get_id
    if not self.channel_id:
           ^^^^^^^^^^^^^^^
AttributeError: 'Youtube' object has no attribute 'channel_id'. Did you mean: 'channel'?

Live Streams

Theoretically yt-dlp works with many different video hosting platforms, even with twitch.tv or youtube live streams, does ytdlp2strm work with live streams? Has this ever been tested?

Higer quality videos

All videos from youtube have at most 720p quality... is there a way to allow higer resolutions?

ytsearch

Hallo i am trying implement
this function on this code, you help me
#yt-dlp -f 'best' --no-warning --get-url
#yt-dlp -f 'best' ytsearch10:[AO VIVO] --no-warning --get-url

and create a @channel_user_name folder before search a kayword on my list file

Error

I get the following Error message from ytdl2STRM installed in an virtual env in /opt:
Traceback (most recent call last):
File "/opt/ytdlp2STRM/cli.py", line 3, in
import config.plugins as plugins
File "/opt/ytdlp2STRM/config/plugins.py", line 2, in
from plugins.youtube import youtube
File "/opt/ytdlp2STRM/plugins/youtube/youtube.py", line 374, in
).get_channels()
^^^^^^^^^^^^^^
File "/opt/ytdlp2STRM/clases/config/config.py", line 41, in get_channels
config_data = json.load(file)
^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/json/init.py", line 293, in load
return loads(fp.read(),
^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/json/init.py", line 346, in loads
return _default_decoder.decode(s)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/json/decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 3 column 1 (char 43)

Only downloaded the recent video from channel

channel_list.json

[
    "https://www.youtube.com/@aswanthkok9312"
]

config.json

{
    "strm_output_folder" : "./Youtube",
    "channels_list_file" : "./plugins/youtube/channel_list.json",
    "days_dateafter" : "10", 
    "videos_limit" : "10",
    "sponsorblock" : false,
    "sponsorblock_cats" : "sponsor"
}

Response cli.py


20/03/2024 15:20:54
Running youtube with ['direct'] params
Preparing channel https://www.youtube.com/@aswanthkok9312
@aswanthkok9312
Working channel URL: https://www.youtube.com/@aswanthkok9312/videos
Getting channel ID...
yt-dlp --compat-options no-youtube-channel-redirect --compat-options no-youtube-unavailable-videos --restrict-filenames --ignore-errors --no-warnings --playlist-start 1 --playlist-end 1 --print channel_url https://www.youtube.com/@aswanthkok9312/videos
Generating name folder...
Getting name...
Command yt-dlp https://www.youtube.com/@aswanthkok9312 --compat-options no-youtube-unavailable-videos --print "%(channel)s" --restrict-filenames --ignore-errors --no-warnings --playlist-items 1 --compat-options no-youtube-channel-redirect
Getting description...
Getting thumbnails...
Getting videos...
Created directory: ./Youtube/@aswanthkok9312 [UCr8xb2866oogDXDSN5-2Mxw]
File created: ./Youtube/@aswanthkok9312 [UCr8xb2866oogDXDSN5-2Mxw]/20240315 - Anchakkallakokkan Review  Ullas Chemban  Lukman Avaran  Chemban Vinod  Chembosky [z1UNrBd655g].strm

Playlists?

Hello there

This tool looks pretty good but I see that it only uses channels. Any plans to include playlists too?

I have a watch later playlist that I would love to place in my JF library

Cheers

Try but fall

Hi!
Your project looks interesting.
I followed your instructions to create a docker, but unfortunately I didn't end up with anything that works:
I don't have any files in my /media folder, even if I changed the cron data or added a new youtube channel.

P.S
I have a gui in localhost:5005

Can we get this as a docker image?

Hello!
This project looks real cool and seems to do exactly what I want it (mainly streaming Youtube and Twitch), but I don’t want to run it as a direct service can this be packaged as a docker. Thanks.

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.