Giter Club home page Giter Club logo

kindle-synology-photos-photoframe's Introduction

kindle-synology-photos-photoframe

Pick a random photo from a shared album in Synology Photos and show it on a jailbroken Kindle every morning. All processing happens on the device using 100% Golang.

Read the corresponding blog post here

Photo frame

Tested on a Kindle Voyage. But should also work on other jailbroken Kindles.

Instructions

  1. Make sure your Kindle is jailbroken and is reachable over SSH (<= 5.13.3 or <= 5.14.2)
  2. Download the latest release
  3. Copy photoframe binary and linkss folder to the internal storage of the kindle (/mnt/us).
  4. To start ./photoframe http://192.168.50.57:5000/mo/sharing/RMVJ3g6t8 > /dev/null & (replace url with sharing link to your own album)
  5. To stop killall photoframe. You will have 30 seconds to stop it after you woke up the device manually by pressing the power button.

Log files are stored under /mnt/us/photoframe.log

kindle-synology-photos-photoframe's People

Contributors

landgenoot avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

rickmzr

kindle-synology-photos-photoframe's Issues

Compatibility with Kindle Paperwhite 1 (2015)

Thanks for sharing this awesome project! When I try to run the binary, it is looking for a libharfbuzz.so.0, which does not exist:

[root@kindle us]# ./photoframe 
./photoframe: error while loading shared libraries:
libharfbuzz.so.0: cannot open shared object file: No such file or directory

This happens on a Kindle Paperwhite (2015) with Firmware version 5.4.4.2.

I tried to re-use the lib files from KOreader, which seems to work, but I now get a crash that suggests an issue with the network polling (kernel supports it though: /proc/sys/fs/epoll/ has max_user_watches). It might be because Go has removed compatibility with kernel 2.6.

[root@kindle us]# ./photoframe https://foobar
runtime: epollwait on fd 4 failed with 38
fatal error: runtime: netpoll failed

runtime stack:
runtime.throw({0x2f5583, 0x17})
	/usr/local/go/src/runtime/panic.go:1047 +0x4c fp=0x496e34bc sp=0x496e34a8 pc=0x4c7fc
runtime.netpoll(0x0)
	/usr/local/go/src/runtime/netpoll_epoll.go:121 +0x414 fp=0x496e3d20 sp=0x496e34bc pc=0x484a4
runtime.sysmon()
	/usr/local/go/src/runtime/proc.go:5362 +0x4ac fp=0x496e3d80 sp=0x496e3d20 pc=0x5c780
runtime.mstart1()
	/usr/local/go/src/runtime/proc.go:1498 +0x7c fp=0x496e3d90 sp=0x496e3d80 pc=0x52ae8
runtime.mstart0()
	/usr/local/go/src/runtime/proc.go:1455 +0x7c fp=0x496e3da4 sp=0x496e3d90 pc=0x52a5c
runtime.mstart()
	/usr/local/go/src/runtime/asm_arm.s:210 +0x8 fp=0x496e3da8 sp=0x496e3da4 pc=0x81a78

goroutine 1 [running]:
	goroutine running on other thread; stack unavailable

goroutine 2 [force gc (idle)]:
runtime.gopark(0x308c78, 0x4e62f8, 0x11, 0x14, 0x1)
	/usr/local/go/src/runtime/proc.go:381 +0x100 fp=0x828fd8 sp=0x828fc4 pc=0x4ff3c
runtime.goparkunlock(...)
	/usr/local/go/src/runtime/proc.go:387
runtime.forcegchelper()
	/usr/local/go/src/runtime/proc.go:305 +0xd4 fp=0x828fec sp=0x828fd8 pc=0x4fd5c
runtime.goexit()
	/usr/local/go/src/runtime/asm_arm.s:831 +0x4 fp=0x828fec sp=0x828fec pc=0x83770
created by runtime.init.5
	/usr/local/go/src/runtime/proc.go:293 +0x1c

goroutine 3 [GC sweep wait]:
runtime.gopark(0x308c78, 0x4e6610, 0xc, 0x14, 0x1)
	/usr/local/go/src/runtime/proc.go:381 +0x100 fp=0x8297c8 sp=0x8297b4 pc=0x4ff3c
runtime.goparkunlock(...)
	/usr/local/go/src/runtime/proc.go:387
runtime.bgsweep(0x81c040)
	/usr/local/go/src/runtime/mgcsweep.go:278 +0x94 fp=0x8297e4 sp=0x8297c8 pc=0x39ce0
runtime.gcenable.func1()
	/usr/local/go/src/runtime/mgc.go:178 +0x28 fp=0x8297ec sp=0x8297e4 pc=0x29eec
runtime.goexit()
	/usr/local/go/src/runtime/asm_arm.s:831 +0x4 fp=0x8297ec sp=0x8297ec pc=0x83770
created by runtime.gcenable
	/usr/local/go/src/runtime/mgc.go:178 +0x74

goroutine 4 [GC scavenge wait]:
runtime.gopark(0x308c78, 0x4e68a0, 0xd, 0x14, 0x2)
	/usr/local/go/src/runtime/proc.go:381 +0x100 fp=0x829fb4 sp=0x829fa0 pc=0x4ff3c
runtime.goparkunlock(...)
	/usr/local/go/src/runtime/proc.go:387
runtime.(*scavengerState).park(0x4e68a0)
	/usr/local/go/src/runtime/mgcscavenge.go:400 +0x64 fp=0x829fc8 sp=0x829fb4 pc=0x3707c
runtime.bgscavenge(0x81c040)
	/usr/local/go/src/runtime/mgcscavenge.go:628 +0x3c fp=0x829fe4 sp=0x829fc8 pc=0x37940
runtime.gcenable.func2()
	/usr/local/go/src/runtime/mgc.go:179 +0x28 fp=0x829fec sp=0x829fe4 pc=0x29e98
runtime.goexit()
	/usr/local/go/src/runtime/asm_arm.s:831 +0x4 fp=0x829fec sp=0x829fec pc=0x83770
created by runtime.gcenable
	/usr/local/go/src/runtime/mgc.go:179 +0xbc

goroutine 5 [finalizer wait]:
runtime.gopark(0x308bb8, 0x4f78ac, 0x10, 0x14, 0x1)
	/usr/local/go/src/runtime/proc.go:381 +0x100 fp=0x82878c sp=0x828778 pc=0x4ff3c
runtime.runfinq()
	/usr/local/go/src/runtime/mfinal.go:193 +0xfc fp=0x8287ec sp=0x82878c pc=0x28dc4
runtime.goexit()
	/usr/local/go/src/runtime/asm_arm.s:831 +0x4 fp=0x8287ec sp=0x8287ec pc=0x83770
created by runtime.createfing
	/usr/local/go/src/runtime/mfinal.go:163 +0x5c

When using Go 1.18 and re-adding epoll_wait, this seems to work again. I just need to set up a working cross-compilation environment for Go.

Step by step guide

Hi Daan,
I saw your project and want to follow you building a synology album kindle viewer.
I am not sure though on where to start. Where should the code be placed? Any chance you can modify the readme as a step by step guide?
Thanks so much in advance!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.