Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/Pipfile b/Pipfile
- index ebd27c3..509a86c 100644
- --- a/Pipfile
- +++ b/Pipfile
- @@ -8,6 +8,10 @@ name = "pypi"
- requests = "*"
- colorama = "*"
- websockets = "*"
- +aiortc = "*"
- +aioice = "*"
- +numpy = "*"
- +opencv-python = "*"
- [dev-packages]
- diff --git a/Pipfile.lock b/Pipfile.lock
- index 537a464..7f587b8 100644
- --- a/Pipfile.lock
- +++ b/Pipfile.lock
- @@ -1,7 +1,7 @@
- {
- "_meta": {
- "hash": {
- - "sha256": "72faa30545bd7d8ea7bb612de96c61f91148be66e1b93cd2f7faa8ceef3a6c38"
- + "sha256": "df7daa88fb2fdbf455e155f191a46f6e7fcecdb2aaae4f60abe217f8a6677bd8"
- },
- "pipfile-spec": 6,
- "requires": {
- @@ -16,6 +16,35 @@
- ]
- },
- "default": {
- + "aioice": {
- + "hashes": [
- + "sha256:c06e218fa1a2b346ddea0089544d950a79ce6f2c9757cabc8d548eb3252072d9",
- + "sha256:f3623f2e6ba00aa2d41aefe4a7a5f7b8d5e6884a20c2e2a5b013f8164913126b"
- + ],
- + "index": "pypi",
- + "version": "==0.6.2"
- + },
- + "aiortc": {
- + "hashes": [
- + "sha256:743eccd61463631762debccf07d425cfef79640c75ad1c19da264c9738ab05e0"
- + ],
- + "index": "pypi",
- + "version": "==0.9.1"
- + },
- + "asn1crypto": {
- + "hashes": [
- + "sha256:2f1adbb7546ed199e3c90ef23ec95c5cf3585bac7d11fb7eb562a3fe89c64e87",
- + "sha256:9d5c20441baf0cb60a4ac34cc447c6c189024b6b4c6cd7877034f4965c464e49"
- + ],
- + "version": "==0.24.0"
- + },
- + "attrs": {
- + "hashes": [
- + "sha256:4b90b09eeeb9b88c35bc642cbac057e45a5fd85367b985bd2809c62b7b939265",
- + "sha256:e0d0eb91441a3b53dab4d9b743eafc1ac44476296a2053b6ca3af0b139faf87b"
- + ],
- + "version": "==18.1.0"
- + },
- "beautifulsoup4": {
- "hashes": [
- "sha256:11a9a27b7d3bddc6d86f59fb76afb70e921a25ac2d6cc55b40d072bd68435a76",
- @@ -38,6 +67,43 @@
- ],
- "version": "==2018.4.16"
- },
- + "cffi": {
- + "hashes": [
- + "sha256:151b7eefd035c56b2b2e1eb9963c90c6302dc15fbd8c1c0a83a163ff2c7d7743",
- + "sha256:1553d1e99f035ace1c0544050622b7bc963374a00c467edafac50ad7bd276aef",
- + "sha256:1b0493c091a1898f1136e3f4f991a784437fac3673780ff9de3bcf46c80b6b50",
- + "sha256:2ba8a45822b7aee805ab49abfe7eec16b90587f7f26df20c71dd89e45a97076f",
- + "sha256:3bb6bd7266598f318063e584378b8e27c67de998a43362e8fce664c54ee52d30",
- + "sha256:3c85641778460581c42924384f5e68076d724ceac0f267d66c757f7535069c93",
- + "sha256:3eb6434197633b7748cea30bf0ba9f66727cdce45117a712b29a443943733257",
- + "sha256:495c5c2d43bf6cebe0178eb3e88f9c4aa48d8934aa6e3cddb865c058da76756b",
- + "sha256:4c91af6e967c2015729d3e69c2e51d92f9898c330d6a851bf8f121236f3defd3",
- + "sha256:57b2533356cb2d8fac1555815929f7f5f14d68ac77b085d2326b571310f34f6e",
- + "sha256:770f3782b31f50b68627e22f91cb182c48c47c02eb405fd689472aa7b7aa16dc",
- + "sha256:79f9b6f7c46ae1f8ded75f68cf8ad50e5729ed4d590c74840471fc2823457d04",
- + "sha256:7a33145e04d44ce95bcd71e522b478d282ad0eafaf34fe1ec5bbd73e662f22b6",
- + "sha256:857959354ae3a6fa3da6651b966d13b0a8bed6bbc87a0de7b38a549db1d2a359",
- + "sha256:87f37fe5130574ff76c17cab61e7d2538a16f843bb7bca8ebbc4b12de3078596",
- + "sha256:95d5251e4b5ca00061f9d9f3d6fe537247e145a8524ae9fd30a2f8fbce993b5b",
- + "sha256:9d1d3e63a4afdc29bd76ce6aa9d58c771cd1599fbba8cf5057e7860b203710dd",
- + "sha256:a36c5c154f9d42ec176e6e620cb0dd275744aa1d804786a71ac37dc3661a5e95",
- + "sha256:a6a5cb8809091ec9ac03edde9304b3ad82ad4466333432b16d78ef40e0cce0d5",
- + "sha256:ae5e35a2c189d397b91034642cb0eab0e346f776ec2eb44a49a459e6615d6e2e",
- + "sha256:b0f7d4a3df8f06cf49f9f121bead236e328074de6449866515cea4907bbc63d6",
- + "sha256:b75110fb114fa366b29a027d0c9be3709579602ae111ff61674d28c93606acca",
- + "sha256:ba5e697569f84b13640c9e193170e89c13c6244c24400fc57e88724ef610cd31",
- + "sha256:be2a9b390f77fd7676d80bc3cdc4f8edb940d8c198ed2d8c0be1319018c778e1",
- + "sha256:ca1bd81f40adc59011f58159e4aa6445fc585a32bb8ac9badf7a2c1aa23822f2",
- + "sha256:d5d8555d9bfc3f02385c1c37e9f998e2011f0db4f90e250e5bc0c0a85a813085",
- + "sha256:e55e22ac0a30023426564b1059b035973ec82186ddddbac867078435801c7801",
- + "sha256:e90f17980e6ab0f3c2f3730e56d1fe9bcba1891eeea58966e89d352492cc74f4",
- + "sha256:ecbb7b01409e9b782df5ded849c178a0aa7c906cf8c5a67368047daab282b184",
- + "sha256:ed01918d545a38998bfa5902c7c00e0fee90e957ce036a4000a88e3fe2264917",
- + "sha256:edabd457cd23a02965166026fd9bfd196f4324fe6032e866d0f3bd0301cd486f",
- + "sha256:fdf1c1dc5bafc32bc5d08b054f94d659422b05aba244d6be4ddc1c72d9aa70fb"
- + ],
- + "version": "==1.11.5"
- + },
- "chardet": {
- "hashes": [
- "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
- @@ -53,6 +119,36 @@
- "index": "pypi",
- "version": "==0.3.9"
- },
- + "crcmod": {
- + "hashes": [
- + "sha256:dc7051a0db5f2bd48665a990d3ec1cc305a466a77358ca4492826f41f283601e"
- + ],
- + "version": "==1.7"
- + },
- + "cryptography": {
- + "hashes": [
- + "sha256:21af753934f2f6d1a10fe8f4c0a64315af209ef6adeaee63ca349797d747d687",
- + "sha256:27bb401a20a838d6d0ea380f08c6ead3ccd8c9d8a0232dc9adcc0e4994576a66",
- + "sha256:29720c4253263cff9aea64585adbbe85013ba647f6e98367efff9db2d7193ded",
- + "sha256:2a35b7570d8f247889784010aac8b384fd2e4a47b33e15c4a60b45a7c1944120",
- + "sha256:42c531a6a354407f42ee07fda5c2c0dc822cf6d52744949c182f2b295fbd4183",
- + "sha256:5eb86f03f9c4f0ac2336ac5431271072ddf7ecc76b338e26366732cfac58aa19",
- + "sha256:67f7f57eae8dede577f3f7775957f5bec93edd6bdb6ce597bb5b28e1bdf3d4fb",
- + "sha256:6ec84edcbc966ae460560a51a90046503ff0b5b66157a9efc61515c68059f6c8",
- + "sha256:7ba834564daef87557e7fcd35c3c3183a4147b0b3a57314e53317360b9b201b3",
- + "sha256:7d7f084cbe1fdb82be5a0545062b59b1ad3637bc5a48612ac2eb428ff31b31ea",
- + "sha256:82409f5150e529d699e5c33fa8fd85e965104db03bc564f5f4b6a9199e591f7c",
- + "sha256:87d092a7c2a44e5f7414ab02fb4145723ebba411425e1a99773531dd4c0e9b8d",
- + "sha256:8c56ef989342e42b9fcaba7c74b446f0cc9bed546dd00034fa7ad66fc00307ef",
- + "sha256:9449f5d4d7c516a6118fa9210c4a00f34384cb1d2028672100ee0c6cce49d7f6",
- + "sha256:bc2301170986ad82d9349a91eb8884e0e191209c45f5541b16aa7c0cfb135978",
- + "sha256:c132bab45d4bd0fff1d3fe294d92b0a6eb8404e93337b3127bdec9f21de117e6",
- + "sha256:c3d945b7b577f07a477700f618f46cbc287af3a9222cd73035c6ef527ef2c363",
- + "sha256:cee18beb4c807b5c0b178f4fa2fae03cef9d51821a358c6890f8b23465b7e5d2",
- + "sha256:d01dfc5c2b3495184f683574e03c70022674ca9a7be88589c5aba130d835ea90"
- + ],
- + "version": "==2.3"
- + },
- "idna": {
- "hashes": [
- "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e",
- @@ -60,6 +156,133 @@
- ],
- "version": "==2.7"
- },
- + "netifaces": {
- + "hashes": [
- + "sha256:0083ff8d89c559d0da0811c4930cf36e4945da0f03749e0f108678098d7d1607",
- + "sha256:179f2463469fe69c829c96c7b332c7fd3f01652311e36ae11e409e5b34eb9dad",
- + "sha256:19df6feff2af7a9179e42afdd01d79616d85b7ff4401b55ffce2df29d512a017",
- + "sha256:1a4082a52f521ceeaf3d0ff25c61a06d46444f3578f487935652ecc93becf538",
- + "sha256:1edeea7d739b1d716d15214039386e999f2e374aaeac0703092132b4e55ba461",
- + "sha256:2acb23ca092cc53b2b1f374132bbef5dd843767f6b10d31024f958474a1dfe96",
- + "sha256:38969c101f1e61c2a53af6a7b635f63e81085ae87413f1f5551a4d7057f5f773",
- + "sha256:4817871b226082600b64578549b9932bb07c1a42e9311ddd7c9dad08ff1fb22f",
- + "sha256:4bb6b02b7c485a595a9d75346df3a77fcaa12d2352437c49c2d73ed968572d72",
- + "sha256:674498dad41dacd86ec82e9e1793f9d8716755085c3776f051a266b1634a0b60",
- + "sha256:7ea8eb1e824f74c161396f0d6d76fa3943462ee9a4629c387c10399d2aee058c",
- + "sha256:8a69dc2743dcbb9b87fa3453820852f0feabc17b03d3841619e8e63f5d3902d5",
- + "sha256:9cf8cb2de7524c34808e6111dfb9f89e3b7c568e6953b3e02b8397447a6d8303",
- + "sha256:a77263e046636a761a2c3eeb0a56b5f8fa64f865efec91a9be008a46412b4ddd",
- + "sha256:aea569ce1a5a75b010758097199f84d9a3a109a696473c635bcf82f8a43cc551",
- + "sha256:bd590fcb75421537d4149825e1e63cca225fd47dad861710c46bd1cb329d8cbd",
- + "sha256:e1037cfad0e99a23fb4829f40302f3696395358950ba9f0315363a0e1eb04af6",
- + "sha256:e6d52aee254f9cf6192b54c156c67d54dcf451bec6781580844af892e4bf36bb",
- + "sha256:e76d38d9cff51ecf9fd5b8d0adf63f7b8875e1ac8548ccb52264939e308b771e"
- + ],
- + "version": "==0.10.7"
- + },
- + "numpy": {
- + "hashes": [
- + "sha256:07379fe0b450f6fd6e5934a9bc015025bb4ce1c8fbed3ca8bef29328b1bc9570",
- + "sha256:085afac75bbc97a096744fcfc97a4b321c5a87220286811e85089ae04885acdd",
- + "sha256:2d6481c6bdab1c75affc0fc71eb1bd4b3ecef620d06f2f60c3f00521d54be04f",
- + "sha256:2df854df882d322d5c23087a4959e145b953dfff2abe1774fec4f639ac2f3160",
- + "sha256:381ad13c30cd1d0b2f3da8a0c1a4aa697487e8bb0e9e0cbeb7439776bcb645f8",
- + "sha256:385f1ce46e08676505b692bfde918c1e0b350963a15ef52d77691c2cf0f5dbf6",
- + "sha256:4130e5ae16c656b7de654dc5e595cfeb85d3a4b0bb0734d19c0dce6dc7ee0e07",
- + "sha256:4d278c2261be6423c5e63d8f0ceb1b0c6db3ff83f2906f4b860db6ae99ca1bb5",
- + "sha256:51c5dcb51cf88b34b7d04c15f600b07c6ccbb73a089a38af2ab83c02862318da",
- + "sha256:589336ba5199c8061239cf446ee2f2f1fcc0c68e8531ee1382b6fc0c66b2d388",
- + "sha256:5ae3564cb630e155a650f4f9c054589848e97836bebae5637240a0d8099f817b",
- + "sha256:5edf1acc827ed139086af95ce4449b7b664f57a8c29eb755411a634be280d9f2",
- + "sha256:6b82b81c6b3b70ed40bc6d0b71222ebfcd6b6c04a6e7945a936e514b9113d5a3",
- + "sha256:6c57f973218b776195d0356e556ec932698f3a563e2f640cfca7020086383f50",
- + "sha256:758d1091a501fd2d75034e55e7e98bfd1370dc089160845c242db1c760d944d9",
- + "sha256:8622db292b766719810e0cb0f62ef6141e15fe32b04e4eb2959888319e59336b",
- + "sha256:8b8dcfcd630f1981f0f1e3846fae883376762a0c1b472baa35b145b911683b7b",
- + "sha256:91fdd510743ae4df862dbd51a4354519dd9fb8941347526cd9c2194b792b3da9",
- + "sha256:97fa8f1dceffab782069b291e38c4c2227f255cdac5f1e3346666931df87373e",
- + "sha256:9b705f18b26fb551366ab6347ba9941b62272bf71c6bbcadcd8af94d10535241",
- + "sha256:9d69967673ab7b028c2df09cae05ba56bf4e39e3cb04ebe452b6035c3b49848e",
- + "sha256:9e1f53afae865cc32459ad211493cf9e2a3651a7295b7a38654ef3d123808996",
- + "sha256:a4a433b3a264dbc9aa9c7c241e87c0358a503ea6394f8737df1683c7c9a102ac",
- + "sha256:baadc5f770917ada556afb7651a68176559f4dca5f4b2d0947cd15b9fb84fb51",
- + "sha256:c725d11990a9243e6ceffe0ab25a07c46c1cc2c5dc55e305717b5afe856c9608",
- + "sha256:d696a8c87315a83983fc59dd27efe034292b9e8ad667aeae51a68b4be14690d9",
- + "sha256:e1864a4e9f93ddb2dc6b62ccc2ec1f8250ff4ac0d3d7a15c8985dd4e1fbd6418",
- + "sha256:e1d18421a7e2ad4a655b76e65d549d4159f8874c18a417464c1d439ee7ccc7cd"
- + ],
- + "index": "pypi",
- + "version": "==1.14.5"
- + },
- + "opencv-python": {
- + "hashes": [
- + "sha256:02342c264ac95fddd6c5dfdc2bf71bf65617d4b0006b1d56b699b559671f8c9d",
- + "sha256:049b080c53bc660bce0819cbabeade21bef8cc4f8bd2d4b407e62a576c70ef44",
- + "sha256:050202bfcdb4d039dacdb567fe7c04f221f49b59ae5c50c2b111090e2c2451c6",
- + "sha256:0b75aa8255eea19c3382dad18423a9809873962b1f8488bc7a232dccb847bfc1",
- + "sha256:0fd4c86dbce58bdda149f5175093d50a0396ee5a981675c21b14a30aa667b97f",
- + "sha256:151d738d479df018edd050ed146567c6044a19b7b7e3d4e38c726e904bad7a3e",
- + "sha256:22e4b07e30da981a4013141809eb974a6f14cd712fa4fa80f8e70d8cc8c155f8",
- + "sha256:2cea809afe32cdccf97d66b131afc0fed80076244fb77b68ad9bf016d9cdc261",
- + "sha256:2ed45cfe330c0cbd925c5eb8de32b78fae68ae02952b46bf04af813eefc065b7",
- + "sha256:57b73647e25402cfd4ecb42d5bb3ddc5ec740a3124b4559c215c073127971cd5",
- + "sha256:66f35f28b705272f9f54ecb6decb8954d5b0b2db8506cdcf0c0f9b7014b5b446",
- + "sha256:76c732905bd84b84d7c6d8b924471a54d02088e649e006ad8abda4b630a5de93",
- + "sha256:7fef1125b7a38ce6a839338109de0dfba604552d5ac2f5a839ed1eb5cf8b5887",
- + "sha256:856f492631ac5523dd10c8273d8b7ec708199e4a9096deea880a6fc41ffd1bc9",
- + "sha256:a875254c00af87e0b9d81026dff165c7233a37672764f0d647a93fd702afa3ef",
- + "sha256:ba7571e14f7aca54552dc0ee71714bc4466c5076b571fed2dd6e1af6879a9532",
- + "sha256:bb79ef5db35f08bfd340cac25b89eab1dff0d5cbada9015a988d9092e48bbe5c",
- + "sha256:c2cb706934cc55023a2fa597422b4dd18b7bf3cb14033bfe00633b0f16ab9b48",
- + "sha256:d34fc04624220b0db3652cf52fc40867267a5c92825850ead98da686aea61bb6",
- + "sha256:e27976369de71b159d4e6cb2599bde860570c82eebd6fe2daaca494e6d3037b5",
- + "sha256:f4e3d807319e97e406fe76e722a67ec4c20dc2c26f7fea51b66cbb8a5c078eb1",
- + "sha256:fc9d2874bfd29dcf238f3d57871d718265573e5e0776980f6eea77409a9ce400"
- + ],
- + "index": "pypi",
- + "version": "==3.4.1.15"
- + },
- + "pycparser": {
- + "hashes": [
- + "sha256:99a8ca03e29851d96616ad0404b4aad7d9ee16f25c9f9708a11faf2810f7b226"
- + ],
- + "version": "==2.18"
- + },
- + "pyee": {
- + "hashes": [
- + "sha256:47f8fa96d6dee61c82001831e1fbba55f3f808003a322d0e6653aa01c59f6b9e",
- + "sha256:4ec22817297b7024f89721cc34f790ee2767c5b5ca44284c565ee643abafbe32"
- + ],
- + "version": "==5.0.0"
- + },
- + "pylibsrtp": {
- + "hashes": [
- + "sha256:0038538188149b97fcbf330ea81889b981581b1810789da85c4e20bd7ed8d2a4",
- + "sha256:05ddedaac59b11773223908ac762f54f9a39c9757afa01447f56b13d743c6419",
- + "sha256:0b1329b69d3eeac9cd05d42e289f7317a99ad49c245facb500ae8d894e53c447",
- + "sha256:175bf88fb5c23fde0287696a6b0febfb73c720cc0636bf1f3ed5b1b38c1898d0",
- + "sha256:2307dedd90a40042c3bdf157cef0348c5b1ddda362554d973abdc3c4864d0222",
- + "sha256:2514dc8cee864eb5becd46465a7550e2b2c7f2d6560b238ae72e5abde23254ac",
- + "sha256:288294536756e3e3c22218ced6b6c4a4001fd8d3326a2f62b1bf23a9aaae2b4e",
- + "sha256:2d01ccfede1f8f4fbb0702792c3309b6570bdef2f5ccc1701c05e1042c99de1a",
- + "sha256:46fe5c44dc382e1a3466b9f3ead640919427f0c6ab1235d5b03c04cc97fafb0b",
- + "sha256:4e0f15d966a183dbbbbe67f3d78c69ea8aa870c717aeafec4082f87e9427e7c6",
- + "sha256:6a20a1bc1bca93225374450c17fe01770fc03136ba1671296c6e283c72d14f75",
- + "sha256:9eebb78a1a0def6dbeca97cc5500947c42f9c1841245326f67444e33c88ce679",
- + "sha256:b59ad98677f52e931652052102a850cccf7103feba9e974a05e861bb53e5eb30",
- + "sha256:f0a12d6676c3c3447e792ad56b0e4d3868188dd9b616056edaaebfcc28ffa4fd",
- + "sha256:f9f6e46fb4f07fa7ad910514ebbdca3259deb010230715ca7f2cf430df5a9b60",
- + "sha256:fbd6b92e9a1c8611cfcd16d6bead82709838803b7b8a241b22ee991d4323173a"
- + ],
- + "version": "==0.5.5"
- + },
- + "pyopenssl": {
- + "hashes": [
- + "sha256:26ff56a6b5ecaf3a2a59f132681e2a80afcc76b4f902f612f518f92c2a1bf854",
- + "sha256:6488f1423b00f73b7ad5167885312bb0ce410d3312eb212393795b53c8caa580"
- + ],
- + "version": "==18.0.0"
- + },
- "requests": {
- "hashes": [
- "sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1",
- @@ -68,6 +291,13 @@
- "index": "pypi",
- "version": "==2.19.1"
- },
- + "six": {
- + "hashes": [
- + "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9",
- + "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"
- + ],
- + "version": "==1.11.0"
- + },
- "urllib3": {
- "hashes": [
- "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf",
- @@ -78,22 +308,30 @@
- },
- "websockets": {
- "hashes": [
- - "sha256:0b7b561bcbf992edd54e961b89551b5b6073415a0446fe445bd6554d41dabb95",
- - "sha256:2469c98f2254878a49a6eda248d3ed8a89bbdca85cc316ff72ea15924cec9e1f",
- - "sha256:29b676568e4fcb1a05064473b96243ef4e9391f251b4c485cf7f93507787b459",
- - "sha256:2a05e42400de009c1c330167cd6d90b300d2364d2dd1e6539d01a6a22901967b",
- - "sha256:39241fb291c1648e33dc41208be876a5771466291f0f6f7bff8f6732373084bd",
- - "sha256:43c332fc331541c57d40c124089b270d668c25a6b04908bd688969375db7327f",
- - "sha256:480259ec6e80f28859f23b5c231beb856fb96ab30e64ee621fdaf27da1515604",
- - "sha256:9049ec652713f5132b512d3498c2d37264580714ccc95dbc0f7f9622c3f6da7e",
- - "sha256:a17c45716178a42cc8f66f587507f01e169a75556749d88f714e4c1d295885d1",
- - "sha256:a49d315db5a7a19d55422e1678e8a1c3b9661d7296bef3179fa620cf80b12674",
- - "sha256:a911beb8149d7dae9d4c942927c448c05c41dfaa9c002a6bc26e269df932769b",
- - "sha256:cf34479130704797ce28a478f0b5985abe71ea90999a1c956e15fe0b0b11d0dc",
- - "sha256:d3724acff61ee1029fefc614cf005982338b033998a0b71fbb13a0a2fd99ab6f"
- + "sha256:0e2f7d6567838369af074f0ef4d0b802d19fa1fee135d864acc656ceefa33136",
- + "sha256:2a16dac282b2fdae75178d0ed3d5b9bc3258dabfae50196cbb30578d84b6f6a6",
- + "sha256:5a1fa6072405648cb5b3688e9ed3b94be683ce4a4e5723e6f5d34859dee495c1",
- + "sha256:5c1f55a1274df9d6a37553fef8cff2958515438c58920897675c9bc70f5a0538",
- + "sha256:669d1e46f165e0ad152ed8197f7edead22854a6c90419f544e0f234cc9dac6c4",
- + "sha256:695e34c4dbea18d09ab2c258994a8bf6a09564e762655408241f6a14592d2908",
- + "sha256:6b2e03d69afa8d20253455e67b64de1a82ff8612db105113cccec35d3f8429f0",
- + "sha256:79ca7cdda7ad4e3663ea3c43bfa8637fc5d5604c7737f19a8964781abbd1148d",
- + "sha256:7fd2dd9a856f72e6ed06f82facfce01d119b88457cd4b47b7ae501e8e11eba9c",
- + "sha256:82c0354ac39379d836719a77ee360ef865377aa6fdead87909d50248d0f05f4d",
- + "sha256:8f3b956d11c5b301206382726210dc1d3bee1a9ccf7aadf895aaf31f71c3716c",
- + "sha256:91ec98640220ae05b34b79ee88abf27f97ef7c61cf525eec57ea8fcea9f7dddb",
- + "sha256:952be9540d83dba815569d5cb5f31708801e0bbfc3a8c5aef1890b57ed7e58bf",
- + "sha256:99ac266af38ba1b1fe13975aea01ac0e14bb5f3a3200d2c69f05385768b8568e",
- + "sha256:9fa122e7adb24232247f8a89f2d9070bf64b7869daf93ac5e19546b409e47e96",
- + "sha256:a0873eadc4b8ca93e2e848d490809e0123eea154aa44ecd0109c4d0171869584",
- + "sha256:cb998bd4d93af46b8b49ecf5a72c0a98e5cc6d57fdca6527ba78ad89d6606484",
- + "sha256:e02e57346f6a68523e3c43bbdf35dde5c440318d1f827208ae455f6a2ace446d",
- + "sha256:e79a5a896bcee7fff24a788d72e5c69f13e61369d055f28113e71945a7eb1559",
- + "sha256:ee55eb6bcf23ecc975e6b47c127c201b913598f38b6a300075f84eeef2d3baff",
- + "sha256:f1414e6cbcea8d22843e7eafdfdfae3dd1aba41d1945f6ca66e4806c07c4f454"
- ],
- "index": "pypi",
- - "version": "==5.0.1"
- + "version": "==6.0"
- }
- },
- "develop": {}
- diff --git a/client.py b/client.py
- index 4d7944a..6d5197b 100644
- --- a/client.py
- +++ b/client.py
- @@ -53,6 +53,7 @@ if __name__ == '__main__':
- logging.basicConfig(filename=pinylib.CONFIG.DEBUG_FILE_NAME,
- level=pinylib.CONFIG.DEBUG_LEVEL, format=formater)
- log.info('Starting pinylib webrtc version: %s' % pinylib.__version__)
- + log.addHandler('ice')
- else:
- log.addHandler(logging.NullHandler())
- main()
- diff --git a/config.py b/config.py
- index 5a38b8d..2768c24 100644
- --- a/config.py
- +++ b/config.py
- @@ -1,17 +1,17 @@
- # Tinychat account.
- -ACCOUNT = ''
- +ACCOUNT = 'coco'
- # Password for account
- -PASSWORD = ''
- +PASSWORD = 'nigga'
- # Fallback rtc version.
- FALLBACK_RTC_VERSION = '2.0.22-4'
- # Log chat messages and events.
- CHAT_LOGGING = False
- # Show additional info/errors in console.
- -DEBUG_MODE = False
- +DEBUG_MODE = True
- # Log debug info to file.
- DEBUG_TO_FILE = False
- # Logging level for the debug file.
- -DEBUG_LEVEL = 30
- +DEBUG_LEVEL = 10
- # Use colors for the console.
- CONSOLE_COLORS = True
- # Time format.
- diff --git a/pinylib.py b/pinylib.py
- index e5dd814..b66ef6b 100644
- --- a/pinylib.py
- +++ b/pinylib.py
- @@ -4,6 +4,14 @@ import traceback
- import logging
- import time
- import websockets
- +from aiortc import (RTCPeerConnection, RTCSessionDescription, VideoStreamTrack, AudioStreamTrack,
- + RTCIceGatherer, RTCIceTransport, RTCIceParameters, RTCIceServer, RTCConfiguration)
- +from aiortc.mediastreams import VideoFrame
- +import math
- +import os
- +import cv2
- +import numpy
- +import aioice
- from colorama import init, Fore, Style
- import config
- @@ -35,6 +43,41 @@ COLOR = {
- 'bright_magenta': Style.BRIGHT + Fore.MAGENTA
- }
- +BLUE = (255, 0, 0)
- +GREEN = (0, 255, 0)
- +RED = (0, 0, 255)
- +
- +
- +def frame_from_bgr(data_bgr):
- + data_yuv = cv2.cvtColor(data_bgr, cv2.COLOR_BGR2YUV_YV12)
- + return VideoFrame(width=data_bgr.shape[1], height=data_bgr.shape[0], data=data_yuv.tobytes())
- +
- +def frame_to_bgr(frame):
- + data_flat = numpy.frombuffer(frame.data, numpy.uint8)
- + data_yuv = data_flat.reshape((math.ceil(frame.height * 12 / 8), frame.width))
- + return cv2.cvtColor(data_yuv, cv2.COLOR_YUV2BGR_YV12)
- +
- +
- +class ColorVideoStreamTrack(VideoStreamTrack):
- + def __init__(self, width, height, color):
- + data_bgr = numpy.zeros((height, width, 3), numpy.uint8)
- + data_bgr[:, :] = color
- + self.frame = frame_from_bgr(data_bgr=data_bgr)
- +
- + async def recv(self):
- + return self.frame
- +
- +
- +class CombinedVideoStreamTrack(VideoStreamTrack):
- + def __init__(self, tracks):
- + self.tracks = tracks
- +
- + async def recv(self):
- + coros = [track.recv() for track in self.tracks]
- + frames = await asyncio.gather(*coros)
- + data_bgrs = [frame_to_bgr(frame) for frame in frames]
- + data_bgr = numpy.hstack(data_bgrs)
- + return frame_from_bgr(data_bgr)
- class TinychatRTCClient(object):
- def __init__(self, room, nickname='', account=None, password=None):
- @@ -56,6 +99,11 @@ class TinychatRTCClient(object):
- self._ws = None
- self._req = 1
- self.is_published = False
- + self.rtc_env = RTCPeerConnection()
- + self.ice_env = None
- +
- + self.rtc_env.addTrack(AudioStreamTrack())
- + self.rtc_env.addTrack(VideoStreamTrack())
- def console_write(self, color, message):
- """
- @@ -145,6 +193,7 @@ class TinychatRTCClient(object):
- json_data = json.loads(data)
- log.debug(f'DATA: {data}')
- event = json_data['tc']
- + print(json_data)
- if event == 'ping':
- # just pong immediately, no real need to handle this event.
- await self.send({'tc': 'pong'})
- @@ -224,16 +273,17 @@ class TinychatRTCClient(object):
- await self.on_yut_stop(json_data)
- elif event == 'iceservers':
- - pass
- + self.ice_servers = json_data['servers']
- elif event == 'stream_connected':
- - pass
- + print(json_data)
- elif event == 'stream_closed':
- - pass
- + print(json_data)
- elif event == 'sdp':
- - pass
- + print(json_data)
- + await self.sdp_events(json_data)
- else:
- log.warning(f'Unknown Event: {event}, {json_data}')
- @@ -242,6 +292,78 @@ class TinychatRTCClient(object):
- if config.DEBUG_MODE:
- self.console_write(COLOR['white'], data)
- +
- + def description_to_dict(self, description):
- + return {
- + 'sdp': description.sdp,
- + 'type': description.type
- + }
- +
- + def description_from_string(self, descr_dict):
- + return RTCSessionDescription(
- + sdp=descr_dict['sdp'],
- + type=descr_dict['type'])
- +
- + async def sdp_events(self, json_data):
- + if json_data['type'] == 'answer':
- + await self.rtc_env.setRemoteDescription(json_data)
- + await self.rtc_env.setLocalDescription(await self.rtc_env.createAnswer())
- + await self.do_sdp_offer(data=self.rtc_env.localDescription, uid=json_data['handle'])
- + print('Sending offer')
- + else:
- + self.ice_env = RTCIceServer(json_data)
- + self.rtc_env = RTCPeerConnection(configuration=RTCConfiguration(iceServers=[self.ice_env]))
- + #self.rtc_env.addTrack(VideoStreamTrack())
- + #self.rtc_env.addTrack(AudoStreamTrack())
- + await self.rtc_env.setLocalDescription(await self.rtc_env.createOffer())
- + await self.do_sdp_answer(data=self.rtc_env.localDescription, uid=json_data['handle'])
- + print('Sending answer')
- +
- + async def do_sdp_answer(self, data, uid):
- + _data = data
- + _uid = uid
- + payload = {
- + 'tc': 'sdp',
- + 'type': 'answer',
- + 'sdp': self.description_to_dict(_data),
- + 'handle': _uid
- + }
- + await self.send(payload)
- +
- + async def do_sdp_offer(self, data, uid):
- + _data = data
- + _uid = uid
- + payload = {
- + 'tc': 'sdp',
- + 'type': 'offer',
- + 'sdp': self.description_to_dict(_data),
- + 'handle': _uid
- + }
- + await self.send(payload)
- +
- + async def send_sdp(self, data, uid):
- + _sdp_data = data
- + _uid = uid
- + payload = {
- + 'tc': 'sdp',
- + 'type': 'offer',
- + 'sdp': _sdp_data,
- + 'handle': _uid
- + }
- + await self.send(payload)
- +
- + async def send_trickle(self, candidate, uid):
- + _uid = uid
- + _candidate = candidate
- + payload = {
- + 'tc': 'trickle',
- + 'handle': _uid,
- + 'candidate': _candidate
- + }
- + await self.send(payload)
- +
- +
- +
- async def on_closed(self, code):
- """
- This gets sent when ever the connection gets closed by the server for what ever reason.
- @@ -283,6 +405,7 @@ class TinychatRTCClient(object):
- if self.is_client_mod:
- await self.send_banlist_msg()
- +
- async def on_room_info(self, room_info):
- """
- Received when the client have joined the room successfully.
- @@ -445,6 +568,10 @@ class TinychatRTCClient(object):
- if uid != self.client_id:
- self.active_user = self.users.search(uid)
- await self.message_handler(msg)
- + if '?ice' in msg:
- + await self.get_ice()
- + elif '?sdp' in msg:
- + await self.do_sdp_offer()
- self.active_user.msg_time = ts
- async def message_handler(self, msg):
- @@ -494,6 +621,7 @@ class TinychatRTCClient(object):
- if _user.is_waiting:
- _user.is_waiting = False
- self.console_write(COLOR['yellow'], f'{_user.nick}:{uid} is broadcasting.')
- + await self.send_subscribe(uid)
- async def on_unpublish(self, uid):
- """
- @@ -677,6 +805,20 @@ class TinychatRTCClient(object):
- log.info(f'Token request failed\ntoken={token}')
- return False
- + async def get_ice(self):
- + payload = {
- + 'tc': 'getice'
- + }
- + await self.send(payload)
- +
- + async def send_subscribe(self, uid):
- + payload = {
- + 'tc': 'subscribe',
- + 'handle': uid
- + }
- + print('Sending {} to {}'.format(payload['tc'], payload['handle']))
- + await self.send(payload)
- +
- async def set_nick(self):
- """ Send a nick message. """
- payload = {
- @@ -968,7 +1110,10 @@ class TinychatRTCClient(object):
- await self.send(payload)
- async def send(self, payload):
- - _payload = json.dumps(payload)
- + try:
- + _payload = json.dumps(payload)
- + except:
- + _payload = payload
- await self._ws.send(_payload)
- self._req += 1
- log.debug(f'{_payload}')
Add Comment
Please, Sign In to add comment