raydash 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in raydash.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
data/Readme ADDED
@@ -0,0 +1,96 @@
1
+ == Introduction
2
+
3
+ Raydash allows you to easily integrate web-based video chat into your
4
+ web applications. You will need a userid and secret to access
5
+ Raydash's servers. Then, embed videostream and videorecord to have
6
+ camera and display boxes in the application.
7
+
8
+ == Quickstart
9
+
10
+ 1) Add the following to your Gemfile:
11
+
12
+ gem "raydash", :git => 'https://github.com/gersh/Raydash-Ruby-on-Rails'
13
+
14
+ 2) Configure your project your userid and secret with the following command:
15
+
16
+ rails g raydash:install [user] [token]
17
+
18
+ This will generate the required configuration files to use Raydash
19
+
20
+ 3) You now need to generate a model, which will call the Raydash API
21
+ to generate tokens for your video streams. Optionally, you can create
22
+ your own model, and call the API directly, but a generator is provided
23
+ to make this easier. You can invoke the generator by calling
24
+
25
+ rails g raydash:model [modelname]
26
+
27
+ This model will represent a token. Each token can be used for both a
28
+ record and playback stream control.
29
+
30
+ 4) Create a controller for your app. For example, if you name the
31
+ named the model 'video' you can create a new video with:
32
+
33
+ def index()
34
+ @video = Video.new()
35
+ @video.save()
36
+ end
37
+
38
+ 5) Add the proper header information to your layout. Often, this is
39
+ app/views/layouts/application.html.erb. You will need add the
40
+ following into the header:
41
+
42
+ <%= raydash_header %>
43
+ 6) Create a view to display the video. You will utilize two helpers
44
+ provided by raydash: 'videostream' and 'videorecord'. These will embed
45
+ a streaming ability, and a recording ability respectively.
46
+
47
+ A sample view might look like:
48
+
49
+ <%= videostream(@video.token,"video_in") %>
50
+ <%= videorecord(@video.token,"video_out") %>
51
+
52
+ In this sample, @video.token specifies the token we are connecting to,
53
+ and "video_in" and "video_out" are div ids.
54
+
55
+
56
+ 7) Assuming you have configured the necessary routes (E.X adding:
57
+ match '/YOUR_CONTROLLER' => 'YOUR_CONTROLLER#index'
58
+ to routes 'routes.rb', you should be
59
+ able to load the page, and enable your camera. The streaming
60
+ capabilities will also be enabled but the stream isn't connect to
61
+ anything.
62
+
63
+ 8) You can connect arbitrary tokens. This is handle all handle on the
64
+ server-end, and it can be done in real-time. So, create a new
65
+ controller function such as:
66
+
67
+ def connect_to()
68
+ video=Model.find(params[:id1])
69
+ video.connect_to(params[:id2])
70
+ end
71
+
72
+ with route
73
+ '/videos/route/:id1/:id2' => 'YOUR_CONTROLLER#connect_to'
74
+
75
+
76
+ == Backend-API library
77
+
78
+ === Raydash.getToken(streamName="")
79
+ This function gets a token. A token is needed for every recording or
80
+ viewing video box in the application.
81
+
82
+ streamName is an optional parameter that is another token created with
83
+ this function. If specified, the display stream will show the stream
84
+ from the call of that function
85
+
86
+
87
+ === Raydash.changeStream(output_token, input_token)
88
+ The function re-points where a token is streaming from. We can
89
+ dynamically change where any stream is pointing, dynamically.
90
+
91
+ output_token is the name of the token we are streaming to. If we have
92
+ a video stream initialized with this token, if will immediately start
93
+ displaying content from the input_token.
94
+
95
+ input_token refers to a videorecord that has been initialized with its stream
96
+
@@ -0,0 +1,11 @@
1
+ module RaydashHelper
2
+ def raydash_header()
3
+ javascript_include_tag 'swfobject.js'
4
+ end
5
+ def videostream(token, id,width="500",height="500")
6
+ javascript_tag("swfobject.embedSWF(\"/swfs/raydash/ClientBox.swf\", \"#{id}\",#{width},#{height},\"9.0.0\",\"http://www.adobe.com/products/flashplayer/download\",{autostart:1,token:\"#{token}\"})") + content_tag(:div, "Video stream not available", :id => id)
7
+ end
8
+ def videorecord(token, id,width="500",height="500")
9
+ javascript_tag("swfobject.embedSWF(\"/swfs/raydash/RecordBox.swf\", \"#{id}\",#{width},#{height},\"9.0.0\",\"http://www.adobe.com/products/flashplayer/download\",{hideControls:1,hideCamera:0,autostart:1,token:\"#{token}\"})") + content_tag(:div, "Video stream not available", :id => id)
10
+ end
11
+ end
@@ -0,0 +1,24 @@
1
+ module Raydash
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ desc "This generator install necessary files and configures your application for Raydash. Syntax: 'rails g raydash:install [userid] [secret]'. The userid and secret can be obtained from http://www.raydash.com."
5
+ source_root File.expand_path("../../templates", __FILE__)
6
+ argument :userid, :desc => "Userid from http://www.raydash.com", :required => true
7
+ argument :secret, :desc => "Secret from http://www.raydash.com", :required => true
8
+ def copy_initializer
9
+ template "raydash.rb", "config/initializers/raydash.rb"
10
+ end
11
+ def copy_flash
12
+ empty_directory "public/swfs/raydash"
13
+ copy_file "ClientBox.swf", "public/swfs/raydash/ClientBox.swf"
14
+ copy_file "RecordBox.swf", "public/swfs/raydash/RecordBox.swf"
15
+ end
16
+ def copy_flash_javascript
17
+ copy_file "swfobject.js", "public/javascripts/swfobject.js"
18
+ end
19
+ def show_readme
20
+ readme "README" if behavior == :invoke
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,37 @@
1
+ require 'migration'
2
+
3
+ module Raydash
4
+ module Generators
5
+
6
+ class ModelGenerator < Rails::Generators::NamedBase
7
+ desc "Generate a model for working with video tokens"
8
+ source_root File.expand_path("../../templates", __FILE__)
9
+ def manifest
10
+ #record do |m|
11
+ migration_template 'migration:migration.rb', "db/migrate", {:assigns => raydash_local_assigns,
12
+ :migration_file_name => 'create_raydash_table_#{custom_name}'
13
+ }
14
+ #end
15
+ end
16
+ def model
17
+ @custom_name=custom_file_name
18
+ template "model.rb", "app/models/#{custom_file_name}.rb"
19
+ end
20
+ private
21
+ def custom_file_name
22
+ custom_name = class_name.underscore.downcase
23
+ custom_name = custom_name.pluralize if ActiveRecord::Base.pluralize_table_names
24
+ end
25
+
26
+ def raydash_local_assigns
27
+ returning(assigns = {}) do
28
+ assigns[:migration_action] = "add"
29
+ assigns[:class_name] = "add_raydash_table_#{custom_file_name}"
30
+ assigns[:table_name] = custom_file_name
31
+ assigns[:attributes] = [Rails::Generator::GeneratedAttribute.new("token", "string")]
32
+ assigns[:attributes] << Rails::Generator::GeneratedAttribute.new("connected_to","string")
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1 @@
1
+ Raydash has been installed into your application. If you run 'rails g raydash:model' and 'rails g raydash:controller [controllername]', you can create a sample configuration for using Raydash within your rails application.
@@ -0,0 +1,11 @@
1
+ class <%=@controller_name%> < ActiveRecord
2
+ def index()
3
+
4
+ end
5
+ def show()
6
+ @token=Raydash.getToken()
7
+ end
8
+ def change()
9
+ Raydash.changeStream(params[:input_token],params[:output_token])
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ Connect users to each other:
2
+
3
+ <% @tokens.each do |t| %>
4
+ <%= t %> <%= select_tag @tokens %> <% remote_function_call 'connect' %><br/>
5
+ <% end %>
@@ -0,0 +1,6 @@
1
+ class <%= @name %> < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :<%= @name %> do |t|
4
+ t.string :token
5
+ end
6
+ end
@@ -0,0 +1,13 @@
1
+ class <%= @custom_name %> < ActiveRecord::Base
2
+ before_create :generate_token
3
+
4
+ def point_to(otherToken)
5
+ Raydash.changeStream(self.connected_to,otherToken)
6
+ self.connected_to=otherToken
7
+ self.save()
8
+ end
9
+ private
10
+ def generate_token
11
+ self.token = Raydash.getToken()
12
+ end
13
+ end
@@ -0,0 +1,4 @@
1
+ Raydash.setup do |config|
2
+ config.userid = "<%= @userid%>"
3
+ config.secret = "<%= @secret%>"
4
+ end
@@ -0,0 +1,4 @@
1
+ /* SWFObject v2.2 <http://code.google.com/p/swfobject/>
2
+ is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
3
+ */
4
+ var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();
@@ -0,0 +1,2 @@
1
+ <%= videostream(@token) %><br/>
2
+ <%= videorecord(@token) %><br/>
@@ -0,0 +1,3 @@
1
+ module Raydash
2
+ VERSION = "0.0.1"
3
+ end
data/lib/raydash.rb ADDED
@@ -0,0 +1,37 @@
1
+ require 'net/http'
2
+ require 'app/helpers/raydash_helper'
3
+ module Raydash
4
+ RAYDASH_HTTP_SERVER = "api.raydash.com"
5
+ RAYDASH_HTTP_PORT = 8080
6
+
7
+ mattr_accessor :userid
8
+ mattr_accessor :secret
9
+
10
+ def self.doRequest(request)
11
+ return Net::HTTP.get_response(RAYDASH_HTTP_SERVER, request, RAYDASH_HTTP_PORT)
12
+ end
13
+ # Gets a new token for internal or external streams. The same token can be re-used for input and output streams.
14
+ def self.getToken(streamName="")
15
+ if streamName!="" then
16
+ path="/api/1/authtoken/" + streamName + "?userid=" + self.userid + "&secret=" + self.secret
17
+ else
18
+ path="/api/1/authtoken" + "?userid=" + self.userid + "&secret=" + self.secret
19
+ end
20
+ result = self.doRequest(path)
21
+ result.value()
22
+ return result.body
23
+ end
24
+ # Changes which input-stream connects to which output-stream token
25
+ def self.changeStream(output_token,input_token)
26
+ path="/api/1/changeStream/" + output_token + "/" + input_token + "?userid=" + self.userid + "&secret=" + self.secret
27
+ result = doRequest(path)
28
+ result.value()
29
+ return result.body
30
+ end
31
+
32
+ # Used for configuration
33
+ def self.setup
34
+ yield self
35
+ end
36
+ end
37
+ ActionView::Base.send :include, RaydashHelper
data/raydash.gemspec ADDED
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "raydash/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "raydash"
7
+ s.version = Raydash::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Gershon Bialer"]
10
+ s.email = ["gershon@raydash.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{Embed video chat or video streaming via Raydash}
13
+ s.description = %q{Live video chat or video streams can be hosted on Raydash, and accessed via the API contained within this gem}
14
+
15
+ s.rubyforge_project = "raydash"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: raydash
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Gershon Bialer
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-02-09 00:00:00 -06:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: Live video chat or video streams can be hosted on Raydash, and accessed via the API contained within this gem
23
+ email:
24
+ - gershon@raydash.com
25
+ executables: []
26
+
27
+ extensions: []
28
+
29
+ extra_rdoc_files: []
30
+
31
+ files:
32
+ - .gitignore
33
+ - Gemfile
34
+ - Rakefile
35
+ - Readme
36
+ - lib/app/helpers/raydash_helper.rb
37
+ - lib/generators/raydash/install_generator.rb
38
+ - lib/generators/raydash/model_generator.rb
39
+ - lib/generators/templates/ClientBox.swf
40
+ - lib/generators/templates/README
41
+ - lib/generators/templates/RecordBox.swf
42
+ - lib/generators/templates/controller.rb
43
+ - lib/generators/templates/index.html.erb
44
+ - lib/generators/templates/migration.rb
45
+ - lib/generators/templates/model.rb
46
+ - lib/generators/templates/raydash.rb
47
+ - lib/generators/templates/swfobject.js
48
+ - lib/generators/templates/view.html.erb
49
+ - lib/raydash.rb
50
+ - lib/raydash/version.rb
51
+ - raydash.gemspec
52
+ has_rdoc: true
53
+ homepage: ""
54
+ licenses: []
55
+
56
+ post_install_message:
57
+ rdoc_options: []
58
+
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ hash: 3
67
+ segments:
68
+ - 0
69
+ version: "0"
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ hash: 3
76
+ segments:
77
+ - 0
78
+ version: "0"
79
+ requirements: []
80
+
81
+ rubyforge_project: raydash
82
+ rubygems_version: 1.3.7
83
+ signing_key:
84
+ specification_version: 3
85
+ summary: Embed video chat or video streaming via Raydash
86
+ test_files: []
87
+