seanap / plex-audiobook-guide Goto Github PK
View Code? Open in Web Editor NEWA walkthrough for optimal Audiobook experience using Plex
A walkthrough for optimal Audiobook experience using Plex
I'am using the auto-m4b docker container to convert my MP3 Files to a single M4B. Converting is working fine I'll get a single M4B File, but Chapters are not applied to the file.
If I want to tag the file beets-audible I am getting just a single chapter. It seems that beets is not recognizing all chapters. Or auto-m4b does not write the chapters in the right way. Chapters file looks like this:
Also in Plex (but thats normal as far as I read) and Prologue I am just seeing on Chapter
Config Files are both the same as in the readme.
Does anyone has an idea what I am doing wrong or what issue this might be?
audible finding any matches or not reaching audible web site can someone help with this thanks.
Not actually an issue, just a question...
I'm a little nitpicky in the way I like my audiobooks sorted and streamed using Prologue, and also I like to populate some metadata that Plex doesn't use so I won't every have to redo all my tagging in the event that some day another way of managing my library comes along that I like better.
I'm fairly decent at picking up elementary-level code via simple monkey-see/monkey-do, so I've mostly been able to tweak the .src files for scraping Audible info so that it suits my particular preferences.
However, I apparently have a mental block when it comes to regex stuff. I've tried many times over the last five years to try to wrap my head around it, but it just...doesn't compute for me.
So I'm able to, for example, remove things like "(Unabridged)" at the end of a title and the (usually unnecessary if not downright redundant) "Series" at the end of a series title, and remove the # from the Subtitle/ContentGroup fields ", Book #" just because find it more aesthetically pleasing.
There are two things I would like to do, however, that I can't figure out how to automate upon import using the .src script.
The first is automatically populate "Sort Artist/AlbumArtist/Composer" with Last Name, First formatting, because I can't work out the syntax for separating the name string at the final space in the string, then swap the two with a comma in between (which isn't a bulletproof solution, I know, but it handles ~90% of names.)
I also like to separate multiple authors and narrators by semicolons, rather than commas. This makes the delimiter easier to locate in situations where you have "Author Name, Ph.D." or whatever. Admittedly, the main reason I hope to have this is because someday, I'm hoping to finish the library database app I'm writing for MacOS/iOS, which would give each individual author their own record in the database instead of lumping multiple authors together. (So, for instance, books by "Robert Jordan; Brandon Sanderson" could be found when you look up either author's bibliography.) But that's another endeavor.
I would also like to import the Publisher's Summary to UNSYNCEDLYRICS (or long description, but most people seem to use the lyrics tag for this) complete with paragraph breaks (from there, it can be filtered/shortened further for use in the shorter COMMENT/DESCRIPTION tags.) The <p> </p>
html tags are filtered out in the regex here, I presume?
if "bc-text-bold\" >Publisher's Summary</h2>"
outputto "UnsyncedLyrics"
findline "<span class"
joinuntil "</span>"
regexpreplace "</?[^><]+>" ""
unspace
regexpreplace " +" " "
replace "bc-color-secondary\" >" ""
sayrest
else
But I'm not sure where. I know the unspace
is used to truncate leading and trailing whitespaces. Does that include paragraph breaks?
I'd also like to trim leading "The"/"A"/"An" etc from the album/title sorting.
I can probably do my monkey-see/monkey-do stuff if I can see samples of code where this is done, so there isn't a need to do it for me, unless it's quicker and easier to just demonstrate on the fly?
I upgraded my Synology DSM to Version 7 and thanks to Plex Member ChuckPa I was able to successfully update my Plex to a supported version of Plex. Everything except for the recognition of new audiobooks is working fine in Plex but unfortunately during the Plex upgrade it disabled the audiobook plugin that you have created and which is included in your software. I found a post for other Plex plugins on DSM 7 which indicated that plugins may still work if they are copied into the plugin directory in the upgraded Plex environment so I did that via SSH - but unfortunately the audiobook plugin doesn't seem to be working as new audiobooks added to my library are not being recognized by Plex. Do you intend to upgrade your applications to support Plex on DSM 7 by any chance? Thanks in advance for what you have created and any support or insight you may be able to provide.
Thanks for a great guide! after much frustration with lack of documentation to make audiobooks sort properly with plex, I am using this now for all my audiobooks! Much appreciated!
Is there anyway to match the track title with the chapter names?
Say: Prologue: "xxx", Chapter 1: "xxx", 2, 3 and so on.
I don't mind doing this manually. Thought automated would be great.
Right now, it tags every track at 01 and onward. This bugs me as some books starts with a prologue so chapter 2 would be mislabled as 01.
Thank you for this guide, it really helps.Everything seems good, but the tracks display, all of the m4b files just got 1 track there. It works ok in the other media palyers.
Meta info:
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
title : A Little History of the World (Unabridged)
artist : E. H. Gombrich
album_artist : E. H. Gombrich
album : A Little History of the World (Unabridged)
date : 2006
encoder : Lavf58.76.100
comment : An international best seller now available in English for the first time....
genre : Audiobook
copyright : ©1985 DuMont Literatur und Kunst Verlag GmbH und Co. KG, Cologne, Germany. English translation 2005 Leonie Gombrich;(P)2006 Blackstone Audio Inc.
Duration: 09:11:27.66, start: 0.000000, bitrate: 63 kb/s
Chapters:
Chapter #0:0: start 0.000000, end 1034.728000
Metadata:
title : Chapter 1
Chapter #0:1: start 1034.728000, end 1644.670000
Metadata:
title : Chapter 2
Chapter #0:2: start 1644.670000, end 2477.709000
Metadata:
title : Chapter 3
Chapter #0:3: start 2477.709000, end 3103.533000
Metadata:
title : Chapter 4
Chapter #0:4: start 3103.533000, end 3655.982000
...............
title : Chapter 40
Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 22050 Hz, stereo, fltp, 62 kb/s (default)
Metadata:
handler_name : ?Apple Sound Media Handler
vendor_id : [0][0][0][0]
Stream #0:1(eng): Data: bin_data (text / 0x74786574)
Metadata:
handler_name : SubtitleHandler
Stream #0:2: Video: mjpeg (Baseline), yuvj444p(pc, bt470bg/unknown/unknown), 600x600, 90k tbr, 90k tbn, 90k tbc (attached pic)
Hello,
I have a problem with Beets. When I digitize my audiobooks it sometimes can't capture the individual chapter names and then just calls them "track 1, track 2, etc..." or "name of album 1, name of album 2, name of album 3..."
After processing auto-m4b and launching beets, I select the correct audiobook from the suggestions.
# selection (default 1), Skip, Use as-is, as Tracks, Group albums,
Enter search, enter Id, aBort, eDit, edit Candidates? 1
Tagging:
Bill Bryson read by Ralph Caspers - A brief history of almost everything: edition for young listeners.
URL:
https://musicbrainz.org/release/89e2a576-6c3c-4c36-bce2-458d24c543b9
(Similarity: 28.1%) (missing tracks, tracks) (2xCD, 2008, DE, Random House Audio, ISBN: 978-3-86604-963-5)
CD 1
* A journey into space (140:19) -> A journey into space (2:06) (length)
Missing tracks (47/48 - 97.9%):
! Introduction (# 1) (2:22)
! Building instructions for a universe (# 2) (3:59)
! The Big Bang (# 3) (4:08)
! Hello! Glad you made it! (# 4) (2:26)
! Listening to the big bang (# 5) (2:19)
! Who is out there? (# 7) (1:47)
! Back on earth (# 8) (3:34)
! The earth owl (# 9) (1:37)
! What does the earth weigh? (#10) (3:00)
! How old is the earth? (#11) (3:27)
! Always nice and slow (#12) (3:08)
! Fossil finds (#13) (1:58)
! How to date rocks? (#14) (1:43)
! Bone Age (#15) (2:21)
! The mighty atom (#16) (4:07)
! A question of chemistry (#17) (3:30)
! The periodic table (#18) (2:30)
! Radiant elements (#19) (3:07)
! Einstein - A genius (#20) (3:22)
! Spacetime (#21) (2:42) !
! The big picture (#22) (2:49) !
! Unfortunate science (#23) (3:06) !
! The breaking crust (#24) (2:39)
! The fire underneath (#25) (2:38)
! The Yellowstone Park (#26) (2:55)
! When the earth shakes (#27) (3:23)
! Our tiny spot (#28) (4:13)
! Water everywhere (#29) (4:40)
! Protein soup (#30) (3:27)
! Fighting bacteria (#31) (3:46)
! Our mini world (#32) (3:15)
! What makes us sick (#33) (3:08)
! The cell state (#34) (2:52)
! How long can you stay? (#35) (2:26)
! Gradually it starts (#36) (2:07)
! Out of the sea (#37) (2:55)
! Where did we come from ? (#38) (1:49)
! Journey to the future (#39) (3:30)
! The silent monk (#40) (2:56)
! One big happy family (#41) (3:42)
! The chain of life (#42) (3:10)
! Skulls and bones (#43) (3:14)
! Lucy (#44) (3:04)
! From there to us (#45) (2:25)
! Toolmaker (#46) (2:17)
! What now ? (#47) (1:51)
! And bye! (#48) (2:23)
Apply, More candidates, Skip, Use as-is, as Tracks, Group albums,
Enter search, enter Id, aBort, eDit, edit Candidates?
What do I have to select now, that at the end in Prologue the single chapters are named as suggested above and not "Track1, Track2, ...."?
I have already tried A,U,T without success.
Steps to reproduce:
I narrowed it down to the %totaltracks%
doesn't seem to return a correct value because the if condition $ifgreater(%totaltracks%,1, - pt$num(%track%,2),)
in the actions script always returns an empty space.
If i change it to $ifgreater(2,1,- pt$num(%track%,2),)
which is always true everything works fine
First, thank you for pulling this guide together. I have been using it for years. Lately, something seems to have broken the MP3Tag link to Audible for metadata. No books are being found when I have it search. I am US based and using US Audible link. Any help is appreciated.
Hi @seanap - thank you for this app! I have a suggestion for your documentation at this step:
Test it by Copying an audiofile to /Original. Make sure it's working before moving on
What I found was that although I was dropping several different files here, nothing would actually copy and the logs for DropIt inexplicably told me they were skipping every file. I eventually discovered that the reason for this was because of the advanced filter in the BookCopy profile that only copies files if they're updated or created in the last 5 minutes.
I completely see why this makes sense once you're up and running, but at the testing stage here, it'd be quite helpful if you add a note to users to untick these values in the filter while testing to make sure the script works.
Hopefully this tip helps a future user! Thank you again for the software!
I copied the SRC file into the data directory (C:\Users\user\AppData\Roaming\Mp3tag\data) and restarted Mp3tag, but it's not showing up in sources (all I see are freedb and freedb local). Is there some other step to import the SRC file?
Instead of parsing out the author and narrator etc its putting all the information on the author line like this...
Author: By: John Doe Narrated by: John Doe Series: Example Book, Book 3, Example Book, Book 3 Length: 7 hrs and 53 mins Categories: Teen & Young Adult, Science Fiction & Fantasy 4.9 out of 5 stars
instead of
Author: John Doe
It's adding the information into the other fields except for Genre and Book Series/Number, that's being kept blank. I've updated it to the most current 11/8.
I set it up a few months ago and all has been working great until I tried today. Wonder if Audible changed the site configuration and its scraping incorrectly now?
I would like to see is a book belongs to multiple series on Audible, the ability to select the series to populate into the tags.
Running into this retagging all my Tom Clancy series books. Audibles data is a hot mess. Most of the books belong to two series (one for chronological order, one for publication order) and the books are inconsistent about which series is first. This throws off all the album sort tags.
For now I am going through everything manually
Hi,
I'm wondering if there's any other way of achieving the automatic tagging functionality besides using mp3tag?
For example, I'm wondering if a custom Beets plugin would be able to do this.
A recent install of plex docker on unraid and audiobook agent. Shortly after scanning a bunch of my books album titles started getting changed to - "No-No Boy" by John Okada [2018]. Half of my audiobook library has had its name changed. When I look at the log I see:
Sep 20, 2021 19:21:11.021 [0x14b131ef8b38] Error — Exception loading item '(BOOK NAME)' from bundle: invalid type specifier
Picture attached is a book with the issue
Hi
Thanks again for an awesome job! I've been using it regularly over the last couple of days with no problems.
One preference I have for my library is that after the meta data loads using the import from MP3TAG, im not bothered to have it import anymore with the metadata agent. I will handle it manually from that point forward.
That being said, I have configured plex as such. - no issues.
What I would like to do is have the 'Album' and 'Album Sort' fields named slightly differently so they list in plex with all books together and in order:
"SeriesName SeriesBook# - Book Title"
For example:
I have been doing it manually for each book up to this point before I click the action button. Everything works great except I had to edit the folder and file naming to eliminate this same info at the end of the title.
I'm not a programmer so a little detail is required if you're willing to point me in the right direction!
Thanks in advance!
So I prepped most of my AudioBooks using Mp3Tag and the guide.
Downloaded the new Audiobook plug-in
I setup Local Assets above Audiobook
Added a Library and did the unchecking and checking.
All books that have been touched by Mp3Tag and the renaming scheme are added to Plex with no cover.
If I go into Edit mode there are loads of posters
But none of them gets selected.
Also the description of what the books are about is non existant.
The logs show ALOT of "No matches for Search"
While searching for this error I found another error and it seems as if Plex has a bug
https://forums.plex.tv/t/plex-just-said-f-k-all-my-local-music-metadata-help/746071/13
Hi,
Can you add an audible version for the French audible?
In general the audible.com works, but for some audiobook i cannot find them on all the other audible files
For ex, Frankenstein is available in french
https://www.audible.fr/pd/Frankenstein-Livre-Audio/B00NNZV1V6?qid=1659427779&sr=1-1&ref=a_search_c3_lProduct_1_1&pf_rd_p=f20cf038-cbbb-4fa0-adfe-62ed184d8867&pf_rd_r=3XX3TEG3CF779R7KNDHB
But when i search on the mp3tag audible, i cannot find it.
Don't hesite if you need more information.
Thanks!
Little offtopic:
Is there a reason the audible-sources are split into two different directories?
When downloading the zip on windows all files end up in the same spot, as intended I guess (although there are case differencies)
Is this some submodule/subtree stuff?
Thank you for your guide btw, I'm currently in the process of setting everything up.
This is a phenomenal guide you have here. Thank you so much for putting this all together and sharing it out. So as an Ubuntu user, this took me a moment to fully realize that mp3tag is only a Windows/Mac based app. So I had gone through reading in detail everything, formulated a plan of attack only to realize it wouldn't work for me as written.
I'm trying to see how far I can get using puddletag to do the same thing as mp3tag, but puddletag is new to me.
If anyone has any recommendations though, feel free to share them!
Thanks
Originally posted by zwavoo October 2, 2023
I have added a number of audiobooks in the format audiobooks/author/book/*.mp3 and find that regardless of how I set the id3 tags, some books show up with one icon in plex and then tracks or chapters within, or I get each chapter / track as a separate icon on the plex menu. If you can picture that, all it takes is one large multi chapter book, and my screen is full. I would love to know how to group all the files together consistently. Any ideas?
About 25% of the time I use the 1mp3tag to write tags and move to a new folder I receive an error. Its always on the second file of the folder and says that it can not move the file to the destination as the file already exists. Its kind of a pain because now my books are split between two destinations and i have to manually add the first file back. Any suggestions on what is causing this error? Thank you
Recently when I try the match with audible the results do not show any tags or cover art. The first result, which I assume is the closest match, is always the genre. The author, length or the book are all shown correctly, but when I move to the ‘Adjust tag information’ window, no tags or cover art is shown.
I have an issue with some audiobooks becoming corrupted after pulling tag information from Audible.com. The MP3 plays prior to tagging, and will not play afterward. I can't seem to find a theme between the files that get corrupted and the others which don't.
Hi, thanks for this guide, this is really useful.
I bought a multi-discs audiobook and I couldn't run your move/rename script successfully as obviously some tracks had the same number but from different discs.
I had to update your script to add the disc number if there are multiple discs, eg line 3 of my Mp3tag\data\actions\&1 Rename Relocate Extras Title.mta
now is:
1=D:\\AudioBooksTarget\\%albumartist%\\%series%\\%year% - %album% [ '['%series% %series-part%']']\\%album% (%year%)[ '['%series% %series-part%']']$ifgreater(%_total_files%,1,[- disc$num(%discnumber%,2)] - pt$num(%track%,2),)
I edited your action scripts to unify the "single file" and "multiple file" cases using the script logic. This works well for me, and I think I covered most of the edge cases. You might want to incorporate this, or something similar, into your setup.
Inline, not attached, because of github attachment file type issues.
[#0]
T=5
1=X:\\audiobooks\\%albumartist%\\%series%\\%album% (%year%)[ '['%series% %series-part%']']\\%album% (%year%)[ '['%series% %series-part%']']$ifgreater(%_total%,1,- Part $num(%track%,2),)
F=_FILENAME
[#1]
T=13
1=%album% (%year%) ['['%series% %series-part%']' ]- cover
3=0|3
2=0
[#2]
T=15
F=desc
1=X:\\audiobooks\\%albumartist%\\%series%\\%album% (%year%)[ '['%series% %series-part%']']\\desc.txt
2=0
3=0
[#3]
T=15
F=reader
1=X:\\audiobooks\\%albumartist%\\%series%\\%album% (%year%)[ '['%series% %series-part%']']\\reader.txt
2=0
3=0
I'm not sure if I've done something wrong but the audio books them selves populate perfectly for me. However, I don't get any information on the author (artist) in Plex. Do I need to add this manually or should it populate as well?
Is there a way for this to work on Podcasts by chance?
in mp3tag, I am able to find the podcast itself on audible but it doesn't seem to gather any of the tag information.
I plan on having a seprate walkthrough that will take you through backing up your Audible .aax files, and converting them to chapterized .M4B files. This giude will work for both mp3 and m4b files, but I prefer chapterized m4b's. Plex handles M4B metadata better than mp3's, some third party players like Prologue and BookCamp can handle the M4B chapter splits and names, and generally having less files helps plex run smoother.
I have gone through the process of tagging and importing a rather large book (436 tracks). But when I ask Plex to scan it, it gives me a lot of albums, all appear to have a similar issue of: [Unknown Artist] and [Unknown Album]
All other albums I have imported appear fine though. Is there a known issue with audiobooks with this many tracks? Also, are there possible solutions too?
Thanks for your help,
Dan
Hey,
I love this setup and has been great with minor flaws (not with your guide but an issue with plex and outside network).
I however was stumped on how to get the purpose of the .sh script to work on my windows setup, as I dont have audiobooks on my linux comp. There may have been a better and faster way to make this all work but here is my solution on a 100% windows setup.
Step 1. Get a program called Autohotkey and install. (very small program I have been using for years)
Step 2. Find a location you want to have this alternate script saved at, right click at the location, go to "New" in the context menu, and select "Autohotkey Script" and name it whatever you like. (leave the .ahk extention)
Step 3. Right click the newly created script, click "Edit"
Step 4. Copy and paste the code from below and change the directories to match yours, then File/Save
Step 5. Open windows task scheduler, click "Create Task", name it BookCopy or w/e, click Triggers tab, then click "New", set Begin task: to "At Logon", under advanced while in Triggers tab still, check the Repeat task every: and choose 5 minutes, set for a duration of: to Indefinitely, then click "OK. Next click the Actions Tab, then click "New", Set Action to "Start a program", then in Settings Program/script section, just point it to where ever you created this script, and then click "OK" and "OK" again.
Step 6. Log out then back in.
Step 7. Done, Enjoy!
I hope this helps, and please share an easier way if you know of one.
Code:
Copy below this line vvvvvvvvvvv
;-------------------------------------------------------------------------------------------------------
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
CopySourcePattern := "C:\path\to\audiobook\original" ;<----your Original folder
CopyDest := "C:\path\to\audiobook\temp" ;<----your Temp folder
Loop, Files, %CopySourcePattern%*, DR
{
{
copy_it := false
if not FileExist(CopyDest "" A_LoopFileName) ; Always copy if target file doesn't yet exist.
copy_it := true
}
if copy_it
{
FileCopyDir, %A_LoopFileFullPath%, %CopyDest%%A_LoopFileName%, 1
if ErrorLevel
MsgBox, Could not copy "%A_LoopFileFullPath%" to "%CopyDest%%A_LoopFileName%".
}
}
exitapp
Recently started noticing Audiobook media not being populated by the agent, logs full of
Exception loading item 'BOOKNAME' from bundle: invalid type specifier
It seems some other users on Reddit are seeing the same behavior
Please let me know if I can provide more info
Thanks for the amazing guide!
Unfortunately I encountered an issue with the following audiobook when trying to fetch tags from Audible: https://www.audible.de/pd/B0B1QKF5QZ
I guess the reason for this is that the audiobook doesnt mention any narrator, which stops mp3tag from processing further fields
Just wondered if you use LazyLibrarian. If so, how does it fit into the workflow so that LazyLibrarian can still find the downloaded audiobook once the folder has been renamed/moved by this script.
Thanks for the great workflow!
First off, thanks for this guide, it's great.
I've got a library of about 1,000 audiobooks, all in single m4b files (with the exception of a few that are broken up). They all reside in an 'audiobooks' folder. When I create the library, Plex lumps them under "Various Artists" in a single album with each book as a track. Have you run in to this? Thanks.
I have everything working properly, but no matter what I do I cannot get Plex to use the local artwork instead of the Audible artwork. When using MP3Tag to import, I made sure that the artwork I wanted was the ONLY cover image listed. Plex properly sees this artwork when I change the agent to Plex Music. Am I doing something wrong? Is this working as intended?
Any help is much appreciated.
Originally posted by Nuuki9 January 14, 2022
Hi,
I've been using this workflow for a while and overall its been working great - amazing work. One minor niggle I'm trying to close out is that its not pulling in the Narrator for me.
I'm using the amazon.co.uk script - I've enabled debug and when I check the output file the last script line its showing as running is 101, which is while "bc-color-link" 99
. The next entries in the debug are a section covering "Total output".
Interestingly there are tags set after 101 which are being processed such as Description (line 276). As such it doesn't seem to be the case that its actually stopping at line 101, but as the moment I'm a bit stuck.
Any ideas?
Do you know how to get a visual of the ASIN in mp3tag? I want to be able to quickly rename my files with the ASIN included so that Plex w/ Audnexus automatically checks for matches but I'm having trouble figuring out how to locate the tag itself within mp3tag.
I've used m4b-tool to convert mp3s to m4b+chapter file, so in the audiobooks folder, I've got a book folder with book name and chapter file, but in Plex Library I can see only 1 big file with book name? Is this ok or has something gone wrong and I should be able see audio book with chapters in Plex Library?
I am following the guide to manually create and configure mp3tag but the options available don't match 1:1 with the Windows version.
Custom sources was mentioned in a previous issue (#2 (comment)) but it appears this has since been added.
However when I click Next
I'm met with this error
In the .src
file, It appears that this line is looking for the ASIN value but can't find it, or perhaps I've not properly set up my tags? The interface has slight changes that make it difficult to follow the Windows instructions.
It would be nice to have alternative documentation for the macOS version, and potentially different config/src files if possible. I'm willing to contribute but this is my first run through the guide.
I am following your wonderful guide, but sometime plex didn't get the summary of some audiobooks, even if it are in the comments and descriptions tags.
The instructions have the following:
%APPDATA%\Mp3tag\data\action\1 m4b.mta Update lines 3, 15, 22 with the path to your Plex \Audiobook folder
I have tried several variations and cannot seem to get the correct syntax.
My folders are on my Synology drive. Could you please show me the correct way to put this folder into the notepad++ instructions?
What part of this line do I change:
1=X:\\Audiobooks\\%albumartist%\\%series%\\%year% - %album%[ '['%series% %series-part%']']\\%album% (%year%)[ '['%series% %series-part%']']
To point to this folder?
S:\tempab
another way file explorer shows this folder is like this:
Thanks in Advance
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.