Git Product home page Git Product logo

tvapprepo's Introduction

TvAppRepo

An app repository of Android TV apps

In Android TV's stock launcher, all apps that appear must have the LEANBACK_LAUNCHER attribute and have a TV banner. While this helps guarantee the app works on TVs, it can make it difficult for other apps to be launched. While it's not impossible, it's not as convenient as having an icon on the homescreen.

Using a python script, tiny shortcut apps are generated and can be installed. They simply contain the face of a Leanback app. However, once they're opened they simply redirect users to the intended app. It's a simple workaround.

This workaround has a few advantages. By not modifying the APK directly, it allows updates to continue through the Google Play Store. In fact, the actual app isn't touched at all. These shortcuts could point to anything: a website, a specific shortcut in an app, or basically any Intent.

The python script cannot be run in the app. The app contains several sideloading tools, including supporting #SIDELOADTAG, showing all your downloaded apps, and browsing apps that have generated shortcuts. The app should also be able to notify users when it needs to be updated.

Python Script

The script takes the /python/Shortcut sample project and clones it to /python/temp_apk. Then it replaces strings.xml with new info, along with modifying build.gradle and AndroidManifest.xml to use a new package name. The banner is swapped out. Finally, the shortcut APK is generated and ready to be downloaded and installed.

It can be called in several ways.

python leanbackshortcut.py --firebase --windows

  • --firebase indicates that the Firebase database will be queried for results
  • --windows indicates that you're using a Windows command prompt. This changes some of the commands.

Before you get started, you'll need to add some additional files.

config.txt

This config file uses a KEY=VALUE pair for particular settings related to your personal configuration. Currently there are two properties needed: SHORTCUT_APP_DIRECTORY and ANDROID_SDK_LOCATION.

SHORTCUT_APK_DIRECTORY=c:/Users/me/TvAppRepo/python/Shortcut
ANDROID_SDK_LOCATION=c:/Users/me/AppData/Local/Android/sdk

keys.txt

The shortcuts are still apps that need to be signed. This can be done by putting the values into a file called keys.txt.

storeFile file("C:\\Users\\me\\keys\\thiskey.jks")
storePassword "P@55word"
keyAlias "@ndroid"
keyPassword "Purple"

Additional Notes

  • On Windows, the task Java Binary needs to be killed at the end of every run in order for the next to start.
  • Bulk APK generations from Firebase do not work
  • Banners must be in the PNG file format. While not exactly enforced in the script, it causes compiler problems.

Download

You can check out the Releases tab to download the latest version. Alternatively one can use the #SIDELOADTAG TVAPPREPO102 to get version 1.0.2 (which should then be able to update to the newest version).

tvapprepo's People

Contributors

fleker 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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tvapprepo's Issues

Banner "Icon Packs"

What if I could generate shortcut apps with banners that come from third-party apps, similar to icon packs?

Enforce PNGs

If the banner or icon is not a PNG, issue an error and stop the process. This is causing the build process to fail down the line because I'm downloading a JPG but saying it's a PNG.

Theme with Palette

Use Palette to theme app cards and each app's page to make each one more colorful

Crash on Shield TV

Installed the OpenCommunity APK on a 2017 Shield TV with the latest 5.0.1 update and the application crashes immediately.

