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 +3 -0
- data/Gemfile +4 -0
- data/Rakefile +2 -0
- data/Readme +96 -0
- data/lib/app/helpers/raydash_helper.rb +11 -0
- data/lib/generators/raydash/install_generator.rb +24 -0
- data/lib/generators/raydash/model_generator.rb +37 -0
- data/lib/generators/templates/ClientBox.swf +0 -0
- data/lib/generators/templates/README +1 -0
- data/lib/generators/templates/RecordBox.swf +0 -0
- data/lib/generators/templates/controller.rb +11 -0
- data/lib/generators/templates/index.html.erb +5 -0
- data/lib/generators/templates/migration.rb +6 -0
- data/lib/generators/templates/model.rb +13 -0
- data/lib/generators/templates/raydash.rb +4 -0
- data/lib/generators/templates/swfobject.js +4 -0
- data/lib/generators/templates/view.html.erb +2 -0
- data/lib/raydash/version.rb +3 -0
- data/lib/raydash.rb +37 -0
- data/raydash.gemspec +21 -0
- metadata +87 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
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
|
Binary file
|
@@ -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.
|
Binary file
|
@@ -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
|
+
/* 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}}}}();
|
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
|
+
|