Giter Club home page Giter Club logo

plugin.video.invidious's Introduction

plugin.video.invidious's People

Contributors

aiosk avatar davidhenrythoreau avatar dreamdance61 avatar lekma avatar sethfalco 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

plugin.video.invidious's Issues

updating translations

@greenfoo, @Dreamdance61: would you guys be so kind as to update your respective translations? I'd love to release a fully translated 0.2.5 and there are 2 or 3 (I think) new strings to deal with.

Also, if you feel they deserve a translation, the description/summary tags in addon.xml could use your help 😃

thanks in advance for your help

updating translations

@DavidHenryThoreau, @greenfoo: I'd like to make a new minor release with a couple of new features (feed/search history). There are a few new/modified strings needing translation. Would you guys be so kind as to update your respective contributions?

thanks in advance for your support

Updating to latest version using your repository

HI there @lekma

Thanks A LOT for this plugin, this is has been really fantastic for me in the last months :)

However, I seem to be stuck on version 0.5.7. Of course I could install current release (v1.0.0) manually, but I would like to report that, even if I have forced an update on the repository (which is now at 3.0.0), the 1.0.0 version of the plugin doesn't yet show on the plugin update menu on Kodi.

Any idea on what could be going on? Maybe v1.0.0 hastn't been pushed to the repository yet?

Thanks!

Seems to not work with other sites than invidio.us

I tried my own instance (0.20.1-97eb01a @ master) and the top 8 instances from the plugin's Readme but only invidio.us plays videos. The other instances just flash and have logs like that:

