Giter Site home page Giter Site logo

nyaapy's Introduction

GitHub license

Unofficial Python module for Nyaa.si (WebScraping) and Nyaa.pantsu.cat (API wrapper)

Supports Python 3+

Installation

Install it using pip.

pip install nyaapy

License

Copyright 2017 Juanjo Salvador

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

nyaapy's People

Contributors

cosmosatlas avatar d-grossman avatar euklios avatar hungry-dolphin avatar husudosu avatar jennisu avatar juanjosalvador avatar saltaccount avatar solimm4sks 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

Watchers

 avatar  avatar  avatar  avatar  avatar

nyaapy's Issues

Write some tests

I'm testing it by checking manually the values of every query, but it will be nice if I can test my code using pytest or something.

Update Pantsu data

Since nyaa.pantsu.cat has been moved to nyaa.net, we need to update our endpoints.

We need to go deeper!

NyaaPy for Nyaa.si (not Pantsu) needs to be able to parse single torrents too, not only lists or querys.

Maybe it will be nice if we can parse users profiles too.

Make some params optionals

search() takes 5 parameters, and all of them are mandatory.

The issue here is, search() needs to assign the value 0 for each integer parameter if its value is None.

Improve cat-subcat extraction

Each category has its own subcategories, so I group all of them into a dict with subdicts.

The key to access to category and subcategory name, is a number. I'm getting this error:

(nyaa) {00:31:54} [~/Proyectos/NyaaPy] [version-0.4 *] → python3 tests/test.py        
Traceback (most recent call last):
  File "tests/test.py", line 37, in <module>
    nyaa_news()
  File "tests/test.py", line 12, in nyaa_news
    news = Nyaa.news(5)
  File "/usr/local/lib/python3.6/site-packages/nyaapy-0.4.1-py3.6.egg/NyaaPy/__init__.py", line 88, in news
    'category': get_categories(block[0]),
  File "/usr/local/lib/python3.6/site-packages/nyaapy-0.4.1-py3.6.egg/NyaaPy/__init__.py", line 173, in get_categories
    return "{} - {}".format(categories[cat]['name'], categories[cat]['subcats'][subcat])
TypeError: string indices must be integers

Confusion

The search function seems to return a torrent object list?

Remakes, trusted and those things

Nyaa.si uses a color-based system just to add extra info for every torrent, such as trusted user, remake, etc.

Would be fine for v0.7.0 (Hinata)

Green entries (trusted) are: Torrents uploaded by trusted users.

Red entries (remake) are torrents that match any of the following:

  • Reencode of original release.
  • Remux of another uploader's original release for hardsubbing and/or fixing purposes.
  • Reupload of original release using non-original file names.
  • Reupload of original release with missing and/or unrelated additional files.

Orange entries are: Batches of completed series.

Grey entries are: Hidden torrents.

Request module not found

When I install NyaaPy into another virtualenv (not the development one), and trying to using it, it seems like pip doesn't install NyaaPy's dependencies.

No filter documentation

I would really appreciate it if I could see the filter list to know what I can filter. Right now it is just an empty doc.

Cheers

Torrent by ID (v0.6.0)

Currently I have a method (dev) at Nyaa and NyaaPantsu thats retrieves a single torrent.

For Nyaa, retrieves it using his URL, for NyaaPantsu, using ID.

Nyaa needs to use ID too, so we need to add the ID as an element of the Nyaa dict

Fix the example code

On branch version-0.4 there is a README with errors. We need to fix the error on the example code, there is no title in the returned dict. Instead of this, it should be name.

Return JSON objects instead of dictionaries

My first idea was convert XML to JSON, but for this purpose.

XML > dictionary > JSON

This seems a good idea:

o = xmltodict.parse('<e> <a>text</a> <a>text</a> </e>')
json.dumps(o) # '{"e": {"a": ["text", "text"]}}'

[Nyaa.si][last_uploaded_torrents] How about using RSS?

I guess it would be a little faster, using RSS source for last uploaded torrents. What do you think about it? It can done via LXML or we could use feed_parser library.
RSS source contains almost every torrent of the first page of nyaa (1 missing if I saw it correctly).

Nyaa.si pagination

Nyaa.si makes a pagination with the results (showing 75 by default).

Default results per page: 75
Max results: 1000

Refactor "utils" module to not use a class

The Utils class should not be a class, actually is just a bunch of common functions joined into a single file. So, we can import that functions without instanciate a class.

Instead of using

from NyaaPy.utils import Utils
utils = Utils()

we can use just

from Nyaa import utils

