diff --git a/README.md b/README.md index 8103ea1b7..733f7f0cd 100755 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ step 1: build srs
 tar xf simple-rtmp-server-*.*.tar.gz
 cd simple-rtmp-server-*.*/trunk
-./configure --with-ssl --with-hls --with-ffmpeg
+./configure --with-ssl --with-hls --with-ffmpeg --with-http
 make
 
step 2: start srs
@@ -30,6 +30,10 @@ step 4(optional): start nginx for HLS
 sudo ./objs/nginx/sbin/nginx
 
+step 5(optional): start http hooks for srs callback
+
+python ./research/api-server/server.py 8085
+
step 5: publish live stream
 FMS URL: rtmp://127.0.0.1:1935/live
diff --git a/trunk/conf/srs.conf b/trunk/conf/srs.conf
index f3ff06a39..0bccae544 100755
--- a/trunk/conf/srs.conf
+++ b/trunk/conf/srs.conf
@@ -87,6 +87,12 @@ vhost dev {
     hls_window      30;
     #forward         127.0.0.1:19350;
     #forward         127.0.0.1:1936;
+    on_connect      http://127.0.0.1:8085/api/v1/clients;
+    on_close        http://127.0.0.1:8085/api/v1/clients;
+    on_publish      http://127.0.0.1:8085/api/v1/streams;
+    on_unpublish    http://127.0.0.1:8085/api/v1/streams;
+    on_play         http://127.0.0.1:8085/api/v1/sessions;
+    on_stop         http://127.0.0.1:8085/api/v1/sessions;
     transcode {
         enabled     off;
         ffmpeg      ./objs/ffmpeg/bin/ffmpeg;
diff --git a/trunk/configure b/trunk/configure
index 310e2a53b..187f9f652 100755
--- a/trunk/configure
+++ b/trunk/configure
@@ -174,4 +174,7 @@ fi
 if [ $SRS_FFMPEG = YES ]; then
     echo -e "\" ./objs/ffmpeg/bin/ffmpeg  \" is used for live stream transcoding"
 fi
+if [ $SRS_HTTP = YES ]; then
+    echo -e "\" python ./research/api-server/server.py 8085  \" to start the api-server"
+fi
 echo "\" ./objs/simple_rtmp_server -c conf/srs.conf \" to start the srs live server"
diff --git a/trunk/research/api-server/server.py b/trunk/research/api-server/server.py
new file mode 100755
index 000000000..a6b61acc0
--- /dev/null
+++ b/trunk/research/api-server/server.py
@@ -0,0 +1,90 @@
+#!/usr/bin/python
+'''
+The MIT License (MIT)
+
+Copyright (c) 2013 winlin
+
+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.
+'''
+
+"""
+the api-server is a default demo server for srs to call
+when srs get some event, for example, when client connect
+to srs, srs can invoke the http api of the api-server
+"""
+
+import sys;
+# reload sys model to enable the getdefaultencoding method.
+reload(sys);
+# set the default encoding to utf-8
+# using exec to set the encoding, to avoid error in IDE.
+exec("sys.setdefaultencoding('utf-8')");
+assert sys.getdefaultencoding().lower() == "utf-8";
+
+if __name__ != "__main__":
+    raise Exception("embed not support");
+
+if len(sys.argv) <= 1:
+    print "SRS api callback server, Copyright (c) 2013 winlin"
+    print "Usage: python %s "%(sys.argv[0])
+    print "    port: the port to listen at."
+    print "For example:"
+    print "    python %s 8085"%(sys.argv[0])
+    print ""
+    print "See also: https://github.com/winlinvip/simple-rtmp-server"
+    sys.exit(1)
+
+import datetime, cherrypy
+
+def trace(msg):
+    date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+    print "[%s][trace] %s"%(date, msg)
+
+class RESTClients(object):
+    pass;
+
+class Root(object):
+    def __init__(self):
+        self.api = Api()
+
+class Api(object):
+    def __init__(self):
+        self.v1 = V1()
+
+class V1(object):
+    def __init__(self):
+        self.clients = RESTClients()
+
+port = int(sys.argv[1])
+trace("api server listen at port: %s"%(port))
+
+conf = {
+    'global': {
+        'server.shutdown_timeout': 1,
+        'server.socket_host': '0.0.0.0',
+        'server.socket_port': port,
+        'tools.encode.on': True,
+        'tools.encode.encoding': "utf-8"
+    },
+    '/': {
+        'request.dispatch': cherrypy.dispatch.MethodDispatcher()
+    }
+}
+
+trace("start cherrypy server")
+cherrypy.quickstart(Root(), '/', conf)