2020-04-25 13:25:58.721 T:1937215504  NOTICE: VideoPlayer::OpenFile: plugin://plugin.video.invidious/?action=play_video&video_id=dRFbwjwQ4VE
2020-04-25 13:25:58.740 T:1458377600  NOTICE: Creating InputStream
2020-04-25 13:25:58.943 T:1458377600   ERROR: AddOnLog: InputStream Adaptive: Cannot download /api/manifest/dash/id/dRFbwjwQ4VE
2020-04-25 13:25:58.944 T:1458377600   ERROR: AddOnLog: InputStream Adaptive: Could not open / parse mpdURL (/api/manifest/dash/id/dRFbwjwQ4VE)
2020-04-25 13:25:58.944 T:1458377600   ERROR: CVideoPlayer::OpenInputStream - error opening [plugin://plugin.video.invidious/?action=play_video&video_id=dRFbwjwQ4VE]
2020-04-25 13:25:58.944 T:1458377600  NOTICE: CVideoPlayer::OnExit()
2020-04-25 13:25:59.055 T:1937215504  NOTICE: CVideoPlayer::CloseFile()
2020-04-25 13:25:59.056 T:1937215504  NOTICE: VideoPlayer: waiting for threads to exit
2020-04-25 13:25:59.056 T:1937215504  NOTICE: VideoPlayer: finished waiting

commit https://github.com/lekma/plugin.video.invidious
LibreElec/Raspi 9.2.1

Search has stopped working since last week

As mentioned in the title, invidious has stopped returning search results since last week, maybe a bit more. Searching for a video, a channel or a playlist makes kodi's loading circle spin until I stop it with backspace. When it is stopped, these are written in the log

2020-07-15 10:52:27.331 T:139630142580480 WARNING: CWebServer[8080]: invalid response data with range start at 1 and end at 0
2020-07-15 10:52:27.366 T:139630159365888   ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                             - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                            Error Type: <class 'iapc.RequestError'>
                                            Error Contents: remote traceback: unknown error
                                            Traceback (most recent call last):
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 219, in <module>
                                                dispatch(*sys.argv)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 214, in dispatch
                                                Dispatcher(url, int(handle)).dispatch(**parseQuery(query))
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 208, in dispatch
                                                return action(**kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 32, in wrapper
                                                success = func(self, **kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 196, in search
                                                return self._search(q, **kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 162, in _search
                                                client.search(q, **kwargs), kwargs["type"], q=q, **kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/client.py", line 119, in search
                                                self.query_("search", q=q, page=page, **kwargs), limit=limit)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/client.py", line 40, in query_
                                                return self.client.query(key, *args, **kwargs) or self._defaults_.get(key, [])
                                              File "/storage/.kodi/addons/script.module.iapc/lib/iapc.py", line 195, in __call__
                                                return Request(self.sender).execute((self.name, args, kwargs))
                                              File "/storage/.kodi/addons/script.module.iapc/lib/iapc.py", line 174, in execute
                                                raise self.response
                                            RequestError: remote traceback: unknown error
                                            -->End of Python script error report<--
2020-07-15 10:52:27.377 T:139630062446336   ERROR: GetDirectory - Error getting plugin://plugin.video.invidious/?action=search&q=idies%20proseyxes&type=video
2020-07-15 10:52:27.383 T:139631551453312   ERROR: CGUIMediaWindow::GetDirectory(plugin://plugin.video.invidious/?action=search&q=idies%20p

Libreelec 9.2.3 x64, kodi 18.7 and invidious 0.2.5. I have tried deleting ~/.kodi/userdata/addon_data/plugin.video.invidious so as to reset everything to defaults but still no luck.
I found your addon some weeks ago after I dumped the official one for youtube due to api key issues and I ONLY use its search function, so I did not test anything else.

Add a licence

This repository have no LICENCE file
Add a Open Source / Free Software licence.

Video requests add port 3000 incorrectly to url when using a custom instance

When using my own hosted invidious instance for some reason requests made by the Invidious plugin are adding port 3000 to the requested video url even though I am not specifying it in the setup.

You can see in this log that the service url is correct, but when it tries to connect to the video it adds :3000 to the url.
This does not appear to occur if using one of the hosts from the public instance selector, only if I specify my invidious instance manually.

2021-03-07 14:59:56.954 T:1276064640  NOTICE: [plugin.video.invidious] service.timeout: (9.0500000000000007, 10.0)
2021-03-07 15:00:08.087 T:1276064640  NOTICE: [plugin.video.invidious] request.url: https://invidious.example.com/api/v1/search?q=****&region=US&type=video&page=1&sort_by=relevance
2021-03-07 15:00:12.264 T:1276064640  NOTICE: [plugin.video.invidious] request.url: https://invidious.example.com/api/v1/videos/****?region=US
2021-03-07 15:00:13.209 T:1223250816  NOTICE: [plugin.video.invidious] video.url: https://invidious.example.com:3000/api/manifest/dash/id/****
2021-03-07 15:00:14.006 T:1937126448  NOTICE: VideoPlayer::OpenFile: plugin://plugin.video.invidious/?action=video&videoId=****
2021-03-07 15:00:14.007 T:1708807040  NOTICE: Creating InputStream
2021-03-07 15:00:14.031 T:1708807040   ERROR: CCurlFile::FillBuffer - Failed: Couldn't connect to server(7)
2021-03-07 15:00:14.031 T:1708807040   ERROR: CCurlFile::Open failed with code 0 for https://invidious.example.com:3000/api/manifest/dash/id/****:
2021-03-07 15:00:14.031 T:1708807040   ERROR: AddOnLog: InputStream Adaptive: Cannot download https://invidious.example.com:3000/api/manifest/dash/id/****
2021-03-07 15:00:14.031 T:1708807040   ERROR: AddOnLog: InputStream Adaptive: Could not open / parse mpdURL (https://invidious.example.com:3000/api/manifest/dash/id/****)
2021-03-07 15:00:14.032 T:1708807040   ERROR: CVideoPlayer::OpenInputStream - error opening [plugin://plugin.video.invidious/?action=video&videoId=****]
2021-03-07 15:00:14.032 T:1708807040  NOTICE: CVideoPlayer::OnExit()
2021-03-07 15:00:14.216 T:1937126448  NOTICE: CVideoPlayer::CloseFile()

Got this crash

2021-01-04 00:34:04.699 T:3773907824  NOTICE: [plugin.video.invidious] request.url: https://invidious.snopyta.org/api/v1/playlists/PLoFRvPlmME6H2FWTcK4Aru8gL8XzP9LjC?region=US
2021-01-04 00:34:05.949 T:3425031024   ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                             - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                            Error Type: <class 'iapc.json_service.RequestError'>
                                            Error Contents: remote traceback: unknown error
                                            Traceback (most recent call last):
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 216, in <module>
                                                dispatch(*sys.argv)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 212, in dispatch
                                                InvidiousPlugin(url, int(handle)).dispatch(**parseQuery(query))
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 33, in dispatch
                                                super(InvidiousPlugin, self).dispatch(**kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/tools/plugin.py", line 68, in dispatch
                                                return action(**kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/tools/plugin.py", line 29, in wrapper
                                                success = func(self, **kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 158, in autogenerated
                                                client.autogenerated(**kwargs), "playlist", **kwargs
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/invidious/client.py", line 146, in autogenerated
                                                data = self.__client__.autogenerated(authorId, **kwargs)
                                              File "/storage/.kodi/addons/script.module.iapc/lib/iapc/json_service.py", line 174, in __call__
                                                return Request(self.sender).execute((self.name, args, kwargs))
                                              File "/storage/.kodi/addons/script.module.iapc/lib/iapc/json_service.py", line 153, in execute
                                                raise self.response
                                            RequestError: remote traceback: unknown error
                                            -->End of Python script error report<--

System information:

LibreELEC:~/.kodi/addons # cat /etc/os-release 
NAME="LibreELEC"
VERSION="9.0.2"
ID="libreelec"
VERSION_ID="9.0"
PRETTY_NAME="LibreELEC (official): 9.0.2"
HOME_URL="https://libreelec.tv"
BUG_REPORT_URL="https://github.com/LibreELEC/LibreELEC.tv"
BUILD_ID="301789032e264eac90589cdf0c094c557cec43fb"
OPENELEC_ARCH="LePotato.arm"
LIBREELEC_ARCH="LePotato.arm"
LIBREELEC_BUILD="official"
LIBREELEC_PROJECT="Amlogic"
LIBREELEC_DEVICE="LePotato"

Search error

Hi all,
after a few days of working fine, yesterday the addon stopped working. Anyone knows how to fix it?

Thanks in advance!

2020-10-05 12:54:52.471 T:1690223488   ERROR: [plugin.video.invidious] service: error processing request: [JSONDecodeError: Expecting value: line 1 column 1 >
2020-10-05 12:54:52.478 T:1261474688   ERROR: GetDirectory - Error getting plugin://plugin.video.invidious/?action=search&q=dota%20rennrad&type=video
2020-10-05 12:54:52.483 T:1799328640   ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                             - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                            Error Type: <class 'iapc.RequestError'>
                                            Error Contents: remote traceback: Traceback (most recent call last):
                                              File "/storage/.kodi/addons/script.module.iapc/lib/iapc.py", line 123, in execute
                                                response = {"result": method(*args, **kwargs)}
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/service.py", line 129, in query
                                                return self.get(self._urls_.get(key, key).format(*args), **kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/service.py", line 123, in get
                                                return self._session_.get(urljoin(self._url, url), params=kwargs)
                                              File "/storage/.kodi/addons/script.module.requests/lib/requests/sessions.py", line 546, in get
                                                return self.request('GET', url, **kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/service.py", line 43, in request
                                                return response.json()
                                              File "/storage/.kodi/addons/script.module.requests/lib/requests/models.py", line 897, in json
                                                return complexjson.loads(self.text, **kwargs)
                                              File "/usr/lib/python2.7/site-packages/simplejson/__init__.py", line 518, in loads
                                              File "/usr/lib/python2.7/site-packages/simplejson/decoder.py", line 370, in decode
                                              File "/usr/lib/python2.7/site-packages/simplejson/decoder.py", line 400, in raw_decode
                                              File "/usr/lib/python2.7/site-packages/simplejson/scanner.py", line 79, in scan_once
                                              File "/usr/lib/python2.7/site-packages/simplejson/scanner.py", line 70, in _scan_once
                                            JSONDecodeError: Expecting value: line 1 column 1 (char 0)

                                            Traceback (most recent call last):
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 219, in <module>
                                                dispatch(*sys.argv)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 214, in dispatch
                                                Dispatcher(url, int(handle)).dispatch(**parseQuery(query))
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 208, in dispatch
                                               return action(**kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 32, in wrapper
                                                success = func(self, **kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 196, in search
                                                return self._search(q, **kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 162, in _search
                                                client.search(q, **kwargs), kwargs["type"], q=q, **kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/client.py", line 125, in search
                                                self.query_("search", q=q, page=page, **kwargs), limit=limit)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/client.py", line 41, in query_
                                                return self.client.query(key, *args, **kwargs) or self._defaults_.get(key, [])
                                              File "/storage/.kodi/addons/script.module.iapc/lib/iapc.py", line 195, in __call__
                                                return Request(self.sender).execute((self.name, args, kwargs))
                                              File "/storage/.kodi/addons/script.module.iapc/lib/iapc.py", line 174, in execute
                                                raise self.response
                                            RequestError: remote traceback: Traceback (most recent call last):
                                              File "/storage/.kodi/addons/script.module.iapc/lib/iapc.py", line 123, in execute
                                                response = {"result": method(*args, **kwargs)}
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/service.py", line 129, in query
                                                return self.get(self._urls_.get(key, key).format(*args), **kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/service.py", line 123, in get
                                                return self._session_.get(urljoin(self._url, url), params=kwargs)
                                              File "/storage/.kodi/addons/script.module.requests/lib/requests/sessions.py", line 546, in get
                                                return self.request('GET', url, **kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/service.py", line 43, in request
                                                return response.json()
                                              File "/storage/.kodi/addons/script.module.requests/lib/requests/models.py", line 897, in json
                                                return complexjson.loads(self.text, **kwargs)
                                              File "/usr/lib/python2.7/site-packages/simplejson/__init__.py", line 518, in loads
                                              File "/usr/lib/python2.7/site-packages/simplejson/decoder.py", line 370, in decode
                                              File "/usr/lib/python2.7/site-packages/simplejson/decoder.py", line 400, in raw_decode
                                              File "/usr/lib/python2.7/site-packages/simplejson/scanner.py", line 79, in scan_once
                                              File "/usr/lib/python2.7/site-packages/simplejson/scanner.py", line 70, in _scan_once
                                            JSONDecodeError: Expecting value: line 1 column 1 (char 0)

                                            -->End of Python script error report<--

Please make it possible to order search by date (newest)

Please make it possible to order search by date (newest) in addition to whatever it is ordered by default (relevance?). This should be a per-search setting, because I would like to have searches saved for some topics by date, and for other topics ordered by something else.

PSA: New Invidious Domain (Old One Is Deprecated)

Invidious official domain has moved. I strongly suggest changing the URL for the official Invidious instance from https://invidio.us to https://invidious.io because https://invidio.us is now deprecated as per the project's recent announcement.

"invidio.us is now deprecated, invidious.io is the new domain.

The invidious-redirect website ( invidio.us ) is now https://redirect.invidious.io/

The instance API ( instances.invidio.us ) is now https://api.invidious.io/

The uptimerobot page ( uptime.invidio.us ) is now https://uptime.invidious.io/

https://git.invidious.io/ redirects to the Github page of the project: https://github.com/iv-org/invidious/

https://docs.invidious.io/ redirects to the documentation website of the project: https://github.com/iv-org/documentation/

https://invidious.io/ will become in the future a "project presentation" page (like https://searx.me/ ), we will use a markdown framework like Hugo."

does/should it work with python <3.8?

beforehand: i wrongly posted this issue already at a different project (TheAssassin/kodi-invidious-plugin#18)... sorry for somehow assuming - just because of the same addon id - that these two projects are closer related.


i'm using the latest OSMC (2022.03-1) which provides Kodi 19.4 and is based on Debian 10 Buster. the addon plugin.video.invidious from the official repo (0.1.0+matrix.1) can be installed, but if i try to send any request to the chosen invidious instance - no mater which one - i get a 403 response.
because it seems a little bit outdated, i activated/installed @lekma's addon repo, installed it's latest version (1.0.10), but then i just get an error notification to look at the logs for further information... the lines invidious related:

2022-09-14 13:54:25.376 T:626      INFO <general>: CAddonMgr::FindAddon: plugin.video.invidious v1.0.10 installed
2022-09-14 13:54:26.178 T:635      INFO <general>: initializing python engine.
2022-09-14 13:54:26.339 T:547   WARNING <general>: CGUIMediaWindow::OnMessage - updating in progress
2022-09-14 13:54:27.424 T:635     ERROR <general>: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                                    - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                                   Error Type: <class 'SyntaxError'>
                                                   Error Contents: invalid syntax (service.py, line 61)
                                                     File "/home/osmc/.kodi/addons/plugin.video.invidious/lib/service.py", line 61
                                                       if (timeout := getSetting("timeout", float)) <= 0.0:
                                                                   ^
                                                   SyntaxError: invalid syntax
                                                   -->End of Python script error report<--
                                                   
2022-09-14 13:54:28.093 T:635      INFO <general>: Python interpreter stopped
2022-09-14 13:54:34.525 T:547     ERROR <general>: AddonVersion: 0.1.0 matrix.1 is not a valid version
2022-09-14 13:54:57.629 T:547      INFO <general>: Stopping player
2022-09-14 13:54:57.725 T:580      INFO <general>: CZeroconfAvahi::clientCallback: client failure. avahi-daemon stopped? Recreating client...
2022-09-14 13:54:58.353 T:547      INFO <general>: Stopping all
2022-09-14 13:54:58.353 T:547      INFO <general>: ES: Stopping event server
2022-09-14 13:54:58.353 T:547      INFO <general>: stopping zeroconf publishing
2022-09-14 13:54:58.365 T:580      INFO <general>: CZeroconfAvahi::clientCallback: avahi server not available. But may become later...
2022-09-14 13:54:58.377 T:547      INFO <CWebserver[80]>: Stopped
2022-09-14 13:54:58.457 T:581      INFO <general>: ES: UDP Event server stopped
2022-09-14 13:54:58.462 T:547      INFO <general>: stop dvd detect media
2022-09-14 13:54:58.464 T:547      INFO <general>: CServiceAddonManager: failed to stop plugin.video.invidious (may have ended)

it seems that this addon - at least all version in @lekma's addon repo - uses/assumes python 3.8 but Debian Buster provides only python 3.7 (3.7.3-1 in my case to be precise).

if i'm correct, is there any chance to get this addon working with python <3.8 (with reasonable effort)? or is there a way to install the needed dependencies resp. check them beforehand and avoid installing/updating if they are not met?

Error Message: "Missing hash key gridChannelRenderer"

For some time now, every time I call the feed, I get the above error message in the right upper corner. It still works, but it takes a long time until something happens.
I am using Kodi 19.3 on a Raspberry Pi with LibreELEC 10.0.1 and addon in version 1.0.8.

Compatibility with python3 and kodi 19

Kodi 19 was released yesterday and it demands all addons to be made with python3 (kodi 18 supported both python3 and python2).
So, I upgraded to 19 a few minutes ago and now I am checking which of my addons are broken because of this. Invidious is one of them, so here is the issue report, plain and simple.
There is no log to show and the addon is not even listed as available from your repo because of the above.

Shortcut for searching on a Kodi skin

Hello,
I would like to have a path that I can use in the search settings of my Kodi skin to directly access the videos.
Thank you for your work !

ERROR Can't return videos

The search can't return videos :

Version :
Kodi 18.9
Invidious 0.5.3

log :

`2021-01-09 17:11:56.785 T:140646035723840 NOTICE: [plugin.video.invidious] request.url: https://invidio.us/api/v1/search?q=ls&region=US&type=video&page=1&sort_by=relevance
2021-01-09 17:11:57.146 T:140646035723840 ERROR: [plugin.video.invidious] service: error processing request: [JSONDecodeError: Expecting value: line 1 column 1 (char 0)]
2021-01-09 17:11:57.714 T:140646395389504 ERROR: GetDirectory - Error getting plugin://plugin.video.invidious/?action=search&new=True&type=video
2021-01-09 17:11:57.715 T:140645750535744 ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
- NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
Error Type: <class 'iapc.json_service.RequestError'>
Error Contents: remote traceback: Traceback (most recent call last):
File "/home/USER/.kodi/addons/script.module.iapc/lib/iapc/json_service.py", line 97, in execute
response = {"result": method(*args, **kwargs)}
File "/home/USER/.kodi/addons/plugin.video.invidious/lib/service.py", line 192, in query
self.paths.get(key, key).format(*args), **kwargs
File "/home/USER/.kodi/addons/plugin.video.invidious/lib/service.py", line 178, in get
urljoin(self.url, path), timeout=self.timeout, params=kwargs
File "/home/USER/.kodi/addons/script.module.requests/lib/requests/sessions.py", line 546, in get
return self.request('GET', url, **kwargs)
File "/home/USER/.kodi/addons/plugin.video.invidious/lib/service.py", line 102, in request
result = response.json()
File "/home/USER/.kodi/addons/script.module.requests/lib/requests/models.py", line 897, in json
return complexjson.loads(self.text, **kwargs)
File "/usr/lib/python2.7/site-packages/simplejson/init.py", line 525, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/site-packages/simplejson/decoder.py", line 370, in decode
obj, end = self.raw_decode(s)
File "/usr/lib/python2.7/site-packages/simplejson/decoder.py", line 400, in raw_decode
return self.scan_once(s, idx=_w(s, idx).end())
JSONDecodeError: Expecting value: line 1 column 1 (char 0)

                                        Traceback (most recent call last):
                                          File "/home/USER/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 223, in <module>
                                            dispatch(*sys.argv)
                                          File "/home/USER/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 219, in dispatch
                                            InvidiousPlugin(url, int(handle)).dispatch(**parseQuery(query))
                                          File "/home/USER/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 33, in dispatch
                                            super(InvidiousPlugin, self).dispatch(**kwargs)
                                          File "/home/USER/.kodi/addons/plugin.video.invidious/lib/tools/plugin.py", line 68, in dispatch
                                            return action(**kwargs)
                                          File "/home/USER/.kodi/addons/plugin.video.invidious/lib/tools/plugin.py", line 29, in wrapper
                                            success = func(self, **kwargs)
                                          File "/home/USER/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 201, in search
                                            return self._new_search(history=history, **kwargs)
                                          File "/home/USER/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 189, in _new_search
                                            return self._search(query, **kwargs)
                                          File "/home/USER/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 172, in _search
                                            client.search(query, **kwargs), kwargs["type"],
                                          File "/home/USER/.kodi/addons/plugin.video.invidious/lib/invidious/client.py", line 156, in search
                                            self._query("search", q=query, page=page, **kwargs),
                                          File "/home/USER/.kodi/addons/plugin.video.invidious/lib/invidious/client.py", line 46, in _query
                                            self.__client__.query(key, *args, **kwargs) or
                                          File "/home/USER/.kodi/addons/script.module.iapc/lib/iapc/json_service.py", line 174, in __call__
                                            return Request(self.sender).execute((self.name, args, kwargs))
                                          File "/home/USER/.kodi/addons/script.module.iapc/lib/iapc/json_service.py", line 153, in execute
                                            raise self.response
                                        RequestError: remote traceback: Traceback (most recent call last):
                                          File "/home/USER/.kodi/addons/script.module.iapc/lib/iapc/json_service.py", line 97, in execute
                                            response = {"result": method(*args, **kwargs)}
                                          File "/home/USER/.kodi/addons/plugin.video.invidious/lib/service.py", line 192, in query
                                            self.__paths__.get(key, key).format(*args), **kwargs
                                          File "/home/USER/.kodi/addons/plugin.video.invidious/lib/service.py", line 178, in __get__
                                            urljoin(self.__url__, path), timeout=self.__timeout__, params=kwargs
                                          File "/home/USER/.kodi/addons/script.module.requests/lib/requests/sessions.py", line 546, in get
                                            return self.request('GET', url, **kwargs)
                                          File "/home/USER/.kodi/addons/plugin.video.invidious/lib/service.py", line 102, in request
                                            result = response.json()
                                          File "/home/USER/.kodi/addons/script.module.requests/lib/requests/models.py", line 897, in json
                                            return complexjson.loads(self.text, **kwargs)
                                          File "/usr/lib/python2.7/site-packages/simplejson/__init__.py", line 525, in loads
                                            return _default_decoder.decode(s)
                                          File "/usr/lib/python2.7/site-packages/simplejson/decoder.py", line 370, in decode
                                            obj, end = self.raw_decode(s)
                                          File "/usr/lib/python2.7/site-packages/simplejson/decoder.py", line 400, in raw_decode
                                            return self.scan_once(s, idx=_w(s, idx).end())
                                        JSONDecodeError: Expecting value: line 1 column 1 (char 0)
                                        
                                        -->End of Python script error report<--

2021-01-09 17:11:57.726 T:140647372338048 ERROR: CGUIMediaWindow::GetDirectory(plugin://plugin.video.invidious/?action=search&new=True&type=video) failed`

Easier access to the addon's settings

Can you please add an extra entry in the main menu, under search, that leads to the settings of the addon?

The main reason behind this is simple: it makes it easier switch between the instances. The way it is now, I have to exit invidious, right click on it in the list of the video addons and select settings (or press i to get to the addon's info page, then settings).

The addon has not returned a single search result for me in the last 3+ days, regardless of what instance I select in there, so I assume it is an api issue and the addon is not to blame. I have the same behavior on straw-viewer as well.

Please allow saved searches to be added to the Feed

Please make it possible to view all search results in one common playlist.

Use case:
I would like to see the new videos of all my saved searches, without having to open each saved search individually to see whether there is a new video.

Rather than subscribing to channels, I would like to subscribe to topics (= saved searches).

They should be in descending release date order (=newest first).

Feature request: SponsorBlock

This may be asking a lot. I was wondering if support for SponsorBlock is a feasible thing to include, either in this repository or as a separate companion add-on. I use the mpv_sponsorblock_minimal script with mpv and always miss this feature when using Invidious on Kodi. Especially on videos with a lower signal-to-noise ratio (videos with many sponsorships and unneeded fluff).

There is a SponsorBlock add-on for YouTube, but I would rather not use the YouTube add-on for the sake of privacy (it requires unique API keys associated to a particular identity).

Maybe it would be better to write a more generic add-on that can perform this functionality with any media file/stream, but sadly I currently lack the know-how to do it myself...

Only Audio playing - missing video

Hello,

thank you very much for your addon. I love it.

When playing videos I sometimes have the problem that only the sound is played but not the picture. For some channels the error rate is very high. It doesn't matter if the addon is used in version 1.0.10 or 1.0.13 or which OS is used (tried Android and Linux). Also the Kodi version does not matter (19.3, 19.4 and 19.5 tried). Likewise, the public server instance is irrelevant. Also reinstalling the addon or even Kodi doesn't do anything. In the browser via the various Invidious instances, all videos are played without any problems.

Example:
Channel "Visualpolitik DE"

Of the most recent three videos (as of 01/01/2023 08:00 CET), two do not work.

Problems:
https://invidious.snopyta.org/watch?v=cFIuiTECevA
https://invidious.snopyta.org/watch?v=UvvY9ZeU0So

No problems:
https://invidious.snopyta.org/watch?v=xlSvbdt96jI

As I said, only in the addon, no problem in the browser.

Can you reproduce the problem and maybe even solve it?

Do others also have this problem?

Thanks a lot in advance!

Kind regards
Björn

[Suggestion] Channels subscriptions "mix"

Would it be possible to have something like this?

  1. I visit some channels and "save" ("subscribe") them
  2. A new folder appears which contains the latest videos from all those channels sorted by "newest".

Example: I subscribe to channels A, B and C. This new folder (maybe called "Subscriptions RSS"?) would then contain something like this (in this order):

  • Video from today from Channel A
  • Video from yesterday from Channel A
  • Video from last week from Chanel B
  • Video from last month from Channel A
  • Video from last year from Channel C

This would allow us to have the "home page" functionality of a YouTube account without actually needing one.

Thanks.

feature request: log in

I don't see an option anywhere to log in. I've exported my YouTube subscriptions and imported them into an Invidious instance, and /api/v1/auth/feed on that instance returns the newest videos. I could add subscriptions manually to the plugin's feed list,or convert with something like this and dump the file into the plugin's data directory:

from xml.etree import ElementTree
from pprint import pprint
from collections import OrderedDict
import pickle

def extract_rss_urls_from_opml(filename):
    urls = OrderedDict()
    with open(filename, 'rt') as f:
        tree = ElementTree.parse(f)
    for node in tree.findall('.//outline'):
        url = node.attrib.get('xmlUrl')
        name=node.attrib.get("title")
        id=str(url)[52:]
        if (id!=""):
            urls[str(url)[52:]]=name
    return urls

channels = extract_rss_urls_from_opml("youtube.opml")
f=open("feed.pickle","wb")
pickle.dump(channels,f,protocol=2)
f.close()

but it takes several minutes to load the 70+ subscriptions I have that way, and I suspect it'd take several minutes every time. It also has to be repeated across every Kodi installation I have. Since Invidious supports logins and subscriptions, it seems it'd be better if this plugin supported them, as assembling the feed list on the Invidious server is likely going to be faster.

[SOLVED] ERROR: Playlist Player: skipping unplayable item

Some video can't be played with error : ERROR: Playlist Player: skipping unplayable item: 0, path

2021-02-18 18:48:22.401 T:140194040772160 NOTICE: [plugin.video.invidious] request.url: https://invidious.snopyta.org/api/v1/videos/IqOedGIHonY?region=FR 2021-02-18 18:48:35.174 T:140195577150144 ERROR: Playlist Player: skipping unplayable item: 0, path [plugin://plugin.video.invidious/?action=video&videoId=IqOedGIHonY]

Where are the feeds stored

Hi,

I just tried out the plugin and I like it a lot (running kodi on a pretty weak machine and it works great, but freetube is a bit too demanding for it)

i gave the plugin a shot and it works great -- i just wonder if there is a file somewhere (f.e. xml?) where it stores the feeds ... i would write a small script to convert my freetube "subscriptions" to the plugin, so I can easily switch

thx

Error when trying to do access contents with Invidious on Kodi

Hi there,

I am running KODI on the Raspberry Pi4, and I have manually installed the Invidious plugin.

However, everytime I try to do a SEARCH, or access the MUSIC section, etc... I get "Invidious error: check log"

And here's what I see in the log:

2021-01-31 01:55:32.874 T:2785600368  NOTICE: [plugin.video.invidious] request.url: https://invidious.snopyta.org/api/v1/search?q=laseractive&region=US&type=video&page=1&sort_by=relevance
2021-01-31 01:55:33.169 T:2785600368   ERROR: [plugin.video.invidious] service: error processing request: [HTTPError: 403 Client Error: Forbidden for url: https://invidious.snopyta.org/api/v1/search?q=laseractive&region=US&type=video&page=1&sort_by=relevance]
2021-01-31 01:55:33.247 T:2556408688 WARNING: CRenderManager::WaitForBuffer - timeout waiting for buffer
2021-01-31 01:55:33.545 T:2504319856   ERROR: GetDirectory - Error getting plugin://plugin.video.invidious/?action=search&query=laseractive&sort_by=relevance&type=video
2021-01-31 01:55:33.549 T:2489844592   ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                             - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                            Error Type: <class 'iapc.json_service.RequestError'>
                                            Error Contents: remote traceback: Traceback (most recent call last):
                                              File "/storage/.kodi/addons/script.module.iapc/lib/iapc/json_service.py", line 97, in execute
                                                response = {"result": method(*args, **kwargs)}
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/service.py", line 192, in query
                                                self.__paths__.get(key, key).format(*args), **kwargs
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/service.py", line 178, in __get__
                                                urljoin(self.__url__, path), timeout=self.__timeout__, params=kwargs
                                              File "/storage/.kodi/addons/script.module.requests/lib/requests/sessions.py", line 546, in get
                                                return self.request('GET', url, **kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/service.py", line 100, in request
                                                raise error
                                            HTTPError: 403 Client Error: Forbidden for url: https://invidious.snopyta.org/api/v1/search?q=laseractive&region=US&type=video&page=1&sort_by=relevance

It goes on, etc. But I believe it must be something easy on my side, since nothing seems to work.
Any help, please?

Today's upgrade of script.module.iapc broke invidious completely

As mentioned in the title, updating script.module.iapc to v0.2.0 made invidious unusable.
When kodi starts, a notification pops up that invidious has crashed and the log mentions

2020-12-30 17:16:56.456 T:139963488253696   ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                             - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                            Error Type: <type 'exceptions.ImportError'>
                                            Error Contents: cannot import name JSONRPCError
                                            Traceback (most recent call last):
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/service.py", line 15, in <module>
                                                from script import _clearSearchHistory
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/script.py", line 13, in <module>
                                                from iapc import JSONRPCError
                                            ImportError: cannot import name JSONRPCError
                                            -->End of Python script error report<--

Also, when a search is done, the "busy" animation stays up for way too long and when it is done or cancelled this comes up in the log

2020-12-30 17:23:51.748 T:139631916189440   ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                             - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                            Error Type: <class 'iapc.json_service.RequestError'>
                                            Error Contents: remote traceback: unknown error
                                            Traceback (most recent call last):
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 229, in <module>
                                                dispatch(*sys.argv)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 224, in dispatch
                                                Dispatcher(url, int(handle)).dispatch(**parseQuery(query))
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 218, in dispatch
                                                return action(**kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 32, in wrapper
                                                success = func(self, **kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 206, in search
                                                return self._search(q, **kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 172, in _search
                                                client.search(q, **kwargs), kwargs["type"], q=q, **kwargs)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/client.py", line 125, in search
                                                self.query_("search", q=q, page=page, **kwargs), limit=limit)
                                              File "/storage/.kodi/addons/plugin.video.invidious/lib/client.py", line 41, in query_
                                                return self.client.query(key, *args, **kwargs) or self._defaults_.get(key, [])
                                              File "/storage/.kodi/addons/script.module.iapc/lib/iapc/json_service.py", line 174, in __call__
                                                return Request(self.sender).execute((self.name, args, kwargs))
                                              File "/storage/.kodi/addons/script.module.iapc/lib/iapc/json_service.py", line 153, in execute
                                                raise self.response
                                            RequestError: remote traceback: unknown error
                                            -->End of Python script error report<--

Downgrading script.module.iapc broke to v0.1.0 makes the first error go away, but search remains broken.
Kodi 18.9 on libreelec x64 9.2.6 (as seen in the logs above) and on debian testing x64, invidious 0.2.6-c1d590 and kavin.rocks as the instance.
Truth is I had not opened invidious since last week, so the search may have been broken already all that time.

Thank you in advance and have a happy new year :)

Invidious for leia?

Hi, what can I do?
In matrix v 1.0.8 it works with changed ip address, but 0.0.6 for leia fail.
Can you help me?
Thanks!

Krypton Support

Bizarre question, I know, but I'm using DSPlayer and wondered if there were any version that worked with 17.6?

Right click go to channel

Hi,

I'm using the kodi invidous application thanks for shared :)
Can you add a right click option in videos in order to go to channel directly ?

Date and hour in description

1/ In the description the date is not the same on YouTube website than in Invidous.
For example :

2/ The hour can vary depends on the searched hour for the test it was 10:44

Addon not loading

2021-11-11 10:55:12.551 T:14439   DEBUG <general>: CPythonInvoker(56, /home/osmc/.kodi/addons/plugin.video.invidious/lib/service.py): setting the Python path to /home/osmc/.kodi/addons/plugin.video.invidious/lib:/home/osmc/.kodi/addons/script.module.certifi/lib:/home/osmc/.kodi/addons/script.module.chardet/lib:/home/osmc/.kodi/addons/script.module.iapc/lib:/home/osmc/.kodi/addons/script.module.idna/lib:/home/osmc/.kodi/addons/script.module.inputstreamhelper/lib:/home/osmc/.kodi/addons/script.module.requests/lib:/home/osmc/.kodi/addons/script.module.urllib3/lib:/:/usr/lib/python37.zip:/usr/lib/python3.7:/usr/lib/python3.7/lib-dynload:/home/osmc/.local/lib/python3.7/site-packages:/usr/local/lib/python3.7/dist-packages:/usr/lib/python3/dist-packages
2021-11-11 10:55:12.552 T:14439   DEBUG <general>: CPythonInvoker(56, /home/osmc/.kodi/addons/plugin.video.invidious/lib/service.py): entering source directory /home/osmc/.kodi/addons/plugin.video.invidious/lib
2021-11-11 10:55:12.552 T:14440   DEBUG <general>: Thread waiting 3267330240 terminating
2021-11-11 10:55:12.553 T:14439   DEBUG <general>: CPythonInvoker(56, /home/osmc/.kodi/addons/plugin.video.invidious/lib/service.py): instantiating addon using automatically obtained id of "plugin.video.invidious" dependent on version 3.0.0 of the xbmc.python api
2021-11-11 10:55:12.589 T:13855   DEBUG <general>: ------ Window Deinit (DialogBusy.xml) ------
2021-11-11 10:55:12.592 T:14441   DEBUG <general>: Thread BackgroundLoader start, auto delete: false
2021-11-11 10:55:12.594 T:14441   DEBUG <general>: Thread BackgroundLoader 3069685952 terminating
2021-11-11 10:55:12.756 T:14439   ERROR <general>: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                                    - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                                   Error Type: <class 'SyntaxError'>
                                                   Error Contents: invalid syntax (service.py, line 61)
                                                     File "/home/osmc/.kodi/addons/plugin.video.invidious/lib/service.py", line 61
                                                       if (timeout := getSetting("timeout", float)) <= 0.0:
                                                                   ^
                                                   SyntaxError: invalid syntax
                                                   -->End of Python script error report<--
                                                   
2021-11-11 10:55:12.756 T:14439   DEBUG <general>: onExecutionDone(56, /home/osmc/.kodi/addons/plugin.video.invidious/lib/service.py)
2021-11-11 10:55:13.049 T:14439    INFO <general>: Python interpreter stopped

System information:

PRETTY_NAME="Open Source Media Center"
NAME="OSMC"
VERSION="August 2021"
VERSION_ID="2021.08-1"
ID=osmc
ID_LIKE=debian

ANSI_COLOR="1;31"
HOME_URL="https://www.osmc.tv"
SUPPORT_URL="https://www.osmc.tv"
BUG_REPORT_URL="https://www.osmc.tv"

This happened right after installing the addon.
After that it cannot be loaded with the following error:

2021-11-11 10:23:50.555 T:13619   ERROR <general>: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                                    - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                                   Error Type: <class 'SyntaxError'>
                                                   Error Contents: invalid syntax (plugin.py, line 67)
                                                     File "/home/osmc/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 67
                                                       if (more := getattr(items, "more", None)):
                                                                ^
                                                   SyntaxError: invalid syntax
                                                   -->End of Python script error report<--
                                                   
2021-11-11 10:23:50.555 T:13619   DEBUG <general>: onExecutionDone(117, /home/osmc/.kodi/addons/plugin.video.invidious/lib/plugin.py)

Error 403 and 500

Error can't play any videos :

ERROR <general>: AddOnLog: inputstream.adaptive: Download https://r2---sn-5hne6ns6.googlevideo.com/videoplaybackt...=r2---sn-5hne6ns6.googlevideo.com failed with error: 403 2021-04-03 09:50:49.071 T:14249 ERROR <general>: AddOnLog: inputstream.adaptive: Unable to select stream! 2021-04-03 09:50:49.216 T:14251 ERROR <general>: AddOnLog: inputstream.adaptive: Download https://r2---sn-5hne6ns6.googlevideo.com/videoplayback?expire.. failed with error: 403

Even with right click play with youtube :

2021-04-03 09:56:18.695 T:10289 ERROR <general>: [plugin.video.invidious] <httpd> 'GET /manifest?videoId=BP3_dgTofKA HTTP/1.1' => (500 - Internal Server Error) Traceback (most recent call last): File "/home/USER/.kodi/addons/script.module.iapc/lib/iapc/httpd.py", line 93, in execute return self.server.execute(self) File "/home/USER/.kodi/addons/script.module.iapc/lib/iapc/httpd.py", line 149, in execute result = method(**parseQuery(url.query)) File "/home/USER/.kodi/addons/plugin.video.invidious/lib/invidious/youtube/httpd.py", line 158, in manifest video = self.video(videoId) File "/home/USER/.kodi/addons/plugin.video.invidious/lib/invidious/youtube/httpd.py", line 121, in video video = find(html, r"ytInitialPlayerResponse\s*=\s*") File "/home/USER/.kodi/addons/plugin.video.invidious/lib/invidious/youtube/httpd.py", line 28, in find raise PatternsError(*patterns) invidious.youtube.find.PatternsError: No matches found for patterns: ('ytInitialPlayerResponse\\s*=\\s*',) 2021-04-03 09:56:18.695 T:20882 ERROR <general>: CCurlFile::FillBuffer - Failed: HTTP returned error 500 2021-04-03 09:56:18.696 T:20882 ERROR <general>: CCurlFile::Open failed with code 500 for http://127.0.0.1:58657/manifest?videoId=BP3_dgTofKA:

__class__ cell not found

Hello!
Plugin doesn't start on Kodi (20.0-ALPHA1 (19.90.101) Git:20211011-nogitfound). Platform: Linux ARM 32-bit,
Python3.10 on armv7

Error message:
`2021-10-12 22:50:24.035 T:9620 info : initializing python engine.
2021-10-12 22:50:25.331 T:9620 error : EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--

  • NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
    Error Type: <class 'RuntimeError'>
    Error Contents: super(): class cell not found
    Traceback (most recent call last):
    File "/home/kodi/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 218, in
    dispatch(*argv)
    File "/home/kodi/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 214, in dispatch
    InvidiousPlugin(url, int(handle)).dispatch(**parseQuery(query))
    File "/home/kodi/.kodi/addons/plugin.video.invidious/lib/plugin.py", line 26, in dispatch
    super().dispatch(**kwargs)
    RuntimeError: super(): class cell not found
    -->End of Python script error report<--

2021-10-12 22:50:25.503 T:9620 info : Python interpreter stopped
2021-10-12 22:50:25.505 T:9618 error : GetDirectory - Error getting plugin://plugin.video.invidious/
2021-10-12 22:50:25.535 T:8609 error : CGUIMediaWindow::GetDirectory(plugin://plugin.video.invidious/) failed
`

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.