Giter VIP home page Giter VIP logo

Comments (18)

np1 avatar np1 commented on September 3, 2024

I notice this mostly when requesting audio streams (ie. show_video is set to false). Do you find it happens more with mplayer than mpv or does it occur equally with both? I recently changed the mplayer http requests from https to http to see if that helps but I'm not sure whether it's improved and don't have time to do more testing right now.

from yewtube.

 avatar commented on September 3, 2024

I'd never used mpv before. I've been using it (and have been liking it a lot better than mplayer). I think it might be more reliable. I have not had the issue yet.

from yewtube.

 avatar commented on September 3, 2024

Just experienced this issue with mpv. Restarting the request worked.

from yewtube.

 avatar commented on September 3, 2024

This is happening quite frequently. I'm not getting any error messages, though. How can I best supply information?

from yewtube.

np1 avatar np1 commented on September 3, 2024

You could set a custom playerargs setting and exclude the -really-quiet option so that you will be able to see the output from mplayer / mpv.

Eg:

set player mpv
set playerargs ""

or

set player mplayer
set playerargs "-prefer-ipv4 -nolirc"

from yewtube.

np1 avatar np1 commented on September 3, 2024

I should have mentioned you can also add -v to the arguments above to see more of what is happening in mplayer/mpv:

set player mpv
set playerargs -v

or

set player mplayer
set playerargs -v -prefer-ipv4 -nolirc

from yewtube.

np1 avatar np1 commented on September 3, 2024

I noticed that the larger the audio file, the longer it takes to start playback. I monitored my bandwidth usage and it seems that the whole file is transferred before playback begins! This only happens with audio streams, and only on playback (download is fine).

