Что нового

[Автоматизация] Обновить веб страницу с onlineTv каналом в случае остановки трансляции

softvirus

Новичок
Сообщения
9
Репутация
0
Версия AutoIt: 3 - последняя

Описание:
В силу того, что телевидение могу смотреть только через инет (кабельного нет, а спутниковое пока что для меня дорого :( ), то приходится постоянно бегать к телевизору, когда вещание "подвисает".
Хотелось бы заиметь скрипт (если это возможно реализовать) который бы обновлял страницу с инетТВ каналом, когда трансляция прерывается, и при возобновлении трансляции разворачивал плеер на весь экран.
Примечания:
Сайт на котором я смотрю ТВ - http://www.ontvtime.ru/ . Трансляция ведётся через WinMediaPlayer плугин.
На сколько я вижу реализацию стрипта - это проверка, что находится под курсором (я просто не знаю - AutoIt умеет понимать состояние windows media player? Если умеет, то тогда в случае состояния реконнекта, который дольше 5 секунт, сворачивал бы с полного экрана плеер, передавал бы управление браузеру, обновлял бы страницу, дожидался бы загрузки страницы, после этого проверял бы запустилось вещание или идёт коннект в плеере, если идёт вещание - то разворот на весь экран, а если в течении 10 секунд вещание не возобновилось, то снова обновление страницы и .... .
Увлёкся на счёт понимания состояния приложения. В случае если это сложно, то можно было бы и через то, что находится под курсором. Если плеер - то всё нормально, а если веб страница (когда прекращается трансляция, плеер выходит из полноэкранного режима), то обновление её, ожидание загрузки страницы, ожидание начала вещания, разворот на весь экран.

Вообщем как-то так.


Огромная просьба, если кто сможет такой скрипт реализовать - ПОМОГИТЕ :smile:))).
Это очень актуально становится, когда кормишь ребёнка/убаюкиваешь, а вещание прерывается.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
softvirus
А прямую ссылку не побывали смотреть непосредственно в WMP?
Файл - > Открыть адрес URL
К примеру:
Код:
http://www.ontvtime.ru/stream/muztv_62.149.12.61_9699.asx
WMP сам обновляет соединение, если оно прервалось.
 
Автор
S

softvirus

Новичок
Сообщения
9
Репутация
0
спасибо огромное. Но тот скрипт, по ссылке выше, он делает немного не то что мне нужно (на сколько я смог понять код). Как я понял - он переделывает GUI интерфейс плугина.

Прямая ссылка не помогает. На стороне сервера скорее всего стоит лимит по времени подключения. + WMP как и его плугин, почему-то не правильно реконнектится, точнее иногда вещание возобнобновляется, но чаще всего вещание прекращается или же подвисает подключение к серверу.
Так что мне приходится постоянно вставать, подходить к телеку, нажимать обновить страницу и только после этого вещание возобновляется.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
361
softvirus
А в чем заключается прерывание трансляции? Просто картинка замирает?
Тогда можно периодически сравнивать скриншоты экрана.

Воспользовавшись темой http://autoit-script.ru/index.php?topic=1824.0
написал следующий код:

Код:
#include <ScreenCapture.au3>
Opt("WinTitleMatchMode", 2)
While 1
_ScreenCapture_Capture ("C:\1.bmp" ,0,0,-1,-1,False)
Sleep(5000)
_ScreenCapture_Capture ("C:\2.bmp" ,0,0,-1,-1,False)

$hFile1 = FileOpen("C:\1.bmp", 16)
$hFile2 = FileOpen("C:\2.bmp", 16)
$sTest1 = FileRead($hFile1)
$sTest2 = FileRead($hFile2)
FileClose($hFile1)
FileClose($hFile2)

If $sTest1 = $sTest2 Then
    MsgBox(0, "", "Трансляция прервана!", 2)
	WinActivate ("Internet Explorer", "")
	Send("{F5}")
	Sleep(17000)
	ControlClick ("Internet Explorer", "", "[CLASS:EVRVideoHandler; INSTANCE:1]","left", 2)
Else
EndIf
WEnd

Конечно, не слишком элегантно, но более-менее работает.
Проверялся в Win 7, думаю, для XP придется переписывать класс элемента окна для включения полноэкранного режима - нужно Au3Info посмотреть, что показывает при выделении окна плагина в браузере
 
Автор
S

softvirus

Новичок
Сообщения
9
Репутация
0
Спасибки за помощь :smile:!
Да, забыл сказать - у меня winXP стоит.
Прерывание трансляции в 90% случаев обычно заключается в остановке трансляции и сворачивании плеера с полноэранного режима. После обновления страницы плеер автоматически начинает коннектится к серверу и после подключения начинает показывать канал. Остаётся только мне дважды кликнуть чтобы развернуть на полный экран.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Если оно сворачивается - можно сделать реакцию именно на это ;)
Код:
Opt("WinTitleMatchMode", 2)
While 1
    $state = WinGetState('Windows Media')
    If BitAND($state, 16) Then ; окно свернулось!
        MsgBox(0, "", "Трансляция прервана!", 2)
        WinActivate ("Internet Explorer", "")
        Send("{F5}")
        Sleep(17000)
        ControlClick ("Internet Explorer", "", "[CLASS:EVRVideoHandler; INSTANCE:1]","left", 2)
    EndIf
    Sleep(5000)
