Что нового

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

softvirus

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

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

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


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

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
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
Репутация
363
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
Репутация
375
Если оно сворачивается - можно сделать реакцию именно на это ;)
Код:
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,322
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,322
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,322
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:
 
Верх