I logged an issue on the mpv project page (mpv-player/mpv#579) and am told that it is likely a problem with ffmpeg's mp4 demuxer consuming the entire stream. I'm not sure what I can do about it. One way to deal with it would be to play all audio by streaming the video and suppressing the video output, although that is a massive waste of bandwidth. It could be enabled/disabled by a user config option.

Another option is to locally cache the next file when audio mode is enabled, and then play the file locally, although that would only work when selecting a range of items to play (e.g., 1,5,7,8). It would not help when selecting a single arbitrary result from a saved playlist / search result screen.

from yewtube.

 avatar commented on September 3, 2024

I'm unsure of what's causing this: I can't get this bug to trigger with the -v flag set :(

from yewtube.

np1 avatar np1 commented on September 3, 2024

Have you tried selecting a large audio stream (> 60 minutes, say) ?

from yewtube.

 avatar commented on September 3, 2024

I have - I do notice that starting a stream takes much longer on lengthy tracks (due to the downloading) but I don't have the issue of playback for a few seconds followed by a quit.

from yewtube.

 avatar commented on September 3, 2024

aha! Got it to happen just now with a two-minute track! Here's a dump of the output - re-selecting it for playback will properly play the track.

MPlayer svn r34540 (Ubuntu), built with gcc-4.7 (C) 2000-2012 MPlayer Team
CPU vendor name: GenuineIntel max cpuid level: 13
CPU: Intel(R) Core(TM)2 Duo CPU P8700 @ 2.53GHz (Family: 6, Model: 23, Stepping: 10)
extended cpuid-level: 8
extended cache-info: 201351232
Detected cache-line size is 64 bytes
CPUflags: MMX: 1 MMX2: 1 3DNow: 0 3DNowExt: 0 SSE: 1 SSE2: 1 SSSE3: 1
Compiled with runtime CPU detection.
get_path('codecs.conf') -> '/home/ainola/.mplayer/codecs.conf'
Reading optional codecs config file /home/ainola/.mplayer/codecs.conf: No such file or directory
Reading optional codecs config file /etc/mplayer/codecs.conf: No such file or directory
Using built-in default codecs.conf.
init_freetype
Using MMX (with tiny bit MMX2) Optimized OnScreenDisplay
get_path('fonts') -> '/home/ainola/.mplayer/fonts'
Configuration: --prefix=/usr --confdir=/etc/mplayer --enable-xvmc --enable-menu --enable-radio --enable-radio-capture --disable-arts --language=all --disable-dvdread-internal --disable-libdvdcss-internal --disable-libmpeg2-internal --disable-ffmpeg_a --enable-runtime-cpudetection --enable-debug --enable-joystick --disable-gui
CommandLine: '-nolirc' '-nocache' '-prefer-ipv4' '-v' 'http://r18---sn-hp576ned.googlevideo.com/videoplayback?ms=au&mt=1393498668&gir=yes&key=yt5&signature=D01321BCB2F525534A134461E13D099B9AA4A7F0.EB2F9DB2DD9D0121FE6C602BD8AC5760C0049731&id=1f2d1a123f3989f6&fexp=936117%2C937417%2C937416%2C913434%2C936910%2C936913%2C902907&ipbits=0&expire=1393520895&itag=171&lmt=1391848451477696&dur=156.304&mv=m&source=youtube&sver=3&clen=1346115&sparams=clen%2Cdur%2Cgir%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Crequiressl%2Csource%2Cupn%2Cexpire&requiressl=yes&upn=o-n1cRhHb3Y&ip=66.177.253.240&ratebypass=yes'
Using nanosleep() timing
get_path('input.conf') -> '/home/ainola/.mplayer/input.conf'
Reading optional input config file /home/ainola/.mplayer/input.conf: No such file or directory
Parsing input config file /etc/mplayer/input.conf
Input config file /etc/mplayer/input.conf parsed: 92 binds
get_path('videoplayback?ms=au&mt=1393498668&gir=yes&key=yt5&signature=D01321BCB2F525534A134461E13D099B9AA4A7F0.EB2F9DB2DD9D0121FE6C602BD8AC5760C0049731&id=1f2d1a123f3989f6&fexp=936117%2C937417%2C937416%2C913434%2C936910%2C936913%2C902907&ipbits=0&expire=1393520895&itag=171&lmt=1391848451477696&dur=156.304&mv=m&source=youtube&sver=3&clen=1346115&sparams=clen%2Cdur%2Cgir%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Crequiressl%2Csource%2Cupn%2Cexpire&requiressl=yes&upn=o-n1cRhHb3Y&ip=66.177.253.240&ratebypass=yes.conf') -> '/home/ainola/.mplayer/videoplayback?ms=au&mt=1393498668&gir=yes&key=yt5&signature=D01321BCB2F525534A134461E13D099B9AA4A7F0.EB2F9DB2DD9D0121FE6C602BD8AC5760C0049731&id=1f2d1a123f3989f6&fexp=936117%2C937417%2C937416%2C913434%2C936910%2C936913%2C902907&ipbits=0&expire=1393520895&itag=171&lmt=1391848451477696&dur=156.304&mv=m&source=youtube&sver=3&clen=1346115&sparams=clen%2Cdur%2Cgir%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Crequiressl%2Csource%2Cupn%2Cexpire&requiressl=yes&upn=o-n1cRhHb3Y&ip=66.177.253.240&ratebypass=yes.conf'

Playing http://r18---sn-hp576ned.googlevideo.com/videoplayback?ms=au&mt=1393498668&gir=yes&key=yt5&signature=D01321BCB2F525534A134461E13D099B9AA4A7F0.EB2F9DB2DD9D0121FE6C602BD8AC5760C0049731&id=1f2d1a123f3989f6&fexp=936117%2C937417%2C937416%2C913434%2C936910%2C936913%2C902907&ipbits=0&expire=1393520895&itag=171&lmt=1391848451477696&dur=156.304&mv=m&source=youtube&sver=3&clen=1346115&sparams=clen%2Cdur%2Cgir%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Crequiressl%2Csource%2Cupn%2Cexpire&requiressl=yes&upn=o-n1cRhHb3Y&ip=66.177.253.240&ratebypass=yes.
get_path('sub/') -> '/home/ainola/.mplayer/sub/'
Filename for url is now http://r18---sn-hp576ned.googlevideo.com/videoplayback?ms=au&mt=1393498668&gir=yes&key=yt5&signature=D01321BCB2F525534A134461E13D099B9AA4A7F0.EB2F9DB2DD9D0121FE6C602BD8AC5760C0049731&id=1f2d1a123f3989f6&fexp=936117%2C937417%2C937416%2C913434%2C936910%2C936913%2C902907&ipbits=0&expire=1393520895&itag=171&lmt=1391848451477696&dur=156.304&mv=m&source=youtube&sver=3&clen=1346115&sparams=clen%2Cdur%2Cgir%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Crequiressl%2Csource%2Cupn%2Cexpire&requiressl=yes&upn=o-n1cRhHb3Y&ip=66.177.253.240&ratebypass=yes
Filename for url is now http://r18---sn-hp576ned.googlevideo.com/videoplayback?ms=au&mt=1393498668&gir=yes&key=yt5&signature=D01321BCB2F525534A134461E13D099B9AA4A7F0.EB2F9DB2DD9D0121FE6C602BD8AC5760C0049731&id=1f2d1a123f3989f6&fexp=936117%2C937417%2C937416%2C913434%2C936910%2C936913%2C902907&ipbits=0&expire=1393520895&itag=171&lmt=1391848451477696&dur=156.304&mv=m&source=youtube&sver=3&clen=1346115&sparams=clen%2Cdur%2Cgir%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Crequiressl%2Csource%2Cupn%2Cexpire&requiressl=yes&upn=o-n1cRhHb3Y&ip=66.177.253.240&ratebypass=yes
STREAM_HTTP(1), URL: http://r18---sn-hp576ned.googlevideo.com/videoplayback?ms=au&mt=1393498668&gir=yes&key=yt5&signature=D01321BCB2F525534A134461E13D099B9AA4A7F0.EB2F9DB2DD9D0121FE6C602BD8AC5760C0049731&id=1f2d1a123f3989f6&fexp=936117%2C937417%2C937416%2C913434%2C936910%2C936913%2C902907&ipbits=0&expire=1393520895&itag=171&lmt=1391848451477696&dur=156.304&mv=m&source=youtube&sver=3&clen=1346115&sparams=clen%2Cdur%2Cgir%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Crequiressl%2Csource%2Cupn%2Cexpire&requiressl=yes&upn=o-n1cRhHb3Y&ip=66.177.253.240&ratebypass=yes
Resolving r18---sn-hp576ned.googlevideo.com for AF_INET...
Connecting to server r18---sn-hp576ned.googlevideo.com[173.194.17.119]: 80...

--- HTTP DEBUG HEADER --- START ---
protocol: [HTTP/1.1]
http minor version: [1]
uri: [(null)]
method: [(null)]
status code: [403]
reason phrase: [Forbidden]
body size: [0]
Fields:
0 - Last-Modified: Wed, 02 May 2007 10:26:10 GMT
1 - Content-Type: text/plain
2 - Content-Length: 0
3 - Connection: close
4 - X-Content-Type-Options: nosniff
5 - Date: Thu, 27 Feb 2014 10:58:49 GMT
6 - Server: gvs 1.0
--- HTTP DEBUG HEADER --- END ---
Filename for url is now http://r18---sn-hp576ned.googlevideo.com/videoplayback?ms=au&mt=1393498668&gir=yes&key=yt5&signature=D01321BCB2F525534A134461E13D099B9AA4A7F0.EB2F9DB2DD9D0121FE6C602BD8AC5760C0049731&id=1f2d1a123f3989f6&fexp=936117%2C937417%2C937416%2C913434%2C936910%2C936913%2C902907&ipbits=0&expire=1393520895&itag=171&lmt=1391848451477696&dur=156.304&mv=m&source=youtube&sver=3&clen=1346115&sparams=clen%2Cdur%2Cgir%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Crequiressl%2Csource%2Cupn%2Cexpire&requiressl=yes&upn=o-n1cRhHb3Y&ip=66.177.253.240&ratebypass=yes
Filename for url is now http://r18---sn-hp576ned.googlevideo.com/videoplayback?ms=au&mt=1393498668&gir=yes&key=yt5&signature=D01321BCB2F525534A134461E13D099B9AA4A7F0.EB2F9DB2DD9D0121FE6C602BD8AC5760C0049731&id=1f2d1a123f3989f6&fexp=936117%2C937417%2C937416%2C913434%2C936910%2C936913%2C902907&ipbits=0&expire=1393520895&itag=171&lmt=1391848451477696&dur=156.304&mv=m&source=youtube&sver=3&clen=1346115&sparams=clen%2Cdur%2Cgir%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Crequiressl%2Csource%2Cupn%2Cexpire&requiressl=yes&upn=o-n1cRhHb3Y&ip=66.177.253.240&ratebypass=yes
STREAM_ASF, URL: http://r18---sn-hp576ned.googlevideo.com/videoplayback?ms=au&mt=1393498668&gir=yes&key=yt5&signature=D01321BCB2F525534A134461E13D099B9AA4A7F0.EB2F9DB2DD9D0121FE6C602BD8AC5760C0049731&id=1f2d1a123f3989f6&fexp=936117%2C937417%2C937416%2C913434%2C936910%2C936913%2C902907&ipbits=0&expire=1393520895&itag=171&lmt=1391848451477696&dur=156.304&mv=m&source=youtube&sver=3&clen=1346115&sparams=clen%2Cdur%2Cgir%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Crequiressl%2Csource%2Cupn%2Cexpire&requiressl=yes&upn=o-n1cRhHb3Y&ip=66.177.253.240&ratebypass=yes
Trying ASF/HTTP...
Resolving r18---sn-hp576ned.googlevideo.com for AF_INET...
Connecting to server r18---sn-hp576ned.googlevideo.com[173.194.17.119]: 80...
===> ASF/HTTP failed
Filename for url is now http://r18---sn-hp576ned.googlevideo.com/videoplayback?ms=au&mt=1393498668&gir=yes&key=yt5&signature=D01321BCB2F525534A134461E13D099B9AA4A7F0.EB2F9DB2DD9D0121FE6C602BD8AC5760C0049731&id=1f2d1a123f3989f6&fexp=936117%2C937417%2C937416%2C913434%2C936910%2C936913%2C902907&ipbits=0&expire=1393520895&itag=171&lmt=1391848451477696&dur=156.304&mv=m&source=youtube&sver=3&clen=1346115&sparams=clen%2Cdur%2Cgir%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Crequiressl%2Csource%2Cupn%2Cexpire&requiressl=yes&upn=o-n1cRhHb3Y&ip=66.177.253.240&ratebypass=yes
Filename for url is now http://r18---sn-hp576ned.googlevideo.com/videoplayback?ms=au&mt=1393498668&gir=yes&key=yt5&signature=D01321BCB2F525534A134461E13D099B9AA4A7F0.EB2F9DB2DD9D0121FE6C602BD8AC5760C0049731&id=1f2d1a123f3989f6&fexp=936117%2C937417%2C937416%2C913434%2C936910%2C936913%2C902907&ipbits=0&expire=1393520895&itag=171&lmt=1391848451477696&dur=156.304&mv=m&source=youtube&sver=3&clen=1346115&sparams=clen%2Cdur%2Cgir%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Crequiressl%2Csource%2Cupn%2Cexpire&requiressl=yes&upn=o-n1cRhHb3Y&ip=66.177.253.240&ratebypass=yes
STREAM_HTTP(2), URL: http://r18---sn-hp576ned.googlevideo.com/videoplayback?ms=au&mt=1393498668&gir=yes&key=yt5&signature=D01321BCB2F525534A134461E13D099B9AA4A7F0.EB2F9DB2DD9D0121FE6C602BD8AC5760C0049731&id=1f2d1a123f3989f6&fexp=936117%2C937417%2C937416%2C913434%2C936910%2C936913%2C902907&ipbits=0&expire=1393520895&itag=171&lmt=1391848451477696&dur=156.304&mv=m&source=youtube&sver=3&clen=1346115&sparams=clen%2Cdur%2Cgir%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Crequiressl%2Csource%2Cupn%2Cexpire&requiressl=yes&upn=o-n1cRhHb3Y&ip=66.177.253.240&ratebypass=yes
Resolving r18---sn-hp576ned.googlevideo.com for AF_INET...
Connecting to server r18---sn-hp576ned.googlevideo.com[173.194.17.119]: 80...
--- HTTP DEBUG HEADER --- START ---
protocol: [HTTP/1.1]
http minor version: [1]
uri: [(null)]
method: [(null)]
status code: [403]
reason phrase: [Forbidden]
body size: [0]
Fields:
0 - Last-Modified: Wed, 02 May 2007 10:26:10 GMT
1 - Content-Type: text/plain
2 - Content-Length: 0
3 - Connection: close
4 - X-Content-Type-Options: nosniff
5 - Date: Thu, 27 Feb 2014 10:58:49 GMT
6 - Server: gvs 1.0
--- HTTP DEBUG HEADER --- END ---

vo: x11 uninit called but X11 not initialized..

Exiting... (End of file)

from yewtube.

np1 avatar np1 commented on September 3, 2024

Not sure what can be done about that. You are getting a 403 (Forbidden) status code. Did the selected item play for a few seconds and then exit as you reported in your comment before last?

from yewtube.

 avatar commented on September 3, 2024

I was afraid that wasn't going to be helpful. It did not, but I had though this might be the same issue.

On February 27, 2014 9:54:27 AM EST, nagev [email protected] wrote:

Not sure what can be done about that. You are getting a 403
(Forbidden) status code. Did the selected item play for a few seconds
and then exit as you reported in your comment before last?


Reply to this email directly or view it on GitHub:
https://github.com/np1/mps-youtube/issues/17#issuecomment-36249283

from yewtube.

 avatar commented on September 3, 2024

Okay, I have been listening to a hour+ track for about 20 minutes now and it just cut off on me and went back to the results listing. I did not try to seek as the output may suggest. Further, I've been having spotty playing gaps that can either be attributed to the newest version or (very likely) my internet service being a little slower than normal today.

[UPDATE]: Nah, it's gotta be mplayer or something, my internet is very reliable right now. I'm getting slews of HTTP DEBUG HEADER --- END messages

This was the final output. Sadly, it doesn't seem to be very informative but here's hoping:

--- HTTP DEBUG HEADER --- END ---
stream_seek: WARNING! Can't seek to 0x3CA7DF2 !
Resolving r7---sn-hp576n7y.googlevideo.com for AF_INET...
Connecting to server r7---sn-hp576n7y.googlevideo.com[173.194.29.140]: 80...

--- HTTP DEBUG HEADER --- START ---
protocol: [HTTP/1.1]
http minor version: [1]
uri: [(null)]
method: [(null)]
status code: [302]
reason phrase: [Found]
body size: [0]
Fields:
0 - Last-Modified: Wed, 02 May 2007 10:26:10 GMT
1 - Date: Fri, 28 Feb 2014 02:34:53 GMT
2 - Expires: Fri, 28 Feb 2014 02:34:53 GMT
3 - Cache-Control: private, max-age=900
4 - Location: http://r4---sn-p5qlsu7s.googlevideo.com/videoplayback?ipbits=0&sver=3&id=0c74f7a3580a8b57&expire=1393577855&signature=7E406C51004C8BAE5EDB5D395AB540A5D9F0A761.2689F7059D6903ED97C941AB1AD2B92D6909C5E6&ratebypass=yes&itag=22&fexp=926526%2C924614%2C913585%2C919007%2C937417%2C937416%2C924616%2C913434%2C936910%2C936913%2C902907%2C923320&ip=66.177.253.240&sparams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&source=youtube&upn=5vjGEg6ka2U&key=yt5&redirect_counter=2&cms_redirect=yes&ms=tsu&mt=1393554856&mv=m
5 - Content-Length: 0
6 - Connection: close
7 - X-Content-Type-Options: nosniff
8 - Content-Type: text/html
9 - Server: gvs 1.0
--- HTTP DEBUG HEADER --- END ---
Resolving r7---sn-hp576n7y.googlevideo.com for AF_INET...
Connecting to server r7---sn-hp576n7y.googlevideo.com[173.194.29.140]: 80...

--- HTTP DEBUG HEADER --- START ---
protocol: [HTTP/1.1]
http minor version: [1]
uri: [(null)]
method: [(null)]
status code: [206]
reason phrase: [Partial Content]
body size: [0]
Fields:
0 - Last-Modified: Tue, 22 Oct 2013 21:47:16 GMT
1 - Content-Type: video/mp4
2 - Date: Fri, 28 Feb 2014 02:34:53 GMT
3 - Expires: Fri, 28 Feb 2014 02:34:53 GMT
4 - Cache-Control: private, max-age=22662
5 - Content-Range: bytes 63248384-615752809/615752810
6 - Accept-Ranges: bytes
7 - Content-Length: 552504426
8 - Connection: close
9 - Alternate-Protocol: 80:quic
10 - X-Content-Type-Options: nosniff
11 - Server: gvs 1.0
--- HTTP DEBUG HEADER --- END ---
Content-Type: [video/mp4]
Content-Length: [552504426]
ds_fill_buffer: EOF reached (stream: audio)
A: 639.7 (10:39.7) of 6264.2 ( 1:44:24.1) 5.4%
ds_fill_buffer: EOF reached (stream: audio)
A: 639.7 (10:39.7) of 6264.2 ( 1:44:24.1) 5.4%
EOF code: 1

Uninit audio filters...
[libaf] Removing filter dummy
Uninit audio: ffmpeg
vo: x11 uninit called but X11 not initialized..

Exiting... (End of file)

from yewtube.

np1 avatar np1 commented on September 3, 2024

The EOF (end of file) signifies that no more data is being received. I can't tell what the reason is. It could be an mplayer problem, it could be an issue with your connection, it could be the server stopped sending data. I can't tell from that log which arguments were used for the request. If you have -nocache set please try removing this to see if that helps. I removed it in a recent release, it was originally there to help with the time it took mplayer to open m4a streams but since we are now rejecting m4a streams with mplayer it made sense to use caching again. If you type "set player mplayer" it should remove the -nocache option that may still be left over in your config from a previous release.

from yewtube.

 avatar commented on September 3, 2024

I've noticed that this issue also occurs sometimes when I pause a track for a period of time (ten or so minutes) and then resume playback. The track will play about 15-30 seconds and then suddenly cut and move to the next track (or quit playback if only one track). It's possible that this one is mplayer as I've tried to recreate in mpv with no success.

I'm sorry for the psuedo-symptoms I keep producing :(. Perhaps this should just be closed until I can get something tangible.

from yewtube.

np1 avatar np1 commented on September 3, 2024

I'm aware of this, the pause doesn't work for very long. It's the same in mps. It will play whatever is left in the cache and then go on to the next track. I haven't tested it much but I expect the same would happen with mpv. I think that the server would have a timeout limit, it's not going to wait and leave the inactive connection open forever in case you decide to resume. I don't think there's much I can do about it.

from yewtube.

 avatar commented on September 3, 2024

Oh, I forgot this ticket was still open. I haven't experiened this in a long time: I think it can safely be closed.

from yewtube.

Related Issues (20)

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.