import time
import socket
import base64

print("                ______           \n" +
      "               /\__  _\          \n" +
      " _____   __  __\/_/\ \/ __  __   \n" +
      "/\ '__`\/\ \/\ \  \ \ \/\ \/\ \  \n" +
      "\ \ \L\ \ \ \_\ \  \ \ \ \ \_/ | \n" +
      " \ \ ,__/\/`____ \  \ \_\ \___/  \n"
      "  \ \ \/  `/___/> \  \/_/\/__/   \n"
      "   \ \_\     /\___/ 1.0 by       \n"
      "    \/_/     \/__/     @xdavidhu \n")

tvIP = raw_input("TV's IP: ")

src = "192.168.0.1"  # ip of remote
mac = '00-AB-11-11-11-11'  # mac of remote
remote = 'pyTV_remote'  # remote name
dst = tvIP  # ip of tv
app = 'python'  # iphone..iapp.samsung
tv = 'LE32C650'  # iphone.LE32C650.iapp.samsung

def push(key):
    new = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    new.settimeout(10)
    new.connect((dst, 55000))
    msg = chr(0x64) + chr(0x00) + \
          chr(len(base64.b64encode(src))) + chr(0x00) + base64.b64encode(src) + \
          chr(len(base64.b64encode(mac))) + chr(0x00) + base64.b64encode(mac) + \
          chr(len(base64.b64encode(remote))) + chr(0x00) + base64.b64encode(remote)
    pkt = chr(0x00) + \
          chr(len(app)) + chr(0x00) + app + \
          chr(len(msg)) + chr(0x00) + msg
    new.send(pkt)
    msg = chr(0x00) + chr(0x00) + chr(0x00) + \
          chr(len(base64.b64encode(key))) + chr(0x00) + base64.b64encode(key)
    pkt = chr(0x00) + \
          chr(len(tv)) + chr(0x00) + tv + \
          chr(len(msg)) + chr(0x00) + msg
    new.send(pkt)
    new.close()
    time.sleep(0.1)


try:
    push("KEY_ENTER")
except:
    print("\nTV not found :( Try again with an other IP address.\n")
    exit()

print("\nTV successfully connected.")


print("\nOptions:")
while True:
    try:
        print("[0] Turn off TV")
        print("[1] Change volume")
        print("[2] Change channel")
        print("[3] Trigger mute")
        print("[4] Set up a sleep timer")
        print("[exit] Exit from pyTv")
        option = raw_input()

        if option == "exit":
            print("\nExiting...\n")
            exit()

        elif option == "0":
            push("KEY_POWEROFF")
            print("\n[PWR] TV turned off.\n")
            exit()

        elif option == "1":
            volume = int(raw_input("[VOL] Enter the volume level (0-100): "))
            if volume > 100:
                print("\n[VOL] Volume '100' is the max.\n")
            i = 0
            print("[VOL] Setting volume to '0'...")
            while i <= 100:
                push("KEY_VOLDOWN")
                i = i+1
            i = 1
            print("[VOL] Setting volume up to '"+ str(volume) +"'...")
            while i <= volume:
                push("KEY_VOLUP")
                i=i+1
            print("\n[VOL] Volume changed.\n")

        elif option == "2":
            channel = str(raw_input("[CHN] Enter the channel number: "))
            ch_lenght = len(channel)
            print(ch_lenght)
            i = 1
            while ch_lenght >= i:
                print(channel[i-1:i])
                push("KEY_" + channel[i-1:i])
                i = i+1
            push("KEY_ENTER")
            print("\n[CHN] Channel changed to "+ channel +".\n")

        elif option == "3":
            push("KEY_MUTE")
            print("\n[MUT] Mute triggered.\n")

        elif option == "4":
            print("[STM] Select one option:")
            print("[1] 30 min sleep timer")
            print("[2] 60 min sleep timer")
            print("[3] 90 min sleep timer")
            print("[4] 120 min sleep timer")
            print("[5] 150 min sleep timer")
            print("[6] 180 min sleep timer")
            print("[dis] Disable a running timer")
            timer = raw_input()

            if timer == "dis":
                print("[STM] Witch timer is running?")
                print("[1] 30 min sleep timer")
                print("[2] 60 min sleep timer")
                print("[3] 90 min sleep timer")
                print("[4] 120 min sleep timer")
                print("[5] 150 min sleep timer")
                print("[6] 180 min sleep timer")
                dis_timer = int(raw_input())

                print("[STM] Disableing sleep timer...")
                push("KEY_TOOLS")
                time.sleep(1)
                push("KEY_DOWN")
                time.sleep(0.5)
                push("KEY_DOWN")
                time.sleep(0.5)
                push("KEY_DOWN")
                time.sleep(0.5)
                push("KEY_ENTER")
                time.sleep(0.5)
                i = 1
                while dis_timer >= i:
                    print(i)
                    push("KEY_UP")
                    time.sleep(0.5)
                    i = i + 1
                push("KEY_ENTER")
                time.sleep(0.5)
                push("KEY_EXIT")

                print("\n[STM] Sleep timer disabled successfully.\n")
                continue

            print("[STM] Setting up sleep timer...")
            push("KEY_TOOLS")
            time.sleep(1)
            push("KEY_DOWN")
            time.sleep(0.5)
            push("KEY_DOWN")
            time.sleep(0.5)
            push("KEY_DOWN")
            time.sleep(0.5)
            push("KEY_ENTER")
            time.sleep(0.5)
            timer = int(timer)
            i = 1
            while timer >= i:
                push("KEY_DOWN")
                time.sleep(0.5)
                i = i+1
            push("KEY_ENTER")
            time.sleep(0.5)
            push("KEY_EXIT")

            print("\n[STM] Sleep timer configured successfully.\n")


    except KeyboardInterrupt:
        print("\nYou can exit using the 'exit' command.\n")




