README, minor corrections
[BABOOSHKA.TV] / README.md
1 # [babooshka.tv](https://babooshka.tv) old-school tv-box video player
2
3 This simple and lightweight package could turn your RPi into a video player. The package is designed primarily for your grandparents, for whom the use of a computer is a difficult task. You can upload your home kittens-kids videos or add videos from Youtube/Vimeo that you like. 
4
5 The package is fully written in bash. 
6
7 ![babooshka.tv RPi based prototype](https://repository.interplaymedium.org/babooshka.tv/babooshka.tv.rpi.jpeg)  
8
9 ## Wiring
10
11 [Pi Zero IO Pinout](https://pinout.xyz/pinout/io_pi_zero)
12
13 The yellow LED connected to +3,3v via 470R 
14
15         GPIO 0  BCM17   LED green, booting  
16         GPIO 2  BCM27   LED red, video status  
17
18 Lowering resistors are required for all diodes (Red LEDs normally brighter, so I would recommend ~470R for yellow and green and about 1K for red)
19
20 ### Infrared interface
21
22         GPIO 3  BCM22   IR TX  
23         GPIO 4  BCM23   IR RX  
24
25         38kHz -- standard 
26
27         +-----------------------+ 3
28         |                       +---------------------o +3.3V
29         |      ______________   |
30         |     /                 |
31         |    (                  | 2  
32         |     \______________   +---------------------o GND
33         |                       |
34         |                       | 1
35         |               data -> +---------------------o GPIO 4 (BCM23)
36         +-----------------------+
37
38
39         950nm emitting diode (e.g. TSUS5400)
40
41                          +5V
42                           o
43                           |
44                          | |  51 Ohm (depending on MOSFET maybe not required)
45                          |_|
46                           |
47                          _|_
48                          \ / 
49                          ---  IR LED
50                           |
51                           |
52              ___      |---'
53       o-----|___|-----|       MOSFET
54              10K      |->--
55         GPIO 3 (BCM22)     |
56                            |
57                         ----- GND
58                          ---
59                           - 
60
61 ### Analog Audio 
62
63         GPIO 1  BCM18   R AUDIO
64         GPIO 23 BCM13   L AUDIO
65
66 ![RPi Zero Audio](https://repository.interplaymedium.org/babooshka.tv/pi-zero-audio_bb.jpg)  
67 Picture taken [from here](https://shallowsky.com/blog/hardware/pi-zero-audio.html), thanks :)  
68
69 ### Analog video pin
70
71 ![RPi TV out](https://repository.interplaymedium.org/babooshka.tv/RPi_TV_out.jpeg)  
72 Picture taken [from here](https://magpi.raspberrypi.org/articles/rca-pi-zero), thanks :)  
73
74 ## Setup
75
76 Download, copy to microSD and install oficial [Raspberry Pi OS Lite image](https://www.raspberrypi.org/downloads/raspberry-pi-os/)
77
78 The procedure of adding a login and password for your access point, as well as the ssh configuration is omitted. It is assumed that you know how to do so :)  
79 If you not sure, [ddg it](https://duckduckgo.com/?q=RPi+headless+how+setup+and+ssh).
80
81 Further operations are performed on device.
82
83         ssh <your RPi device>
84
85 Update repository list and install dependencies 
86
87         apt update  
88         apt install mc fbi omxplayer sox
89
90 Try to install freefonts (required by omxplayer)
91
92         apt install ttf-freefont
93
94 By some reason recently *freefonts* package has been removed from official RPi repository. So in case of unsuccess just copy included freefonts to /usr/share/fonts/truetype/...  
95 do it with *sudo*
96
97         cp -r freefont /usr/share/fonts/truetype/freefont  
98         chown root:root /usr/share/fonts/truetype/freefont  
99         chown root:root /usr/share/fonts/truetype/freefont/*
100
101 ### IR interface setup
102
103         apt install lirc
104
105 edit /etc/lirc/hardware.conf
106
107         # Run "lircd --driver=help" for a list of supported drivers.  
108         DRIVER="default"
109
110         # usually /dev/lirc0 is the correct setting for systems using udev  
111         DEVICE="/dev/lirc1"  
112         MODULES="gpio_ir_recv"
113
114 edit /etc/lirc/lirc_options.conf
115 NOTE! add new line in the end of the file !!!! [known bug](https://forum.odroid.com/viewtopic.php?t=32181)
116
117         driver            = default  
118         device            = /dev/lirc1
119
120 First try to find you device using 
121
122         irdb-get find YOUR_DEVICE  
123
124 If you did it, copy YOUR_DEVICE.conf to */etc/lirc/lircd.conf.d/* 
125 In case of unsiccess try to find and copy here: [List of devices](http://lirc-remotes.sourceforge.net/remotes-table.html) supported by Lirc 'from the box'. However, you always can record your own, see below... 
126
127 Copy template lircd.conf
128
129         cp /etc/lirc/lircd.conf.dist /etc/lirc/lircd.conf
130
131 Make changes in */boot/config.txt* to set up PAL video output and run appropriate kernel overlays for IR interface:
132
133         disable_splash=1
134         
135         # disable_overscan=1
136
137         framebuffer_width=720
138         framebuffer_height=576
139
140         # enable PWM audio (add this line)
141         dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4
142
143         # uncomment for composite PAL
144         sdtv_mode=2
145
146         # uncomment if hdmi display is not detected and composite is being output
147         # hdmi_force_hotplug=1
148
149         # Uncomment this to enable the gpio-ir module
150         dtoverlay=gpio-ir,gpio_pin=23,gpio_pull=up
151         dtoverlay=gpio-ir-tx,gpio_pin=22
152
153 ### Make IR works as TX and RX simultanoiously
154
155 This part taken from [this GitHub comment](https://github.com/raspberrypi/linux/issues/2993#issuecomment-497420228) thank you [@elmicha](https://github.com/elmicha) :)
156
157 Add these rules in */etc/udev/rules.d/71-lirc.rules* to get stable */dev/lirc-rx* and */dev/lirc-tx* device names:
158
159         ACTION=="add", SUBSYSTEM=="lirc", DRIVERS=="gpio_ir_recv", SYMLINK+="lirc-rx"
160         ACTION=="add", SUBSYSTEM=="lirc", DRIVERS=="gpio-ir-tx", SYMLINK+="lirc-tx"
161         ACTION=="add", SUBSYSTEM=="lirc", DRIVERS=="pwm-ir-tx", SYMLINK+="lirc-tx"
162
163 Change the device and listening address in /etc/lirc/lirc_options.conf:
164
165         device            = /dev/lirc-rx
166         listen            = 0.0.0.0:8766
167
168 Copy lirc_options.conf to lirc_tx_options.conf and edit these lines:
169
170         device            = /dev/lirc-tx
171         output            = /var/run/lirc/lircd-tx
172         pidfile          = /var/run/lirc/lircd-tx.pid
173         listen            = 0.0.0.0:8765
174         connect          = 127.0.0.1:8766
175
176 Create */etc/systemd/system/lircd-tx.service* (from the output of *systemctl cat lircd*) and edit it like this:
177
178         [Unit]  
179         Documentation=man:lircd(8)  
180         Documentation=http://lirc.org/html/configure.html  
181         Description=Second lircd, the transmitter  
182         Wants=lircd-setup.service  
183         After=network.target lircd-setup.service lircd.service  
184         
185         [Service]  
186         Type=simple  
187         ExecStart=/usr/sbin/lircd --nodaemon --options-file /etc/lirc/lirc_tx_options.conf  
188         
189         [Install]  
190         WantedBy=multi-user.target  
191         Create /etc/systemd/system/lircd-tx.socket (from the output of systemctl cat lircd.socket) and edit it:  
192         
193         [Socket]  
194         ListenStream=/run/lirc/lircd-tx  
195         
196         [Install]  
197         WantedBy=sockets.target  
198         Also=lircd-tx.service  
199
200
201 Create /usr/local/bin/irsend and make it executable
202
203         #! /bin/sh  
204         exec /usr/bin/irsend --device=/var/run/lirc/lircd-tx "$@"
205         chmod +x /usr/local/bin/irsend
206
207 Start lircd-tx (with *sudo*)
208
209         systemctl daemon-reload
210         systemctl start lircd-tx
211         systemctl enable lircd-tx
212
213 Enable RX (with *sudo*)
214         systemctl enable lircd.service
215         systemctl enable lircd.socket
216
217         systemctl restart lircd
218
219 NOTE: there maybe the Warning of duplication of "begin remote .. end remote", it is fine. Ignore it. 
220
221 Reboot and check status :)
222
223         systemctl reboot
224
225         systemctl status lircd.service
226         systemctl status lircd.socket
227
228 ### Test IR 
229
230 Send some command. replace vendor and command with your
231
232         irsend SEND_ONCE SONY-TV KEY_1
233
234 Read RX 
235
236         irw
237
238 Record your own (if you have no compatible remote control or incomplete config)
239
240         systemctl stop lircd.socket
241         systemctl stop lircd.service
242         
243         record with own key names
244         irrecord --disable-namespace
245
246         systemctl start lircd.socket
247         systemctl start lircd.service
248
249 Force raw record mode (normally not required)
250         
251         irrecord -f -d /dev/lirc0 ~/lirc.conf
252
253 ## IR remote setup and button assignment
254
255 If everything went fine and your remote reading by Raspbery, you have to choose buttons that you going to use for Babooshka control. Here is a list of current commands: 
256
257 - next
258 - prev
259 - forward +10min
260 - backward -10min
261 - play/pause toggle
262 - pause on switching-off
263 - stop
264 - audio track switch
265 - subtitles switch      
266
267 This is how they marked in *remoteir.sh* 
268
269 To assign comands you need to edit "ARR_DOWN", "ARR_UP" and so on in *remoteir.sh*. Change it for that you see in *irw* stdout when pressing buttons.
270
271         irw
272
273 ## Main package installation
274
275         cd /home/pi/
276         git clone <this repo> (see above)
277         cd BABOOSHKA.TV/
278
279 Make sure that all .sh files inside are executable (have x flag)
280
281         ls --all 
282
283 if required make them *chmod +x *.sh*
284
285 ### Early stage systemd service (launching led driver and creating splash image)
286
287 Create */etc/systemd/system/splash.service* file and add there
288
289         [Unit]  
290         DefaultDependencies=no  
291         After=local-fs.target  
292         
293         [Service]  
294         StandardInput=tty  
295         StandardOutput=tty  
296         ExecStart=/home/pi/BABOOSHKA.TV/early_init.sh  
297           
298         [Install]  
299         WantedBy=sysinit.target  
300
301 Activate the service 
302
303         sudo systemctl enable splash.service
304
305 ### On boot launcher
306
307 Add this line to */etc/rc.local*
308
309    sudo -H -u pi /home/pi/BABOOSHKA.TV/start.babooshka.sh > /dev/null &
310
311 reboot and test :)
312
313         systemctl reboot
314
315 if everything has been done properly, you will see the splash babooshka.tv logo
316
317 - add testing video in *~/BABOOSHKA.TV/VIDEO/* directory
318 - check playlist (that the video link has been added)
319 - click PLAY on your remote 
320 - if something went wrong, see Debug section below
321
322 ## Cosmetic polishing 
323
324 Edit */boot/cmdline.txt*. Make sure that you have *console=tty3 quiet consoleblank=0* and *logo.nologo*, this is my cmdline: 
325
326         console=serial0,115200 console=tty3 quiet consoleblank=0 loglevel=1 root=PARTUUID=6c586e13-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait logo.nologo
327
328 Disable blinking cursor (probably not required)
329
330         vt.global_cursor_default=0
331
332 Remove tty login service to eliminate blinking cursor
333         
334         sudo systemctl disable getty@tty1 
335
336 ## Additional software 
337
338 If' you're going to watch videos from YouTube, Vimeo and so on, this packages would be required. Most porbably probably would beed to install youtube-dl globally. So do that with *sudo -H ...*. It would be recommended wor futher compatibility. 
339
340         apt install mkvtoolnix python-pip
341         pip install -U youtube-dl
342
343 ## Usage
344
345 converting video. Note *-level 3.0* option! it is required for RPi HW codec. I've been breaking by brain until found that RPi HW codec can't play *low profile* (or maybe it is driver limitation). However [here is](https://superuser.com/questions/489087/what-are-the-differences-between-h-264-profiles) some technical details, if you interested in. 
346
347         ffmpeg -i FILEIN -vcodec libx264 -preset slow -level 3.0 -b 700k -s 720x404 FILEOUT
348
349 upload new video from local PC 
350
351         scp <your_super_cool_kitten_flick.mp4>  <babooshka>:BABOOSHKA.TV/VIDEO/
352
353 download new video from youtube (on device)
354
355         youtube-dl -f 'bestvideo[vcodec=avc1][height<=720]+bestaudio/best[abr<=120]' --merge-output-format mp4 -o '%(playlist_index)s - %(title)s.%(ext)s' <youtube link>
356
357 click PLAY button and enjoy :)
358
359 ## Debug
360
361         tail -F /tmp/babooshka.log
362
363 ## Known bugs
364
365 - Not changing the state on finish (WATCHED) if video has been resumed (time of resuming is disregarded)
366
367 ## Todo
368
369 - WiFi auto-reconnect, probably *sudo iw dev wlan0 set power_save off* would be helpful
370 - youtube-dl, autoupdate
371 - youtube-dl download from downloadlist
372 - check free storage space
373 - auto removing of old videos + commenting in playlist
374 - splash info, Nth video from COUNT videos
375 - Make a single package
376
377 ## Extras 
378
379 Download this nice babooshka.tv [sticker and logo](https://repository.interplaymedium.org/babooshka.tv/babooshka_sticker.svg)
380
381 ![babooshka.tv found enclosure and cool sticker](https://repository.interplaymedium.org/babooshka.tv/babooshka.tv.enclosure_front.jpeg)
382
383 ## License
384
385 Copyright © 2020 Dmitry Shalnov [interplaymedium.org]
386
387 Licensed under the Apache License, Version 2.0 (the "License");
388 you may not use this files except in compliance with the License.
389 You may obtain a copy of the License at
390
391         http://www.apache.org/licenses/LICENSE-2.0
392
393 Unless required by applicable law or agreed to in writing, software
394 distributed under the License is distributed on an "AS IS" BASIS,
395 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
396 See the License for the specific language governing permissions and
397 limitations under the License.
398
399 ## Donate 
400
401 If you would like to contribute to a project, you can always [help with a penny](https://paypal.me/shalnov). 
402
403
404
405
Contact me: dev (at) shalnoff (dot) com
PGP fingerprint: A6B8 3B23 6013 F18A 0C71 198B 83D8 C64D 917A 5717