{ "info": { "author": "Alfred Santacatalina", "author_email": "alfred82santa@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.6", "Topic :: Communications :: Chat" ], "description": "\n.. |badge-python-versions| image:: https://img.shields.io/pypi/pyversions/whalesong.svg\n :alt: Python versions\n\n\n.. |badge-version| image:: https://img.shields.io/pypi/v/whalesong.svg\n :alt: Last version\n :target: https://pypi.org/project/whalesong/\n\n.. |badge-license| image:: https://img.shields.io/pypi/l/whalesong.svg\n :alt: License\n\n\n.. |badge-status| image:: https://img.shields.io/pypi/status/whalesong.svg\n :alt: Status\n\n|badge-status| |badge-license| |badge-version| |badge-python-versions|\n\n.. warning::\n\n **NEW VERSION 0.7.0**\n\n With new version some new requirements have been defined and some API change have been\n committed.\n\n Version 0.7.0 introduces new driver for Chromium browser. It has required some changes on base\n driver's API. It should not affect anyone. But be aware.\n\n\n.. warning::\n\n **NEW VERSION 0.7.0**\n\n Stream model now uses enumerations. It means that if you check stream states\n you must be aware that they are not a string anymore, now they are enumerations. Look at\n :class:`documentation `.\n\n\n=========\nWhalesong\n=========\n\nWhalesong is an asyncio python library to manage WebApps remotely.\nCurrently WhatsappWeb is implemented\n\n-------------\nDocumentation\n-------------\n\nhttp://whalesong.readthedocs.io/\n\n\n-------------------\nBinary Requirements\n-------------------\n\n* Python 3.6+\n\n.............\nUsing Firefox\n.............\n\n* Geckodriver\n* Firefox 50+\n\n..............\nUsing Chromium\n..............\n\n* Execute this after installation:\n\n .. code-block:: bash\n\n $ pyppeteer-install\n\n\n........................\nDevelopment requirements\n........................\n\n* node (only for development)\n* npm (only for development)\n* make (only for development)\n\n------------\nInstallation\n------------\n\nStarting with version `0.7.0` Whalesong introduces new `browsers backends `_. It means you must\ndecide which browser backend you want to use. So, depending on it:\n\n.. tip::\n\n You could install both with no problems.\n\n.............\nUsing Firefox\n.............\n\n.. code-block:: bash\n\n $ pip3 install whalesong[firefox]\n\n\n.. _using_chromium:\n\n..............\nUsing Chronium\n..............\n\n\n.. code-block:: bash\n\n $ pip3 install whalesong[chromium]\n\n\nIf you choose Chromium backend, you should execute this after installation:\n\n.. code-block:: bash\n\n $ pyppeteer-install\n\nIt will download a patched Chromium distribution needed for that backend.\n\n--------\nFeatures\n--------\n\n* Non blocking driver. It can do more than one thing at same time.\n* Monitor feature. Python code could react to Javascript event.\n* Iterator feature. Large item list are passed to Python as async iterators.\n* Persistent browser profile.\n* Easy way to build new features.\n* AmpersandJS/BackboneJS models and collection monitor.\n* AmpersandJS/BackboneJS field monitor.\n* Monitor localStorage.\n* Take screenshots (page and css elements).\n* Powered by AsyncIO.\n* Firefox backend.\n* Chromium backend.\n\n.................\nWhatsapp features\n.................\n\n* Monitor connection state.\n* Monitor QR changes.\n* Monitor stream state.\n* It's able to refresh QR.\n* It's able to take over session.\n* List chats.\n* List contacts.\n* List messages\n* Monitor new messages.\n* Monitor unread messages.\n* Monitor message acks.\n* Monitor new contacts.\n* Monitor new chats.\n* Send text messages.\n* Reply messages.\n* Send VCard messages.\n* Send Media (image/video/pdf) messages.\n* Send seen to chats.\n* Create groups\n* Manage groups (add/kick/promote/demote people)\n* Auto load link previews\n* Allow to check whether a contact is registered on Whatsapp.\n* Load and send stickers (even with a quoted message).\n* Presence monitor.\n* Profile and group's picture management.\n* (Un)Pin and (un)archive chats.\n* Report spam.\n* (Un)Star messages.\n* Status management.\n* Pushname management.\n* Display information management.\n* Live location management.\n* Mutes management.\n* It's able to revoke messages (delete messages for others).\n* List and manage WhatsApp Status version 3 (Stories).\n\n---------\nChangelog\n---------\n\nSee `documentation `_\n\n----\nTODO\n----\n\n* Tests, tests, tests.\n* Documentation. (`Work in progress `_)\n* More examples.\n* Missing Whatsapp features. (Work in progress)\n* Implement scriptlet for other WebApp (maybe `Android Messages `_).\n* Drop Selenium and Geckodriver. (Work in progress)\n* Create/Use a small footprint headless browser with async interface (like marionette). (Work in progress)\n* Push results. Avoid continuous polling. (Work in progress)\n\n\n.. _browser_backends:\n\n----------------\nBrowser backends\n----------------\n\nWhalesong use a browser backend in order to execute a WebApp (currently only WhatsAppWeb). All backends have\nan interface to manage webviews and that is what Whalesong use to manage applications. That interface change\ndepending on browser, but there is a standard interface called\n`WebDriver `_. Firsts Whalesong versions used to use a\n`Selenium `_ library in order to communicate with Firefox browser.\nThis backend is the default one for now, **but it will be deprecated in next versions and removed in version 1.0**.\n\n...............\nFirefox backend\n...............\n\nIt was the first backend developed. It uses `Selenium `_ library and\n`Geckodriver `_ to communicate with\nFirefox process. It is the most tested (the most, but not well).\n\n\nPros\n====\n\n* Tested (more or less).\n* Use Firefox (I prefer it in front Chromium).\n\nContras\n=======\n\n* Selenium is a huge library. It is wonderful for what it was created, but not for Whalsong.\n* Selenium is a synchronous library. It is a problem, because Whalesong is an asynchronous\n library. It means, Whalesong creates a thread pool to communicate with Selenium.\n\n* We need Geckodriver. Firefox does not implement Webdriver protocol by itself. Firefox has its\n own protocol called `Marionette `_.\n So Geckodriver is used as proxy between Webdriver protocol and Marionette protocol.\n\n* As Webdriver is a synchronous protocol. Whalesong must poll continuously to Firefox in order to get new events.\n There is no way to make Firefox notify Whalesong proactively. It means, Whalesong is polling for new results\n continuously, with an interval (by default 0.5 seconds).\n\n\n\n.. note::\n\n **There is only one way for the Firefox backend to survive:**\n\n Drop Selenium, drop Geckodriver, implement Marionette protocol directly and implement a notification\n system (I'm not sure it is possible in Marionette, currently).\n\n\nHow to use\n==========\n\nCurrently Firefox backend is the default one. But it will change on next versions. So, in order to ensure you use\nFirefox backend you must instantiate Whalesong with proper driver.\n\n.. code-block:: python3\n\n from whalesong import Whalesong\n from whalesong.driver_firefox import WhalesongDriver\n\n driver = WhalesongDriver(profile='/path/to/your/firefox/profile')\n whaleapp = Whalesong(driver=driver)\n\n................\nChromium backend\n................\n\nIt is the new one. It is implemented using `Pyppetter `_ which is inspired\non `Puppetter `_ (a `node` library to control Chromium headless, mainly, for testing). It uses\n`Devtools protocol `_ in order to communicate with the browser.\nIt is an asynchronous protocol over websocket.\n\nPros\n====\n\n* No more polling! When a result is produced it will send proactively to Whalesong. No more `sleeps`, no more waitings.\n* Small footprint (at least, it looks like, even being Chromium).\n* No extra processes (No more Geckodriver).\n* Application mode. No tabs, no URL field.\n* No huge libraries (No more Selenium).\n* No more threads in order to communicate with synchronous libraries.\n\nContras\n=======\n\n* It is Chromium. It uses Blink: over-vitaminized Webkit render. A memory eater.\n* Currently Pypperter has a bug. It makes to loose connection after 20 seconds. It is resolved in\n `miyakogi/pyppeteer/#160 `_ but is not approved\n yet (some test errors).\n\n* It uses a patched Chromium version from Puppetter. Whalesong needs this patch because it uses `Runtime.addBinding`\n command. It is not available in regular stable version. So, you must `download it `_ before\n use the backend.\n\n* Poorly tested.\n\n* There is a bug in Chromium under Wayland. It makes impossible to get WhastappWeb QR when\n Chromium is executed with window (no headless).\n\nHow to use\n==========\n\nIn order to use Chromium backend you must inject Chromium driver to Whalesong service constructor.\n\n.. code-block:: python3\n\n from whalesong import Whalesong\n from whalesong.driver_chromium import WhalesongDriver\n\n driver = WhalesongDriver(profile='/path/to/your/chromium/profile')\n whaleapp = Whalesong(driver=driver)\n\n..............\nOther backends\n..............\n\nNo, there are no other backends. But I'm thinking about other possibilities:\n\n* Create a small footprint webview using Webkit directly (GTK or QT ways are not an option).\n* Create a small footprint webview using Servo directly (I want to learn rust language).\n\n**Of course, any contribution will be welcome (so much).**\n\n---------------\nGetting started\n---------------\n\n............................\nInstall library requirements\n............................\n\n.. code-block:: bash\n\n $ make requirements\n\n.........................\nBuild Javascript scriplet\n.........................\n\nYou have to rebuild scriptlet after any change if you want to use in Python code.\n\n.. code-block:: bash\n\n $ make build-js\n\n.............\nBeautify code\n.............\n\nYou must beautify code before to make a pull request. Ugly code will not be accepted.\n\n.. code-block:: bash\n\n $ make beautify\n\n--------\nExamples\n--------\n\nSee `documentation `_\n\n----------------\nRelated projects\n----------------\n\n............\nwhalesong-js\n............\n\nPort of Whalesong to Node.js.\n\n**Author:** `@jabolina `_\n\n**Repository:** https://github.com/jabolina/whalesong-js\n\n\n-----\nLegal\n-----\n\nThis code is in no way affiliated with, authorized, maintained, sponsored or endorsed by WhatsApp\nor any of its affiliates or subsidiaries. This is an independent and unofficial software.\nUse at your own risk.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/alfred82santa/whalesong", "keywords": "WebApp Selenium Web Whatsapp Chat Bot Chatbot", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "whalesong", "package_url": "https://pypi.org/project/whalesong/", "platform": "", "project_url": "https://pypi.org/project/whalesong/", "project_urls": { "Homepage": "https://github.com/alfred82santa/whalesong" }, "release_url": "https://pypi.org/project/whalesong/0.9.0/", "requires_dist": [ "dirty-models (>=0.11)", "python-axolotl", "cryptography", "aiohttp (>=3.0)", "vobject", "pyppeteer; extra == 'chromium'", "websockets (<7.0); extra == 'chromium'", "selenium (>=3.4.3); extra == 'firefox'" ], "requires_python": "", "summary": "Whalesong is a python library to manage WebApps remotely. Currently WhatsappWeb is implemented", "version": "0.9.0" }, "last_serial": 4870996, "releases": { "0.3.0": [ { "comment_text": "", "digests": { "md5": "c716e8cf0bf900c848b32416db4d0a1e", "sha256": "877d225024dacf805700e949b679bd565023308f7d877d4d560bd53f54f1277e" }, "downloads": -1, "filename": "whalesong-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c716e8cf0bf900c848b32416db4d0a1e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 62393, "upload_time": "2018-06-25T13:01:13", "url": "https://files.pythonhosted.org/packages/c3/42/e18ff45a624bea94cc0fd3f1e2c67654ae17aaa9327954b26b3b7b34beb6/whalesong-0.3.0-py3-none-any.whl" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "b32023ad07c42aa511aab6ad18fdf308", "sha256": "4ce5b33cd37bd087a181da8f5ae881e7068bc6482177972fcd171321d7ae9a2e" }, "downloads": -1, "filename": "whalesong-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b32023ad07c42aa511aab6ad18fdf308", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 62888, "upload_time": "2018-06-28T21:30:43", "url": "https://files.pythonhosted.org/packages/06/8e/c76fb8de1d9d07b24441e7ffadc03ab4c6f5faa8d9468741f4c0cdede69f/whalesong-0.4.0-py3-none-any.whl" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "bc8d048b07ad139ce4cff2cd5c08db67", "sha256": "1c7afa8ca52d7d5c8244a392bb39c29b6ad4d07904fd97cd681c66e4679eee4a" }, "downloads": -1, "filename": "whalesong-0.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "bc8d048b07ad139ce4cff2cd5c08db67", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 62992, "upload_time": "2018-06-29T07:45:28", "url": "https://files.pythonhosted.org/packages/f7/f4/cba61282f92e0f569dca7614d33a1d1db65a8a0d3c8845b8e70226467c74/whalesong-0.4.1-py3-none-any.whl" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "0796326284241514a8f8422333626b7c", "sha256": "1ef0ed91c091feb6b56c7527ff6c27ebdb2bfa52aac2be99b2f5f20426e8252a" }, "downloads": -1, "filename": "whalesong-0.4.2-py3-none-any.whl", "has_sig": false, "md5_digest": "0796326284241514a8f8422333626b7c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 62993, "upload_time": "2018-06-29T07:56:36", "url": "https://files.pythonhosted.org/packages/40/7c/df0cfbd42a7d3a633ccb27d50f6ccd6c2bc99d8915b0b77c03b9c9e6caa6/whalesong-0.4.2-py3-none-any.whl" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "1c8505b58998d65b4a660c102815a953", "sha256": "31f8ffde802a1fe642d843dafe11c12a9d8579aacf1ffcddc784975f16436816" }, "downloads": -1, "filename": "whalesong-0.4.3-py3-none-any.whl", "has_sig": false, "md5_digest": "1c8505b58998d65b4a660c102815a953", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 63055, "upload_time": "2018-06-29T11:58:40", "url": "https://files.pythonhosted.org/packages/31/25/151d75225a13f12299bc3300498cde8e7870e0fef69df269e7e926b61972/whalesong-0.4.3-py3-none-any.whl" } ], "0.4.4": [ { "comment_text": "", "digests": { "md5": "2aa1ed94c62565f7cee8827c04eee34a", "sha256": "db11ca5b07c49dc1e517c19d0a4b4fb24caaea720c4de7e6d72fd1b01e6c5c85" }, "downloads": -1, "filename": "whalesong-0.4.4-py3-none-any.whl", "has_sig": false, "md5_digest": "2aa1ed94c62565f7cee8827c04eee34a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 63345, "upload_time": "2018-10-30T18:43:21", "url": "https://files.pythonhosted.org/packages/df/9f/8fc4a2c0cf72993fe05945089cf991333973a5769aa6db008c055db89f25/whalesong-0.4.4-py3-none-any.whl" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "61b789eeb61430a6b6fac5bb34033c91", "sha256": "95b2428fa4c1eb716ada1f6ffc8a52bb01e284025ac98d4acb38dd13d0797b87" }, "downloads": -1, "filename": "whalesong-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "61b789eeb61430a6b6fac5bb34033c91", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 66027, "upload_time": "2018-10-30T22:29:28", "url": "https://files.pythonhosted.org/packages/18/e3/5eab1e6e96aef3e9583181562320569ec0bc06f0e440965a6611bb079e27/whalesong-0.5.0-py3-none-any.whl" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "a9576a240c708c598e42eb69f5eb99d6", "sha256": "861c557ec85141441449aaa54f121cfd74330e253a1c6972e4132c92f2914113" }, "downloads": -1, "filename": "whalesong-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "a9576a240c708c598e42eb69f5eb99d6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 66260, "upload_time": "2018-11-02T12:55:56", "url": "https://files.pythonhosted.org/packages/4e/a0/b04da849759e1ac4d329f47d42f2751196ef365e7f4842d7e25ea122d435/whalesong-0.5.1-py3-none-any.whl" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "8aabaef7205412546efe9f8787d59f28", "sha256": "6929e797799889d2cba8345a3e90b8fba22a7199cf36e71b6fe4b694820147d8" }, "downloads": -1, "filename": "whalesong-0.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "8aabaef7205412546efe9f8787d59f28", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 70594, "upload_time": "2018-11-12T18:07:14", "url": "https://files.pythonhosted.org/packages/66/f9/7981ede46102658ad7effe4aff9de3df2c270552793904f7717710b06c13/whalesong-0.5.2-py3-none-any.whl" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "4e2b1e3e777b0db4d5ba9b7623ffefbd", "sha256": "0b07804cc3adb391fd781ce17f2e836421dc5a78d97bd2dca5e7ff17b443023f" }, "downloads": -1, "filename": "whalesong-0.5.3-py3-none-any.whl", "has_sig": false, "md5_digest": "4e2b1e3e777b0db4d5ba9b7623ffefbd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 70889, "upload_time": "2018-11-12T21:22:16", "url": "https://files.pythonhosted.org/packages/fa/ab/5df75fb3277cd80f668e7b064471a8776d3d95c939229986b70d540dc9e2/whalesong-0.5.3-py3-none-any.whl" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "dd3059294d4f3f08d8673f6cb5ef5be7", "sha256": "b1a386b4dae1aef38b9f11377a4c584c86e72edabbcd67fe14ccc774d6bad701" }, "downloads": -1, "filename": "whalesong-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "dd3059294d4f3f08d8673f6cb5ef5be7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 75796, "upload_time": "2018-11-20T17:42:07", "url": "https://files.pythonhosted.org/packages/20/d1/8bf326a2ffda10988c0052caf276118882a07b6229b4612e6720273c4726/whalesong-0.6.0-py3-none-any.whl" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "8c19a77e04475c4103f4db8788e29f13", "sha256": "34893f7689ae01f701bc2a11f81aa2612c8d5e5fe9e34b42aec658e5f5d0d2e6" }, "downloads": -1, "filename": "whalesong-0.7.0-py3-none-any.whl", "has_sig": false, "md5_digest": "8c19a77e04475c4103f4db8788e29f13", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 88388, "upload_time": "2018-11-26T12:23:21", "url": "https://files.pythonhosted.org/packages/61/3c/5817df083d437d94ee0e71d8b857fa63c8b0be24a59edd68a32c7f52dc03/whalesong-0.7.0-py3-none-any.whl" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "b06f3535b1015dc06b44ba908b6132da", "sha256": "7e745fab48727252771f91231e5e5a40288a3b1dd966f775e38e66ad06b2bd73" }, "downloads": -1, "filename": "whalesong-0.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b06f3535b1015dc06b44ba908b6132da", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 88399, "upload_time": "2018-11-29T21:05:43", "url": "https://files.pythonhosted.org/packages/71/b9/18f5798fb2282ec295419cbfc3e2761761deb1e2c5b6c0b5199097ca4a92/whalesong-0.7.1-py3-none-any.whl" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "1152c0b97e9ed321b62c4ee7c4bf93d3", "sha256": "f1f01dace9e11db21bb6673cc49d35c0a8498c21db32451dd9b0327860612cef" }, "downloads": -1, "filename": "whalesong-0.7.2-py3-none-any.whl", "has_sig": false, "md5_digest": "1152c0b97e9ed321b62c4ee7c4bf93d3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 91121, "upload_time": "2018-12-01T11:09:09", "url": "https://files.pythonhosted.org/packages/b2/30/40cc0977112daf24029ea4865411e71567802bc3711bc737a93d1e3a611a/whalesong-0.7.2-py3-none-any.whl" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "3dba2f64cc0c98ae2e213b9a1d169224", "sha256": "ebe8e3be1bbc0eada439fcd0cb00bf309cb8413f8ccdeae7ca3aa8c4e7369733" }, "downloads": -1, "filename": "whalesong-0.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3dba2f64cc0c98ae2e213b9a1d169224", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 73107, "upload_time": "2018-12-07T13:46:38", "url": "https://files.pythonhosted.org/packages/42/b5/485cec180e6e80029a9d192011369d758bc24148b0b54a12a9241db7f842/whalesong-0.8.0-py3-none-any.whl" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "cf4c762729efa64460928d47f48a0060", "sha256": "44df2e37255bcba72b1c932fc77a796d9efb5ea1410a139939a3b70104757337" }, "downloads": -1, "filename": "whalesong-0.8.1-py3-none-any.whl", "has_sig": false, "md5_digest": "cf4c762729efa64460928d47f48a0060", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 73050, "upload_time": "2019-01-27T18:32:34", "url": "https://files.pythonhosted.org/packages/f8/89/380ffae5a52e0a74872b61d2bdfbf1f3415f7a2db4b7710cc9b8668a4468/whalesong-0.8.1-py3-none-any.whl" } ], "0.8.2": [ { "comment_text": "", "digests": { "md5": "81034c502d7f2e18442d94ff0d1fc3b5", "sha256": "9759a569820236cfacdbc69a5fa786ae50c5ef910acb0287c506aaede448bd49" }, "downloads": -1, "filename": "whalesong-0.8.2-py3-none-any.whl", "has_sig": false, "md5_digest": "81034c502d7f2e18442d94ff0d1fc3b5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 73051, "upload_time": "2019-02-04T20:05:24", "url": "https://files.pythonhosted.org/packages/71/a5/aca46030765a2c7b748a59f5b7cfe27cbd04d1128adcab6f6b017923c514/whalesong-0.8.2-py3-none-any.whl" } ], "0.8.4": [ { "comment_text": "", "digests": { "md5": "ad0c7fed2507fcaa1ac66a707f0a4989", "sha256": "0aaf5b8a5af556598d110195ffa990e6ddce33f568316c2beedecc19bf8b7e43" }, "downloads": -1, "filename": "whalesong-0.8.4-py3-none-any.whl", "has_sig": false, "md5_digest": "ad0c7fed2507fcaa1ac66a707f0a4989", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 73221, "upload_time": "2019-02-14T22:44:21", "url": "https://files.pythonhosted.org/packages/13/31/3534bacb2f50f44e9d4b965e3448c5b763dd66fe657ad901795aef463a12/whalesong-0.8.4-py3-none-any.whl" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "e69c33beff2cd51f504fac80760ed84e", "sha256": "87a29525fa07042840efd2d37f94c749e7309d6f9fbb4baccbc29586240f1093" }, "downloads": -1, "filename": "whalesong-0.9.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e69c33beff2cd51f504fac80760ed84e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 75168, "upload_time": "2019-02-26T18:36:26", "url": "https://files.pythonhosted.org/packages/45/eb/5a8fe0958a38231fd1ede1102195a0a8fb9539b11d54390b81803269fd87/whalesong-0.9.0-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e69c33beff2cd51f504fac80760ed84e", "sha256": "87a29525fa07042840efd2d37f94c749e7309d6f9fbb4baccbc29586240f1093" }, "downloads": -1, "filename": "whalesong-0.9.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e69c33beff2cd51f504fac80760ed84e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 75168, "upload_time": "2019-02-26T18:36:26", "url": "https://files.pythonhosted.org/packages/45/eb/5a8fe0958a38231fd1ede1102195a0a8fb9539b11d54390b81803269fd87/whalesong-0.9.0-py3-none-any.whl" } ] }