Skip to content

Commit 9bd426a

Browse files
committed
Restored Kar4oke post + Landis Gyr post
1 parent 05760d0 commit 9bd426a

File tree

6 files changed

+168
-8
lines changed

6 files changed

+168
-8
lines changed

_posts/2025-07-20-kar4oke.md

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,47 @@
11
---
22
layout: post
3-
title: "[PT-BR] kar4oke.com - Explorando formas de ampliar o catálogo"
3+
title: "[PT-BR] kar4oke.com - Injetando URLs do YouTube no player embutido"
44
date: 2025-07-20
55
---
66

7-
Recentemente assinei o serviço do site kar4oke.com para usar em uma festa entre amigos. A proposta do site é excelente e funciona muito bem, mas notei que a seleção de músicas disponíveis é bastante limitada, o que pode restringir a experiência em alguns contextos.
7+
Recentemente assinei o serviço do site kar4oke.com para usar em uma festa, porém percebi que a seleção de músicas é extremamente limitada.
88

9-
Curioso sobre como o sistema funcionava por trás dos panos, comecei a explorar com mais atenção a forma como os vídeos são carregados e reproduzidos na plataforma. Percebi que o serviço utiliza como base um player bem conhecido e consolidado do mercado, o que me levou a testar algumas formas de integração alternativa.
9+
Usando o site normalmente, é bem visível que o player deles não passa de um reprodutor do YouTube, inspecionando a página, percebi que existia uma tag iframe, sem pensar duas vezes, substitui a tag manualmente por uma com o src de outro vídeo, e incrivelmente funcionou.
1010

11-
No começo, minhas tentativas de inserir conteúdos externos pareciam funcionar visualmente, mas logo notei que várias funcionalidades importantes, como a geração de nota e a sequência automática de faixas, não se comportavam como o esperado. Isso indicava que o sistema interno da plataforma era bem mais sofisticado do que parecia à primeira vista.
11+
Ou assim eu pensei, pois assim que o vídeo terminou, não gerou a nota aleatória nem passou para o próximo vídeo.
1212

