diff --git a/docs/_applications.rst b/docs/_applications.rst
new file mode 100644
index 00000000..767a79b8
--- /dev/null
+++ b/docs/_applications.rst
@@ -0,0 +1,24 @@
+.. _applications:
+
+:orphan:
+
+
+.. raw:: html
+
+    <style>
+        .rst-content table.field-list td {
+            padding-top: 8px;
+        }
+    </style>
+
+.. |Windows| raw:: html
+
+    <i class="fa fa-fw fa-windows"></i>
+
+.. |MacOS| raw:: html
+
+    <i class="fa fa-fw fa-apple"></i>
+
+.. |Linux| raw:: html
+
+    <i class="fa fa-fw fa-linux"></i>
diff --git a/docs/applications.rst b/docs/applications.rst
new file mode 100644
index 00000000..598d7197
--- /dev/null
+++ b/docs/applications.rst
@@ -0,0 +1,22 @@
+.. include:: _applications.rst
+
+
+Streamlink Applications
+=======================
+
+
+Streamlink Twitch GUI
+---------------------
+
+.. image:: https://user-images.githubusercontent.com/467294/28097570-3415020e-66b1-11e7-928d-4b9da35daf13.jpg
+    :alt: Streamlink Twitch GUI
+
+:Description: A multi platform Twitch.tv browser for Streamlink
+:Type: Graphical User Interface
+:OS: |Windows| |MacOS| |Linux|
+:Author: `Sebastian Meyer <https://github.com/bastimeyer>`_
+:Website: https://streamlink.github.io/streamlink-twitch-gui
+:Source code: https://github.com/streamlink/streamlink-twitch-gui
+:Info: A NW.js based desktop web application, formerly known as *Livestreamer Twitch GUI*. Browse Twitch.tv and watch
+    multiple streams at once. Filter streams by language, receive desktop notifications when followed channels start
+    streaming and access the Twitch chat by using customizable chat applications.
diff --git a/docs/conf.py b/docs/conf.py
index 5591eb25..a8b13451 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -58,7 +58,7 @@ release = streamlink_version
 
 # List of patterns, relative to source directory, that match files and
 # directories to ignore when looking for source files.
-exclude_patterns = ['_build']
+exclude_patterns = ['_build', '_applications.rst']
 
 # The reST default role (used for this markup: `text`) to use for all documents.
 #default_role = None
diff --git a/docs/index.rst b/docs/index.rst
index 64870690..1deedaae 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -66,3 +66,5 @@ See their respective sections for more information on how to use them.
     api
     changelog
     donate
+    applications
+    thirdparty
diff --git a/docs/thirdparty.rst b/docs/thirdparty.rst
new file mode 100644
index 00000000..5e3ead84
--- /dev/null
+++ b/docs/thirdparty.rst
@@ -0,0 +1,46 @@
+..
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+    If you're a developer and want to add your project/application to this list, please
+
+    1. adhere to the same structure and format of the entries of the applications.rst file and this one
+    2. add your new entry to the bottom of the list
+    3. at least provide the required fields (in the same order)
+       - "Description" (a brief text describing your application)
+       - "Type" (eg. Graphical User Interface, CLI wrapper, etc.)
+       - "OS" (please use the available substitutions)
+       - "Author" (if possible, include a link to the creator's Github/Gitlab profile, etc. or a contact email address)
+       - "Website"
+    4. use an image
+       - in the jpeg or png format
+       - with a static and reliable !!!https!!! URL (use Github or an image hoster like Imgur, etc.)
+       - with a reasonable size and aspect ratio
+       - with a decent compression quality
+       - that is not too large (at most 1 MiB allowed, the smaller the better)
+       - that is neutral and only shows your application
+    5. optionally add more fields like a URL to the source code repository, a larger info or features text, etc.
+
+    Please be aware that the Streamlink team may edit and remove your entry at any time.
+
+    Thank you! :)
+
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+
+.. include:: _applications.rst
+
+
+Third Party Applications
+========================
+
+
+.. content list start
+
+
+.. replace this line with the first entry
+
+
+.. content list end
+
+
+Help us extend this list by sending us a pull request on Github. Thanks!
diff --git a/src/streamlink/plugins/arconai.py b/src/streamlink/plugins/arconai.py
index bd6cff20..7a0ee04b 100644
--- a/src/streamlink/plugins/arconai.py
+++ b/src/streamlink/plugins/arconai.py
@@ -1,14 +1,13 @@
 import re
 
 from streamlink.plugin import Plugin
-from streamlink.plugin.api import http, validate
-from streamlink.plugin.api.utils import parse_json
+from streamlink.plugin.api import http
+from streamlink.plugin.api import useragents
 from streamlink.stream import HLSStream
 
-_url_re = re.compile(r"https://www.arconaitv.me/([^/]+)/")
+_url_re = re.compile(r'''https?://(www\.)?arconaitv\.me/stream\.php\?id=\d+''')
+_playlist_re = re.compile(r'''source\ssrc=["'](?P<url>[^"']+)["']''')
 
-SOURCES_RE = re.compile(r" data-item='([^']+)' ")
-USER_AGENT = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36"
 
 class ArconaiTv(Plugin):
     @classmethod
@@ -16,19 +15,21 @@ class ArconaiTv(Plugin):
         return _url_re.match(url)
 
     def _get_streams(self):
-        page = http.get(self.url)
-        match = SOURCES_RE.search(page.text)
-        if match is None:
-            return
+        headers = {
+            'User-Agent': useragents.CHROME,
+            'Referer': self.url
+        }
 
