mirror of
https://github.com/Neur0toxine/lg-webos-devmode-timer-extender.git
synced 2025-02-03 08:09:23 +03:00
initial commit
This commit is contained in:
parent
9fb3929960
commit
21c58a3829
9
.gitignore
vendored
9
.gitignore
vendored
@ -1,5 +1,5 @@
|
|||||||
# Binaries for programs and plugins
|
# Binaries
|
||||||
*.exe
|
devmode-extender_*
|
||||||
*.exe~
|
*.exe~
|
||||||
*.dll
|
*.dll
|
||||||
*.so
|
*.so
|
||||||
@ -12,4 +12,7 @@
|
|||||||
*.out
|
*.out
|
||||||
|
|
||||||
# Dependency directories (remove the comment below to include it)
|
# Dependency directories (remove the comment below to include it)
|
||||||
# vendor/
|
vendor/
|
||||||
|
|
||||||
|
# IDE files.
|
||||||
|
.idea
|
||||||
|
16
Dockerfile
Normal file
16
Dockerfile
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
FROM debian:stable-slim
|
||||||
|
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get -y --no-install-recommends install make binutils upx-ucl wget gcc-arm-linux-gnueabihf software-properties-common && \
|
||||||
|
add-apt-repository "deb http://httpredir.debian.org/debian sid main" && \
|
||||||
|
apt-get update && \
|
||||||
|
apt-get -t sid install -y --no-install-recommends golang-1.17-go && \
|
||||||
|
apt clean && \
|
||||||
|
rm -rf /var/lib/apt && \
|
||||||
|
rm -rf /var/lib/dpkg
|
||||||
|
|
||||||
|
RUN wget https://github.com/tinygo-org/tinygo/releases/download/v0.21.0/tinygo_0.21.0_amd64.deb \
|
||||||
|
&& dpkg -i tinygo_0.21.0_amd64.deb \
|
||||||
|
&& rm tinygo_0.21.0_amd64.deb
|
||||||
|
|
||||||
|
ENV PATH="/usr/lib/go-1.17/bin/:$PATH"
|
32
Makefile
Normal file
32
Makefile
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
SHELL = /bin/bash -o pipefail
|
||||||
|
export PATH := $(shell go env GOPATH)/bin:$(PATH)
|
||||||
|
|
||||||
|
ROOT_DIR=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
|
||||||
|
BIN=$(ROOT_DIR)/devmode-extender
|
||||||
|
|
||||||
|
all:
|
||||||
|
@docker-compose run --rm app
|
||||||
|
|
||||||
|
build: deps fmt
|
||||||
|
@echo "> Building"
|
||||||
|
# TODO: TinyGo has problems with the arm crosscompilation. See this: https://github.com/tinygo-org/tinygo/issues/1906
|
||||||
|
#@CGO_ENABLED=0 GOOS=linux GOARCH=arm tinygo build -o $(BIN)_arm . && strip $(BIN)_arm && upx -9 $(BIN)_arm
|
||||||
|
@CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -ldflags="-s -w" -o $(BIN)_arm . && upx -9 $(BIN)_arm
|
||||||
|
@echo $(BIN)_arm
|
||||||
|
# TODO: TinyGo has problems with the arm crosscompilation. See this: https://github.com/tinygo-org/tinygo/issues/1906
|
||||||
|
#@CGO_ENABLED=0 GOOS=linux GOARCH=arm64 tinygo build -o $(BIN)_arm64 . && strip $(BIN)_arm64 && upx -9 $(BIN)_arm64
|
||||||
|
@CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -o $(BIN)_arm64 . && upx -9 $(BIN)_arm64
|
||||||
|
@echo $(BIN)_arm64
|
||||||
|
@CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags="-s -w" -o $(BIN)_386.exe . && upx -9 $(BIN)_386.exe
|
||||||
|
@echo $(BIN)_386.exe
|
||||||
|
@CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o $(BIN)_amd64.exe . && upx -9 $(BIN)_amd64.exe
|
||||||
|
@echo $(BIN)_amd64.exe
|
||||||
|
|
||||||
|
fmt:
|
||||||
|
@echo "> gofmt"
|
||||||
|
@gofmt -l -s -w `go list -f '{{.Dir}}' ${ROOT_DIR}/... | grep -v /vendor/`
|
||||||
|
|
||||||
|
deps:
|
||||||
|
@echo "> Dependencies"
|
||||||
|
@go mod tidy
|
||||||
|
@go mod vendor
|
12
README.md
12
README.md
@ -1,2 +1,12 @@
|
|||||||
# lg-webos-devmode-timer-extender
|
# LG WebOS Developer Mode Extender
|
||||||
This app can extend developer mode timer for the LG TV (you'll need the session token for that)
|
This app can extend developer mode timer for the LG TV (you'll need the session token for that)
|
||||||
|
|
||||||
|
You can obtain the developer mode session token by logging into your TV and executing this command:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cat /var/luna/preferences/devmode_enabled
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
Run `make all`. You will need Docker for that.
|
||||||
|
63
api/client.go
Normal file
63
api/client.go
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const BaseURL = "https://developer.lge.com/secure"
|
||||||
|
|
||||||
|
type Client struct {
|
||||||
|
client *http.Client
|
||||||
|
token string
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(token string) *Client {
|
||||||
|
return &Client{
|
||||||
|
client: &http.Client{Timeout: time.Second * 10},
|
||||||
|
token: token,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) call(method string, target interface{}) (err error) {
|
||||||
|
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/%s.dev?sessionToken=%s", BaseURL, method, c.token), nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := c.client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer res.Body.Close()
|
||||||
|
|
||||||
|
err = json.NewDecoder(res.Body).Decode(target)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) Query() (timeLeft string, err error) {
|
||||||
|
var res Response
|
||||||
|
if err = c.call("CheckDevModeSession", &res); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if res.Failed() {
|
||||||
|
err = res.Error()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return res.ErrorMsg, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) Extend() (err error) {
|
||||||
|
var res Response
|
||||||
|
if err = c.call("ResetDevModeSession", &res); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if res.Failed() || !res.ResetIsSuccessful() {
|
||||||
|
err = res.Error()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
31
api/response.go
Normal file
31
api/response.go
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Response struct {
|
||||||
|
Result string `json:"result,omitempty"`
|
||||||
|
ErrorCode string `json:"errorCode,omitempty"`
|
||||||
|
ErrorMsg string `json:"errorMsg,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b Response) Failed() bool {
|
||||||
|
return b.Result == "fail"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b Response) Succeeded() bool {
|
||||||
|
return b.Result == "success" && b.ErrorCode == "200"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b Response) Error() error {
|
||||||
|
if b.Failed() {
|
||||||
|
return errors.New(fmt.Sprintf("%s: %s", b.ErrorCode, b.ErrorMsg))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b Response) ResetIsSuccessful() bool {
|
||||||
|
return b.Succeeded() && b.ErrorMsg == "GNL"
|
||||||
|
}
|
11
docker-compose.yml
Normal file
11
docker-compose.yml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
volumes:
|
||||||
|
- ./:/app
|
||||||
|
working_dir: "/app"
|
||||||
|
command: "make build"
|
3
go.mod
Normal file
3
go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module github.com/Neur0toxine/lg-webos-devmode-timer-extender
|
||||||
|
|
||||||
|
go 1.17
|
51
main.go
Normal file
51
main.go
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/Neur0toxine/lg-webos-devmode-timer-extender/api"
|
||||||
|
)
|
||||||
|
|
||||||
|
const TokenParam = "--token="
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
token := getTokenArg()
|
||||||
|
if token == "" {
|
||||||
|
log.Println("Usage:")
|
||||||
|
log.Printf("$ %s %stoken\n", os.Args[0], TokenParam)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
client := api.New(token)
|
||||||
|
timeLeft, err := client.Query()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln("Cannot query devmode status:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("Time left before resetting:", timeLeft)
|
||||||
|
|
||||||
|
if err := client.Extend(); err != nil {
|
||||||
|
log.Fatalln("Cannot extend devmode timer:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
timeLeft, err = client.Query()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln("Cannot query devmode status again:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("Time left after resetting:", timeLeft)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTokenArg() string {
|
||||||
|
if len(os.Args) != 2 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.HasPrefix(os.Args[1], TokenParam) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.TrimSpace(os.Args[1][len(TokenParam):])
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user