13-
Com um pouco mais de investigação e prototipagem, consegui desenvolver uma solução que mantém todas as funcionalidades essenciais da plataforma mesmo ao utilizar conteúdos externos — incluindo reprodução automática, avaliação e integração com a fila de músicas. Essa solução, que implementei como uma ferramenta experimental para uso pessoal, abre espaço para expandir a biblioteca disponível sem comprometer a lógica e a estrutura original do site.
13+
Após isso, fiz uma extensão [(disponível no meu GitHub)](https://github.com/housey2k/kar4oke.com-ForceYT) que automaticamente substitui o iframe, mesmo funcionando, o resultado foi o mesmo ao terminar o vídeo, sem nota nem autoplay.
1414

15-
Além disso, observando o comportamento do sistema de adição de músicas por QR Code, percebi que existe um processo estruturado de seleção e controle de conteúdo, o que me leva a crer que existe uma preocupação legítima com a curadoria e a estabilidade do serviço. Mesmo assim, acredito que existem formas técnicas seguras de oferecer uma experiência mais flexível ao usuário final, sem comprometer os pilares do sistema.
15+
Depois de olhar o código e fazer um pouco de engenharia reversa, descobri que por algum motivo existe um iframe com todo o código HTML, como se fosse uma página isolada, e dentro desse frame, um segundo frame com o player, descobri também que posso enviar comandos diretamente usando uma função chamada `player.loadVideoById(string)`
1616

17-
Essa experiência me mostrou como a combinação de curiosidade, respeito à arquitetura existente e criatividade pode resultar em soluções que agregam valor tanto para os usuários quanto para os desenvolvedores da plataforma. Caso a equipe do kar4oke.com tenha interesse, estou aberto para compartilhar ideias e colaborar com melhorias que tragam mais liberdade ao usuário, sem abrir mão da consistência e da qualidade da experiência oferecida.
17+
O código implementado na extensão está assim:
18+
```javascript
19+
function sendLoadVideoMessage(videoId) {
20+
const iframe = document.querySelector('iframe[id^="youtube-"]');
21+
if (!iframe) {
22+
alert("Iframe do YouTube não encontrado.");
23+
return;
24+
}
1825

19-
Se você me conhece, sabe que não gosto de ocultar detalhes, mas por enquanto esse post vai ficar assim, sem sequer uma informação valiosa, e o repositório no GitHub com o código da extensão estará privado, estou fazendo isso pois estarei oferecendo essa função à empresa, e quero evitar cópias
26+
const message = JSON.stringify({
27+
function: `player.loadVideoById("${videoId}")`
28+
});
29+
30+
iframe.contentWindow.postMessage(message, "*");
31+
}
32+
```
33+
34+
Com esse novo código enviando instruções diretamente ao player existente ao invés de o substituir, os problemas de autoplay e geração de nota foram resolvidos
35+
36+
Se você olhar na constante iframe, pode perceber que usei um queryselector para a ID começando com "youtube-", isso foi feito pois percebi que em alguns momentos o iframe principal tinha ID "youtube-0", e em outros momentos "youtube-1", não sei exatamente como funciona, mas provavelmente existem mais IDs.
37+
Após alguns ajustes e implementação de drag&drop, disponibilizo essa extensão de navegador extremamente simples que permite injetar qualquer vídeo do youtube no site kar4oke.
38+
39+
Uma outra descoberta é que olhando o tráfego de rede da página de adcionar músicas por QR Code, percebi que ao pesquisar, a API retorna uma lista de músicas, no JSON vem a thumbnail, nome da música, artistas, e um ID numérico da música, e ao clicar para adcionar a música à fila, ele envia uma solicitação com uma instrução de adcionar e o ID da música.
40+
41+
Talvez exista algum motivo técnico, talvez seja apenas para controlar o conteúdo disponível no site, mas ao invés de implementar um banco de dados de IDs numéricos e links do youtube, eu implementaria a busca diretamente pelo youtube (por mais que isso crie a possibilidade de encontrar vídeos que não são karaokê).
42+
43+
Essa experiência mostra como um pouco de curiosidade e engenharia reversa podem revelar o funcionamento interno de plataformas web modernas. Embora o site kar4oke.com limite a seleção de músicas disponíveis, descobri que é possível contornar essas limitações interagindo diretamente com o player do YouTube embutido, preservando funcionalidades como autoplay e geração de notas. Com isso, usuários mais avançados ganham a liberdade de personalizar sua experiência, enquanto mantêm o sistema original funcional. Ainda assim, essa abordagem levanta questões sobre o equilíbrio entre controle de conteúdo, experiência do usuário e liberdade de uso — algo que toda plataforma fechada precisa considerar ao definir suas limitações técnicas.
44+
45+
Entrei em contato com a empresa perguntando se eles tinham interesse em implementar essa função, e me ignoraram. A extensão tá no meu GitHub pra vocês usarem a vontade.
2046

2147
<video width="640" height="480" controls><source src="/post-vid/KAR4OKE.mp4" type="video/mp4">Your browser does not support the video tag.</video>

_posts/2025-07-30-ld-tli-dump.md

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
---
2+
layout: post
3+
title: "[WIP] Dumping the firmware of a Landis+Gyr reading terminal"
4+
date: 2025-07-30
5+
---
6+
7+
![TLI Picutre](/post-img/LD-TLI.png "The target of this project")
8+
9+
This whole project started as a curbside find: An abandoned power meter.
10+
Without much hesitation I picked it up.
11+
12+
After getting home and doing some research I found it was part of a metering system called SGP+M (Sistema de Gerenciamento de Perdas + Medição/System for Management of Losses + Metering).
13+
After more googling, I could find a manual for that system ([read it here](/post-docs/SGPM-Manual.pdf)). It has many awesome stuff I'll probably never get to see, so let's just focus on the TLI.
14+
15+
If I'm not mistaken, TLI stands for "Terminal de Leitura de Informações/Information Reading Terminal".
16+
17+
The board has these 3 main ICs:
18+
* Z8 Encore! series microcontroller ([Z8F0421](/post-docs/Z8F0421-Datasheet.pdf)), equipped with 4KB of flash.
19+
* ATA5744N RF IC (RX Only, sadly).
20+
* CF8566T LCD Driver.
21+
22+
There is a 6 pin debug header on the board. Here is the pinout:
23+
1 - DBG
24+
2 - VCC (capacitive dropper output)
25+
3 - 3.3V
26+
4 - NC
27+
5 - NC
28+
6 - GND
29+
30+
The DBG pin is Zilog's authoral system for debugging their microcontrollers. It uses UART Half-Duplex for communication with automatic baud rate detection.
31+
32+
I found a [post by Sean Young](https://www.mess.org/2018/02/10/Dumping-Z8-Encore-Z8F0811-Program-Memory/) sharing their work on dumping a different Z8 Encore microcontroller.
33+
On this post there is a piece of code I managed to badly modify (with the help of ChatGPT) to not only transmit, but also receive the response data. It's shown below, I flashed it on my STM32 Bluepill so I didn't need logic level shifters.
34+
```c
35+
#define pin PA0
36+
#define BIT_DELAY 10 // microseconds per bit (your original timing)
37+
38+
// Your existing send_byte with small tweak
39+
void send_byte(int b)
40+
{
41+
pinMode(pin, OUTPUT);
42+
digitalWrite(pin, LOW); // Start bit
43+
delayMicroseconds(BIT_DELAY);
44+
45+
for (int i = 0; i < 8; i++) {
46+
if (b & (1 << i))
47+
digitalWrite(pin, HIGH);
48+
else
49+
digitalWrite(pin, LOW);
50+
delayMicroseconds(BIT_DELAY);
51+
}
52+
53+
digitalWrite(pin, HIGH); // Stop bit
54+
delayMicroseconds(BIT_DELAY);
55+
}
56+
57+
// New bit-bang receiver matching that framing
58+
int read_byte() {
59+
pinMode(pin, INPUT_PULLUP);
60+
61+
// Wait for start bit (line goes LOW)
62+
while (digitalRead(pin) == HIGH);
63+
64+
// Align to middle of first data bit
65+
delayMicroseconds(BIT_DELAY + BIT_DELAY / 2);
66+
67+
int value = 0;
68+
for (int i = 0; i < 8; i++) {
69+
if (digitalRead(pin))
70+
value |= (1 << i);
71+
delayMicroseconds(BIT_DELAY);
72+
}
73+
74+
// Optionally wait for stop bit, but ignoring it here
75+
delayMicroseconds(BIT_DELAY);
76+
77+
return value;
78+
}
79+
80+
void setup() {
81+
Serial.begin(115200);
82+
pinMode(pin, OUTPUT);
83+
digitalWrite(pin, HIGH); // Idle HIGH
84+
}
85+
86+
87+
void loop() {
88+
Serial.println("Holding DBG LOW for manual power connection...");
89+
90+
pinMode(pin, OUTPUT);
91+
digitalWrite(pin, LOW);
92+
delay(10000); // <-- 10 seconds for you to connect target power
93+
94+
Serial.println("Releasing DBG line...");
95+
digitalWrite(pin, HIGH);
96+
delay(1);
97+
98+
Serial.println("Starting communication sequence...");
99+
100+
// Your existing command sequence
101+
send_byte(0x80);
102+
send_byte(0x0B);
103+
send_byte(0x00);
104+
send_byte(0x00);
105+
send_byte(0x20);
106+
send_byte(0x00);
107+
108+
Serial.println("Switching to receive mode...");
109+
110+
pinMode(pin, INPUT_PULLUP);
111+
delayMicroseconds(50);
112+
113+
for (int i = 0; i < 1024; i++) {
114+
int b = read_byte();
115+
Serial.print("RECV 0x");
116+
Serial.println(b, HEX);
117+
}
118+
119+
Serial.println("Done.");
120+
while (1);
121+
}
122+
```
123+
124+
Sadly all I got was 0xFF, which means the MCU has read protection enabled. Scrolling further on Sean's post, we can see they also got it, but that isn't the end of it.
125+
Zilog has an application note named [AN0117](/post-docs/an0117.pdf) that explains how to do gang programming on Z8 microcontrollers using something called the **BYPASS** mode.
126+
127+
Sean developed software to dump their MCU using a raspberry pi, but they didn't release the full code.
128+
129+
I love hardware, but I'm a terrible programmer, so I just explained all my situation to ChatGPT and managed to build a full STM32CubeIDE project with a bit of intervention by me.
130+
The code is avaiable on a [GitHub repository on my profile](github.com/housey2k/Z8F0421-Dump).
131+
132+
Now the only thing left is buying a breakout board and connecting the STM32 to the Z8.
133+
134+
I really hope it works, I'd be able to display custom stuff on the LCD (This time with vanilla hardware, differently from my MT1389 post where I tossed the original board and hooked the VFD to an arduino), decode smart meter signals maybe, and maybe contribute with [Hash](recessim.com)'s efforts on reverse engineering smart meters

post-docs/SGPM-Manual.pdf

3.38 MB
Binary file not shown.

post-docs/Z8F0421-Datasheet.pdf

5.54 MB
Binary file not shown.

post-docs/an0117.pdf

184 KB
Binary file not shown.

post-img/LD-TLI.png

571 KB
Loading

0 commit comments

Comments
 (0)