Code Monkey home page Code Monkey logo

themerr-plex's Introduction

github_url

https://github.com/LizardByte/Themerr-plex/blob/master/README.rst

Overview

LizardByte has the full documentation hosted on Read the Docs.

About

Themerr-plex is a metadata agent plug-in for Plex Media Player. The plug-in adds theme music to your movies and tv shows.

This plugin contributes to the following metadata agents.

  • Plex Movie - tv.plex.agents.movie
  • Plex Series - tv.plex.agents.series
  • Plex Movie (Legacy) - com.plexapp.agents.imdb
  • The Movie Database - com.plexapp.agents.themoviedb
  • TheTVDB - com.plexapp.agents.thetvdb
  • RetroArcher - dev.lizardbyte.retroarcher-plex

Integrations

GitHub Workflow Status (CI)

Read the Docs

Codecov

Downloads

GitHub Releases

Docker

themerr-plex's People

Contributors

dependabot[bot] avatar lizardbyte-bot avatar reenignearcher avatar zdimension avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

themerr-plex's Issues

Previous Movie Not Obtaining theme

Describe the Bug

movies uploaded before themerr was added to my plex server, do not receive theme songs

Expected Behavior

all movies (present in thmerrDB) receive the theme in my plex server

Additional Context

I tried update metadata and analyze

Custom Collections show up in Web UI

Describe the Bug

