Skip to main content

Reverse engineering Pubvn apps for fun and... larger-screen-fun

It's Friday night and the wifeTM wanted to watch Games of Thrones on the TV (via Chromecast). Should be easy right? We have lots of apps installed for exactly this purpose: Netflix, HBO Now, Flix, etc. None of them worked though...

  • Netflix just doesn't have HBO contents like GoT.
  • HBO Now works but it requires a US proxy to watch and there is no way to tell the Chromecast to go through a proxy.
  • Flix, a promising local app, good with TV streaming but not series.
So we had to settle to use HBO Now and Google Chrome's cast tab feature to have it on the big screen. A complicated setup, and slow. The casting was broken a few times during the episode, probably because of wifi interferences. This problem needs some engineering!

Proxy Those Apps

First order of business would be proxy their apps to catch all network requests. I used Charles with their iOS app. At first I thought it would be tricky if they use https or certificate pinning but it turned out everything runs through http. After a few taps on the apps, the flow looks something like this:

  1. `filmlist` api for search
  2. `filmdetail` to get a movie's episodes
  3. Finally use `filmmedia` for the mp4 url
After a few hours or so, I had gotten the mp4 casting on my TV. Success? Not yet.


Hmm, subtitles are important, we really need those (especially for GoT). Chromecast supports subtitles in WebVTT format (which is good) but apparently Pubvn only has SRT. Also, the subtitles url is protected with some weird authentication hashing. Almost gave up, I tried to proxy their Android app and found out that this app uses a slightly different api. Best of all, Android subtitles don't require authentication, they have some custom made encoding instead.

New plan:
  • Switch to use Android api endpoints
  • Decompile their apk to get the SRT decoder.
  • Put that decoder on Heroku with WebVTT converter
Complicated but now we have working mp4 and WebVTT urls. For some reason, Chromecast failed to play with subtitles turned on though...


Another couple hours passed by until I found out that both urls must have CORS headers. Probably the video player needs more data from the movie stream when it renders subtitles, I don't know.

It's easy to add those headers for the subtitles, we just need to update the Heroku app. But for the movie itself... It is hard, we don't control Pubvn servers so there is no ways to add those CORS headers (I asked them, no answer so far). I guess we can run a CORS proxy and play the movie from there? Just to be safe, let route the srt through that proxy too (so Pubvn servers will see our requests all from one IP).

Hah! Now we have movie with subtitles fully working on Chromecast! I have to keep 2 servers running though: the Heroku app and the CORS proxy.

Repositories if you are interested:


Popular posts from this blog

Flutter: Fixing Firebase header not found with Notification Service Extension

If you follow the FCM tutorial Send an image in the notification payload and encountered this error message: 'FirebaseMessaging/FirebaseMessaging.h' file not found You are on the right place, I'm going to show you how to fix it. My app was working fine but one day it stopped compiling. Apparently Flutter 1.20 changed the way it uses CocoaPod so the service extension no longer has the proper library configured. After some tinkering, I came up with this pod config, it has to be added to ios/Podfile below the main Runner target. target 'FcmImage' do use_frameworks! use_modular_headers! require File.expand_path('../.symlinks/plugins/firebase_core/ios/firebase_sdk_version.rb', __FILE__) firebase_sdk_version = firebase_sdk_version! pod 'Firebase/Messaging', "~> #{firebase_sdk_version}" end FcmImage is my extension name, replace it with yours We can use a hardcoded version for Firebase/Messaging pod but doing so m

IMAP module for PHP in Mac OS X Mountain Lion

So here it comes again. I have recently upgraded to Mountain Lion and for whatever reason, Apple decided to nuked all my previous PHP (among other things) configurations so I have to setup IMAP in PHP again. A simple Google search may point you to this post with detailed instruction for Lion however, some steps have been changed a bit... Step 1: Install prerequisites You may choose to download Xcode ( FREE ) from the App Store then go to menu Xcode > menu item Preferences > tab Downloads, select to install Command Line Tools OR you can go to Apple Developer  to get it, you may need to login. Step 2: Compile IMAP Get the IMAP source code from University of Washington website . Please do me a favor and check that website for the latest version, it's good practice. If you that laz y , try to click the "y" to get direct link to 2007f version. Extract the package and open the Terminal to the new directory before executing these command: make osx EXTRACFLAG

A faster Docker for Mac experience

Docker for Mac is freaking slow, this is known issue for years. I'm switching to docker-machine running within Parallels for now... Image from Install the tools I use brew to quickly install these: brew install docker-machine brew install docker-machine-parallels Create the virtual machine The --driver param and vm name is required. The others are all optional, the default values are quite low so I bumped the specs a bit. docker-machine create --driver=parallels \   --parallels-cpu-count=2 \   --parallels-disk-size=100000 \   --parallels-memory=4096 \   parallels Usage Set up the shell environment: eval $(docker-machine env parallels) Then use the cli as normal: docker ls docker-compose up -d To get the vm IP address: docker-machine ip parallels