wxllow / applemusicrp Goto Github PK
View Code? Open in Web Editor NEWDiscord Rich Presence for Apple Music w/ Album Artwork!
License: MIT License
Discord Rich Presence for Apple Music w/ Album Artwork!
License: MIT License
With some songs/album or artist there is an issue. It shows the Apple Music Icon instead of the album artwork whereas this album actually exists on Apple Music and iTunes.
It happens with The Kid LAROI (artist) on every songs of "F CK LOVE 3+: OVER YOU" as well as on the "F ck Love (Savage)" edition.
You can check by playing a song of one of these albums.
I did a screenshot of the issue and one of the actual album on iTunes
Hello, I've noticed the app sometimes crashing on certain musics. It has happened on some of the Apple Music Music Mix lists so I don't know if it's related to the musics not being in my library (but it doesn't seem to be the case as I'm listening to non library music without the app crashing) but that brings me to the second type of crash: titles. I don't know if it's the special character of the title ( called "ยฟ") or the length of the album title Music to listen todance toblaze topray tofeed tosleep totalk togrind totrip tobreathe tohelp tohurt toscroll toroll tolove tohate tolearn Tooplot toplay tobe tofeel tobreed tosweat todream tohide tolive todie to~GO TO but something in this music is definitely breaking the app (or Discord limitations maybe). I don't think it's the author as all the other Bring Me The Horizon songs seem to work fine
Status is not being hidden after being paused for 10 mins.
Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when you blocked my account.
Describe the solution you'd like
you unblock me
Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.
none
Additional context
Add any other context or screenshots about the feature request here.
gravel is done
Not entirely sure what causes this or if its even fixable, but it seems to fail getting certain album covers. I have noticed this multiple times in many different songs, one example being "The One by Chris Rain". It seems to pull something completely unrelated to the cover on discord, doesn't seem to happen with any of his other songs.
Describe the bug
While changing songs, an error would pop up saying "An unexpected error has occurred while trying to update your Discord status!".
To Reproduce
Happened just changing songs rapidly (one change every second) error triggers around the 6th change and only errors 2 times, then on the third time just stops working.
OS
Additional context
--- Logging error ---
Traceback (most recent call last):
File "src\applemusicrp\applemusicrp.pyc", line 185, in rp_updater
File "pypresence\presence.pyc", line 36, in update
File "asyncio\base_events.pyc", line 646, in run_until_complete
File "pypresence\baseclient.pyc", line 88, in read_output
pypresence.exceptions.ServerError: Unknown error
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "rich\logging.pyc", line 162, in emit
File "rich\console.pyc", line 1646, in print
File "rich\console.pyc", line 848, in exit
File "rich\console.pyc", line 806, in exit_buffer
File "rich\console.pyc", line 1990, in check_buffer
AttributeError: 'Blackhole' object has no attribute 'fileno'
Call stack:
File "threading.pyc", line 973, in bootstrap
File "threading.pyc", line 1016, in bootstrap_inner
File "threading.pyc", line 953, in run
File "src\applemusicrp\applemusicrp.pyc", line 189, in rp_updater
File "logging_init.pyc", line 1512, in exception
File "logging_init.pyc", line 1506, in error
File "logging_init.pyc", line 1624, in log
File "logging_init.pyc", line 1634, in handle
File "logging_init.pyc", line 1696, in callHandlers
File "logging_init_.pyc", line 968, in handle
File "rich\logging.pyc", line 164, in emit
Message: ServerError('Unknown error')
Arguments: ()
--- Logging error ---
Traceback (most recent call last):
File "src\applemusicrp\applemusicrp.pyc", line 185, in rp_updater
File "pypresence\presence.pyc", line 36, in update
File "asyncio\base_events.pyc", line 646, in run_until_complete
File "pypresence\baseclient.pyc", line 88, in read_output
pypresence.exceptions.ServerError: Unknown error
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "rich\logging.pyc", line 162, in emit
File "rich\console.pyc", line 1646, in print
File "rich\console.pyc", line 848, in exit
File "rich\console.pyc", line 806, in exit_buffer
File "rich\console.pyc", line 1990, in check_buffer
AttributeError: 'Blackhole' object has no attribute 'fileno'
Call stack:
File "threading.pyc", line 973, in bootstrap
File "threading.pyc", line 1016, in bootstrap_inner
File "threading.pyc", line 953, in run
File "src\applemusicrp\applemusicrp.pyc", line 189, in rp_updater
File "logging_init.pyc", line 1512, in exception
File "logging_init.pyc", line 1506, in error
File "logging_init.pyc", line 1624, in log
File "logging_init.pyc", line 1634, in handle
File "logging_init.pyc", line 1696, in callHandlers
File "logging_init_.pyc", line 968, in handle
File "rich\logging.pyc", line 164, in emit
Message: ServerError('Unknown error')
Arguments: ()
--- Logging error ---
Traceback (most recent call last):
File "src\applemusicrp\applemusicrp.pyc", line 185, in rp_updater
File "pypresence\presence.pyc", line 36, in update
File "asyncio\base_events.pyc", line 646, in run_until_complete
File "pypresence\baseclient.pyc", line 88, in read_output
pypresence.exceptions.ServerError: Unknown error
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "rich\logging.pyc", line 162, in emit
File "rich\console.pyc", line 1646, in print
File "rich\console.pyc", line 848, in exit
File "rich\console.pyc", line 806, in exit_buffer
File "rich\console.pyc", line 1990, in check_buffer
AttributeError: 'Blackhole' object has no attribute 'fileno'
Call stack:
File "threading.pyc", line 973, in bootstrap
File "threading.pyc", line 1016, in bootstrap_inner
File "threading.pyc", line 953, in run
File "src\applemusicrp\applemusicrp.pyc", line 189, in rp_updater
File "logging_init.pyc", line 1512, in exception
File "logging_init.pyc", line 1506, in error
File "logging_init.pyc", line 1624, in log
File "logging_init.pyc", line 1634, in handle
File "logging_init.pyc", line 1696, in callHandlers
File "logging_init_.pyc", line 968, in handle
File "rich\logging.pyc", line 164, in emit
Message: ServerError('Unknown error')
Arguments: ()
--- Logging error ---
Traceback (most recent call last):
File "src\applemusicrp\applemusicrp.pyc", line 185, in rp_updater
File "pypresence\presence.pyc", line 36, in update
File "asyncio\base_events.pyc", line 646, in run_until_complete
File "pypresence\baseclient.pyc", line 88, in read_output
pypresence.exceptions.ServerError: Unknown error
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "rich\logging.pyc", line 162, in emit
File "rich\console.pyc", line 1646, in print
File "rich\console.pyc", line 848, in exit
File "rich\console.pyc", line 806, in exit_buffer
File "rich\console.pyc", line 1990, in check_buffer
AttributeError: 'Blackhole' object has no attribute 'fileno'
Call stack:
File "threading.pyc", line 973, in bootstrap
File "threading.pyc", line 1016, in bootstrap_inner
File "threading.pyc", line 953, in run
File "src\applemusicrp\applemusicrp.pyc", line 189, in rp_updater
File "logging_init.pyc", line 1512, in exception
File "logging_init.pyc", line 1506, in error
File "logging_init.pyc", line 1624, in log
File "logging_init.pyc", line 1634, in handle
File "logging_init.pyc", line 1696, in callHandlers
File "logging_init_.pyc", line 968, in handle
File "rich\logging.pyc", line 164, in emit
Message: ServerError('Unknown error')
Arguments: ()
--- Logging error ---
Traceback (most recent call last):
File "src\applemusicrp\applemusicrp.pyc", line 185, in rp_updater
File "pypresence\presence.pyc", line 36, in update
File "asyncio\base_events.pyc", line 646, in run_until_complete
File "pypresence\baseclient.pyc", line 88, in read_output
pypresence.exceptions.ServerError: Unknown error
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "rich\logging.pyc", line 162, in emit
File "rich\console.pyc", line 1646, in print
File "rich\console.pyc", line 848, in exit
File "rich\console.pyc", line 806, in exit_buffer
File "rich\console.pyc", line 1990, in check_buffer
AttributeError: 'Blackhole' object has no attribute 'fileno'
Call stack:
File "threading.pyc", line 973, in bootstrap
File "threading.pyc", line 1016, in bootstrap_inner
File "threading.pyc", line 953, in run
File "src\applemusicrp\applemusicrp.pyc", line 189, in rp_updater
File "logging_init.pyc", line 1512, in exception
File "logging_init.pyc", line 1506, in error
File "logging_init.pyc", line 1624, in log
File "logging_init.pyc", line 1634, in handle
File "logging_init.pyc", line 1696, in callHandlers
File "logging_init_.pyc", line 968, in handle
File "rich\logging.pyc", line 164, in emit
Message: ServerError('Unknown error')
Arguments: ()
--- Logging error ---
Traceback (most recent call last):
File "src\applemusicrp\applemusicrp.pyc", line 185, in rp_updater
File "pypresence\presence.pyc", line 36, in update
File "asyncio\base_events.pyc", line 646, in run_until_complete
File "pypresence\baseclient.pyc", line 88, in read_output
pypresence.exceptions.ServerError: Unknown error
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "rich\logging.pyc", line 162, in emit
File "rich\console.pyc", line 1646, in print
File "rich\console.pyc", line 848, in exit
File "rich\console.pyc", line 806, in exit_buffer
File "rich\console.pyc", line 1990, in check_buffer
AttributeError: 'Blackhole' object has no attribute 'fileno'
Call stack:
File "threading.pyc", line 973, in bootstrap
File "threading.pyc", line 1016, in bootstrap_inner
File "threading.pyc", line 953, in run
File "src\applemusicrp\applemusicrp.pyc", line 189, in rp_updater
File "logging_init.pyc", line 1512, in exception
File "logging_init.pyc", line 1506, in error
File "logging_init.pyc", line 1624, in log
File "logging_init.pyc", line 1634, in handle
File "logging_init.pyc", line 1696, in callHandlers
File "logging_init_.pyc", line 968, in handle
File "rich\logging.pyc", line 164, in emit
Message: ServerError('Unknown error')
Arguments: ()
--- Logging error ---
Traceback (most recent call last):
File "pystray_win32.pyc", line 401, in _dispatcher
File "pystray_win32.pyc", line 213, in _on_notify
File "pystray_base.pyc", line 324, in inner
File "pystray_base.pyc", line 449, in call
File "pystray_base.pyc", line 544, in wrapper0
File "src\applemusicrp\applemusicrp.pyc", line 224, in quit
SystemExit: 0
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "rich\logging.pyc", line 162, in emit
File "rich\console.pyc", line 1646, in print
File "rich\console.pyc", line 848, in exit
File "rich\console.pyc", line 806, in _exit_buffer
File "rich\console.pyc", line 1990, in check_buffer
AttributeError: 'Blackhole' object has no attribute 'fileno'
Call stack:
File "AppleMusicRP.py", line 3, in
File "src\applemusicrp\applemusicrp.pyc", line 239, in main
File "pystray_base.pyc", line 212, in run
File "pystray_win32.pyc", line 127, in run
File "pystray_win32.pyc", line 146, in mainloop
File "pystray_win32.pyc", line 405, in dispatcher
File "logging_init.pyc", line 1506, in error
File "logging_init.pyc", line 1624, in log
File "logging_init.pyc", line 1634, in handle
File "logging_init.pyc", line 1696, in callHandlers
File "logging_init.pyc", line 968, in handle
File "rich\logging.pyc", line 164, in emit
Message: 'An error occurred when calling message handler'
Arguments: ()
Since i know local files you cant really find the cover can we just have it not show any cover like spotify does? instead of the apple music symbol
Get data from iTunes Windows
Hi There!
Love your project! I was trying to see if I could add some features as well, so I downloaded the source code to alter it in Visual Studio. However, everytime I run the command you provided for Windows, I run into the same issue over and over:
PS C:\Users\ammar\Downloads\AMRPD_1.01\applemusicrichpresencefordiscord-master> poetry run python setup_win.py py2exe
running py2exe
running build_py
package init file 'src\applemusicrp\assets_init_.py' not found (or not a regular file)
package init file 'src\applemusicrp\scripts_init_.py' not found (or not a regular file)
Analyzing the code
Found 624 modules, 46 are missing, 0 may be missing
? OpenSSL.SSL imported from urllib3.contrib.pyopenssl
? OpenSSL.crypto imported from urllib3.contrib.pyopenssl
? PIL imported from src.applemusicrp.applemusicrp
? Queue imported from urllib3.util.queue
? StringIO imported from urllib3.packages.six
? main imported from bdb, pdb
? _frozen_importlib imported from importlib, importlib.abc, zipimport
? _frozen_importlib_external imported from importlib, importlib._bootstrap, importlib.abc, zipimport
? _posixshmem imported from multiprocessing.resource_tracker, multiprocessing.shared_memory
? _winreg imported from appdirs, platform
? assets.FREQUENCIES imported from charset_normalizer.cd, charset_normalizer.constant
? asyncio.DefaultEventLoopPolicy imported from -
? brotli imported from urllib3.response, urllib3.util.request
? brotlicffi imported from urllib3.response, urllib3.util.request
? collections.Mapping imported from urllib3._collections
? collections.MutableMapping imported from urllib3._collections
? com.sun imported from appdirs
? com.sun.jna imported from appdirs
? com.sun.jna.platform imported from appdirs
? cryptography imported from requests, urllib3.contrib.pyopenssl
? cryptography.hazmat.backends.openssl imported from urllib3.contrib.pyopenssl
? cryptography.x509 imported from urllib3.contrib.pyopenssl
? cryptography.x509.extensions imported from urllib3.contrib.pyopenssl
? dummy.Process imported from multiprocessing.pool
? dummy_threading imported from requests.cookies
? java.lang imported from platform
? numpy imported from toml.encoder
? org.python.core imported from copy, pickle
? os.path imported from ctypes.aix, distutils.file_util, os, pkgutil, py_compile, requests.adapters, src.applemusicrp.utils, sysconfig, toml.decoder, tracemalloc, unittest, unittest.util
? packages.six.moves imported from urllib3.connectionpool, urllib3.util.queue, urllib3.util.response
? packages.six.moves.http_client imported from urllib3.connection, urllib3.exceptions
? packages.six.moves.urllib.parse imported from urllib3.poolmanager, urllib3.request
? pep517 imported from importlib.metadata
? pystray imported from src.applemusicrp.applemusicrp
? pythoncom imported from src.applemusicrp.rpc
? readline imported from cmd, code, pdb
? resource imported from test.support
? rumps imported from src.applemusicrp.applemusicrp
? simplejson imported from requests.compat
? socks imported from urllib3.contrib.socks
? urllib3_secure_extra imported from urllib3
? util.SKIPPABLE_HEADERS imported from urllib3.connection
? util.SKIP_HEADER imported from urllib3.connection
? win32api imported from appdirs
? win32com.client imported from src.applemusicrp.rpc
? win32com.shell imported from appdirs
Building 'dist/windows/AppleMusicRP.exe'.
Traceback (most recent call last):
File "C:\Users\ammar\Downloads\AMRPD_1.01\applemusicrichpresencefordiscord-master\setup_win.py", line 53, in
setup(
File "C:\Users\ammar\AppData\Local\pypoetry\Cache\virtualenvs\applemusicrp-9nq2FRJt-py3.9\lib\site-packages\setuptools_init.py", line 87, in setup
return distutils.core.setup(**attrs)
File "C:\Users\ammar\AppData\Local\pypoetry\Cache\virtualenvs\applemusicrp-9nq2FRJt-py3.9\lib\site-packages\setuptools_distutils\core.py", line 177, in setup
return run_commands(dist)
File "C:\Users\ammar\AppData\Local\pypoetry\Cache\virtualenvs\applemusicrp-9nq2FRJt-py3.9\lib\site-packages\setuptools_distutils\core.py", line 193, in run_commands
dist.run_commands()
File "C:\Users\ammar\AppData\Local\pypoetry\Cache\virtualenvs\applemusicrp-9nq2FRJt-py3.9\lib\site-packages\setuptools_distutils\dist.py", line 968, in run_commands
self.run_command(cmd)
File "C:\Users\ammar\AppData\Local\pypoetry\Cache\virtualenvs\applemusicrp-9nq2FRJt-py3.9\lib\site-packages\setuptools\dist.py", line 1229, in run_command
super().run_command(command)
File "C:\Users\ammar\AppData\Local\pypoetry\Cache\virtualenvs\applemusicrp-9nq2FRJt-py3.9\lib\site-packages\setuptools_distutils\dist.py", line 987, in run_command
cmd_obj.run()
File "C:\Users\ammar\AppData\Local\pypoetry\Cache\virtualenvs\applemusicrp-9nq2FRJt-py3.9\lib\site-packages\py2exe\distutils_buildexe.py", line 204, in run
self._run()
File "C:\Users\ammar\AppData\Local\pypoetry\Cache\virtualenvs\applemusicrp-9nq2FRJt-py3.9\lib\site-packages\py2exe\distutils_buildexe.py", line 285, in _run
builder.build()
File "C:\Users\ammar\AppData\Local\pypoetry\Cache\virtualenvs\applemusicrp-9nq2FRJt-py3.9\lib\site-packages\py2exe\runtime.py", line 245, in build
self.build_exe(target, exe_path, options.libname)
File "C:\Users\ammar\AppData\Local\pypoetry\Cache\virtualenvs\applemusicrp-9nq2FRJt-py3.9\lib\site-packages\py2exe\runtime.py", line 364, in build_exe
if self.options.version_info:
Are there some libraries missing in the pyproject.toml file you provided? I have run the install py2exe command several times, and it states that there is nothing else to add, yet I get this error. I know you're busy, but if you could help me build this I'd love to help you fix some of the bugs/issues and will open up pull requests with some edits soon!
Thanks!
Hello, I'm using your app for 1 month now.
There is a little glitch with the elapsed time counter.
For example, when the song is at 1:20, instead of going to 1:21, it will show 1:19 then 1:20, 1:21, 1:22... (It's going backward for a second)
As far as I know there is no real desync between the time shown by Apple Music and the time of the rich presence because your app updates/recalculates the time constantly.
For a better explanation, I shot a video of the problem.
Also there is another bug that I will describe in another issue section.
However this rich presence app works well!
Here is the video:
https://user-images.githubusercontent.com/67318218/197392548-25e85170-b573-43f1-b53d-26927b34a308.mp4
Optimize code to be a little faster and cleaner, mainly rp_updater
Figure out a way to improve the search query used to fetch cover art from iTunes API (see get_cover_art_url
)
Whether using the Start menu shortcut that got created after installation or the Pythonw.exe to which that shortcut seem to be pointing, I just get a Windows permission request to launch Python Build, which I grant, and then nothing nowhere. Is there anything I did wrong or missed ?
Using Windows 10 and the latest build. The previous version works fine
Fix dependencies (Some dependencies are Windows-only and some macOS-only which makes issues.)
Describe the bug
I downloaded the macOS .dmg for 3.1.0 and newer versions, finding that they would not launch. When I ran it in terminal to debug, I found that imaging.so, provided by Pillow, only contains an arm64 library. This prevents release binaries from running on x86_64 and x86_64h (AVX2 version of x86_64).
To Reproduce
1. Try starting a copy of the .app from the Releases on this GitHub.
- Might be able to reproduce if you use Rosetta.
Expected behavior
It would open.
OS
Additional context
I was able to recompile it locally and it worked.
Problem
You might have heard of the issues where developers built software that once shipped to the customers, could not run the software on their side. And the only excuse from devs is "But it works on my machine", well here maybe we may get the same issue.
I took a look at your setup.py
file where you define the metadata for your Python package and I saw that the dependencies are here but not their versions.
I created this issue because in the future you might get (big or small) changes on those dependencies and it might affect your project.
Solution
Currently you have this :
install_dependencies = ['pypresence', 'pystray', 'dialite', 'coverpy', 'appdirs', 'toml']
You might go for something like this :
install_dependencies = [
'pypresence==x.y.z',
'pystray>=x.y.z',
'dialite==x.y.z',
'coverpy<=x.y.z',
'appdirs==x.y.z',
'toml>=x.y.z'
]
It is up to your needs.
Alternative solution
Download the packages under your project folders, though I do not recommend doing that as it might make your project heavier.
Additional context
python -m pip freeze
, it will display your dependencies and their versions!Hope it is relevant, you can give me feedback on that issue too!
Good luck ๐จ
I used to use another app for rich presence before this one and this allowed you to put in a parameter to display the playlist (e.g. instead of {album} You'd use {playlist} and if u were playing from an album or explorer it would just show: "") Is there a way to have a similar feature in this tool?
I hope this is possible with the way the tool is set up now.
Thanks for all the effort on the tool, hope that you have the time to find a solution for something like this!
Have 2 separate configuration files, config.toml
for advanced user configuration, and preferences.toml
for settings that can be changed directly in the app. In addition to this, add a "Reload Configuration" option
Here is how the reload config may work:
def reload_config():
config = Config()
Allow custom formatting of status
So like, a pop-up menu to customize what stuff is show where, for example:
{state} {title}
By {artist} on {album}
- Show time elapsed
[RESET TO DEFAULT]
Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
no
Describe the solution you'd like
A clear and concise description of what you want to happen.
apple music support for when using airplay from an iPhone/iPad to a mac
Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.
none xd
Additional context
Add any other context or screenshots about the feature request here.
ooga wooga tap tap music play, discord show music smashes rock
Hi! I'm not sure if this is even possible, but would Applemusicrp ever be able to pull from the website on top of the iTunes app? The website is much more refined so I'm just curious.
I thought that maybe it would have to be a chrome extension on top of the app on the desktop.
What are your thoughts on this? :)
The website is: https://music.apple.com/
If you close iTunes while AppleMusicRP is running, it will reopen itself.
The code that handles this and causes this is here
v3.1.0 will not open at all on macOS 10.15. Every time I try I get a launch error and only option is to terminate. v3.0.0 works fine but I'd like to upgrade.
Is your feature request related to a problem? Please describe.
No, my request is just a new feature
Describe the solution you'd like
It would be cool if(like other apple music RPC clients) this program could also have a button that when clicked would take the user to the currently playing song on the apple music website
Describe alternatives you've considered
The alternative programs that have this feature are Mac OS only, so I'm requesting it for this one since I use it on Windows
Had the app crash specifically on the four songs "P", "I", "N" and "K" of Jaden's ERYS album (explicit versions if it matters). All the other 13 songs in the same album worked perfectly
The crash also seem to occur on the songs "B", "L", "U" and "E". I don't have any other single character songs to try it on at the moment in case this would be the issue
Find a way to build/distribute the app for Windows (py2exe probably)
I downloaded the newest version, but when I launched the app, it wouldn't work. I tried running it as administrator, but that also didn't work. So I downloaded an older version, but this time, when I launched it as administrator it said "An unexpected error has occurred while trying to update your Discord status!"
I recently moved to a Windows 11 PC, and when I installed version 3.2.1 from the msi file it just won't run when I click on it. Running as administrator doesn't work either. Haven't tried installing from source because I'm not really techy enough to even attempt that. 3.1.0 works alright but I'd like to use the newest version.
It sadly doesn't work on macOS. Is there any way i can grab logs to help you out?
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.