When navigating the Web UI, custom collections will not only show up, but will show a theme is missing and will have the option to add a theme. If you hit add, it will route to the DB page with a generic TMDB website autopopulated (https://www.themoviedb.org/collection/)

Expected Behavior

Not sure if we want custom collections to show up, but at the very least, there shouldn't be an option to add a theme for them. It also maybe shouldn't indicate that a theme is missing from them.

Additional Context

No response

There seems to be an anomaly in the display of the status

Describe the Bug

I noticed that only the library ranked first in the WebUI displays "Themerr provided" for items with theme songs, while all other libraries, except for those with theme songs provided by Plex, show "Unknown provider" for items with theme songs (Collections will display "Themerr provided"). Additionally, the same movie appears as "Themerr provided" in the first library but as "Unknown provider" in others. This seems to be an issue.

Unknown provider

Shouldn't all movie theme songs be provided by Themerr? I'm not quite understanding the scenarios in which "Unknown provider" and "User provided" appear.

Moreover, I'm curious about how the libraries are sorted in the WebUI. When the library names are in Chinese, I haven't been able to discern a consistent sorting pattern.

Expected Behavior

No response

Additional Context

No response

Some Themes do not work on AppleTV/iOS devices

Describe the Bug

A significant number of themes do not work on AppleTV/iOS devices.

One suspected factor is the audio codec. Initial investigations point to mostly the fact that Opus encoded files are not working at all... At least one theme with the MPEG AAC codec is also not working, the length of this file is > 5:00 minutes, so that may be the cause there.

Codec 1

Codec: MPEG AAC Audio (mp4a)
Type: Audio
Channels: Stereo
Sample rate: 44100 Hz
Bits per sample: 32

Codec 2

Codec: Opus Audio (Opus)
Language: English
Type: Audio
Channels: Stereo
Sample rate: 48000 Hz
Bits per sample 32

Movie Length Codec Working
2067 2:23 MPEG AAC
The A-Team 1:42 MPEG AAC
Ad Astra 2:41 MPEG AAC
American Outlaws 1:37 MPEG AAC
American Pie Presents: Band Camp 2:53 MPEG AAC
Analyze This 3:58 MPEG AAC
Annapolis 2:31 MPEG AAC
The Avengers 2:03 MPEG AAC
Sonic The Hedgehog 2 3:56 MPEG AAC
8 Mile 5:20 MPEG AAC
16 Blocks 0:56 Opus
21 Jump Street 1:55 Opus
The 40 Year Old Virgin 3:31 Opus
42 4:28 Opus
127 Hours 2:27 Opus
Accepted 2:42 Opus
Act of Valor 2:58 Opus
The Adam Project 4:57 Opus
The Alamo 3:15 Opus
Along Came Polly 0:56 Opus
Alpha Dog 2:52 Opus
American Gangster 2:40 Opus
Toy Story 3 3:03 Opus

Expected Behavior

No response

Additional Context

Additionally, tracks uploaded to the server seem to cutoff just prior to the 3 minute mark. This may be based on the timeout value.

Exception when calling function 'Start'

Describe the Bug

Installed in Windows 11. Did seem to be working at one point as have JSON files, and know at least one theme has been downloaded as tested in Plex on AppleTV client.

On startup of Plex Server, this is in the "dev.lizardbyte.themerr-plex.log" log:

2024-01-02 17:08:20,078 (2e44) :  INFO (logkit:16) - Themerr-plex, version: v2023.1227.133216
2024-01-02 17:08:20,078 (2e44) :  INFO (logkit:16) - DefaultPrefs.json is valid
2024-01-02 17:08:20,078 (2e44) :  DEBUG (logkit:13) - web server started.
2024-01-02 17:08:20,078 (2e44) :  DEBUG (logkit:13) - queue threads started.
2024-01-02 17:08:20,094 (2e44) :  CRITICAL (core:574) - Exception when calling function 'Start' (most recent call last):
  File "C:\Program Files\Plex Media Server\Resources\Plug-ins-fb6452ebf\Framework.bundle\Contents\Resources\Versions\2\Python\Framework\code\sandbox.py", line 294, in call_named_function
    result = f(*args, **kwargs)
  File "D:\Plex Media Server\Plug-ins\Themerr-plex.bundle\Contents\Code\__init__.py", line 199, in Start
    plex_listener()  # start watching plex
  File "D:\Plex Media Server\Plug-ins\Themerr-plex.bundle\Contents\Code\plex_api_helper.py", line 619, in plex_listener
    plex = setup_plexapi()
  File "D:\Plex Media Server\Plug-ins\Themerr-plex.bundle\Contents\Code\plex_api_helper.py", line 90, in setup_plexapi
    plex_server = plexapi.server.PlexServer(baseurl=plex_url, token=plex_token, session=sess)
  File "D:\Plex Media Server\Plug-ins\Themerr-plex.bundle\Contents\Libraries\Shared\plexapi\server.py", line 125, in __init__
    super(PlexServer, self).__init__(self, data, self.key)
  File "D:\Plex Media Server\Plug-ins\Themerr-plex.bundle\Contents\Libraries\Shared\plexapi\base.py", line 69, in __init__
    self._loadData(data)
  File "D:\Plex Media Server\Plug-ins\Themerr-plex.bundle\Contents\Libraries\Shared\plexapi\server.py", line 167, in _loadData
    self.updatedAt = utils.toDatetime(data.attrib.get('updatedAt'))
  File "D:\Plex Media Server\Plug-ins\Themerr-plex.bundle\Contents\Libraries\Shared\plexapi\utils.py", line 339, in toDatetime
    return datetime.fromtimestamp(value)
ValueError: timestamp out of range for platform localtime()/gmtime() function

2024-01-02 17:08:20,094 (2e44) :  INFO (core:611) - Started plug-in
2024-01-02 17:08:20,094 (2e44) :  DEBUG (socketinterface:160) - Starting socket server

Expected Behavior

No response

Additional Context

No response

issue with ThemerrDB issue urls

Describe the Bug

Some movies get the imdb id in the issue url instead of the tmdb id.

https://github.com/LizardByte/ThemerrDB/issues/new?assignees=&labels=request-theme&template=theme.yml&title=[MOVIE]:%20Red%20Dawn%20(1984)&database_url=https://www.themoviedb.org/movie/tt0087985

Movies with symbols in the title may mess up parameters in the URL.

https://github.com/LizardByte/ThemerrDB/issues/new?assignees=&labels=request-theme&template=theme.yml&title=[MOVIE]: Mr. & Mrs. Smith (2005)&database_url=https://www.themoviedb.org/movie/787

Expected Behavior

No response

Additional Context

No response

AlertListener does not work with some hosts on Linux

Describe the Bug

Plex alert listener fails to start on Linux (when using ipv6?) and the following error appears in the logs.

ERROR (alert:94) - getsockaddrarg: bad family

Expected Behavior

No response

Additional Context

IPv6 is likely disabled in Plex's python build.

We can possibly patch python-plexapi to setup websocket-client properly. https://github.com/ReenigneArcher/python-plexapi/blob/c41d98170b3761b8edc7d75970a01b80bb6281c6/plexapi/alert.py#L55

https://websocket-client.readthedocs.io/en/v0.59.0/examples.html?highlight=socket#using-unix-domain-sockets

majek/puka#27

qpython-android/qpysl4a#2

2nd Movie Field won't collapse in Web UI

Describe the Bug

When trying to collapse the 2nd movies field for my 2nd movies library, it won't collapse. The first field collapses fine though. I can hit the arrow and it changes directions, but doesn't collapse it. Note that I have no themes for this library. See picture below:

example

Expected Behavior

I expect that when I hit the arrow, it should collapse the whole movies field similar to the top movies field

Additional Context

No response

Same movie in multiple libraries will show "failed to download"

Describe the Bug

If a movie is present in multiple libraries, it will only show up as green "Themerr provided" in the first Library. While the theme is also playing in all other libraries, they flag it a "failed to download".

A common case to have a movie multiple times is different libraries for "Movies" and "4K Movies". Internally they share the same metadata, since the movie is the same.

Log exerpt:

DEBUG (plex_api_helper:114) - item title: Star Trek (4K UHD)
DEBUG (plex_api_helper:185) - Not overwriting locked theme for movie: Star Trek (4K UHD)

Expected Behavior

If a theme is already available, show it as green "Themerr provided" in the Web UI.

Additional Context

No response

add a log filter

Describe the Bug

A user reported that youtube credentials are stored in the log file. Let's add a log filter to mask sensitive information.

Expected Behavior

No response

Additional Context

May need to disable debug logging in the Info.plist as this is actually something logged by Plex.

2023-01-19 18:09:42,347 (7f88f384ab38) : DEBUG (runtime:717) - Handling request GET /:/plugins/dev.lizardbyte.themerr-plex/prefs/set?...

Chinese collections cannot fetch theme songs.

Describe the Bug

When using the original version of tmdb_helper.py, Chinese titled collections cannot retrieve corresponding TMDB data. Here's an example of the log:

2024-03-12 02:09:49,141 (70000a6bf000) :  DEBUG (plex_api_helper:454) - Getting database info for item: 黑夜传说(系列)
2024-03-12 02:09:49,145 (70000a6bf000) :  DEBUG (networking:139) - Fetching 'http://127.0.0.1:32400/services/tmdb?uri=/search/collection?query=%5Cu9ed1%5Cu591c%5Cu4f20%5Cu8bf4%5Cuff08%5Cu7cfb%5Cu5217%5Cuff09' from the HTTP cache
2024-03-12 02:09:49,150 (70000a6bf000) :  DEBUG (tmdb_helper:117) - TMDB data: {'total_results': 0, 'total_pages': 1, 'page': 1, 'results': []}
2024-03-12 02:09:49,150 (70000a6bf000) :  DEBUG (plex_api_helper:562) - Database info for item: 黑夜传说(系列), database_info: ('movie_collections', 'themoviedb', 'tv.plex.agents.movie', None)

After testing, I found that the issue lies with URL encoding. Since collections are searched and matched on TMDB using their titles, the original script uses the String.Quote function which utilizes Unicode escape sequence URL encoding. For example, "黑夜传说(系列)" would be encoded as:

%5Cu9ed1%5Cu591c%5Cu4f20%5Cu8bf4%5Cuff08%5Cu7cfb%5Cu5217%5Cuff09

I made some modifications to the script. Now, when the title is in Chinese, it uses the urllib.quote function with UTF-8 encoding for URL encoding. For titles in other languages, the script still uses the String.Quote function. For example, "黑夜传说(系列)" would now be encoded as:

%E9%BB%91%E5%A4%9C%E4%BC%A0%E8%AF%B4%EF%BC%88%E7%B3%BB%E5%88%97%EF%BC%89

The modified tmdb_helper.py is as follows:

# -*- coding: utf-8 -*-

# plex debugging
try:
    import plexhints  # noqa: F401
except ImportError:
    pass
else:  # the code is running outside of Plex
    from plexhints.constant_kit import CACHE_1DAY  # constant kit
    from plexhints.log_kit import Log  # log kit
    from plexhints.parse_kit import JSON  # parse kit
    from plexhints.util_kit import String  # util kit

# imports from Libraries\Shared
from typing import Optional, Union
import urllib
import urlparse

# url borrowed from TheMovieDB.bundle
tmdb_base_url = 'http://127.0.0.1:32400/services/tmdb?uri='


def get_tmdb_id_from_external_id(external_id, database, item_type):
    # type: (Union[int, str], str, str) -> Optional[int]
    """
    Convert IMDB ID to TMDB ID.

    Use the builtin Plex tmdb api service to search for a movie by IMDB ID.

    Parameters
    ----------
    external_id : Union[int, str]
        External ID to convert.
    database : str
        Database to search. Must be one of 'imdb' or 'tvdb'.
    item_type : str
        Item type to search. Must be one of 'movie' or 'tv'.

    Returns
    -------
    Optional[int]
        Return TMDB ID if found, otherwise None.

    Examples
    --------
    >>> get_tmdb_id_from_external_id(imdb_id='tt1254207', database='imdb', item_type='movie')
    10378
    >>> get_tmdb_id_from_external_id(imdb_id='268592', database='tvdb', item_type='tv')
    48866
    """
    if database.lower() not in ['imdb', 'tvdb']:
        Log.Exception('Invalid database: {}'.format(database))
        return
    if item_type.lower() not in ['movie', 'tv']:
        Log.Exception('Invalid item type: {}'.format(item_type))
        return

    # according to https://www.themoviedb.org/talk/5f6a0500688cd000351c1712 we can search by external id
    # https://api.themoviedb.org/3/find/tt0458290?api_key=###&external_source=imdb_id
    find_url_suffix = 'find/{}?external_source={}_id'

    url = '{}/{}'.format(
        tmdb_base_url,
        find_url_suffix.format(String.Quote(s=str(external_id), usePlus=True), database.lower())
    )
    try:
        tmdb_data = JSON.ObjectFromURL(
            url=url, sleep=2.0, headers=dict(Accept='application/json'), cacheTime=CACHE_1DAY, errors='strict')
    except Exception as e:
        Log.Debug('Error converting external ID to TMDB ID: {}'.format(e))
    else:
        Log.Debug('TMDB data: {}'.format(tmdb_data))
        try:
            # this is already an integer, but let's force it
            tmdb_id = int(tmdb_data['{}_results'.format(item_type.lower())][0]['id'])
        except (IndexError, KeyError, ValueError):
            Log.Debug('Error converting external ID to TMDB ID: {}'.format(tmdb_data))
        else:
            return tmdb_id


def get_tmdb_id_from_collection(search_query):
    # type: (str) -> Optional[int]
    """
    Search for a collection by name.

    Use the builtin Plex tmdb api service to search for a tmdb collection by name.

    Parameters
    ----------
    search_query : str
        Name of collection to search for.

    Returns
    -------
    Optional[int]
        Return collection ID if found, otherwise None.

    Examples
    --------
    >>> get_tmdb_id_from_collection(search_query='James Bond Collection')
    645
    >>> get_tmdb_id_from_collection(search_query='James Bond')
    645
    """
    # /search/collection?query=James%20Bond%20Collection&include_adult=false&language=en-US&page=1"
    query_url = 'search/collection?query={}'

    # Plex returns 500 error if spaces are in collection query, same with `_`, `+`, and `%20`... so use `-`
    if any(u'\u4e00' <= ch <= u'\u9fff' for ch in search_query):
        search_query = urllib.quote(search_query.encode('utf8'))
    else:
        search_query = String.Quote(s=search_query.replace(' ', '-'), usePlus=True)

    url = '{}/{}'.format(tmdb_base_url, query_url.format(search_query))
    try:
        tmdb_data = JSON.ObjectFromURL(
            url=url, sleep=2.0, headers=dict(Accept='application/json'), cacheTime=CACHE_1DAY, errors='strict')
    except Exception as e:
        Log.Debug('Error searching for collection {}: {}'.format(search_query, e))
    else:
        collection_id = None
        Log.Debug('TMDB data: {}'.format(tmdb_data))

        end_string = 'Collection'  # collection names on themoviedb end with 'Collection'
        try:
            for result in tmdb_data['results']:
                if result['name'].lower() == search_query.lower() or \
                        '{} {}'.format(search_query.lower(), end_string).lower() == result['name'].lower():
                    collection_id = int(result['id'])
        except (IndexError, KeyError, ValueError):
            Log.Debug('Error searching for collection {}: {}'.format(search_query, tmdb_data))
        else:
            return collection_id

After the modification, TMDB data for collections with Chinese titles can now be retrieved. For example:

2024-03-16 04:28:12,457 (7000034c9000) :  DEBUG (plex_api_helper:454) - Getting database info for item: 黑夜传说(系列)
2024-03-16 04:28:12,465 (7000034c9000) :  DEBUG (networking:139) - Fetching 'http://127.0.0.1:32400/services/tmdb?uri=/search/collection?query=%E9%BB%91%E5%A4%9C%E4%BC%A0%E8%AF%B4%EF%BC%88%E7%B3%BB%E5%88%97%EF%BC%89' from the HTTP cache
2024-03-16 04:28:12,474 (7000034c9000) :  DEBUG (tmdb_helper:123) - TMDB data: {'total_results': 1, 'total_pages': 1, 'page': 1, 'results': [{'poster_path': '/aK8qq0X0pZbf5ncE3JLQ27hdC4F.jpg', 'name': 'Underworld Collection', 'overview': u'A centuries-old war is waged between vampires and lycans (short for lycanthrope, from the Greek \'luk\' [wolf] + \'\xe1nthr\u014dpos\' [human], or werewolf). It begins with a fifth-century man, the sole survivor of a plague that wipes out his village. Somehow, his body turns the disease to his benefit, and afterward, he ceases to age. After living secretly, he moves often to prevent his immunity to the ravages of time from being discovered, even marrying on occasion. After he fathers twin sons who also inherit his gift, they learn its ultimate price after they become the first vampire and lycan after one suffers a bite from a bat and the other from a wolf. Once they learn they can "turn" normal humans into others like them by inflicting their bites on them, they terrorize the nearby countryside, taking from them either victims or tribute. The vampires ultimately enslave the Lycans until love leads to the Lycans\' escape, igniting a bitter war that seems destined to have no end.', 'original_name': 'Underworld Collection', 'backdrop_path': '/2gSaXagD9ZCuBHOsXF4tvtW7Djd.jpg', 'adult': False, 'id': 2326, 'original_language': 'en'}]}
2024-03-16 04:28:12,474 (7000034c9000) :  DEBUG (plex_api_helper:562) - Database info for item: 黑夜传说(系列), database_info: ('movie_collections', 'themoviedb', 'tv.plex.agents.movie', None)
2024-03-16 04:28:12,474 (7000034c9000) :  DEBUG (plex_api_helper:114) - item title: 黑夜传说(系列)

However, collections with Chinese titles still cannot fetch theme songs, while collections with English titles can. For example, I have one collection titled "James Bond Collection" and another titled "詹姆斯·邦德(系列)" in two separate libraries. The collection with the English title successfully fetched the theme song, but the one with the Chinese title did not.

2024-03-16 04:28:57,203 (700004cdb000) :  DEBUG (plex_api_helper:454) - Getting database info for item: James Bond Collection
2024-03-16 04:28:57,208 (700004cdb000) :  DEBUG (networking:139) - Fetching 'http://127.0.0.1:32400/services/tmdb?uri=/search/collection?query=James-Bond-Collection' from the HTTP cache
2024-03-16 04:28:57,213 (700004cdb000) :  DEBUG (tmdb_helper:123) - TMDB data: {'total_results': 1, 'total_pages': 1, 'page': 1, 'results': [{'poster_path': '/ofwSiqOFShhunAIYYdSMHMJQSx2.jpg', 'name': 'James Bond Collection', 'overview': 'The James Bond film series is a British series of spy films based on the fictional character of MI6 agent James Bond, codename "007". With all of the action, adventure, gadgetry & film scores that Bond is famous for.', 'original_name': 'James Bond Collection', 'backdrop_path': '/dOSECZImeyZldoq0ObieBE0lwie.jpg', 'adult': False, 'id': 645, 'original_language': 'en'}]}
2024-03-16 04:28:57,214 (700004cdb000) :  DEBUG (plex_api_helper:562) - Database info for item: James Bond Collection, database_info: ('movie_collections', 'themoviedb', 'tv.plex.agents.movie', None)

2024-03-16 04:28:31,560 (7000034c9000) :  DEBUG (plex_api_helper:454) - Getting database info for item: 詹姆斯·邦德(系列)
2024-03-16 04:28:31,571 (7000034c9000) :  DEBUG (networking:139) - Fetching 'http://127.0.0.1:32400/services/tmdb?uri=/search/collection?query=%E8%A9%B9%E5%A7%86%E6%96%AF%C2%B7%E9%82%A6%E5%BE%B7%EF%BC%88%E7%B3%BB%E5%88%97%EF%BC%89' from the HTTP cache
2024-03-16 04:28:31,575 (7000034c9000) :  DEBUG (tmdb_helper:123) - TMDB data: {'total_results': 1, 'total_pages': 1, 'page': 1, 'results': [{'poster_path': '/ofwSiqOFShhunAIYYdSMHMJQSx2.jpg', 'name': 'James Bond Collection', 'overview': 'The James Bond film series is a British series of spy films based on the fictional character of MI6 agent James Bond, codename "007". With all of the action, adventure, gadgetry & film scores that Bond is famous for.', 'original_name': 'James Bond Collection', 'backdrop_path': '/dOSECZImeyZldoq0ObieBE0lwie.jpg', 'adult': False, 'id': 645, 'original_language': 'en'}]}
2024-03-16 04:28:31,576 (7000034c9000) :  DEBUG (plex_api_helper:562) - Database info for item: 詹姆斯·邦德(系列), database_info: ('movie_collections', 'themoviedb', 'tv.plex.agents.movie', None)

I'm not sure if there are notifications in the logs for fetching theme songs for collections because I haven't seen any "data found for collection" notifications while monitoring the logs. It might be challenging to filter logs based on this. However, in the WebUI, I noticed that only collections in the English library fetched theme songs, while collections in the Chinese library did not. I hope we can find the reason for this discrepancy.

collections

Furthermore, even though we've retrieved data from TMDB, the collection IDs in the logs still show as None. Is this normal? Also, in the WebUI, it displays as "No known ID," despite some collections having successfully matched data from TMDB.

I'm puzzled as well. Both collections with Chinese and English titles have successfully matched with TMDB. So, it's unclear why only collections with English titles are fetching theme songs. There might be a specific issue or limitation in the retrieval process that's causing this discrepancy. It could be worth investigating further to understand the root cause.

How does Themerr search and match collections in ThemerrDB? Is the issue possibly occurring here?

Expected Behavior

No response

Additional Context

No response

Get plex token automatically

Plex unable to start with plugin on

Describe the Bug

Plex unable to start with plugin on

Expected Behavior

Plex to start with plugin

Additional Context

I am using current latest plex version on docker (1.29.0.6244). I have downloaded plugin v0.0.1 and uncompressed it in plugin directory.
Docker logs show:

Error starting framework core for /config/Library/Application Support/Plex Media Server/Plug-ins/Themerr-plex.bundle.
I am aware this is a very fresh project. Let me now if you need further debugging.

Cheers!

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.