I made a better remote-live-view page [OLD]

I'm still getting the error I mentioned previously... when UI2 detects that the session has expired it sometimes will get stuck at a link like the following:

http://ip:60081/ui2.htm
?
page=/image/outside?time=1461606661050&w=1496

Also UI2 doesn't seem to support 2 different servers on the same IP... I'll have http://ip:60081 and http://ip:60082 and it kicks one off when I try to log into the other
 
Re: Can’t get remember me or log in automatically to work.

Did some testing & checking & could not figure out problem? So I deleted the user in Blue Iris & added it back and every thing seems to be fine Today from the remote location. If it acts up again I will remember to log in under another user
 
Good advice. If refreshing the page did not solve the problem, make sure the user account has access to the camera group in question.

Any group a cycle is enabled for should appear in that dropdown list, as you can see with my "backyard cycle" here:

Ok, I feel stupid... LMAO.

For some reason it didn't occur to me that I had to set it up for each group using the gear box on the PTZ controls. I hide the PTZ controls on the display since that's in the dinning room on the wall in the house. I use Amt VNC to change settings when I need to work on the box itself. I use UI2 as my primary way to view and review video in my office.

Thanks again BP.
 
Last edited by a moderator:
I'm still getting the error I mentioned previously... when UI2 detects that the session has expired it sometimes will get stuck at a link like the following:

http://ip:60081/ui2.htm
?
page=/image/outside?time=1461606661050&w=1496

This doesn't make sense. Can you show a screenshot?

Also UI2 doesn't seem to support 2 different servers on the same IP... I'll have http://ip:60081 and http://ip:60082 and it kicks one off when I try to log into the other

Probably your problem is that cookies are being shared between both servers so your two Blue Iris servers override each other's session cookie. This is something web browsers do, and I have no control over it. You can work around it by using a DDNS address in one browser window and the actual IP address in another browser window. Or you could use two different DDNS addresses. Just so long as the browser sees the host name is different, the cookie collection won't be shared.
 
Hi great work with this new UI. ive been using it for a few months now and all been working fine but recently i get and error when downloading any clip except the first one. I really need this feature to work.
posted a screenshot below. It would be amazing if you or anyone else could help me fix this. Thanks!

https://drive.google.com/file/d/0B4J3dhCtMr3CbWhuVkdyUWFvdXc/view?usp=sharing bi error.png
 
Interesting. I see your browser (Chrome?) is trying but failing to download the other clips. I haven't seen anything like this happen.

Perhaps the clips you can't download are still being recorded to?
 
Oh wow you are right. When I click on the older ones it works. Thanks!

Also is there any way to download the clip in another format that's playable in regular player?
 
Also is there any way to download the clip in another format that's playable in regular player?

Nope, you will need to export from Blue Iris the old-fashioned way, since there is no remote export functionality yet.
 
I've just uploaded a new update. The most interesting new feature is H264 streaming using Blue Iris's HLS streaming capability. It has 5 to 15 seconds of delay which makes it poorly suited for a primary viewing method, so I have only implemented this in a limited capacity.

v0.15.0 - 2016-04-26
+ Added limited H264 streaming capability. See the "HLS" button in the top bar and in the context menu which opens by long-pressing a live camera. Read more about it in the Top Bar options, where you can find a toggle for the top bar HLS button.
+ Added livestream.htm which takes a URL parameter "cam" specifying the short name of the camera or group to stream in H264 format.
* Limited the animated clip preview so it can't change between clips more often than every 500 milliseconds.
* Fixed a bug where clips sometimes failed to delete correctly.
* Fixed a bug where the seek bar considered two rapid clicks to be a double click even if the pointer moved significantly between clicks.

h8ss6F7.jpg


pb7x82Z.jpg




 
ok thanks and great update, just tried it. i hope blue iris will implement that soon.

Im getting a different error now when trying to download clips or alerts. Its happening for all clips.


error.png error console.png
 
Last edited by a moderator:
Last edited:
Oops. I must have broken this in the last update. Will fix in a day or two. Thanks for reporting.

I think I found the problem, but I am not able to do a release right now. Try opening the file ui2/wdContextMenu/jquery.contextmenu.js and replace its content with this:

Code:
(function ($)
{
	function returnfalse() { return false; };
	$.fn.contextmenu = function (option)
	{
		option = $.extend({ alias: "cmroot", width: 150, clickType: "long" }, option);
		var ruleName = null;
		var target = null;
		var groups = {};
		var mitems = {};
		var actions = {};
		var showGroups = [];
		var itemTpl = "<div class='b-m-$[type]' unselectable=on><nobr unselectable=on><img src='$[icon]' align='absmiddle'/><span unselectable=on>$[text]</span></nobr></div>";
		var gTemplet = $("<div/>").addClass("b-m-mpanel").attr("unselectable", "on").css("display", "none");
		var iTemplet = $("<div/>").addClass("b-m-item").attr("unselectable", "on");
		var sTemplet = $("<div/>").addClass("b-m-split");
		//build group item, which has sub items
		var buildGroup = function (obj)
		{
			groups[obj.alias] = this;
			this.gidx = obj.alias;
			this.id = obj.alias;
			if (obj.disable)
			{
				this.disable = obj.disable;
				this.className = "b-m-idisable";
			}
			$(this).width(obj.width)/*.click(returnfalse)*/.mousedown(returnfalse).appendTo($("body"));
			obj = null;
			return this;
		};
		var buildItem = function (obj)
		{
			var T = this;
			//T.title = obj.text;
			T.idx = obj.alias;
			T.gidx = obj.gidx;
			T.data = obj;
			T.innerHTML = itemTpl.replace(/\$\[([^\]]+)\]/g, function ()
			{
				return obj[arguments[1]];
			});
			if (obj.disable)
			{
				T.disable = obj.disable;
				T.className = "b-m-idisable";
			}
			obj.items && (T.group = true);
			obj.action && (actions[obj.alias] = obj.action);
			mitems[obj.alias] = T;
			T = obj = null;
			return this;
		};
		//add new items
		var addItems = function (gidx, items)
		{
			var tmp = null;
			for (var i = 0; i < items.length; i++)
			{
				if (items[i].type == "splitLine")
				{
					//split line
					tmp = sTemplet.clone()[0];
				} else
				{
					items[i].gidx = gidx;
					if (items[i].type == "group")
					{
						//group 
						buildGroup.apply(gTemplet.clone()[0], [items[i]]);
						arguments.callee(items[i].alias, items[i].items);
						items[i].type = "arrow";
						tmp = buildItem.apply(iTemplet.clone()[0], [items[i]]);
					} else
					{
						//normal item
						items[i].type = "ibody";
						tmp = buildItem.apply(iTemplet.clone()[0], [items[i]]);
						$(tmp).click(function (e)
						{
							var skipReturn = false;
							if (!this.disable)
							{
								if ($.isFunction(actions[this.idx]))
								{
									if (actions[this.idx].call(this, target))
										skipReturn = true;
								}
								hideMenuPane();
							}
							if (!skipReturn)
								return false;
						});

					} //end if
					$(tmp).bind("contextmenu", returnfalse).hover(overItem, outItem);
				}
				groups[gidx].appendChild(tmp);
				tmp = items[i] = items[i].items = null;
			} //end for
			gidx = items = null;
		};
		var overItem = function (e)
		{
			//menu item is disabled          
			if (this.disable)
				return false;
			hideMenuPane.call(groups[this.gidx]);
			//has sub items
			if (this.group)
			{
				var pos = $(this).offset();
				var width = $(this).outerWidth();
				showMenuGroup.apply(groups[this.idx], [pos, width]);
			}
			this.className = "b-m-ifocus";
			return false;
		};
		//menu loses focus
		var outItem = function (e)
		{
			//disabled item
			if (this.disable)
				return false;
			if (!this.group)
			{
				//normal item
				this.className = "b-m-item";
			} //Endif
			return false;
		};
		//show menu group at specified position
		var showMenuGroup = function (pos, width)
		{
			var bwidth = $("body").width();
			var bheight = document.documentElement.clientHeight;
			var mwidth = $(this).outerWidth();
			var mheight = $(this).outerHeight();
			pos.left = (pos.left + width + mwidth > bwidth) ? (pos.left - mwidth < 0 ? 0 : pos.left - mwidth) : pos.left + width;
			pos.top = (pos.top + mheight > bheight) ? (pos.top - mheight + (width > 0 ? 25 : 0) < 0 ? 0 : pos.top - mheight + (width > 0 ? 25 : 0)) : pos.top;
			$(this).css(pos).show();
			showGroups.push(this.gidx);
		};
		//to hide menu
		var hideMenuPane = function (e)
		{
			var alias = null;
			for (var i = showGroups.length - 1; i >= 0; i--)
			{
				if (showGroups[i] == this.gidx)
					break;
				alias = showGroups.pop();
				groups[alias].style.display = "none";
				mitems[alias] && (mitems[alias].className = "b-m-item");
			} //Endfor
			if (option.onCancelContextMenu && $.isFunction(option.onCancelContextMenu))
				option.onCancelContextMenu.call(this, e);
			//CollectGarbage();
		};
		function applyRule(rule)
		{
			if (ruleName && ruleName == rule.name)
				return false;
			for (var i in mitems)
				disable(i, !rule.disable);
			for (var i = 0; i < rule.items.length; i++)
				disable(rule.items[i], rule.disable);
			ruleName = rule.name;
		};
		function disable(alias, disabled)
		{
			var item = mitems[alias];
			item.className = (item.disable = item.lastChild.disabled = disabled) ? "b-m-idisable" : "b-m-item";
		};

		/* to show menu  */
		function showMenu(e, menutarget)
		{
			target = menutarget;
			showMenuGroup.call(groups[option.alias], { left: e.pageX, top: e.pageY }, 0);
			$(document).one('mousedown', hideMenuPane);
		}
		var $root = $("#" + option.alias);
		var root = null;
		if ($root.length == 0)
		{
			root = buildGroup.apply(gTemplet.clone()[0], [option]);
			root.applyrule = applyRule;
			root.showMenu = showMenu;
			addItems(option.alias, option.items);
		}
		else
		{
			root = $root[0];
		}
		var me = $(this).each(function ()
		{
			var clickHandler = function (e, self)
			{
				var bShowContext = (option.onContextMenu && $.isFunction(option.onContextMenu)) ? option.onContextMenu.call(this, e) : true;
				if (bShowContext)
				{
					if (option.onShow && $.isFunction(option.onShow))
					{
						option.onShow.call(self, root);
					}
					root.showMenu(e, self);
				}
				return false;
			};
			if (option.clickType == "left")
				return $(this).click(function (e)
				{
					if (e.which == 1)
						return clickHandler(e, this);
				});
			else if (option.clickType == "middle")
				return $(this).click(function (e)
				{
					if (e.which == 2)
						return clickHandler(e, this);
				});
			else if (option.clickType == "right")
				return $(this).bind('contextmenu', function (e)
				{
					return clickHandler(e, this);
				});
			else
				return $(this).longpress(function (e)
				{
					return clickHandler(e, this);
				});
		});
		//to apply rule
		if (option.rule)
		{
			applyRule(option.rule);
		}
		gTemplet = iTemplet = sTemplet = itemTpl = buildGroup = buildItem = null;
		addItems = overItem = outItem = null;
		//CollectGarbage();
		return me;
	}
})(jQuery);
 
