Damein Posted August 6, 2016 Posted August 6, 2016 I know I've made a few of these and there are quite a few out there already but just wanted to throw up a new one I did. Special thanks to Alexander Samuelsson AKA AdmiralAlkex for the JSON/Data Retrieve Sections as found in his version Forum Topic I wanted something that I could choose between Livestreamer or Browser when watching and also the ability to launch chat too (If I'm using Livestreamer) because I also use Hex Chat for that as well. Cleaned up the tray menus to my liking and voila. Thanks again and enjoy! GitHub YouTube Demo Source expandcollapse popup#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Icon=Imgs\WatchIcon.ico #AutoIt3Wrapper_Compression=0 #AutoIt3Wrapper_Res_Fileversion=1.3.0.0 #AutoIt3Wrapper_Res_LegalCopyright=R.S.S. #AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker #AutoIt3Wrapper_Add_Constants=n #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ; *** Start added by AutoIt3Wrapper *** #include <StructureConstants.au3> ; *** End added by AutoIt3Wrapper *** #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.12.0 (Stable) Author: Damein / Special Thanks to Alexander Samuelsson AKA AdmiralAlkex for the JSON/Data Retrieve Sections Script Function: Stuff #ce ---------------------------------------------------------------------------- #include "Json.au3" #include <Date.au3> #include <Array.au3> #include <InetConstants.au3> #include <TrayConstants.au3> Opt("TrayMenuMode", 3) Opt("TrayOnEventMode", 1) Opt("WinTitleMatchMode", 2) $iPrintJSON = IniRead(@ScriptDir & "\Data/Settings.ini", "Section", "PrintJSON", "") ;PRINT ON JSON Global $sUsername, $LiveStreamsMenu, $FirstRun = 0, $LiveStreamData Global Enum $eTwitch Global Enum $eDisplayName, $eUrl, $ePreview, $eGame, $eCreated, $eTrayId, $eStatus, $eTime, $eOnline, $eService, $eMax Global $aStreams[0][$eMax] Dim $LiveStreams[4000][4000] $TrayOptionsMenu = TrayCreateMenu("Options") $TrayOptionsSetUsername = TrayCreateItem("Set Username...", $TrayOptionsMenu) TrayItemSetOnEvent(-1, "_SetUsername") $TrayOptionsRefresh = TrayCreateItem("Refresh...", $TrayOptionsMenu) TrayItemSetOnEvent(-1, "_Refresh") $TrayOptionsLiveStreamer = TrayCreateItem("Use Livestreamer...", $TrayOptionsMenu) TrayItemSetOnEvent(-1, "_LiveStreamer") $TrayOptionsUseBrowser = TrayCreateItem("Use Browser...", $TrayOptionsMenu) TrayItemSetOnEvent(-1, "_Browser") $TrayOptionsQuality = TrayCreateItem("Set Quality...", $TrayOptionsMenu) TrayItemSetOnEvent(-1, "_Quality") $TrayExit = TrayCreateItem("Exit...", $TrayOptionsMenu) TrayItemSetOnEvent(-1, "_Exit") TrayCreateItem("") $ChatOptionsMenu = TrayCreateMenu("Chat Options...") $TrayOptionsChat = TrayCreateItem("Load Chat...", $ChatOptionsMenu) TrayItemSetOnEvent(-1, "_LoadChat") $TrayOptionsChatBrowser = TrayCreateItem("Use Browser...", $ChatOptionsMenu) TrayItemSetOnEvent(-1, "_UseBrowser") $TrayOptionsChatHex = TrayCreateItem("Use Hex...", $ChatOptionsMenu) TrayItemSetOnEvent(-1, "_UseHex") $ReadFormat = IniRead(@ScriptDir & "/Data/Settings.ini", "Section", "Format", "NA") If $ReadFormat = "Livestreamer" Then TrayItemSetState($TrayOptionsUseBrowser, $TRAY_UNCHECKED) TrayItemSetState($TrayOptionsLiveStreamer, $TRAY_CHECKED) ElseIf $ReadFormat = "Browser" Then TrayItemSetState($TrayOptionsLiveStreamer, $TRAY_UNCHECKED) TrayItemSetState($TrayOptionsUseBrowser, $TRAY_CHECKED) EndIf $ReadChat = IniRead(@ScriptDir & "/Data/Settings.ini", "Section", "Chat", "NA") If $ReadChat = "1" Then TrayItemSetState($TrayOptionsChat, $TRAY_CHECKED) ElseIf $ReadFormat = "0" Then TrayItemSetState($TrayOptionsChat, $TRAY_UNCHECKED) EndIf $ReadChatType = IniRead(@ScriptDir & "/Data/Settings.ini", "Section", "ChatType", "NA") If $ReadChatType = "Browser" Then TrayItemSetState($TrayOptionsChatBrowser, $TRAY_CHECKED) TrayItemSetState($TrayOptionsChatHex, $TRAY_UNCHECKED) ElseIf $ReadChatType = "Hex" Then TrayItemSetState($TrayOptionsChatBrowser, $TRAY_UNCHECKED) TrayItemSetState($TrayOptionsChatHex, $TRAY_CHECKED) EndIf $sUsername = IniRead(@ScriptDir & "/Data/Settings.ini", "Section", "Username", "NA") If $sUsername = "NA" Or "" Then MsgBox(48, "Error", "Make sure to set a username from the tray menu before trying to search streams!") Else TrayTip("Updating...", "Getting live streams...", 2000) _TwitchGet($sUsername) EndIf Func _TwitchGet($sUsername) Dim $LiveStreams[4000][4000] Global $aStreams[0][$eMax] $iLimit = 100 $iOffset = 0 $sQuotedUsername = URLEncode($sUsername) $sBaseUrl = "https://api.twitch.tv/kraken/users/" & $sQuotedUsername & "/follows/channels" While True $sUrl = $sBaseUrl & OPTIONS_OFFSET_LIMIT_TWITCH($iOffset, $iLimit) $avTemp = FetchItems($sUrl, "follows") If UBound($avTemp) = 0 Then ExitLoop Local $sOptions For $iX = 0 To UBound($avTemp) - 1 $oChannel = Json_ObjGet($avTemp[$iX], "channel") $sName = Json_ObjGet($oChannel, "name") $sOptions &= $sName & ',' Next $sOptions = StringTrimRight($sOptions, 1) $sUrl = 'https://api.twitch.tv/kraken/streams?channel=' & $sOptions & '&limit=' & $iLimit $oChannel = FetchItems($sUrl, "streams") For $iX = 0 To UBound($oChannel) - 1 $oChannel2 = Json_ObjGet($oChannel[$iX], "channel") $sUrl = Json_ObjGet($oChannel2, "url") If $sUrl = "" Then $sUrl = "http://www.twitch.tv/" & Json_ObjGet($oChannel2, "name") $sDisplayName = Json_ObjGet($oChannel2, "display_name") $sStatus = Json_ObjGet($oChannel2, "status") $oPreview = Json_ObjGet($oChannel[$iX], "preview") $sMedium = Json_ObjGet($oPreview, "medium") $sGame = Json_ObjGet($oChannel[$iX], "game") $sCreated = Json_ObjGet($oChannel[$iX], "created_at") $asSplit = StringSplit($sCreated, "T") $asDate = StringSplit($asSplit[1], "-") $asTime = StringSplit(StringTrimRight($asSplit[2], 1), ":") $tSystemTime = DllStructCreate($tagSYSTEMTIME) $tSystemTime.Year = $asDate[1] $tSystemTime.Month = $asDate[2] $tSystemTime.Day = $asDate[3] $tSystemTime.Hour = $asTime[1] $tSystemTime.Minute = $asTime[2] $tSystemTime.Second = $asTime[3] $tFileTime = _Date_Time_SystemTimeToFileTime($tSystemTime) $tLocalTime = _Date_Time_FileTimeToLocalFileTime($tFileTime) $sTime = _Date_Time_FileTimeToStr($tLocalTime, 1) $iHours = _DateDiff("h", $sTime, _NowCalc()) $iMinutes = _DateDiff("n", $sTime, _NowCalc()) $iMinutes -= $iHours * 60 $sTime = StringFormat("%02i:%02i", $iHours, $iMinutes) _StreamSet($sDisplayName, $sUrl, $sMedium, $sGame, $sCreated, $sTime, $sStatus, $eTwitch) Next If UBound($oChannel) <= 100 Then ExitLoop $iOffset += $iLimit WEnd _WriteStreams() Return "Potato on a Stick" EndFunc ;==>_TwitchGet Func FetchItems($sUrl, $sKey, $sExtendedKey = Null) Local $sRetExtended $oJSON = getJson($sUrl) If IsObj($oJSON) = False Then Return "" If IsString($sExtendedKey) Then $sRetExtended = Json_ObjGet($oJSON, $sExtendedKey) EndIf $aFollows = Json_ObjGet($oJSON, $sKey) If UBound($aFollows) > 0 Then Return SetExtended($sRetExtended, $aFollows) Else Return SetExtended($sRetExtended, "") EndIf EndFunc ;==>FetchItems Func _StreamSet($sDisplayName, $sUrl, $sThumbnail, $sGame, $sCreated, $sTime, $sStatus, $iService) ConsoleWrite("Found streamer: " & $sDisplayName & @CRLF) For $iIndex = 0 To UBound($aStreams) - 1 If $aStreams[$iIndex][$eUrl] = $sUrl Then ExitLoop Next If $iIndex = UBound($aStreams) Then ReDim $aStreams[$iIndex + 1][$eMax] EndIf $aStreams[$iIndex][$eDisplayName] = $sDisplayName $aStreams[$iIndex][$eUrl] = $sUrl $aStreams[$iIndex][$ePreview] = $sThumbnail $aStreams[$iIndex][$eGame] = $sGame $aStreams[$iIndex][$eCreated] = $sCreated $aStreams[$iIndex][$eTime] = $sTime $aStreams[$iIndex][$eStatus] = $sStatus $aStreams[$iIndex][$eOnline] = True $aStreams[$iIndex][$eService] = $iService EndFunc ;==>_StreamSet Func OPTIONS_OFFSET_LIMIT_TWITCH($iOffset, $iLimit) Return '?offset=' & $iOffset & '&limit=' & $iLimit EndFunc ;==>OPTIONS_OFFSET_LIMIT_TWITCH Func getJson($sUrl) $dJsonString = InetRead($sUrl, $INET_FORCERELOAD) If $iPrintJSON Then ConsoleWrite(BinaryToString($dJsonString) & @CRLF) $oJSON = Json_Decode(BinaryToString($dJsonString)) Return $oJSON EndFunc ;==>getJson Func URLEncode($urlText) $url = "" For $i = 1 To StringLen($urlText) $acode = Asc(StringMid($urlText, $i, 1)) Select Case ($acode >= 48 And $acode <= 57) Or _ ($acode >= 65 And $acode <= 90) Or _ ($acode >= 97 And $acode <= 122) $url = $url & StringMid($urlText, $i, 1) Case $acode = 32 $url = $url & "+" Case Else $url = $url & "%" & Hex($acode, 2) EndSelect Next Return $url EndFunc ;==>URLEncode Func _WriteStreams() FileDelete(@ScriptDir & "/Data/Data.ini") FileCopy(@ScriptDir & "/Data/Default Data.ini", @ScriptDir & "/Data/Data.ini") For $i = 0 To UBound($aStreams) - 1 IniWrite(@ScriptDir & "/Data/Data.ini", "Live", $aStreams[$i][0], $aStreams[$i][1] & "|" & $aStreams[$i][3]) Next _SetTray() EndFunc ;==>_WriteStreams Func _Refresh() TrayTip("Updating...", "Getting live streams...", 2000) _TwitchGet($sUsername) EndFunc ;==>_Refresh Func _SetTray() TrayItemDelete($LiveStreamsMenu) If $FirstRun = 1 Then For $i = 1 To UBound($LiveStreamData) - 1 TrayItemDelete($LiveStreams[$i][$eTrayId]) Next EndIf $LiveStreamsMenu = TrayCreateMenu("Live Streams") $LiveStreamData = IniReadSection(@ScriptDir & "/Data/Data.ini", "Live") For $i = 1 To UBound($LiveStreamData) - 1 $SplitData = StringSplit($LiveStreamData[$i][1], "|") $LiveStreams[$i][$eTrayId] = TrayCreateItem($LiveStreamData[$i][0] & " - " & $SplitData[2], $LiveStreamsMenu) TrayItemSetOnEvent(-1, "_RunStream") Next TrayTip("Updating...", "Update complete!", 2000) $FirstRun = 1 EndFunc ;==>_SetTray Func _RunStream() $Tray = @TRAY_ID $Tray = TrayItemGetText($Tray) $Split = StringSplit($Tray, "-") $Tray = StringStripWS($Split[1], 8) $CheckVideoSource = IniRead(@ScriptDir & "/Data/Settings.ini", "Section", "Format", "NA") If $CheckVideoSource = "NA" Then MsgBox(48, "Error", "No format has been set, please do so in the options menu!") ElseIf $CheckVideoSource = "Livestreamer" Then $CheckVideoQuality = IniRead(@ScriptDir & "/Data/Settings.ini", "Section", "Quality", "NA") Run("livestreamer" & " twitch.tv/" & $Tray & " " & $CheckVideoQuality) Sleep(1000) ElseIf $CheckVideoSource = "Browser" Then ShellExecute("https://www.twitch.tv/" & $Tray) Sleep(1000) EndIf $ReadChat = IniRead(@ScriptDir & "/Data/Settings.ini", "Section", "Chat", "NA") $ReadChatType = IniRead(@ScriptDir & "/Data/Settings.ini", "Section", "ChatType", "NA") If $ReadChat = "1" Then If $ReadChatType = "Browser" Then ShellExecute("https://www.twitch.tv/" & $Tray & "/chat?popout=") ElseIf $ReadChatType = "Hex" Then WinActivate("HexChat:") Sleep(100) Send("/join {#}" & $Tray) Sleep(100) Send("{ENTER}") EndIf EndIf EndFunc ;==>_RunStream Func _SetUsername() $InputUsername = InputBox("Username...", "Please type out your username only. No Twitch.tv is needed!") If @error = 1 Then MsgBox(48, "Cancelled!", "You have cancelled this operation!") Else IniWrite(@ScriptDir & "/Data/Settings.ini", "Section", "Username", $InputUsername) $sUsername = $InputUsername MsgBox(0, "Username...", "Username: " & $InputUsername & " is set!") EndIf EndFunc ;==>_SetUsername Func _LiveStreamer() TrayItemSetState($TrayOptionsLiveStreamer, $TRAY_UNCHECKED) TrayItemSetState($TrayOptionsUseBrowser, $TRAY_UNCHECKED) TrayItemSetState($TrayOptionsLiveStreamer, $TRAY_CHECKED) MsgBox(0, "Video Source", "Now using Livestreamer by default!") IniWrite(@ScriptDir & "/Data/Settings.ini", "Section", "Format", "Livestreamer") EndFunc ;==>_LiveStreamer Func _Browser() TrayItemSetState($TrayOptionsLiveStreamer, $TRAY_UNCHECKED) TrayItemSetState($TrayOptionsUseBrowser, $TRAY_UNCHECKED) TrayItemSetState($TrayOptionsUseBrowser, $TRAY_CHECKED) MsgBox(0, "Video Source", "Now using default Browser by default!") IniWrite(@ScriptDir & "/Data/Settings.ini", "Section", "Format", "Browser") EndFunc ;==>_Browser Func _Quality() $InputQuality = InputBox("Quality Selection", "Please input a quality for Livestreamer" & @CRLF & "Mobile" & @CRLF & "Low" & @CRLF & "Medium" & @CRLF & "High" & @CRLF & "Source") If @error = 1 Then MsgBox(48, "Cancelled!", "You have cancelled this operation!") Else IniWrite(@ScriptDir & "/Data/Settings.ini", "Section", "Quality", $InputQuality) MsgBox(0, "Quality Selection", "Quality: " & $InputQuality & " has been set for Livestreamer use!") EndIf EndFunc ;==>_Quality Func _UseBrowser() TrayItemSetState($TrayOptionsChatBrowser, $TRAY_UNCHECKED) TrayItemSetState($TrayOptionsChatHex, $TRAY_UNCHECKED) TrayItemSetState($TrayOptionsChatBrowser, $TRAY_CHECKED) IniWrite(@ScriptDir & "/Data/Settings.ini", "Section", "ChatType", "Browser") EndFunc ;==>_UseBrowser Func _UseHex() TrayItemSetState($TrayOptionsChatBrowser, $TRAY_UNCHECKED) TrayItemSetState($TrayOptionsChatHex, $TRAY_UNCHECKED) TrayItemSetState($TrayOptionsChatHex, $TRAY_CHECKED) IniWrite(@ScriptDir & "/Data/Settings.ini", "Section", "ChatType", "Hex") EndFunc ;==>_UseHex Func _LoadChat() $ReadChat = IniRead(@ScriptDir & "/Data/Settings.ini", "Section", "Chat", "NA") If $ReadChat = "1" Then TrayItemSetState($TrayOptionsChat, $TRAY_UNCHECKED) IniWrite(@ScriptDir & "/Data/Settings.ini", "Section", "Chat", "0") ElseIf $ReadChat = 0 Then TrayItemSetState($TrayOptionsChat, $TRAY_CHECKED) IniWrite(@ScriptDir & "/Data/Settings.ini", "Section", "Chat", "1") EndIf EndFunc ;==>_LoadChat Func _Exit() Exit EndFunc ;==>_Exit While 1 Sleep(10) WEnd Reveal hidden contents Most recent sig. I made Quick Launcher W/ Profiles Topic Movie Database Topic & Website | LiveStreamer Pro Website | YouTube Stand-Alone Playlist Manager: Topic | Weather Desktop Widget: Topic | Flash Memory Game: Topic | Volume Control With Mouse / iTunes Hotkeys: Topic | Weather program: Topic | Paws & Tales radio drama podcast mini-player: Topic | Quick Math Calculations: Topic
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now