"""
KEYS:
KEY_MENU
KEY_UP
KEY_DOWN
KEY_LEFT
KEY_RIGHT
KEY_3
KEY_VOLUP
KEY_4
KEY_5
KEY_6
KEY_VOLDOWN
KEY_7
KEY_8
KEY_9
KEY_MUTE
KEY_CHDOWN
KEY_0
KEY_CHUP
KEY_PRECH
KEY_GREEN
KEY_YELLOW
KEY_CYAN
KEY_ADDDEL
KEY_SOURCE
KEY_INFO
KEY_PIP_ONOFF
KEY_PIP_SWAP
KEY_PLUS100
KEY_CAPTION
KEY_PMODE
KEY_TTX_MIX
KEY_TV
KEY_PICTURE_SIZE
KEY_AD
KEY_PIP_SIZE
KEY_MAGIC_CHANNEL
KEY_PIP_SCAN
KEY_PIP_CHUP
KEY_PIP_CHDOWN
KEY_DEVICE_CONNECT
KEY_HELP
KEY_ANTENA
KEY_CONVERGENCE
KEY_11
KEY_12
KEY_AUTO_PROGRAM
KEY_FACTORY
KEY_3SPEED
KEY_RSURF
KEY_ASPECT
KEY_TOPMENU
KEY_GAME
KEY_QUICK_REPLAY
KEY_STILL_PICTURE
KEY_DTV
KEY_FAVCH
KEY_REWIND
KEY_STOP
KEY_PLAY
KEY_FF
KEY_REC
KEY_PAUSE
KEY_TOOLS
KEY_INSTANT_REPLAY
KEY_LINK
KEY_FF_
KEY_GUIDE
KEY_REWIND_
KEY_ANGLE
KEY_RESERVED1
KEY_ZOOM1
KEY_PROGRAM
KEY_BOOKMARK
KEY_DISC_MENU
KEY_PRINT
KEY_RETURN
KEY_SUB_TITLE
KEY_CLEAR
KEY_VCHIP
KEY_REPEAT
KEY_DOOR
KEY_OPEN
KEY_WHEEL_LEFT
KEY_POWER
KEY_SLEEP
KEY_2
KEY_DMA
KEY_TURBO
KEY_1
KEY_FM_RADIO
KEY_DVR_MENU
KEY_MTS
KEY_PCMODE
KEY_TTX_SUBFACE
KEY_CH_LIST
KEY_RED
KEY_DNIe
KEY_SRS
KEY_CONVERT_AUDIO_MAINSUB
KEY_MDC
KEY_SEFFECT
KEY_DVR
KEY_DTV_SIGNAL
KEY_LIVE
KEY_PERPECT_FOCUS
KEY_HOME
KEY_ESAVING
KEY_WHEEL_RIGHT
KEY_CONTENTS
KEY_VCR_MODE
KEY_CATV_MODE
KEY_DSS_MODE
KEY_TV_MODE
KEY_DVD_MODE
KEY_STB_MODE
KEY_CALLER_ID
KEY_SCALE
KEY_ZOOM_MOVE
KEY_CLOCK_DISPLAY
KEY_AV1
KEY_SVIDEO1
KEY_COMPONENT1
KEY_SETUP_CLOCK_TIMER
KEY_COMPONENT2
KEY_MAGIC_BRIGHT
KEY_DVI
KEY_HDMI
KEY_W_LINK
KEY_DTV_LINK
KEY_APP_LIST
KEY_BACK_MHP
KEY_ALT_MHP
KEY_DNSe
KEY_RSS
KEY_ENTERTAINMENT
KEY_ID_INPUT
KEY_ID_SETUP
KEY_ANYNET
KEY_POWEROFF
KEY_POWERON
KEY_ANYVIEW
KEY_MS
KEY_MORE
KEY_PANNEL_POWER
KEY_PANNEL_CHUP
KEY_PANNEL_CHDOWN
KEY_PANNEL_VOLUP
KEY_PANNEL_VOLDOW
KEY_PANNEL_ENTER
KEY_PANNEL_MENU
KEY_PANNEL_SOURCE
KEY_AV2
KEY_AV3
KEY_SVIDEO2
KEY_SVIDEO3
KEY_ZOOM2
KEY_PANORAMA
KEY_4_3
KEY_16_9
KEY_DYNAMIC
KEY_STANDARD
KEY_MOVIE1
KEY_CUSTOM
KEY_AUTO_ARC_RESET
KEY_AUTO_ARC_LNA_ON
KEY_AUTO_ARC_LNA_OFF
KEY_AUTO_ARC_ANYNET_MODE_OK
KEY_AUTO_ARC_ANYNET_AUTO_START
KEY_AUTO_FORMAT
KEY_DNET
KEY_HDMI1
KEY_AUTO_ARC_CAPTION_ON
KEY_AUTO_ARC_CAPTION_OFF
KEY_AUTO_ARC_PIP_DOUBLE
KEY_AUTO_ARC_PIP_LARGE
KEY_AUTO_ARC_PIP_SMALL
KEY_AUTO_ARC_PIP_WIDE
KEY_AUTO_ARC_PIP_LEFT_TOP
KEY_AUTO_ARC_PIP_RIGHT_TOP
KEY_AUTO_ARC_PIP_LEFT_BOTTOM
KEY_AUTO_ARC_PIP_RIGHT_BOTTOM
KEY_AUTO_ARC_PIP_CH_CHANGE
KEY_AUTO_ARC_AUTOCOLOR_SUCCESS
KEY_AUTO_ARC_AUTOCOLOR_FAIL
KEY_AUTO_ARC_C_FORCE_AGING
KEY_AUTO_ARC_USBJACK_INSPECT
KEY_AUTO_ARC_JACK_IDENT
KEY_NINE_SEPERATE
KEY_ZOOM_IN
KEY_ZOOM_OUT
KEY_MIC
KEY_HDMI2
KEY_HDMI3
KEY_AUTO_ARC_CAPTION_KOR
KEY_AUTO_ARC_CAPTION_ENG
KEY_AUTO_ARC_PIP_SOURCE_CHANGE
KEY_HDMI4
KEY_AUTO_ARC_ANTENNA_AIR
KEY_AUTO_ARC_ANTENNA_CABLE
KEY_AUTO_ARC_ANTENNA_SATELLITE
KEY_EXT1
KEY_EXT2
KEY_EXT3
KEY_EXT4
KEY_EXT5
KEY_EXT6
KEY_EXT7
KEY_EXT8
KEY_EXT9
KEY_EXT10
KEY_EXT11
KEY_EXT12
KEY_EXT13
KEY_EXT14
KEY_EXT15
KEY_EXT16
KEY_EXT17
KEY_EXT18
KEY_EXT19
KEY_EXT20
KEY_EXT21
KEY_EXT22
KEY_EXT23
KEY_EXT24
KEY_EXT25
KEY_EXT26
KEY_EXT27
KEY_EXT28
KEY_EXT29
KEY_EXT30
KEY_EXT31
KEY_EXT32
KEY_EXT33
KEY_EXT34
KEY_EXT35
KEY_EXT36
KEY_EXT37
KEY_EXT38
KEY_EXT39
KEY_EXT40
KEY_EXT41
"""