Im sorry if i missed it i tried search the thread and reading but 65 pages is toomuch, is there anyway to make this default page when loging in ?

Also thank you very much it was getting annoying having to RDP to my server to playback video without having to watch the ENTIRE video

also i get no sound from my camera with a MIC, is that i known issue?
 
Last edited by a moderator:
Im sorry if i missed it i tried search the thread and reading but 65 pages is too much, is there anyway to make this default page when loging in ?

In Blue Iris, open the Blue Iris OPTIONS > USERS and select your username and then click EDIT. Under EDIT change Homepage to ui2.htm


bi_options.PNG

Also thank you very much it was getting annoying having to RDP to my server to playback video without having to watch the ENTIRE video

also i get no sound from my camera with a MIC, is that i known issue?

I don't have any cameras with audio so I can't help you there.
 

Attachments

  • bi_options.PNG
    bi_options.PNG
    48.6 KB · Views: 292
...also i get no sound from my camera with a MIC, is that i known issue?

BP2008 - that's a good question I guess I was missing too - is there a way to get audio to stream to the web browser when a specific camera is selected? And is there a way to tap into the two way audio like the mobile app has?
 
also i get no sound from my camera with a MIC, is that i known issue?

UI2 can't play audio from recordings, but it can do live audio. Make sure the audio button is in the unmuted state. For now, I suggest you use firefox for this because it works best. If you try default.htm or default2.htm (default2.htm is a slightly improved version I wrote years ago) in Internet Explorer, then you will be using the ActiveX plugin which should be better at audio all-around, including in recordings I think.
 
  • Like
Reactions: gleep52
BP2008 - that's a good question I guess I was missing too - is there a way to get audio to stream to the web browser when a specific camera is selected? And is there a way to tap into the two way audio like the mobile app has?

If you full-screen a camera that Blue Iris thinks has audio, you should find this speaker button up in the top bar. Use Firefox for best audio performance.

GBkW3Jj.jpg


Fv6b75n.jpg


You'll also see that icon when viewing a camera group, if you have audio enabled for the group, though I am not sure what the audio source is in that case.

Two way audio is not possible right now. Maybe in the future, but I have never worked with two-way audio in a browser before and I imagine whatever the browser is capable of is not compatible with what Blue Iris is capable of.
 
  • Like
Reactions: gleep52
Hmm. I have no idea how UI2 is sending you there, but I will keep an eye out for that happening in the future.

Almost looks like it is going through a reverse proxy and the path is getting passed in an odd way. Have not seen this myself either.
 
only time I've seen it happen the warning box popped up at bottom right corner saying UI2 has detected that your session has expired and then it just forwards me to that