01-19 22:19:06.089 25012 25012 W System  : ClassLoader referenced unknown path: /data/app/news.androidtv.tvapprepo-1/lib/arm64
01-19 22:19:06.103 25012 25012 D FirebaseApp: com.google.firebase.auth.FirebaseAuth is not linked. Skipping initialization.
01-19 22:19:06.107 25012 25012 D FirebaseApp: com.google.firebase.crash.FirebaseCrash is not linked. Skipping initialization.
01-19 22:19:06.111 25012 25012 I FA      : App measurement is starting up, version: 10084
01-19 22:19:06.111 25012 25012 I FA      : To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
01-19 22:19:06.115 25012 25012 I FA      : To enable faster debug mode event logging run:
01-19 22:19:06.115 25012 25012 I FA      :   adb shell setprop debug.firebase.analytics.app news.androidtv.tvapprepo
01-19 22:19:06.122 25012 25012 I FirebaseInitProvider: FirebaseApp initialization successful
01-19 22:19:06.176 25012 25012 I CrashlyticsCore: Initializing Crashlytics 2.3.14.151
01-19 22:19:06.185 25012 25012 I MainFragment: onCreate
01-19 22:19:06.198 25012 25012 D MainFragment: Get RepoDatabase instance
01-19 22:19:06.206 25012 25042 D NetworkSecurityConfig: No Network Security Config specified, using platform default
01-19 22:19:06.209 25012 25012 I DynamiteModule: Considering local module com.google.android.gms.firebase_database:4 and remote module com.google.android.gms.firebase_database:4
01-19 22:19:06.209 25012 25012 I DynamiteModule: Selected remote version of com.google.android.gms.firebase_database, version >= 4
01-19 22:19:06.214 25012 25012 W System  : ClassLoader referenced unknown path: /data/user/0/com.google.android.gms/app_chimera/m/00000006/n/arm64-v8a
01-19 22:19:06.223 25012 25012 D d       : Create new instance
01-19 22:19:06.269 25012 25012 D MainFragment: [ResolveInfo{e523280 com.nvidia.shield.welcome/.WebViewer m=0x108000}, ResolveInfo{362b0b9 mobi.mgeek.TunnyBrowser/.BrowserActivity m=0x108000}, ResolveInfo{af3ccfe com.android.documentsui/.LauncherActivity m=0x108000}, ResolveInfo{cb7dc5f com.nvidia.blakepairing/.BlakePairingLoadingActivity m=0x108000}, ResolveInfo{fe7f6ac com.nvidia.inputviewer/.MainActivity m=0x108000}, ResolveInfo{7f49f75 com.plexapp.mediaserver.smb/com.plexapp.mediaserver.MainActivity m=0x108000}]
01-19 22:19:06.296 25012 25012 D MainFragment: Get RepoDatabase instance
01-19 22:19:06.344 25012 25012 D MainFragment: [ResolveInfo{b809672 com.nvidia.shield.welcome/.WebViewer m=0x108000}, ResolveInfo{1c2fac3 mobi.mgeek.TunnyBrowser/.BrowserActivity m=0x108000}, ResolveInfo{e3e5f40 com.android.documentsui/.LauncherActivity m=0x108000}, ResolveInfo{d143e79 com.nvidia.blakepairing/.BlakePairingLoadingActivity m=0x108000}, ResolveInfo{73da7be com.nvidia.inputviewer/.MainActivity m=0x108000}, ResolveInfo{950801f com.plexapp.mediaserver.smb/com.plexapp.mediaserver.MainActivity m=0x108000}]
01-19 22:19:06.368 25012 25012 D phs:ipc-binder-client: phs: RegisterClient(): transact returned 0, NO_ERROR=0
01-19 22:19:06.368 25012 25012 D phs:ipc-binder-client: phs: RegisterClient() timeout is 5000
01-19 22:19:06.371   759   774 D RSMouse : mFeatureEnabled=true  mPackageEnabled=false
01-19 22:19:06.412 25012 25068 I OpenGLRenderer: Initialized EGL, version 1.4
01-19 22:19:06.412 25012 25068 D OpenGLRenderer: Swap behavior 2
01-19 22:19:06.417 25012 25012 D e       : ResolveInfo{b809672 com.nvidia.shield.welcome/.WebViewer m=0x108000}
01-19 22:19:06.417 25012 25012 D e       : com.nvidia.shield.welcome.WebViewer
01-19 22:19:06.417 25012 25012 D e       : Device Help
01-19 22:19:06.420 25012 25012 D e       : ResolveInfo{1c2fac3 mobi.mgeek.TunnyBrowser/.BrowserActivity m=0x108000}
01-19 22:19:06.420 25012 25012 D e       : mobi.mgeek.TunnyBrowser.BrowserActivity
01-19 22:19:06.420 25012 25012 D e       : Dolphin
01-19 22:19:06.422 25012 25012 D e       : ResolveInfo{e3e5f40 com.android.documentsui/.LauncherActivity m=0x108000}
01-19 22:19:06.422 25012 25012 D e       : com.android.documentsui.LauncherActivity
01-19 22:19:06.422 25012 25012 D e       : Documents
01-19 22:19:06.425 25012 25012 D e       : ResolveInfo{d143e79 com.nvidia.blakepairing/.BlakePairingLoadingActivity m=0x108000}
01-19 22:19:06.425 25012 25012 D e       : com.nvidia.blakepairing.BlakePairingLoadingActivity
01-19 22:19:06.425 25012 25012 D e       : SHIELD Controller
01-19 22:19:06.428 25012 25012 D e       : ResolveInfo{73da7be com.nvidia.inputviewer/.MainActivity m=0x108000}
01-19 22:19:06.428 25012 25012 D e       : com.nvidia.inputviewer.MainActivity
01-19 22:19:06.428 25012 25012 D e       : Input Viewer
01-19 22:19:06.431 25012 25012 D e       : ResolveInfo{950801f com.plexapp.mediaserver.smb/com.plexapp.mediaserver.MainActivity m=0x108000}
01-19 22:19:06.431 25012 25012 D e       : com.plexapp.mediaserver.MainActivity
01-19 22:19:06.431 25012 25012 D e       : Plex Media Server
01-19 22:19:06.566   693  1416 I WindowManager: Destroying surface Surface(name=com.google.android.leanbacklauncher/com.google.android.leanbacklauncher.MainActivity) called by com.android.server.wm.WindowStateAnimator.destroySurface:2016 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:881 com.android.server.wm.WindowState.destroyOrSaveSurface:2087 com.android.server.wm.WindowManagerService.tryStartExitingAnimation:3058 com.android.server.wm.WindowManagerService.relayoutWindow:2938 com.android.server.wm.Session.relayout:216 android.view.IWindowSession$Stub.onTransact:286 com.android.server.wm.Session.onTransact:137
01-19 22:19:06.664   693   713 I ActivityManager: Displayed news.androidtv.tvapprepo/.activities.MainActivity: +606ms
01-19 22:19:06.671  1568  1568 D ViewRootImpl[MainActivity]: changeCanvasOpacity: opaque=false
01-19 22:19:06.672  1568  1568 D ViewRootImpl[MainActivity]: changeCanvasOpacity: opaque=false
01-19 22:19:06.754 25012 25012 D AndroidRuntime: Shutting down VM
01-19 22:19:06.779 25012 25012 E AndroidRuntime: FATAL EXCEPTION: main
01-19 22:19:06.779 25012 25012 E AndroidRuntime: Process: news.androidtv.tvapprepo, PID: 25012
01-19 22:19:06.779 25012 25012 E AndroidRuntime: com.google.firebase.database.c: No properties to serialize found on class news.androidtv.tvapprepo.b.a
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at com.google.android.gms.b.lk$a.<init>(Unknown Source)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at com.google.android.gms.b.lk.a(Unknown Source)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at com.google.android.gms.b.lk.e(Unknown Source)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at com.google.android.gms.b.lk.b(Unknown Source)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at com.google.android.gms.b.lk.a(Unknown Source)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at com.google.firebase.database.a.a(Unknown Source)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at news.androidtv.tvapprepo.b.d$1.a(Unknown Source)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at com.google.android.gms.b.hy.a(Unknown Source)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at com.google.android.gms.b.iz.b(Unknown Source)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at com.google.android.gms.b.jd$1.run(Unknown Source)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at android.os.Handler.handleCallback(Handler.java:751)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:95)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:154)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:6120)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
01-19 22:19:06.779 25012 25012 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
01-19 22:19:06.780   693  1529 W ActivityManager:   Force finishing activity news.androidtv.tvapprepo/.activities.MainActivity```

Live Channel

Using metadata from apps, create a Live Channel that can display YouTube video trailers for the apps (assuming these videos exist). The app link would be an install card which would open up the app to that app's details page.

This would need each app to have some sort of videoUrl link.

The app link can receive data stored in the InternalProviderData for the program.

The Live Channel would need to be able to play YouTube videos

Create Play Store distribution

Use product flavors to create a version for the Play Store that only creates shortcuts (no separate store) and no internal updates.

Then keep an unmodified version for power users

Move LeanbackShortcut property

Each apk datum should not contain a leanback shortcut property. The shortcut apk file does not change per-version. Instead, there should be another main leaf with something called 'leanbackShortcuts'. If that value is present based on the package name, then it downloads the shortcut.

If the package name is not there, we don't download it.

The value refers to the download URL from the apk uploaded to Firebase.

Tv app repo crash

I have Xiaomi Mi Box Android 6.0
I have installed your app from the play Store. It seems to be just what I was looking for. But I have a problem. The problem I am having it the app crashes every time I try to create a shortcut

Fix Firebase permissions

Right now read = true always because I can't figure out how to get the right permissions. This will require re-reading the docs

Reduce install dialog popups

Starting a download works as intended, but then multiple install dialogs will appear for the app which is not intended.

Crash trying to uninstall app

Crash log

Fatal Exception: java.lang.NullPointerException: Attempt to read from field 'java.lang.String android.content.pm.PackageInfo.packageName' on a null object reference
   at news.androidtv.tvapprepo.utils.PackageInstallerUtils.uninstallApp(Unknown Source)
   at news.androidtv.tvapprepo.fragments.AppDetailsFragment$ItemViewClickedListener.onItemClicked(Unknown Source)
   at news.androidtv.tvapprepo.fragments.AppDetailsFragment$ItemViewClickedListener.onItemClicked(Unknown Source)
   at android.support.v17.leanback.widget.DetailsOverviewRowPresenter$ActionsItemBridgeAdapter$1.onClick(DetailsOverviewRowPresenter.java:90)
   at android.view.View.performClick(View.java:5198)
   at android.view.View.onKeyUp(View.java:9879)
   at android.widget.TextView.onKeyUp(TextView.java:6251)
   at android.view.KeyEvent.dispatch(KeyEvent.java:2664)
   at android.view.View.dispatchKeyEvent(View.java:9234)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
   at android.support.v17.leanback.widget.BaseGridView.dispatchKeyEvent(BaseGridView.java:843)
   at android.support.v17.leanback.widget.HorizontalGridView.dispatchKeyEvent(HorizontalGridView.java:50)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
   at android.support.v17.leanback.widget.BaseGridView.dispatchKeyEvent(BaseGridView.java:843)
   at android.support.v17.leanback.widget.VerticalGridView.dispatchKeyEvent(VerticalGridView.java:40)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
   at com.android.internal.policy.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2395)
   at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1727)
   at android.app.Activity.dispatchKeyEvent(Activity.java:2725)
   at com.android.internal.policy.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2310)
   at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4273)
   at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4235)
   at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3783)
   at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3836)
   at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3802)
   at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3931)
   at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3810)
   at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3988)
   at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3783)
   at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3836)
   at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3802)
   at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3810)
   at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3783)
   at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3836)
   at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3802)
   at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3964)
   at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4125)
   at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2264)
   at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1885)
   at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1876)
   at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2241)
   at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
   at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
   at android.os.MessageQueue.next(MessageQueue.java:323)
   at android.os.Looper.loop(Looper.java:135)
   at android.app.ActivityThread.main(ActivityThread.java:5482)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

DTV APP

I'm using your software on KIII PRO Android 7.1.2 by supercelerom and your app just doenst work when I try to use on DTV APP.

Please could you fix it?

DTV APP:
DTV_2017-07-25.zip

Read Launcher Shortcuts

What if I could read the launcher shortcuts from an XML file or dynamically on Android 7.1+ devices and make it easy to put those Intents into a shortcut on the homescreen?

Pull data from Firebase

From Firebase I want to be able to obtain a list of APKs which need to be generated. Then my Python script will generate them. Then I upload these APKs.

Support for multiple APKs

Apps like GPhotos have several APK variants for different device types. These should be supported. Probably have a JSON structure / key:value set. When this is found, we open up a dialog for users to pick the best one.

Add a row for downloaded APKs

On Nougat, there's a weird bug where you can't install an app through an intent right after you download it. Like what TinyDL does, add a row for downloaded APK files so that users can at least see their files and pick one to download.

Graphics

Come up with some assets:

  • App icon
  • App banner
  • Sideloadtag
  • Downloaded APK
  • About app / credits

1.1.3 OpenCommunity Download links To Incorrect File?

I attempted to download the TV App Repo "Open Community" version 1.1.3 .apk file at:-

https://github.com/ITVlab/TvAppRepo/releases/download/1.1.3/app-opencommunity-release.apk

but what I appear to get instead is an old version that identifies as 1.0.6.

Play Store version of 1.1.3 appears to be OK.

Could we please fix the link and/or file?

StephenH

mkjkjt

URL to APK: hyueuuu
Banner(If Submitted): tuxute5au

Build error see comment

Pulling down the repo and then running on a 7.0 emulator produces this error

FATAL EXCEPTION: main Process: news.androidtv.tvapprepo, PID: 4377
java.lang.RuntimeException: Unable to start activity ComponentInfo{news.androidtv.tvapprepo/news.androidtv.tvapprepo.activities.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference

Which automatically closes the app upon launch

Folders

What if I could generate shortcuts with a specific Intent to an activity in this app. This Intent would load a specific list of apps, much like a folder.

Language support

I'm not sure but I've tried creating shortcuts for non English apps and it keeps failing and get a build failed error. (Chinese and Korean characters for app name)
Is this due to language restrictions? Or the app isn't supported.
Thanks

Add option to force screen orientation

Some handheld apps force vertical orientation preventing a correct visualisation on TV, adding an option to force landscape orientation would enhance UX on TV.

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.