Repository: cmiguelcabral/mjsxj05cm-hacks
Branch: dev
Commit: 62eda1322188
Files: 41
Total size: 15.6 MB
Directory structure:
gitextract_jczd0x7e/
├── .github/
│ └── workflows/
│ └── ci.yml
├── .gitignore
├── .gitmodules
├── README.md
├── build
├── firmware/
│ └── 3.4.2_0062/
│ └── tf_recovery.img
└── sdcard/
├── hacks/
│ ├── framegrabber/
│ │ └── bin/
│ │ ├── .build
│ │ └── framegrabber
│ ├── motor-control/
│ │ ├── bin/
│ │ │ └── .build
│ │ └── meta/
│ │ └── service/
│ │ ├── .enable
│ │ └── motor-control
│ ├── onvif-server/
│ │ ├── bin/
│ │ │ └── .build
│ │ └── meta/
│ │ └── service/
│ │ ├── .enable
│ │ └── onvif-server
│ ├── rtsp-server/
│ │ ├── bin/
│ │ │ └── .build
│ │ ├── config/
│ │ │ └── config.json
│ │ └── meta/
│ │ ├── config/
│ │ │ ├── config.json
│ │ │ └── config.json.template
│ │ └── service/
│ │ ├── framegrabber-mainstream
│ │ ├── framegrabber-substream
│ │ └── rtsp-server
│ ├── runit/
│ │ └── bin/
│ │ └── .build
│ ├── sftp-server/
│ │ └── bin/
│ │ └── .build
│ ├── ssh-server/
│ │ ├── bin/
│ │ │ └── .build
│ │ ├── config/
│ │ │ └── config.json
│ │ └── meta/
│ │ ├── config/
│ │ │ ├── config.json
│ │ │ └── config.json.template
│ │ └── service/
│ │ └── ssh-server
│ ├── web-config/
│ │ ├── bin/
│ │ │ └── .build
│ │ ├── meta/
│ │ │ └── service/
│ │ │ ├── .enable
│ │ │ └── web-config
│ │ └── www/
│ │ └── .build
│ └── websocket-stream-server/
│ ├── bin/
│ │ └── .build
│ └── meta/
│ ├── config/
│ │ └── config.json
│ └── service/
│ ├── framegrabber-mainstream
│ ├── framegrabber-substream
│ └── websocket-stream-server
└── manu_test/
├── configure_services.sh
├── disable_factory_mode.sh
├── entrypoint.sh
└── manu.sh
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
push:
branches:
- '*'
env:
sourceBranch: ${{ github.ref }}
isNightly: ${{ contains(github.ref, 'dev') }}
isFinalRelease: ${{ contains(github.ref, 'master') }}
jobs:
build:
runs-on: ubuntu-18.04
steps:
- name: Check out source code
uses: actions/checkout@v2
# - name: Build
# uses: dawidd6/action-ansible-playbook@v2
# with:
# playbook: build.yml
# directory: ./
# options: |
# --extra-vars branch=${{ github.ref }}
- name: Build latest
if: ${{ env.isNightly == 'true' }}
env:
THAT_HASH: ${{ secrets.THAT_HASH }}
run: chmod +x build && ./build dev
- name: Build stable
if: ${{ env.isFinalRelease == 'true' }}
env:
THAT_HASH: ${{ secrets.THAT_HASH }}
run: chmod +x build && ./build final
- name: Release latest
uses: marvinpinto/action-automatic-releases@latest
if: env.isNightly == 'true'
with:
automatic_release_tag: latest-rc
files: dist/sdcard.zip
prerelease: true
repo_token: "${{ secrets.GITHUB_TOKEN }}"
title: latest-rc
- name: Release stable
uses: marvinpinto/action-automatic-releases@latest
if: env.isFinalRelease == 'true'
with:
automatic_release_tag: stable
files: dist/sdcard.zip
prerelease: false
repo_token: "${{ secrets.GITHUB_TOKEN }}"
title: stable
================================================
FILE: .gitignore
================================================
*.ini
*.xcf
dist
================================================
FILE: .gitmodules
================================================
[submodule "submodules/x360h1080p-rtsp-server"]
path = submodules/x360h1080p-rtsp-server
url = https://github.com/telmomarques/x360h1080p-rtsp-server.git
[submodule "submodules/mija-framegrabber"]
path = submodules/mija-framegrabber
url = https://github.com/crckmc/mija-framegrabber.git
[submodule "submodules/x360h1080p-websocket-stream-server"]
path = submodules/x360h1080p-websocket-stream-server
url = https://github.com/telmomarques/x360h1080p-websocket-stream-server.git
[submodule "submodules/x360h1080p-web-config-client"]
path = submodules/x360h1080p-web-config-client
url = https://github.com/telmomarques/x360h1080p-web-config-client
[submodule "submodules/x360h1080p-web-config-server"]
path = submodules/x360h1080p-web-config-server
url = https://github.com/telmomarques/x360h1080p-web-config-server
================================================
FILE: README.md
================================================
[](http://discord.gg/qggupzu)
Stable: 
Latest: 
# Mi Camera Hacks (MJSXJ05CM)
- [Supported Cameras](#supported-cameras)
- [Features](#features)
- [Install Instructions](#install-instructions)
- [FAQ](#faq)
- [These Guys are Awesome](#these-guys-are-awesome)
Keep calm and follow the procedure!
Seriously now: it's still in beta, please read everything before continuing.
## Supported Cameras
For now this is it, I'm working on supporting more cameras.
Model Name(s) | Picture
--- | ---
MJSXJ05CM|
## Features
Feature | Latest | Stable
--- | --- | ---
Motor Control |  | 
Onvif Server |  | 
RTSP Server | | 
Runit |  | 
SFTP Server |  | 
SSH Server ||
Web Configuration Client |  | 
Web Configuration Server | | 
Websocker Stream Server | | 
## Install Instructions
The hacks exploits a flaw in firmware version 3.4.2_0062, **please read the instructions very carefully!!**
- First [Check your camera firmware version](#view-camera-firmware-version)
- If you have firmware version 3.4.2_0062, go to [Install the hacks](#install-the-hacks)
- If you have another firmware version, nothing can be done unfortunately.
### View camera firmware version
1. Configure the camera using the Mi Home app
2. Open the camera in the app and touch the 3 dots in the upper right corner
3. Select the option "General Settings", and then "Check for firmware upgrades"
4. The current firmware version is presented on the screen
### Downgrade the Firmware
⚠️ It is not possible to downgrade the frimware to 3.4.2_0062 on the MJSXJ05CM
If you have try to use an firmware and you camera is stuck on amber light try [this firmware](https://drive.google.com/file/d/1ve6XlBEiZebJV6ukJ0Oiu7DePw2JCsWj/view)
### Install the hacks
1. Configure the camera using the Mi Home app
2. Download the latest release from [releases](https://github.com/telmomarques/xiaomi-360-1080p-hacks/releases)
3. Copy the **contents** of "sdcard" folder to the root of your SD Card
4. Power off the camera and insert the SD Card
5. Power on the camera
6. Find the IP address of your camera
7. Open the web config interface o the camrea on your browser: [http://<your-camera-ip/](http://<your-camera-ip/)
## FAQ
### I can't downgrade the firmware, I follow the instructions but nothing happens.
Thy another SD Card. This actually happens a lot, trying a different SD Card usually solves it.
### The RTSP stream is corrupted / stops working after a while.
The RTSP server is still in alpha stage.
You may see some corrupted frames here and there, and the server may stop working after a few hours (restarting the camera solves it). We're working on it, but if a 100% stable video stream is **critical** for you, then it's still not ready.
### I'm worried about security, can I create/modify the [hack] password?
Security is in the roadmap, but still not the primary focus. Right now you'll have to secure the camera by making sure it's only accessible on your private network, and that your network is secure.
## These Guys are Awesome
Huge thanks to everyone who contributed!
[@aslafy-z](https://github.com/aslafy-z)
[@crckmc](https://github.com/crckmc)
[@thewh1teagle](https://github.com/thewh1teagle)
[@telmomarques](https://github.com/telmomarques)
================================================
FILE: build
================================================
#!/bin/bash
github_download_release_asset() {
local owner=$1
local repository=$2
local tagName=$3
local assetName=$4
is_200_ok=$(wget -q --show-progress --server-response https://github.com/${owner}/${repository}/releases/download/${tagName}/${assetName} 2>&1 | grep -c 'HTTP/1.1 200 OK')
if [ $is_200_ok != "1" ]; then
echo "Failed to get ${assetName}"
exit 1
fi
}
download_from_url() {
local assetName=$1
is_200_ok=$(wget -q --show-progress --server-response ${1} 2>&1 | grep -c 'HTTP/1.1 200 OK')
if [ $is_200_ok != "1" ]; then
echo "Failed to get ${assetName}"
exit 1
fi
}
process_external_download() {
local url=$1
local filename=$2
echo Downloading \"${url}\"
download_from_url ${url}
}
process_github_release_asset_download() {
local owner=$1
local repository=$2
local assetName=$3
if [ $releaseType == "dev" ]; then
tagName="latest-rc"
fi
if [ $releaseType == "final" ]; then
tagName="latest"
fi
echo Downloading \"${owner}/${repository}@${tagName}/${assetName}\"
github_download_release_asset ${owner} ${repository} ${tagName} ${assetName}
}
extract() {
local fileName=${1}
case "$fileName" in
*.zip)
echo Extracting ${fileName}
extract_zip ${fileName}
rm -f ${assetFilename}
;;
*.tar)
echo Extracting ${fileName}
extract_tar ${fileName}
rm -f ${assetFilename}
;;
esac
}
extract_zip() {
unzip -qq ${1}
}
extract_tar() {
tar -xf ${1}
}
process_build_file() {
local buildType=$1
local buildFilePath=.build
local source=$(cat ${buildFilePath} | jq -r ".source")
local assetFilename=""
if [ "${source}" == "external" ]; then
local url=$(cat ${buildFilePath} | jq -r ".url")
assetFilename=$(cat ${buildFilePath} | jq -r ".filename")
process_external_download ${url} ${assetFilename}
elif [ "${source}" == "github-release-asset" ]; then
local owner=$(cat ${buildFilePath} | jq -r ".owner")
local repository=$(cat ${buildFilePath} | jq -r ".repository")
assetFilename=$(cat ${buildFilePath} | jq -r ".assetName")
process_github_release_asset_download ${owner} ${repository} ${assetFilename}
fi
rm $buildFilePath
if [[ ! -z ${assetFilename} ]]; then
extract ${assetFilename}
fi
if [ -d "uclibc" ]; then
cp uclibc/* .
rm -rf libc uclibc
fi
}
clean() {
echo "Cleaning..."
rm -rf dist
}
build() {
echo "Building..."
test -d dist || mkdir dist
cp -r sdcard/* dist/
shopt -s globstar
for buildFile in dist/**/.build; do
pushd $(dirname ${buildFile})
process_build_file ${1}
popd
done
}
package() {
pushd dist
zip -r sdcard.zip * -x hacks/**/libc -x hacks/**/uclibc
popd
}
main() {
local target=$1
case ${target} in
clean)
clean
;;
dev | rc | final)
releaseType=$1
clean
build
package
;;
*)
echo "Invalid target '${1}'"
;;
esac
}
main $1
================================================
FILE: firmware/3.4.2_0062/tf_recovery.img
================================================
[File too large to display: 15.6 MB]
================================================
FILE: sdcard/hacks/framegrabber/bin/.build
================================================
{
"source": "github-release-asset",
"owner": "telmomarques",
"repository": "mija-framegrabber",
"assetName": "framegrabber.zip",
"clean":
[
"ipc009"
]
}
================================================
FILE: sdcard/hacks/framegrabber/bin/framegrabber
================================================
#!/bin/sh
CAMERA_MODEL=`factory get model | cut -d '.' -f3`
if [ -z "$CAMERA_MODEL" ]; then
echo "Can't get camera model, exiting."
exit 1
fi
BINARY_PATH=${CAMERA_MODEL}/framegrabber
if [ ! -f "$BINARY_PATH" ]; then
echo "Camera model '${CAMERA_MODEL}' not supported, exiting."
exit 1
fi
cp -f ${BINARY_PATH} /mnt/data/bin
exec /mnt/data/bin/framegrabber "$@"
================================================
FILE: sdcard/hacks/motor-control/bin/.build
================================================
{
"source": "github-release-asset",
"owner": "cmiguelcabral",
"repository": "mjsxj05cm-motor-control",
"assetName": "motord"
}
================================================
FILE: sdcard/hacks/motor-control/meta/service/.enable
================================================
================================================
FILE: sdcard/hacks/motor-control/meta/service/motor-control
================================================
#!/bin/sh
cd /mnt/sdcard/hacks/motor-control/bin
exec ./motord
================================================
FILE: sdcard/hacks/onvif-server/bin/.build
================================================
{
"source": "github-release-asset",
"owner": "cmiguelcabral",
"repository": "mjsxj05cm-onvif_srvd",
"assetName": "onvif_srvd"
}
================================================
FILE: sdcard/hacks/onvif-server/meta/service/.enable
================================================
================================================
FILE: sdcard/hacks/onvif-server/meta/service/onvif-server
================================================
#!/bin/sh
cd /mnt/sdcard/hacks/onvif-server/bin
source /mnt/data/etc/os-release
STEPS=5
MOTOR_CONTROL="/mnt/sdcard/hacks/motor-control/bin"
EVENT_FILE="$MOTOR_CONTROL/event"
LEFT="echo pan forward $STEPS > $EVENT_FILE"
RIGHT="echo pan reverse $STEPS > $EVENT_FILE"
UP="echo tilt forward $STEPS > $EVENT_FILE"
DOWN="echo tilt reverse $STEPS > $EVENT_FILE"
IP_ADDR=$(ip -4 addr show wlan0 | grep inet | awk '{print $2}' | cut -d'/' -f1)
while [[ -z $IP_ADDR ]]; do
IP_ADDR=$(ip -4 addr show wlan0 | grep inet | awk '{print $2}' | cut -d'/' -f1)
done
echo $IP_ADDR
ONVIF_PROFILE_0="--name HD --width 1920 --height 1080 --url rtsp://$IP_ADDR:8554/mainstream --type H264"
ONVID_PROFILE_1="--name SD --width 640 --height 360 --url rtsp://$IP_ADDR:8554/substream --type H264"
echo $ONVIF_PROFILE_0
echo $ONVIF_PROFILE_1
exec ./onvif_srvd --no_fork --pid_file /var/run/onvif_srvd.pid --model "MJSXJ05CM" --manufacturer "Xiaomi" --ifs wlan0 --port 5000 --scope onvif://www.onvif.org/Profile/S $ONVIF_PROFILE_0 $ONVIF_PROFILE_1 \
--ptz \
--move_left "eval $LEFT" \
--move_right "eval $RIGHT" \
--move_up "eval $UP" \
--move_down "eval $DOWN"
================================================
FILE: sdcard/hacks/rtsp-server/bin/.build
================================================
{
"source": "github-release-asset",
"owner": "cmiguelcabral",
"repository": "mjsxj05cm-rtsp-server",
"assetName": "rtspserver"
}
================================================
FILE: sdcard/hacks/rtsp-server/config/config.json
================================================
{
"encodingType": "h265"
}
================================================
FILE: sdcard/hacks/rtsp-server/meta/config/config.json
================================================
{
"enable": false,
"encodingType": "h265"
}
================================================
FILE: sdcard/hacks/rtsp-server/meta/config/config.json.template
================================================
{
"encodingType": "{{.EncodingType}}"
}
================================================
FILE: sdcard/hacks/rtsp-server/meta/service/framegrabber-mainstream
================================================
#!/bin/sh
ETCDIR=/mnt/data/etc/framegrabber/
RTSP_MAINSTREAM_PIPE="${ETCDIR}rtsp_mainstream"
mkdir -p $ETCDIR
mkfifo $RTSP_MAINSTREAM_PIPE
cd /mnt/sdcard/hacks/framegrabber/bin
exec ./framegrabber -f $RTSP_MAINSTREAM_PIPE -c 0
================================================
FILE: sdcard/hacks/rtsp-server/meta/service/framegrabber-substream
================================================
#!/bin/sh
ETCDIR=/mnt/data/etc/framegrabber/
RTSP_SUBSTREAM_PIPE="${ETCDIR}rtsp_substream"
mkdir -p $ETCDIR
mkfifo $RTSP_SUBSTREAM_PIPE
cd /mnt/sdcard/hacks/framegrabber/bin
exec ./framegrabber -f $RTSP_SUBSTREAM_PIPE -c 1
================================================
FILE: sdcard/hacks/rtsp-server/meta/service/rtsp-server
================================================
#!/bin/sh
cd /mnt/sdcard/hacks/rtsp-server/bin
cp -f rtspserver /mnt/data/bin
exec /mnt/data/bin/rtspserver -c ../config/config.json -m /mnt/data/etc/framegrabber/rtsp_mainstream -s /mnt/data/etc/framegrabber/rtsp_substream
================================================
FILE: sdcard/hacks/runit/bin/.build
================================================
{
"source": "github-release-asset",
"owner": "cmiguelcabral",
"repository": "mjsxj05cm-runit",
"assetName": "runit.tar",
"clean":
[
"*"
]
}
================================================
FILE: sdcard/hacks/sftp-server/bin/.build
================================================
{
"source": "github-release-asset",
"owner": "telmomarques",
"repository": "openssh-portable",
"assetName": "sftp-server.tar"
}
================================================
FILE: sdcard/hacks/ssh-server/bin/.build
================================================
{
"source": "github-release-asset",
"owner": "telmomarques",
"repository": "dropbear",
"assetName": "dropbear.tar"
}
================================================
FILE: sdcard/hacks/ssh-server/config/config.json
================================================
{
"users":
[
]
}
================================================
FILE: sdcard/hacks/ssh-server/meta/config/config.json
================================================
{
"enable": false,
"users": []
}
================================================
FILE: sdcard/hacks/ssh-server/meta/config/config.json.template
================================================
{
"users":
[
{{range $i, $u := .Users}}
{{if $i}}, {{end}}
{"systemUsername": "{{.SystemUsername}}", "username": "{{.Username}}", "password": "{{.Password}}"}
{{end}}
]
}
================================================
FILE: sdcard/hacks/ssh-server/meta/service/ssh-server
================================================
#!/bin/sh
mkdir -p /mnt/data/etc/dropbear
cd /mnt/sdcard/hacks/ssh-server/bin
exec ./dropbear -FERB
================================================
FILE: sdcard/hacks/web-config/bin/.build
================================================
{
"source": "github-release-asset",
"owner": "cmiguelcabral",
"repository": "mjsxj05cm-web-server",
"assetName": "web-config-server"
}
================================================
FILE: sdcard/hacks/web-config/meta/service/.enable
================================================
================================================
FILE: sdcard/hacks/web-config/meta/service/web-config
================================================
#!/bin/sh
cd /mnt/sdcard/hacks/web-config/bin
exec ./web-config-server
================================================
FILE: sdcard/hacks/web-config/www/.build
================================================
{
"source": "github-release-asset",
"owner": "cmiguelcabral",
"repository": "mjsxj05cm-web-client",
"assetName": "web-config-client.zip",
"clean":
[
"*"
]
}
================================================
FILE: sdcard/hacks/websocket-stream-server/bin/.build
================================================
{
"source": "github-release-asset",
"owner": "telmomarques",
"repository": "x360h1080p-websocket-stream-server",
"assetName": "websocket-stream-server"
}
================================================
FILE: sdcard/hacks/websocket-stream-server/meta/config/config.json
================================================
{
"enable": false
}
================================================
FILE: sdcard/hacks/websocket-stream-server/meta/service/framegrabber-mainstream
================================================
#!/bin/sh
ETCDIR=/mnt/data/etc/framegrabber/
WEBSOCKET_MAINSTREAM_PIPE="${ETCDIR}websocket_mainstream"
mkdir -p $ETCDIR
mkfifo $WEBSOCKET_MAINSTREAM_PIPE
cd /mnt/sdcard/hacks/framegrabber/bin
exec ./framegrabber -f $WEBSOCKET_MAINSTREAM_PIPE -c 0
================================================
FILE: sdcard/hacks/websocket-stream-server/meta/service/framegrabber-substream
================================================
#!/bin/sh
ETCDIR=/mnt/data/etc/framegrabber/
WEBSOCKET_SUBSTREAM_PIPE="${ETCDIR}websocket_substream"
mkdir -p $ETCDIR
mkfifo $WEBSOCKET_SUBSTREAM_PIPE
cd /mnt/sdcard/hacks/framegrabber/bin
exec ./framegrabber -f $WEBSOCKET_SUBSTREAM_PIPE -c 1
================================================
FILE: sdcard/hacks/websocket-stream-server/meta/service/websocket-stream-server
================================================
#!/bin/sh
cd /mnt/sdcard/hacks/websocket-stream-server/bin/
exec ./websocket-stream-server -m=/mnt/data/etc/framegrabber/websocket_mainstream -s=/mnt/data/etc/framegrabber/websocket_substream
================================================
FILE: sdcard/manu_test/configure_services.sh
================================================
#!/bin/sh
HACKS_DIR=/mnt/sdcard/hacks
SERVICES_DIR=/mnt/data/etc/runit
install_service() {
hackName=$1
serviceDir=${HACKS_DIR}/${hackName}/meta/service
if [ -d ${serviceDir} ] && [ -f ${serviceDir}/.enable ]; then
cd ${serviceDir}
for service in ${serviceDir}/* ; do
serviceName=`basename ${service}`
hackServiceDir=${SERVICES_DIR}/${hackName}-${serviceName}
mkdir -p ${hackServiceDir}
cp ${service} ${hackServiceDir}/run
done
fi
}
install_services() {
rm -rf ${SERVICES_DIR}
for hack in ${HACKS_DIR}/* ; do
if [ -d ${hack} ]; then
hackName=`basename $hack`
install_service ${hackName}
fi
done;
export PATH=$PATH:${HACKS_DIR}/runit/bin
runsvdir ${SERVICES_DIR} &
}
if [ -z $1 ]; then
install_services
else
install_service $1
fi
================================================
FILE: sdcard/manu_test/disable_factory_mode.sh
================================================
#!/bin/sh
if [ -f "/tmp/factory_mode" ]; then
rm -f /tmp/factory_mode
else
echo '#!/bin/sh
rm -- "$0"' > /mnt/data/bin/touch
chmod +x /mnt/data/bin/touch
fi
================================================
FILE: sdcard/manu_test/entrypoint.sh
================================================
#!/bin/sh
echo "Xiaomi Hacks enabled"
/mnt/sdcard/manu_test/disable_factory_mode.sh
/mnt/sdcard/manu_test/configure_services.sh &
================================================
FILE: sdcard/manu_test/manu.sh
================================================
#!/bin/sh
/mnt/sdcard/manu_test/entrypoint.sh
gitextract_jczd0x7e/
├── .github/
│ └── workflows/
│ └── ci.yml
├── .gitignore
├── .gitmodules
├── README.md
├── build
├── firmware/
│ └── 3.4.2_0062/
│ └── tf_recovery.img
└── sdcard/
├── hacks/
│ ├── framegrabber/
│ │ └── bin/
│ │ ├── .build
│ │ └── framegrabber
│ ├── motor-control/
│ │ ├── bin/
│ │ │ └── .build
│ │ └── meta/
│ │ └── service/
│ │ ├── .enable
│ │ └── motor-control
│ ├── onvif-server/
│ │ ├── bin/
│ │ │ └── .build
│ │ └── meta/
│ │ └── service/
│ │ ├── .enable
│ │ └── onvif-server
│ ├── rtsp-server/
│ │ ├── bin/
│ │ │ └── .build
│ │ ├── config/
│ │ │ └── config.json
│ │ └── meta/
│ │ ├── config/
│ │ │ ├── config.json
│ │ │ └── config.json.template
│ │ └── service/
│ │ ├── framegrabber-mainstream
│ │ ├── framegrabber-substream
│ │ └── rtsp-server
│ ├── runit/
│ │ └── bin/
│ │ └── .build
│ ├── sftp-server/
│ │ └── bin/
│ │ └── .build
│ ├── ssh-server/
│ │ ├── bin/
│ │ │ └── .build
│ │ ├── config/
│ │ │ └── config.json
│ │ └── meta/
│ │ ├── config/
│ │ │ ├── config.json
│ │ │ └── config.json.template
│ │ └── service/
│ │ └── ssh-server
│ ├── web-config/
│ │ ├── bin/
│ │ │ └── .build
│ │ ├── meta/
│ │ │ └── service/
│ │ │ ├── .enable
│ │ │ └── web-config
│ │ └── www/
│ │ └── .build
│ └── websocket-stream-server/
│ ├── bin/
│ │ └── .build
│ └── meta/
│ ├── config/
│ │ └── config.json
│ └── service/
│ ├── framegrabber-mainstream
│ ├── framegrabber-substream
│ └── websocket-stream-server
└── manu_test/
├── configure_services.sh
├── disable_factory_mode.sh
├── entrypoint.sh
└── manu.sh
Condensed preview — 41 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (21K chars).
[
{
"path": ".github/workflows/ci.yml",
"chars": 1459,
"preview": "name: CI\n\non:\n push:\n branches:\n - '*'\n\nenv:\n sourceBranch: ${{ github.ref }}\n isNightly: ${{ contains(github"
},
{
"path": ".gitignore",
"chars": 16,
"preview": "*.ini\n*.xcf\ndist"
},
{
"path": ".gitmodules",
"chars": 823,
"preview": "[submodule \"submodules/x360h1080p-rtsp-server\"]\n\tpath = submodules/x360h1080p-rtsp-server\n\turl = https://github.com/telm"
},
{
"path": "README.md",
"chars": 5439,
"preview": "[](http://discord.gg/qggupzu)\n\nStable:  {\n local owner=$1\n local repository=$2\n local tagName=$3\n local assetNa"
},
{
"path": "sdcard/hacks/framegrabber/bin/.build",
"chars": 170,
"preview": "{\n \"source\": \"github-release-asset\",\n \"owner\": \"telmomarques\",\n \"repository\": \"mija-framegrabber\",\n \"assetName\": \"fr"
},
{
"path": "sdcard/hacks/framegrabber/bin/framegrabber",
"chars": 371,
"preview": "#!/bin/sh\nCAMERA_MODEL=`factory get model | cut -d '.' -f3`\n\nif [ -z \"$CAMERA_MODEL\" ]; then\n echo \"Can't get camera mo"
},
{
"path": "sdcard/hacks/motor-control/bin/.build",
"chars": 134,
"preview": "{\n \"source\": \"github-release-asset\",\n \"owner\": \"cmiguelcabral\",\n \"repository\": \"mjsxj05cm-motor-control\",\n \"assetNam"
},
{
"path": "sdcard/hacks/motor-control/meta/service/.enable",
"chars": 0,
"preview": ""
},
{
"path": "sdcard/hacks/motor-control/meta/service/motor-control",
"chars": 62,
"preview": "#!/bin/sh\ncd /mnt/sdcard/hacks/motor-control/bin\nexec ./motord"
},
{
"path": "sdcard/hacks/onvif-server/bin/.build",
"chars": 135,
"preview": "{\n \"source\": \"github-release-asset\",\n \"owner\": \"cmiguelcabral\",\n \"repository\": \"mjsxj05cm-onvif_srvd\",\n \"assetName\":"
},
{
"path": "sdcard/hacks/onvif-server/meta/service/.enable",
"chars": 0,
"preview": ""
},
{
"path": "sdcard/hacks/onvif-server/meta/service/onvif-server",
"chars": 1182,
"preview": "#!/bin/sh\ncd /mnt/sdcard/hacks/onvif-server/bin\n\nsource /mnt/data/etc/os-release\n\nSTEPS=5\nMOTOR_CONTROL=\"/mnt/sdcard/hac"
},
{
"path": "sdcard/hacks/rtsp-server/bin/.build",
"chars": 136,
"preview": "{\n \"source\": \"github-release-asset\",\n \"owner\": \"cmiguelcabral\",\n \"repository\": \"mjsxj05cm-rtsp-server\",\n \"assetName\""
},
{
"path": "sdcard/hacks/rtsp-server/config/config.json",
"chars": 29,
"preview": "{\n \"encodingType\": \"h265\"\n}\n"
},
{
"path": "sdcard/hacks/rtsp-server/meta/config/config.json",
"chars": 47,
"preview": "{\n \"enable\": false,\n \"encodingType\": \"h265\"\n}"
},
{
"path": "sdcard/hacks/rtsp-server/meta/config/config.json.template",
"chars": 42,
"preview": "{\n \"encodingType\": \"{{.EncodingType}}\"\n}\n"
},
{
"path": "sdcard/hacks/rtsp-server/meta/service/framegrabber-mainstream",
"chars": 229,
"preview": "#!/bin/sh\n\nETCDIR=/mnt/data/etc/framegrabber/\nRTSP_MAINSTREAM_PIPE=\"${ETCDIR}rtsp_mainstream\"\n\nmkdir -p $ETCDIR\nmkfifo $"
},
{
"path": "sdcard/hacks/rtsp-server/meta/service/framegrabber-substream",
"chars": 225,
"preview": "#!/bin/sh\n\nETCDIR=/mnt/data/etc/framegrabber/\nRTSP_SUBSTREAM_PIPE=\"${ETCDIR}rtsp_substream\"\n\nmkdir -p $ETCDIR\nmkfifo $RT"
},
{
"path": "sdcard/hacks/rtsp-server/meta/service/rtsp-server",
"chars": 224,
"preview": "#!/bin/sh\ncd /mnt/sdcard/hacks/rtsp-server/bin\ncp -f rtspserver /mnt/data/bin\nexec /mnt/data/bin/rtspserver -c ../config"
},
{
"path": "sdcard/hacks/runit/bin/.build",
"chars": 157,
"preview": "{\n \"source\": \"github-release-asset\",\n \"owner\": \"cmiguelcabral\",\n \"repository\": \"mjsxj05cm-runit\",\n \"assetName\": \"run"
},
{
"path": "sdcard/hacks/sftp-server/bin/.build",
"chars": 135,
"preview": "{\n \"source\": \"github-release-asset\",\n \"owner\": \"telmomarques\",\n \"repository\": \"openssh-portable\",\n \"assetName\": \"sft"
},
{
"path": "sdcard/hacks/ssh-server/bin/.build",
"chars": 124,
"preview": "{\n \"source\": \"github-release-asset\",\n \"owner\": \"telmomarques\",\n \"repository\": \"dropbear\",\n \"assetName\": \"dropbear.ta"
},
{
"path": "sdcard/hacks/ssh-server/config/config.json",
"chars": 28,
"preview": "{\n \"users\":\n [\n ]\n}"
},
{
"path": "sdcard/hacks/ssh-server/meta/config/config.json",
"chars": 36,
"preview": "{\n \"enable\": false,\n \"users\": []\n}"
},
{
"path": "sdcard/hacks/ssh-server/meta/config/config.json.template",
"chars": 188,
"preview": "{\n \"users\":\n [\n {{range $i, $u := .Users}}\n {{if $i}}, {{end}}\n {\"systemUsername\": \"{{.SystemUsername}}\", \"user"
},
{
"path": "sdcard/hacks/ssh-server/meta/service/ssh-server",
"chars": 99,
"preview": "#!/bin/sh\nmkdir -p /mnt/data/etc/dropbear\ncd /mnt/sdcard/hacks/ssh-server/bin\nexec ./dropbear -FERB"
},
{
"path": "sdcard/hacks/web-config/bin/.build",
"chars": 142,
"preview": "{\n \"source\": \"github-release-asset\",\n \"owner\": \"cmiguelcabral\",\n \"repository\": \"mjsxj05cm-web-server\",\n \"assetName\":"
},
{
"path": "sdcard/hacks/web-config/meta/service/.enable",
"chars": 0,
"preview": ""
},
{
"path": "sdcard/hacks/web-config/meta/service/web-config",
"chars": 71,
"preview": "#!/bin/sh\ncd /mnt/sdcard/hacks/web-config/bin\nexec ./web-config-server\n"
},
{
"path": "sdcard/hacks/web-config/www/.build",
"chars": 174,
"preview": "{\n \"source\": \"github-release-asset\",\n \"owner\": \"cmiguelcabral\",\n \"repository\": \"mjsxj05cm-web-client\",\n \"assetName\":"
},
{
"path": "sdcard/hacks/websocket-stream-server/bin/.build",
"chars": 161,
"preview": "{\n \"source\": \"github-release-asset\",\n \"owner\": \"telmomarques\",\n \"repository\": \"x360h1080p-websocket-stream-server\",\n "
},
{
"path": "sdcard/hacks/websocket-stream-server/meta/config/config.json",
"chars": 21,
"preview": "{\n \"enable\": false\n}"
},
{
"path": "sdcard/hacks/websocket-stream-server/meta/service/framegrabber-mainstream",
"chars": 249,
"preview": "#!/bin/sh\n\nETCDIR=/mnt/data/etc/framegrabber/\nWEBSOCKET_MAINSTREAM_PIPE=\"${ETCDIR}websocket_mainstream\"\n\nmkdir -p $ETCDI"
},
{
"path": "sdcard/hacks/websocket-stream-server/meta/service/framegrabber-substream",
"chars": 245,
"preview": "#!/bin/sh\n\nETCDIR=/mnt/data/etc/framegrabber/\nWEBSOCKET_SUBSTREAM_PIPE=\"${ETCDIR}websocket_substream\"\n\nmkdir -p $ETCDIR\n"
},
{
"path": "sdcard/hacks/websocket-stream-server/meta/service/websocket-stream-server",
"chars": 192,
"preview": "#!/bin/sh\ncd /mnt/sdcard/hacks/websocket-stream-server/bin/\nexec ./websocket-stream-server -m=/mnt/data/etc/framegrabber"
},
{
"path": "sdcard/manu_test/configure_services.sh",
"chars": 776,
"preview": "#!/bin/sh\n\nHACKS_DIR=/mnt/sdcard/hacks\nSERVICES_DIR=/mnt/data/etc/runit\n\ninstall_service() {\n\thackName=$1\n\tserviceDir=${"
},
{
"path": "sdcard/manu_test/disable_factory_mode.sh",
"chars": 164,
"preview": "#!/bin/sh\nif [ -f \"/tmp/factory_mode\" ]; then\n rm -f /tmp/factory_mode\nelse\n echo '#!/bin/sh\n rm -- \"$0\"' > /mnt/data"
},
{
"path": "sdcard/manu_test/entrypoint.sh",
"chars": 131,
"preview": "#!/bin/sh\necho \"Xiaomi Hacks enabled\"\n\n/mnt/sdcard/manu_test/disable_factory_mode.sh\n/mnt/sdcard/manu_test/configure_ser"
},
{
"path": "sdcard/manu_test/manu.sh",
"chars": 45,
"preview": "#!/bin/sh\n/mnt/sdcard/manu_test/entrypoint.sh"
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the cmiguelcabral/mjsxj05cm-hacks GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 41 files (15.6 MB), approximately 6.8k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.