WEnd
 
Автор
S

softvirus

Новичок
Сообщения
9
Репутация
0
Вчера попробовал все коды, которые написали. Что-то реакции вообще ни какой :((((.

Повторюсь на счёт конфигурации системы - WinXP SP3 + Chrome or IE8.

Пробовал сам что-то навоять - результат тот же - нулевой :(
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
softvirus
Попробуйте так. Проверял на Windows XP SP3 (32) с IE8, у меня работает.
Код:
#include <IE.au3>

Opt('PixelCoordMode', 2)
Opt('MouseCoordMode', 2)
Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global Const $tagMIB_IFROW = 'wchar Name[256];dword Index;dword Type;dword Mtu;dword Speed;dword PhysAddrLen;byte PhysAddr[8];dword AdminStatus;dword OperStatus;dword LastChange;dword InOctets;dword InUcastPkts;dword InNUcastPkts;dword InDiscards;dword InErrors;dword InUnknownProtos;dword OutOctets;dword OutUcastPkts;dword OutNUcastPkts;dword OutDiscards;dword OutErrors;dword OutQLen;dword DescrLen;char Descr[256]'

Global $iGetKB_1, $iGetKB_2, $iDifference, $bPause = False, $aGetKB_1, $aGetKB_2

HotKeySet('{F10}', '_MyPause') ;F10 - пауза
HotKeySet('{ESC}', '_MyExit') ;Esc - выход

If Not Ping('www.ontvtime.ru') Then
	ToolTip('Сайт www.ontvtime.ru не доступен.', 0, 0, '', 3, 1)
	Sleep(3000)
	Exit
EndIf

While 1
	If $bPause Then
		$iGetKB_1 = Round(_WinAPI_GetIfEntry() / 1024, 2)
		Sleep(2000)
		$iGetKB_2 = Round(_WinAPI_GetIfEntry() / 1024, 2)
		$iDifference = $iGetKB_2 - $iGetKB_1
		ToolTip(Round($iDifference, 2) & @CRLF & 'F10-пауза' & @CRLF & 'Esc-выход', 0, 0, '', 0, 1)
		If $iDifference < 10 Then
			_Give_Me_My_TV()
		EndIf
	Else
		ToolTip('F10-начать(продолжить) работу', 0, 0, '', 0, 1)
	EndIf
	Sleep(2)
WEnd

Func _Give_Me_My_TV()
	Local $hHandle, $oIE, $aWinPos, $timeout, $aPos, $checksum
	Local $aIE_List = WinList('[Class:IEFrame]')
	If Not $aIE_List[0][0] Then Return

	For $i = 1 To $aIE_List[0][0]
		If StringInStr($aIE_List[$i][0], 'Онлайн ТВ') Then
			$hHandle = $aIE_List[$i][1]
			ExitLoop
		EndIf
	Next
	If Not IsHWnd($hHandle) Then Return
	$oIE = _IEAttach($hHandle, 'HWND')
	If Not IsObj($oIE) Then Return
	_IEAction($oIE, 'refresh')
	_IELoadWait($oIE)

	$aWinPos = WinGetPos($hHandle)
	If Not IsArray($aWinPos) Then Return
	$timeout = TimerInit()
	While 1
		$aPos = ControlGetPos($hHandle, '', '[CLASS:WMPVideoWindow; INSTANCE:1]')
		If IsArray($aPos) Then ExitLoop
		Sleep(500)
		If TimerDiff($timeout) >= 10000 Then Return
	WEnd

	$checksum = PixelChecksum($aPos[0] + $aPos[2] - 50, $aPos[1] + $aPos[3], $aPos[0] + $aPos[2], $aPos[1] + $aPos[3] + 100, 1, $hHandle)
	While $checksum = PixelChecksum($aPos[0] + $aPos[2] - 50, $aPos[1] + $aPos[3], $aPos[0] + $aPos[2], $aPos[1] + $aPos[3] + 100, 1, $hHandle)
		Sleep(100)
	WEnd
	MouseClick('primary', $aPos[0] + $aWinPos[0] + $aPos[2] / 2, $aPos[1] + $aWinPos[1] + $aPos[3] / 2, 2, 1)

	Return
EndFunc   ;==>_Give_Me_My_TV


Func _MyPause()
	$bPause = Not $bPause
EndFunc   ;==>_MyPause

Func _MyExit()
	Exit
EndFunc   ;==>_MyExit

Func _WinAPI_GetIfEntry($iIndex = 1, $Dll = -1)

	Local $Ret, $Data, $sResult
	Local $tMIB_IFROW

	If $Dll < 0 Then
		$Dll = 'IPHlpApi.dll'
	EndIf

	$tMIB_IFROW = DllStructCreate($tagMIB_IFROW)
	DllStructSetData($tMIB_IFROW, 2, $iIndex)
	$Ret = DllCall($Dll, 'dword', 'GetIfEntry', 'ptr', DllStructGetPtr($tMIB_IFROW))
	If (@error) Or ($Ret[0]) Then
		Return SetError($Ret[0], 0, 0)
	EndIf
	$sResult = DllStructGetData($tMIB_IFROW, 'InOctets')
	Return $sResult
EndFunc   ;==>_WinAPI_GetIfEntry

PS
Проверьте AutoIt v3 Window Info, у Вас такой же '[CLASS:WMPVideoWindow; INSTANCE:1]'.

PPS
У Вас какой интернет? У меня через внешний USB-модем, с ним и проверял. Если у Вас через сеть, то код работать не будет.


Поменял код, у меня на Windows XP SP3 (32) с IE8 работает и с USB-модемом, и с сетевым подключением.
Функция _WinAPI_GetIfEntry() в моем коде - упрощенный вариант функции Yashied`a из этой темы: Мониторинг входящего/исходящего трафика для выбранного адаптера.
 
Автор
S

softvirus

Новичок
Сообщения
9
Репутация
0
Код:
>>>> Control <<<<
Class:	WMPVideoWindow
Instance:	1
ClassnameNN:	WMPVideoWindow1
Name:	
Advanced (Class):	[CLASS:WMPVideoWindow; INSTANCE:1]
ID:	
Text:	WMPVideoWindow
Position:	425, 292
Size:	488, 325
ControlClick Coords:	302, 144
Style:	0x54000000
ExStyle:	0x00000080
Handle:	0x000F02B8
Класс - тот же самый.
Всё работает, НО! Проблема состоит в том, что когда скрипт разварачивает на полный экран видео, то через секунду он сворачивает его и обновляет страницу - и так постоянно.
В верхней части цифры то 0 то 1.73. Как я понял из кода - это разница между первой и второй картинками? или?

Может быть сделать проверку на то, что видео плеер не развернут на полный экран и в этом случае делать обновление страницы и т.д....?

Да и влюбом случае - ОГРОМНОЕ СПАСИБО! за то что взялся помочь! :smile:
ЗЫ. Интернет получаю по LAN от провайдера.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
softvirus
Попробуйте закомментировать эти строки:
Код:
...
If $iDifference < 10 Then
      _Give_Me_My_TV()
EndIf
Else
     ToolTip('F10-начать(продолжить) работу', 0, 0, '', 0, 1)
EndIf
...
И посмотрите, какие цифры будет у Вас показывать при нормальной работе и при зависании. В зависимости от этого подберите цифру вместо моей $iDifference < 10. Может у Вас надо не 10, а, например, 1 или 0.5, я под себя это число подгонял.
Или поменяйте паузу вместо Sleep(2000) на Sleep(5000) или больше.
 
Автор
S

softvirus

Новичок
Сообщения
9
Репутация
0
перепробовал то что ты советовал - не срабатывает. Точнее иногда бывает, что цифра 0 и тогда скрипт срабатывает, а так - видеоплеер сворачивается, а цифра как была 1.73-1.72 так и остаётся. :(
ЗЫ. Пробовал выставлять в коде задержку на 1000,2000,3000,4000 - постоянно идёт в перезагрузку. 6000 и более - цифры становятся крайне различными, то 3.14, то 1.73, то 5.12.
Так же в коде сделал порог срабатывания, всё что меньше 1.7

Может быть можно ещё сделать проверку на что нить, что плеер перестал воспроизводить видеотрансляцию?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
softvirus
Давайте уточним. Вы писали выше
Прерывание трансляции в 90% случаев обычно заключается в остановке трансляции и сворачивании плеера с полноэранного режима
А какие еще изменения происходят при зависании?
 
Автор
S

softvirus

Новичок
Сообщения
9
Репутация
0
ну либо картинка зависает, как будто нажали на паузу, но это редко, а так чаще всего плеер сворачивается с полноэкранного режима до состояния "неактивности" (то что на скриншоте). В принципе это всё.
Пытался понять из-за чего при остановленной трансляции всё же выдаётся цифра 1.72-73, а не 0, как должно быть. Если честно то так и не понял :(.
 
Автор
S

softvirus

Новичок
Сообщения
9
Репутация
0
up. к сожалению моя проблема ещё не решена :'(
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Попробовал посидеть на этом сайте. Это не телевизор. Это смерть для смотрящего. Каждые несколько минут они переключаются на другой адрес и порт. У меня при потере траффа отрубается звук - может проще звук ловить, потом обновлять ссылку, потом выводить на весь экран?
 
Автор
S

softvirus

Новичок
Сообщения
9
Репутация
0
хз. в моём случае картинка просто зависает и либо в 20-30% винплеер делает удачный реконнект и всё дальше работает, либо плеер сворачивается и останавливается видеопоказ.
ЗЫ. Да, иногда бывает, что связь с сервером на столько паршивая(славо богу что не часто), что приходится либо постоянно обновлять страницу, либо просто забивать на ТВ трансляцию и смотреть что было скачано торрентом :whistle:
 
Верх