-        sources = parse_json(match.group(1))
-        if "sources" not in sources or not isinstance(sources["sources"], list):
+        res = http.get(self.url, headers=headers)
+
+        match = _playlist_re.search(res.text)
+        if match is None:
             return
 
-        for source in sources["sources"]:
-            if "src" not in source or not source["src"].endswith(".m3u8"):
-                continue
+        url = match.group('url')
 
-            yield "live", HLSStream(self.session, source["src"], headers={"User-Agent": USER_AGENT})
+        if url:
+            self.logger.debug('HLS URL: {0}'.format(url))
+            yield 'live', HLSStream(self.session, url, headers=headers)
 
 __plugin__ = ArconaiTv
diff --git a/src/streamlink/plugins/douyutv.py b/src/streamlink/plugins/douyutv.py
index b05f4ed0..43ad9daa 100644
--- a/src/streamlink/plugins/douyutv.py
+++ b/src/streamlink/plugins/douyutv.py
@@ -1,4 +1,3 @@
-import hashlib
 import re
 import time
 import uuid
@@ -13,10 +12,9 @@ from streamlink.stream import HTTPStream, HLSStream, RTMPStream
 #python version by debugzxcv at https://gist.github.com/debugzxcv/85bb2750d8a5e29803f2686c47dc236b
 from streamlink.plugins.douyutv_blackbox import stupidMD5
 
-WAPI_URL = "https://www.douyu.com/swf_api/room/{0}?cdn=&nofan=yes&_t={1}&sign={2}"
+OAPI_URL = "http://open.douyucdn.cn/api/RoomApi/room/{0}"
 LAPI_URL = "https://www.douyu.com/lapi/live/getPlay/{0}"
 VAPI_URL = "https://vmobile.douyu.com/video/getInfo?vid={0}"
-WAPI_SECRET = "bLFlashflowlad92"
 LAPI_SECRET = "a2053899224e8a92974c729dceed1cc99b3d8282"
 SHOW_STATUS_ONLINE = 1
 SHOW_STATUS_OFFLINE = 2
@@ -71,7 +69,7 @@ _room_id_alt_schema = validate.Schema(
 _room_schema = validate.Schema(
     {
         "data": validate.any(None, {
-            "show_status": validate.all(
+            "room_status": validate.all(
                 validate.text,
                 validate.transform(int)
             )
@@ -113,7 +111,7 @@ class Douyutv(Plugin):
 
     def _get_room_json(self, channel, rate, ts, did, sign):
         data = {
-            "ver": "2017070301",
+            "ver": "2017071231",
             "cdn": "ws", #cdns: ["ws", "tct", "ws2", "dl"]
             "rate": rate,
             "tt": ts,
@@ -144,7 +142,7 @@ class Douyutv(Plugin):
 
         #Thanks to @ximellon for providing method.
         channel = match.group("channel")
-        http.headers.update({'User-Agent': useragents.CHROME})
+        http.headers.update({'User-Agent': useragents.CHROME, 'Referer': self.url})
         try:
             channel = int(channel)
         except ValueError:
@@ -152,19 +150,17 @@ class Douyutv(Plugin):
             if channel is None:
                 channel = http.get(self.url, schema=_room_id_alt_schema)
 
-        ts = int(time.time() / 60)
-        sign = hashlib.md5(("{0}{1}{2}".format(channel, WAPI_SECRET, ts)).encode("utf-8")).hexdigest()
-
-        res = http.get(WAPI_URL.format(channel, ts, sign))
+        res = http.get(OAPI_URL.format(channel))
         room = http.json(res, schema=_room_schema)
         if not room:
             self.logger.info("Not a valid room url.")
             return
 
-        if room["show_status"] != SHOW_STATUS_ONLINE:
+        if room["room_status"] != SHOW_STATUS_ONLINE:
             self.logger.info("Stream currently unavailable.")
             return
 
+        ts = int(time.time() / 60)
         did = uuid.uuid4().hex.upper()
         sign = stupidMD5(("{0}{1}{2}{3}".format(channel, did, LAPI_SECRET, ts)))
 

diff --git a/tests/test_plugin_arconai.py b/tests/test_plugin_arconai.py
new file mode 100644
index 00000000..d1a462f7
--- /dev/null
+++ b/tests/test_plugin_arconai.py
@@ -0,0 +1,14 @@
+import unittest
+
+from streamlink.plugins.arconai import ArconaiTv
+
+
+class TestPluginArconaiTv(unittest.TestCase):
+    def test_can_handle_url(self):
+        # should match
+        self.assertTrue(ArconaiTv.can_handle_url('http://arconaitv.me/stream.php?id=1'))
+        self.assertTrue(ArconaiTv.can_handle_url('http://arconaitv.me/stream.php?id=23'))
+        self.assertTrue(ArconaiTv.can_handle_url('http://arconaitv.me/stream.php?id=440'))
+
+        # shouldn't match
+        self.assertFalse(ArconaiTv.can_handle_url('http://arconaitv.me/'))

Where  does one go to share a GUI/frontend?
### Checklist

- [ ] This is a bug report.
- [ ] This is a plugin request.
- [ ] This is a feature request.
- [x] I used the search function to find already opened/closed issues or pull requests.

### Description

I looked around but I couldn't find any place where they can be submitted. Can someone help me out?
tests/test_plugin_arconai.py::TestPluginArconaiTv::test_can_handle_url