utils.myFunction()

Related: #21

Python 3.10 support

At this point, I'm sure this library is not using anything uncommon for Python 3.10 but we should need to make sure it's fully compatible.

Improve PyPI data

Add categories, keywords, something else that I need to put NyaaPy over the wave.

Exception when the response contains emojis -

Hi. I'm getting this error with NyaaPy 0.6.3:

  File "/opt/homebrew/lib/python3.10/site-packages/NyaaPy/nyaa.py", line 49, in search
    json_data = utils.parse_nyaa(
  File "/opt/homebrew/lib/python3.10/site-packages/NyaaPy/utils.py", line 93, in parse_nyaa
    for tr in tree.xpath("//tbody//tr")[:limit]:
AttributeError: 'NoneType' object has no attribute 'xpath'

It seems when the response contains emoji the parser fails.

Here's a proof of concept with sample html. Note the smiling emojis in the html (😀)


from lxml import etree


html = """
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>Test Title :: Nyaa</title>

    <meta name="viewport" content="width=480px" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <link rel="shortcut icon" type="image/png" href="/static/favicon.png" />
    <link rel="icon" type="image/png" href="/static/favicon.png" />
    <link rel="mask-icon" href="/static/pinned-tab.svg" color="#3582F7" />
    <link
      rel="alternate"
      type="application/rss+xml"
      href="https://nyaa.si/?page=rss&amp;q=test"
    />

    <meta property="og:site_name" content="Nyaa" />
    <meta property="og:title" content="Test Title :: Nyaa" />
    <meta property="og:image" content="/static/img/avatar/default.png" />
    <meta
      property="og:description"
      content="Search for 'Test Title'"
    />

    <!-- Bootstrap core CSS -->
    <!--
			Note: This has been customized at http://getbootstrap.com/customize/ to
			set the column breakpoint to tablet mode, instead of mobile. This is to
			make the navbar not look awful on tablets.
		-->
    <link
      href="/static/css/bootstrap.min.css?t=1608007388"
      rel="stylesheet"
      id="bsThemeLink"
    />
    <link
      href="/static/css/bootstrap-xl-mod.css?t=1608007388"
      rel="stylesheet"
    />
    <!--
			This theme changer script needs to be inline and right under the above stylesheet link to prevent FOUC (Flash Of Unstyled Content)
			Development version is commented out in static/js/main.js at the bottom of the file
		-->
    <script>
      function toggleDarkMode() {
        "dark" === localStorage.getItem("theme")
          ? setThemeLight()
          : setThemeDark();
      }
      function setThemeDark() {
        (bsThemeLink.href = "/static/css/bootstrap-dark.min.css?t=1608007388"),
          localStorage.setItem("theme", "dark"),
          document.body !== null && document.body.classList.add("dark");
      }
      function setThemeLight() {
        (bsThemeLink.href = "/static/css/bootstrap.min.css?t=1608007388"),
          localStorage.setItem("theme", "light"),
          document.body !== null && document.body.classList.remove("dark");
      }
      if ("undefined" != typeof Storage) {
        var bsThemeLink = document.getElementById("bsThemeLink");
        "dark" === localStorage.getItem("theme") && setThemeDark();
      }
    </script>
    <link
      rel="stylesheet"
      href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.2/css/bootstrap-select.min.css"
      integrity="sha256-an4uqLnVJ2flr7w0U74xiF4PJjO2N5Df91R2CUmCLCA="
      crossorigin="anonymous"
    />
    <link
      rel="stylesheet"
      href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
      integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0="
      crossorigin="anonymous"
    />

    <!-- Custom styles for this template -->
    <link href="/static/css/main.css?t=1645052395" rel="stylesheet" />

    <!-- Core JavaScript -->
    <script
      src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"
      integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
      crossorigin="anonymous"
    ></script>
    <script
      src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"
      integrity="sha256-U5ZEeKfGNOja007MMD3YBI0A3OSZOQbeG6z2f2Y0hu8="
      crossorigin="anonymous"
    ></script>
    <script
      src="https://cdnjs.cloudflare.com/ajax/libs/markdown-it/8.3.1/markdown-it.min.js"
      integrity="sha256-3WZyZQOe+ql3pLo90lrkRtALrlniGdnf//gRpW0UQks="
      crossorigin="anonymous"
    ></script>
    <!-- Modified to not apply border-radius to selectpickers and stuff so our navbar looks cool -->
    <script src="/static/js/bootstrap-select.min.js?t=1623304983"></script>
    <script src="/static/js/main.min.js?t=1623304983"></script>

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->

    <link
      rel="search"
      type="application/opensearchdescription+xml"
      title="Nyaa.si"
      href="/static/search.xml"
    />
  </head>
  <body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-static-top navbar-inverse">
      <div class="container">
        <div class="navbar-header">
          <button
            type="button"
            class="navbar-toggle collapsed"
            data-toggle="collapse"
            data-target="#navbar"
            aria-expanded="false"
            aria-controls="navbar"
          >
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="/">Nyaa</a>
        </div>
        <!--/.navbar-header -->
        <div id="navbar" class="navbar-collapse collapse">
          <ul class="nav navbar-nav">
            <li><a href="/upload">Upload</a></li>
            <li class="dropdown">
              <a
                href="#"
                class="dropdown-toggle"
                data-toggle="dropdown"
                role="button"
                aria-haspopup="true"
                aria-expanded="false"
              >
                Info
                <span class="caret"></span>
              </a>
              <ul class="dropdown-menu">
                <li><a href="/rules">Rules</a></li>
                <li><a href="/help">Help</a></li>
              </ul>
            </li>
            <li>
              <a
                href="/?page=rss&amp;q=test"
                >RSS</a
              >
            </li>
            <li><a href="https://twitter.com/NyaaV2">Twitter</a></li>
            <li><a href="//sukebei.nyaa.si">Fap</a></li>
          </ul>

          <ul class="nav navbar-nav navbar-right">
            <li class="dropdown">
              <a
                href="#"
                class="dropdown-toggle visible-lg visible-sm visible-xs"
                data-toggle="dropdown"
                role="button"
                aria-haspopup="true"
                aria-expanded="false"
              >
                <i class="fa fa-user fa-fw"></i>
                Guest
                <span class="caret"></span>
              </a>
              <a
                href="#"
                class="dropdown-toggle hidden-lg hidden-sm hidden-xs"
                data-toggle="dropdown"
                role="button"
                aria-haspopup="true"
                aria-expanded="false"
              >
                <i class="fa fa-user fa-fw"></i>
                <span class="caret"></span>
              </a>
              <ul class="dropdown-menu">
                <li>
                  <a href="/login">
                    <i class="fa fa-sign-in fa-fw"></i>
                    Login
                  </a>
                </li>
                <li>
                  <a href="/register">
                    <i class="fa fa-pencil fa-fw"></i>
                    Register
                  </a>
                </li>
              </ul>
            </li>
          </ul>

          <div class="search-container visible-xs visible-sm">
            <form class="navbar-form navbar-right form" action="/" method="get">
              <input
                type="text"
                class="form-control"
                name="q"
                placeholder="Search..."
                value="Test Title"
              />
              <br />

              <select
                class="form-control"
                title="Filter"
                data-width="120px"
                name="f"
              >
                <option value="0" title="No filter" selected>No filter</option>
                <option value="1" title="No remakes">No remakes</option>
                <option value="2" title="Trusted only">Trusted only</option>
              </select>

              <br />

              <select
                class="form-control"
                title="Category"
                data-width="200px"
                name="c"
              >
                <option value="0_0" title="All categories" selected>
                  All categories
                </option>
                <option value="1_0" title="Anime">Anime</option>
                <option value="1_1" title="Anime - AMV">
                  - Anime Music Video
                </option>
                <option value="1_2" title="Anime - English" selected>
                  - English-translated
                </option>
                <option value="1_3" title="Anime - Non-English">
                  - Non-English-translated
                </option>
                <option value="1_4" title="Anime - Raw">- Raw</option>
                <option value="2_0" title="Audio">Audio</option>
                <option value="2_1" title="Audio - Lossless">- Lossless</option>
                <option value="2_2" title="Audio - Lossy">- Lossy</option>
                <option value="3_0" title="Literature">Literature</option>
                <option value="3_1" title="Literature - English">
                  - English-translated
                </option>
                <option value="3_2" title="Literature - Non-English">
                  - Non-English-translated
                </option>
                <option value="3_3" title="Literature - Raw">- Raw</option>
                <option value="4_0" title="Live Action">Live Action</option>
                <option value="4_1" title="Live Action - English">
                  - English-translated
                </option>
                <option value="4_2" title="Live Action - Idol/PV">
                  - Idol/Promotional Video
                </option>
                <option value="4_3" title="Live Action - Non-English">
                  - Non-English-translated
                </option>
                <option value="4_4" title="Live Action - Raw">- Raw</option>
                <option value="5_0" title="Pictures">Pictures</option>
                <option value="5_1" title="Pictures - Graphics">
                  - Graphics
                </option>
                <option value="5_2" title="Pictures - Photos">- Photos</option>
                <option value="6_0" title="Software">Software</option>
                <option value="6_1" title="Software - Apps">
                  - Applications
                </option>
                <option value="6_2" title="Software - Games">- Games</option>
              </select>

              <br />

              <button class="btn btn-primary form-control" type="submit">
                <i class="fa fa-search fa-fw"></i> Search
              </button>
            </form>
          </div>
          <!--/.search-container -->

          <form class="navbar-form navbar-right form" action="/" method="get">
            <div class="input-group search-container hidden-xs hidden-sm">
              <div class="input-group-btn nav-filter" id="navFilter-criteria">
                <select
                  class="selectpicker show-tick"
                  title="Filter"
                  data-width="120px"
                  name="f"
                >
                  <option value="0" title="No filter" selected>
                    No filter
                  </option>
                  <option value="1" title="No remakes">No remakes</option>
                  <option value="2" title="Trusted only">Trusted only</option>
                </select>
              </div>

              <div class="input-group-btn nav-filter" id="navFilter-category">
                <!--
									On narrow viewports, there isn't enough room to fit the full stuff in the selectpicker, so we show a full-width one on wide viewports, but squish it on narrow ones.
								-->
                <select
                  class="selectpicker show-tick"
                  title="Category"
                  data-width="130px"
                  name="c"
                >
                  <option value="0_0" title="All categories" selected>
                    All categories
                  </option>
                  <option value="1_0" title="Anime">Anime</option>
                  <option value="1_1" title="Anime - AMV">
                    - Anime Music Video
                  </option>
                  <option value="1_2" title="Anime - English" selected>
                    - English-translated
                  </option>
                  <option value="1_3" title="Anime - Non-English">
                    - Non-English-translated
                  </option>
                  <option value="1_4" title="Anime - Raw">- Raw</option>
                  <option value="2_0" title="Audio">Audio</option>
                  <option value="2_1" title="Audio - Lossless">
                    - Lossless
                  </option>
                  <option value="2_2" title="Audio - Lossy">- Lossy</option>
                  <option value="3_0" title="Literature">Literature</option>
                  <option value="3_1" title="Literature - English">
                    - English-translated
                  </option>
                  <option value="3_2" title="Literature - Non-English">
                    - Non-English-translated
                  </option>
                  <option value="3_3" title="Literature - Raw">- Raw</option>
                  <option value="4_0" title="Live Action">Live Action</option>
                  <option value="4_1" title="Live Action - English">
                    - English-translated
                  </option>
                  <option value="4_2" title="Live Action - Idol/PV">
                    - Idol/Promotional Video
                  </option>
                  <option value="4_3" title="Live Action - Non-English">
                    - Non-English-translated
                  </option>
                  <option value="4_4" title="Live Action - Raw">- Raw</option>
                  <option value="5_0" title="Pictures">Pictures</option>
                  <option value="5_1" title="Pictures - Graphics">
                    - Graphics
                  </option>
                  <option value="5_2" title="Pictures - Photos">
                    - Photos
                  </option>
                  <option value="6_0" title="Software">Software</option>
                  <option value="6_1" title="Software - Apps">
                    - Applications
                  </option>
                  <option value="6_2" title="Software - Games">- Games</option>
                </select>
              </div>
              <input
                type="text"
                class="form-control search-bar"
                name="q"
                placeholder="Search..."
                value="Test Title"
              />
              <div class="input-group-btn search-btn">
                <button class="btn btn-primary" type="submit">
                  <i class="fa fa-search fa-fw"></i>
                </button>
              </div>
            </div>
          </form>
        </div>
        <!--/.nav-collapse -->
      </div>
      <!--/.container -->
    </nav>

    <div class="container">
      <div class="table-responsive">
        <table
          class="table table-bordered table-hover table-striped torrent-list"
        >
          <thead>
            <tr class="default">
              <td>
                <a href="/?c=1_2" title="Anime - English-translated">
                  <img
                    src="/static/img/icons/nyaa/1_2.png"
                    alt="Anime - English-translated"
                    class="category-icon"
                  />
                </a>
              </td>
              <td colspan="2">
                <a
                  href="/view/test"
                  class="comments"
                  title="0 comments"
                >
                  <i class="fa fa-comments-o"></i>4</a
                >
                <a
                  href="/view/test"
                  title="Some Title"
                  >Some Title</a
                >
              </td>
              <td class="text-center">
                <a href="/download/test"
                  ><i class="fa fa-fw fa-download"></i
                ></a>
                <a
                  href="magnet:?xt=urn:"
                  ><i class="fa fa-fw fa-magnet"></i
                ></a>
              </td>
              <td class="text-center">0 GiB</td>
              <td class="text-center" data-timestamp="0">
                test
              </td>

              <td class="text-center">0</td>
              <td class="text-center">0</td>
              <td class="text-center">0</td>
            </tr>
            <tr class="default">
              <td>
                <a href="/?c=1_2" title="Anime - English-translated">
                  <img
                    src="/static/img/icons/nyaa/1_2.png"
                    alt="Anime - English-translated"
                    class="category-icon"
                  />
                </a>
              </td>
              <td colspan="2">
                <a
                  href="/view/test"
                  title="Some title 😀- this is a test"
                  >Some title 😀- this is a test</a
                >
              </td>
              <td class="text-center">
                <a href="/download/test"
                  ><i class="fa fa-fw fa-download"></i
                ></a>
                <a
                  href="magnet:?xt=urn:"
                  ><i class="fa fa-fw fa-magnet"></i
                ></a>
              </td>
              <td class="text-center">0 GiB</td>
              <td class="text-center" data-timestamp="0">
                 test
              </td>

              <td class="text-center">0</td>
              <td class="text-center">0</td>
              <td class="text-center">0</td>
            </tr>
            <tr class="default">
              <td>
                <a href="/?c=1_2" title="Anime - English-translated">
                  <img
                    src="/static/img/icons/nyaa/1_2.png"
                    alt="Anime - English-translated"
                    class="category-icon"
                  />
                </a>
              </td>
              <td colspan="2">
                <a
                  href="/view/test"
                  title="Some title"
                  >Test Title</a
                >
              </td>
              <td class="text-center">
                <a href="/download/test"
                  ><i class="fa fa-fw fa-download"></i
                ></a>
                <a
                  href="magnet:?xt=urn:"
                  ><i class="fa fa-fw fa-magnet"></i
                ></a>
              </td>
              <td class="text-center">0 MiB</td>
              <td class="text-center" data-timestamp="0">
                test
              </td>

              <td class="text-center">0</td>
              <td class="text-center">0</td>
              <td class="text-center">0</td>
            </tr>
            <tr class="default">
              <td>
                <a href="/?c=1_2" title="Anime - English-translated">
                  <img
                    src="/static/img/icons/nyaa/1_2.png"
                    alt="Anime - English-translated"
                    class="category-icon"
                  />
                </a>
              </td>
              <td colspan="2">
                <a
                  href="/view/test"
                  title="Some title 😀 - test"
                  >Some title 😀 - test</a
                >
              </td>
              <td class="text-center">
                <a href="/download/test"
                  ><i class="fa fa-fw fa-download"></i
                ></a>
                <a
                  href="magnet:?xt=urn:"
                  ><i class="fa fa-fw fa-magnet"></i
                ></a>
              </td>
              <td class="text-center">0 MiB</td>
              <td class="text-center" data-timestamp="0">
                test
              </td>

              <td class="text-center">0</td>
              <td class="text-center">0</td>
              <td class="text-center">0</td>
            </tr>
          </tbody>
        </table>
      </div>

      <div class="center">
        <div class="pagination-page-info">
          Displaying results 1-1 out of 1 results.<br />
          Please refine your search results if you can't find what you were
          looking for.
        </div>
      </div>
    </div>
    <!-- /container -->

    <footer style="text-align: center">
      <p>Dark Mode: <a href="#" id="themeToggle">Toggle</a></p>
    </footer>
  </body>
</html>

"""

parser = etree.HTMLParser()
tree_nyaa = etree.fromstring(html, parser)
print(tree_nyaa)

When there is emoji the above code prints None, if you remove the emoji it returns the object.

I was tinkering with this and it seems a potential solution would be to change the argument value in nyaa_parse call r.text with r.content (https://github.com/JuanjoSalvador/NyaaPy/blob/v0.6.3/NyaaPy/nyaa.py#L50) . r.content are the raw bytes. With r.content it seems to work and the above exception is not thrown. All emojis are preserved as well.

I tried this code and it worked request_text=r.content,.

Integrate Pantsu module

NyaaPy originally can search on Nyaa.si and Nyaa.pantsu.cat

Currently only nyaa.si is available, I have another module for NPC. Could be useful if we can mix both modules into NyaaPy again.

Remove "__init__.py"

Python 3 doesn't needs the __init__.py file for modules, so we can delete it and refactor.

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.