├── .gitignore ├── LICENSE ├── README.md ├── dist.sh ├── dist ├── files_opds-0.1.1.tar.gz ├── files_opds-0.1.2.tar.gz ├── files_opds-0.1.tar.gz ├── files_opds-0.2.tar.gz ├── files_opds-0.3.1.tar.gz ├── files_opds-0.3.tar.gz ├── files_opds-0.4.tar.gz ├── files_opds-0.5.1.tar.gz ├── files_opds-0.5.2.tar.gz ├── files_opds-0.5.3.tar.gz ├── files_opds-0.5.4.tar.gz ├── files_opds-0.5.5.tar.gz ├── files_opds-0.5.9.tar.gz ├── files_opds-0.5.tar.gz ├── files_opds-0.6.0.tar.gz ├── files_opds-0.6.1.tar.gz ├── files_opds-0.6.10.tar.gz ├── files_opds-0.6.11.tar.gz ├── files_opds-0.6.12.tar.gz ├── files_opds-0.6.13.tar.gz ├── files_opds-0.6.14.tar.gz ├── files_opds-0.6.15.tar.gz ├── files_opds-0.6.16.tar.gz ├── files_opds-0.6.2.tar.gz ├── files_opds-0.6.3.tar.gz ├── files_opds-0.6.4.tar.gz ├── files_opds-0.6.5.tar.gz ├── files_opds-0.6.6.tar.gz ├── files_opds-0.6.7.tar.gz ├── files_opds-0.6.8.tar.gz ├── files_opds-0.6.9.tar.gz ├── files_opds-0.7.0.tar.gz ├── files_opds-0.7.1.tar.gz ├── files_opds-0.7.2.tar.gz ├── files_opds-0.7.3.tar.gz ├── files_opds-0.7.tar.gz ├── files_opds-0.8.0.tar.gz ├── files_opds-0.8.1.tar.gz ├── files_opds-0.8.2.tar.gz ├── files_opds-0.8.3.tar.gz ├── files_opds-0.8.4.tar.gz ├── files_opds-0.8.5.tar.gz ├── files_opds-0.8.6.tar.gz ├── files_opds-0.8.7-NC.tar.gz ├── files_opds-0.8.7-OC.tar.gz ├── files_opds-0.8.8-NC.tar.gz ├── files_opds-0.8.8-OC.tar.gz ├── files_reader-0.4.4.tar.gz ├── files_reader-0.4.5.tar.gz ├── files_reader-0.4.6.tar.gz ├── files_reader-0.5.0.tar.gz ├── files_reader-0.6.0.tar.gz ├── files_reader-0.6.1.tar.gz ├── files_reader-0.7.0.tar.gz ├── files_reader-0.7.1.tar.gz ├── files_reader-0.7.2.tar.gz ├── files_reader-0.8.0.tar.gz ├── files_reader-0.8.1.tar.gz ├── files_reader-0.8.2.tar.gz ├── files_reader-0.8.3.tar.gz ├── files_reader-0.8.4.tar.gz ├── files_reader-0.8.tar.gz ├── files_reader-1.0.0.tar.gz ├── files_reader-1.0.1.tar.gz ├── files_reader-1.0.2.tar.gz ├── files_reader-1.0.3.tar.gz ├── files_reader-1.0.4.tar.gz ├── files_reader-1.1.0.tar.gz ├── files_reader-1.1.2.tar.gz ├── files_reader-1.1.3.tar.gz ├── files_reader-1.1.4.tar.gz ├── files_reader-1.1.5-NC.tar.gz ├── files_reader-1.1.5-OC.tar.gz ├── files_reader-1.1.tar.gz ├── files_reader-1.2.0-NC.tar.gz ├── files_reader-1.2.0-OC.tar.gz ├── files_reader-1.2.1-NC.tar.gz ├── files_reader-1.2.1-OC.tar.gz ├── files_reader-1.2.2-NC.tar.gz ├── files_reader-1.2.2-OC.tar.gz ├── files_reader-1.2.3-NC.tar.gz ├── files_reader-1.2.3-OC.tar.gz └── searchrecoll-0.0.1.tar.gz ├── files_opds ├── CHANGELOG.md ├── README.md ├── admin.php ├── ajax │ ├── admin.php │ ├── clear_bookshelf.php │ ├── personal.php │ └── schedule_rescan.php ├── appinfo │ ├── app.php │ ├── database.xml │ ├── info.xml │ ├── routes.php │ └── signature.json ├── css │ └── settings.css ├── img │ └── app.svg ├── index.php ├── js │ ├── admin.js │ └── personal.js ├── lib │ ├── bookshelf.php │ ├── calibre.php │ ├── config.php │ ├── epub.php │ ├── epubpreview.php │ ├── fb2.php │ ├── fb2preview.php │ ├── feed.php │ ├── files.php │ ├── google.php │ ├── isbn.php │ ├── isbndb.php │ ├── meta.php │ └── util.php ├── personal.php └── templates │ ├── admin.php │ ├── feed.php │ ├── part.feed.acquisition.php │ ├── part.feed.navigation.php │ ├── part.feed.root.php │ ├── personal.php │ └── search.php ├── files_reader ├── CHANGELOG.md ├── README.md ├── TODO ├── ajax │ └── personal.php ├── appinfo │ ├── app.php │ ├── database.xml │ ├── info.xml │ ├── routes.php │ └── signature.json ├── css │ └── settings.css ├── img │ ├── app.svg │ ├── book.png │ └── loading.gif ├── js │ ├── lib │ │ ├── Blob.js │ │ ├── blob.js │ │ ├── typedarray.js │ │ ├── typedarray.min.js │ │ └── wgxpath.install.js │ ├── personal.js │ ├── plugin.js │ ├── ready.js │ └── settings.js ├── lib │ ├── Controller │ │ ├── BookmarkController.php │ │ ├── MetadataController.php │ │ ├── PageController.php │ │ └── PreferenceController.php │ ├── Db │ │ ├── Bookmark.php │ │ ├── BookmarkMapper.php │ │ ├── Preference.php │ │ ├── PreferenceMapper.php │ │ ├── ReaderEntity.php │ │ └── ReaderMapper.php │ ├── Hooks.php │ ├── Service │ │ ├── BookmarkService.php │ │ ├── MetadataService.php │ │ ├── PreferenceService.php │ │ └── Service.php │ ├── Utility │ │ └── Time.php │ └── config.php ├── personal.php ├── templates │ ├── cbreader.php │ ├── epubreader.php │ ├── pdfreader.php │ └── settings-personal.php └── vendor │ ├── bartaz │ └── jquery.highlight.js │ ├── bgrins │ ├── spectrum.css │ └── spectrum.js │ ├── bitjs │ ├── archive │ │ ├── archive.js │ │ ├── rarvm.js │ │ ├── unrar.js │ │ ├── untar.js │ │ └── unzip.js │ └── io │ │ ├── bitstream.js │ │ ├── bytebuffer.js │ │ └── bytestream.js │ ├── cbrjs │ ├── cbr.js │ ├── css │ │ ├── cbr.css │ │ └── idevice.css │ └── img │ │ └── loading.gif │ ├── epubjs │ ├── css │ │ ├── annotations.css │ │ ├── font │ │ │ ├── fontello.eot │ │ │ ├── fontello.svg │ │ │ ├── fontello.ttf │ │ │ └── fontello.woff │ │ ├── idevice.css │ │ ├── main.css │ │ ├── normalize.css │ │ ├── popup.css │ │ └── sidebar.css │ ├── epub.main.css │ ├── epub.min.js │ ├── epub.min.map │ ├── hooks.min.js │ ├── hooks.min.map │ ├── hooks │ │ ├── default │ │ │ └── smartimages.js │ │ └── extensions │ │ │ └── highlight.js │ ├── libs │ │ ├── jquery.min.js │ │ ├── screenfull.min.js │ │ └── zip.min.js │ ├── reader.min.js │ └── reader.min.map │ ├── icomoon │ ├── fonts │ │ ├── icomoon.eot │ │ ├── icomoon.svg │ │ ├── icomoon.ttf │ │ └── icomoon.woff │ └── style.css │ ├── jquery │ └── put-delete.js │ ├── pdfjs │ ├── controllers │ │ ├── annotationlayer_controller.js │ │ ├── bookmarks_controller.js │ │ ├── controls_controller.js │ │ ├── meta_controller.js │ │ ├── notes_controller.js │ │ ├── outline_controller.js │ │ ├── progress_controller.js │ │ ├── reader_controller.js │ │ ├── search_controller.js │ │ ├── settings_controller.js │ │ ├── sidebar_controller.js │ │ ├── styles_controller.js │ │ ├── textlayer_controller.js │ │ ├── textlayer_controller.js.simple │ │ └── toc_controller.js │ ├── css │ │ ├── annotation_layer_builder.css │ │ ├── annotations.css │ │ ├── idevice.css │ │ ├── images │ │ │ ├── annotation-check.svg │ │ │ ├── annotation-comment.svg │ │ │ ├── annotation-help.svg │ │ │ ├── annotation-insert.svg │ │ │ ├── annotation-key.svg │ │ │ ├── annotation-newparagraph.svg │ │ │ ├── annotation-noicon.svg │ │ │ ├── annotation-note.svg │ │ │ └── annotation-paragraph.svg │ │ ├── main.css │ │ ├── normalize.css │ │ ├── popup.css │ │ ├── sidebar.css │ │ └── text_layer_builder.css │ ├── lib │ │ ├── pdf.js │ │ ├── pdf.worker.js │ │ └── text_layer_builder.js │ ├── pdf.reader.js │ └── services │ │ ├── eventbus_service.js │ │ ├── link_service.js │ │ └── simple_link_service.js │ ├── pixastic │ ├── pixastic.effects.js │ ├── pixastic.js │ ├── pixastic.worker.control.js │ ├── pixastic.worker.js │ └── pixastic_combined.js │ └── sindresorhus │ └── screenfull.js ├── l10n ├── ignorelist └── templates │ ├── files_opds.pot │ └── files_reader.pot └── screenshots ├── Screenshot_2014-09-29-20-21-50.png ├── Screenshot_2014-10-02-19-16-18.png ├── Screenshot_2017-03-15_195840_593917640.png ├── Screenshot_2017-03-15_200124_360946567.png ├── files_opds-1.png ├── files_reader-1.png ├── files_reader-2.png ├── files_reader-3.png ├── files_reader_PDF_001.png ├── files_reader_PDF_002.png ├── files_reader_PDF_003.png ├── files_reader_PDF_004.png ├── files_reader_PDF_005.png ├── files_reader_PDF_006.png ├── photo_2017-03-15_17-21-30.jpg ├── photo_2017-03-15_17-21-37.jpg ├── photo_2017-03-15_17-21-39.jpg ├── photo_2017-03-15_17-21-40.jpg ├── photo_2017-03-15_17-21-41.jpg ├── photo_2017-03-15_17-21-43.jpg ├── photo_2017-03-15_17-21-49.jpg ├── photo_2017-03-15_17-21-51.jpg ├── photo_2017-03-15_17-21-52.jpg ├── photo_2017-03-15_17-21-53.jpg ├── photo_2017-03-15_17-21-54.jpg ├── photo_2017-03-15_17-21-56.jpg ├── photo_2017-03-15_17-21-57.jpg ├── photo_2017-03-15_17-21-58.jpg ├── photo_2017-03-15_17-21-59.jpg ├── photo_2017-03-15_17-22-00.jpg ├── photo_2017-03-15_17-22-01.jpg ├── photo_2017-03-15_17-22-02.jpg ├── photo_2017-03-15_17-22-03.jpg ├── photo_2017-03-15_17-22-04.jpg ├── photo_2017-03-15_17-22-05.jpg ├── photo_2017-03-15_17-22-06.jpg ├── photo_2017-03-15_17-22-08.jpg ├── photo_2017-03-15_17-22-09.jpg ├── photo_2017-03-15_17-22-10.jpg ├── photo_2017-03-15_17-22-11.jpg ├── photo_2017-03-15_17-22-12.jpg ├── photo_2017-03-15_17-22-13.jpg ├── photo_2017-03-15_17-22-14.jpg ├── photo_2017-03-15_17-22-15.jpg ├── photo_2017-03-15_17-22-16.jpg ├── photo_2017-03-15_17-22-17.jpg ├── photo_2017-03-15_17-22-18.jpg ├── photo_2017-03-15_17-22-19.jpg ├── photo_2017-03-15_17-22-20.jpg ├── photo_2017-03-15_17-22-21.jpg ├── photo_2017-03-15_17-22-22.jpg ├── photo_2017-03-15_17-22-23.jpg ├── photo_2017-03-15_17-22-24.jpg ├── photo_2017-03-15_17-22-26.jpg ├── photo_2017-03-15_17-22-27.jpg ├── photo_2017-03-15_17-22-28.jpg ├── photo_2017-03-15_18-28-36.jpg ├── photo_2017-03-15_18-28-37.jpg ├── photo_2017-03-15_18-28-43.jpg ├── photo_2017-03-15_18-28-46.jpg ├── photo_2017-03-15_18-28-49.jpg ├── photo_2017-03-15_18-28-52.jpg ├── photo_2017-03-15_18-28-54.jpg └── photo_2017-03-15_18-28-56.jpg /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | dist/*.sig 3 | -------------------------------------------------------------------------------- /dist.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # creates dist files for all updated apps 4 | 5 | ls */appinfo/info.xml|while read f;do 6 | app=$(echo $f|cut -d '/' -f 1) 7 | version=$(xml2json < $f|jq -r '.info.version["$t"]') 8 | if [ ! -f dist/${app}-${version}-OC.tar.gz ]; then 9 | find ${app} -type f -print0|tar --exclude=${app}/appinfo/signature.json -cvzf dist/${app}-${version}-NC.tar.gz --null -T - 10 | nextcloud_sign_package ${app} ${version} > dist/${app}-${version}-NC.sig 11 | owncloud_sign_package ${app} 12 | find ${app} -type f -print0|tar cvzf dist/${app}-${version}-OC.tar.gz --null -T - 13 | else 14 | echo ${app} version ${version} up to date 15 | fi 16 | done 17 | -------------------------------------------------------------------------------- /dist/files_opds-0.1.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.1.1.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.1.2.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.1.2.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.1.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.2.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.2.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.3.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.3.1.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.3.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.3.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.4.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.4.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.5.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.5.1.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.5.2.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.5.2.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.5.3.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.5.3.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.5.4.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.5.4.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.5.5.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.5.5.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.5.9.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.5.9.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.5.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.5.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.0.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.1.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.10.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.10.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.11.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.11.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.12.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.12.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.13.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.13.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.14.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.14.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.15.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.15.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.16.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.16.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.2.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.2.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.3.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.3.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.4.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.4.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.5.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.5.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.6.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.6.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.7.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.7.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.8.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.8.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.6.9.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.6.9.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.7.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.7.0.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.7.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.7.1.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.7.2.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.7.2.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.7.3.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.7.3.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.7.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.7.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.8.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.8.0.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.8.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.8.1.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.8.2.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.8.2.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.8.3.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.8.3.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.8.4.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.8.4.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.8.5.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.8.5.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.8.6.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.8.6.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.8.7-NC.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.8.7-NC.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.8.7-OC.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.8.7-OC.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.8.8-NC.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.8.8-NC.tar.gz -------------------------------------------------------------------------------- /dist/files_opds-0.8.8-OC.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_opds-0.8.8-OC.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-0.4.4.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-0.4.4.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-0.4.5.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-0.4.5.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-0.4.6.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-0.4.6.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-0.5.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-0.5.0.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-0.6.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-0.6.0.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-0.6.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-0.6.1.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-0.7.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-0.7.0.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-0.7.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-0.7.1.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-0.7.2.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-0.7.2.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-0.8.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-0.8.0.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-0.8.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-0.8.1.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-0.8.2.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-0.8.2.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-0.8.3.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-0.8.3.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-0.8.4.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-0.8.4.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-0.8.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-0.8.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.0.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.0.0.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.0.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.0.1.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.0.2.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.0.2.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.0.3.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.0.3.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.0.4.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.0.4.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.1.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.1.0.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.1.2.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.1.2.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.1.3.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.1.3.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.1.4.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.1.4.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.1.5-NC.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.1.5-NC.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.1.5-OC.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.1.5-OC.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.1.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.2.0-NC.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.2.0-NC.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.2.0-OC.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.2.0-OC.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.2.1-NC.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.2.1-NC.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.2.1-OC.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.2.1-OC.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.2.2-NC.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.2.2-NC.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.2.2-OC.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.2.2-OC.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.2.3-NC.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.2.3-NC.tar.gz -------------------------------------------------------------------------------- /dist/files_reader-1.2.3-OC.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/files_reader-1.2.3-OC.tar.gz -------------------------------------------------------------------------------- /dist/searchrecoll-0.0.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/dist/searchrecoll-0.0.1.tar.gz -------------------------------------------------------------------------------- /files_opds/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.8.8 - 2018-01-31 2 | ### Changed 3 | - some minor changes to the preference sections 4 | 5 | ## 0.8.5 - 0.8.7 6 | ### Changed 7 | - debugging NC and OC package signing collision 8 | 9 | ## 0.8.4 - 2018-01-19 10 | ### Changed 11 | - signed package for publication in Owncloud marketplace 12 | 13 | ## 0.8.3 - 2018-01-18 14 | ### Changed 15 | - increased maximum version for OC and NC 16 | 17 | ## 0.8.2 - 2017-01-19 18 | ### Fixed 19 | - Support login tokens ('app passwords', NC/OC) and 2FA (NC) 20 | 21 | ## 0.8.1 - 2017-01-14 22 | ### Changed 23 | - more robust preview generator, fallback to mimetype icon when showPreview throws exception 24 | 25 | ## 0.8.0 - 2017-01-14 26 | ### New 27 | - FictionBook 2 (.fb2) metadata parser 28 | - FB2 preview provider 29 | 30 | ## 0.7.3 - 2017-01-09 31 | ### Fixed 32 | - XML error after deleting an epub file from Library 33 | - [#23](https://github.com/Yetangitu/owncloud-apps/issues/23) 34 | 35 | ## 0.7.2 - 2017-01-09 36 | ### Changed 37 | - Modified info.xml, now with working screenshot url... 38 | 39 | ## 0.7.1 - 2017-01-09 40 | ### Added 41 | - Modified info.xml, added screenshot 42 | 43 | ## 0.7.0 - 2017-01-09 44 | ### Changed 45 | - New logo 46 | - First release to be compatible with Nextcloud 47 | -------------------------------------------------------------------------------- /files_opds/admin.php: -------------------------------------------------------------------------------- 1 | getL10N('files_opds'); 14 | 15 | \OCP\Util::addScript('files_opds', 'admin'); 16 | \OCP\Util::addStyle('files_opds', 'settings'); 17 | $defaults = new \OC_Defaults(); 18 | 19 | $formats = array( 20 | ["epub" => Config::getPreview('OC\Preview\Epub') ? 1 : 0 ], 21 | ["fb2" => Config::getPreview('OC\Preview\FB2') ? 1 : 0 ], 22 | ["pdf" => Config::getPreview('OC\Preview\PDF') ? 1 : 0], 23 | ["opendocument" => Config::getPreview('OC\Preview\OpenDocument') ? 1 : 0], 24 | ["msoffice" => Config::getPreview('OC\Preview\MSOfficeDoc') ? 1 : 0] 25 | ); 26 | 27 | $tmpl = new \OCP\Template('files_opds', 'admin'); 28 | $tmpl->assign('feedSubtitle', Config::getApp('feed-subtitle', $l->t("%s OPDS catalog", $defaults->getName()))); 29 | $tmpl->assign('isbndbKey', Config::getApp('isbndb-key', '')); 30 | $tmpl->assign('googleKey', Config::getApp('google-key', '')); 31 | $tmpl->assign('previewFormats', $formats); 32 | $tmpl->assign('cover-x', Config::getApp('cover-x', '200')); 33 | $tmpl->assign('cover-y', Config::getApp('cover-y', '200')); 34 | $tmpl->assign('thumb-x', Config::getApp('thumb-x', '36')); 35 | $tmpl->assign('thumb-y', Config::getApp('thumb-y', '36')); 36 | 37 | return $tmpl->fetchPage(); 38 | -------------------------------------------------------------------------------- /files_opds/ajax/admin.php: -------------------------------------------------------------------------------- 1 | getL10N('files_opds'); 20 | 21 | if (isset($_POST['opdsCoverX'])) { 22 | // set dimensions, using sane defaults just in case 23 | $opdsCoverX = isset($_POST['opdsCoverX']) ? (int) $_POST['opdsCoverX'] : 200; 24 | $opdsCoverY = isset($_POST['opdsCoverY']) ? (int) $_POST['opdsCoverY'] : 200; 25 | $opdsThumbX = isset($_POST['opdsThumbX']) ? (int) $_POST['opdsThumbX'] : 36; 26 | $opdsThumbY = isset($_POST['opdsThumbY']) ? (int) $_POST['opdsThumbY'] : 36; 27 | $opdsFeedSubtitle = isset($_POST['opdsFeedSubtitle']) ? $_POST['opdsFeedSubtitle'] : $l->t("%s OPDS catalog", $defaults->getName()); 28 | $opdsIsbndbKey = isset($_POST['opdsIsbndbKey']) ? $_POST['opdsIsbndbKey'] : ''; 29 | $opdsGoogleKey = isset($_POST['opdsGoogleKey']) ? $_POST['opdsGoogleKey'] : ''; 30 | 31 | Config::setApp('cover-x', $opdsCoverX); 32 | Config::setApp('cover-y', $opdsCoverY); 33 | Config::setApp('thumb-x', $opdsThumbX); 34 | Config::setApp('thumb-y', $opdsThumbX); 35 | Config::setApp('feed_subtitle', $opdsFeedSubtitle); 36 | Config::setApp('isbndb-key', $opdsIsbndbKey); 37 | Config::setApp('google-key', $opdsGoogleKey); 38 | } else { 39 | // set preview preferences 40 | $opdsPreviewEpub = $_POST['opdsPreviewEpub']; 41 | $opdsPreviewFb2 = $_POST['opdsPreviewFb2']; 42 | $opdsPreviewPdf = $_POST['opdsPreviewPdf']; 43 | $opdsPreviewOpenDocument = $_POST['opdsPreviewOpenDocument']; 44 | $opdsPreviewMsOffice = $_POST['opdsPreviewMsOffice']; 45 | 46 | Config::setPreview('OC\Preview\Epub',$opdsPreviewEpub); 47 | Config::setPreview('OC\Preview\FB2',$opdsPreviewFb2); 48 | Config::setPreview('OC\Preview\PDF',$opdsPreviewPdf); 49 | Config::setPreview('OC\Preview\OpenDocument',$opdsPreviewOpenDocument); 50 | Config::setPreview('OC\Preview\StarOffice',$opdsPreviewOpenDocument); 51 | Config::setPreview('OC\Preview\MSOfficeDoc',$opdsPreviewMsOffice); 52 | Config::setPreview('OC\Preview\MSOffice2003',$opdsPreviewMsOffice); 53 | Config::setPreview('OC\Preview\MSOffice2007',$opdsPreviewMsOffice); 54 | } 55 | 56 | \OCP\JSON::success( 57 | array( 58 | 'data' => array('message'=> $l->t('Settings updated successfully.')) 59 | ) 60 | ); 61 | 62 | exit(); 63 | 64 | -------------------------------------------------------------------------------- /files_opds/ajax/clear_bookshelf.php: -------------------------------------------------------------------------------- 1 | getL10N('files_opds'); 16 | 17 | \OCP\JSON::checkLoggedIn(); 18 | \OCP\JSON::callCheck(); 19 | 20 | Bookshelf::clear(); 21 | \OCP\JSON::success(array( "data" => array( "message" => $l->t("Bookshelf cleared")))); 22 | -------------------------------------------------------------------------------- /files_opds/ajax/personal.php: -------------------------------------------------------------------------------- 1 | getL10N('files_opds'); 19 | 20 | $opdsEnable = isset($_POST['opdsEnable']) ? $_POST['opdsEnable'] : 'false'; 21 | $rootPath = isset($_POST['rootPath']) ? $_POST['rootPath'] : '/Library'; 22 | $fileTypes = isset($_POST['fileTypes']) ? $_POST['fileTypes'] : ''; 23 | $skipList = isset($_POST['skipList']) ? $_POST['skipList'] : 'metadata.opf,cover.jpg'; 24 | $feedTitle = isset($_POST['feedTitle']) ? $_POST['feedTitle'] : $l->t("%s's Library", \OCP\User::getDisplayName()); 25 | 26 | if (!strlen($rootPath) || 27 | \OC\Files\Filesystem::isValidPath($rootPath) === false || 28 | \OC\Files\Filesystem::file_exists($rootPath) === false ) { 29 | \OCP\JSON::error( 30 | array( 31 | 'data' => array('message'=> $l->t('Directory does not exist!')) 32 | ) 33 | ); 34 | } else { 35 | Config::set('root_path', $rootPath); 36 | Config::set('enable', $opdsEnable); 37 | Config::set('file_types', $fileTypes); 38 | Config::set('skip_list', $skipList); 39 | Config::set('feed_title', $feedTitle); 40 | Config::set('id', Util::genUuid()); 41 | 42 | \OCP\JSON::success( 43 | array( 44 | 'data' => array('message'=> $l->t('Settings updated successfully.')) 45 | ) 46 | ); 47 | } 48 | 49 | exit(); 50 | 51 | -------------------------------------------------------------------------------- /files_opds/ajax/schedule_rescan.php: -------------------------------------------------------------------------------- 1 | getL10N('files_opds'); 16 | 17 | \OCP\JSON::checkLoggedIn(); 18 | \OCP\JSON::callCheck(); 19 | 20 | Meta::rescan(); 21 | \OCP\JSON::success(array( "data" => array( "message" => $l->t("Rescan scheduled")))); 22 | -------------------------------------------------------------------------------- /files_opds/appinfo/app.php: -------------------------------------------------------------------------------- 1 | getL10N('files_opds'); 3 | 4 | \OCP\App::registerPersonal('files_opds', 'personal'); 5 | \OCP\App::registerAdmin('files_opds', 'admin'); 6 | 7 | /* register preview providers */ 8 | \OC::$server->getPreviewManager()->registerProvider('/application\/epub\+zip/', function() { return new OCA\Files_Opds\EpubPreview; }); 9 | \OC::$server->getPreviewManager()->registerProvider('/application\/x-fictionbook\+xml/', function() { return new OCA\Files_Opds\Fb2Preview; }); 10 | -------------------------------------------------------------------------------- /files_opds/appinfo/database.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | *dbname* 4 | true 5 | false 6 | utf8 7 | 8 | 9 | *dbprefix*opds_metadata 10 | 11 | 12 | 13 | id 14 | integer 15 | true 16 | true 17 | 11 18 | 19 | 20 | 21 | 22 | updated 23 | timestamp 24 | 1970-01-01 00:00:00 25 | false 26 | 27 | 28 | 29 | 30 | date 31 | text 32 | 33 | true 34 | 32 35 | 36 | 37 | 38 | 39 | author 40 | text 41 | 42 | true 43 | 1024 44 | 45 | 46 | 47 | 48 | title 49 | text 50 | 51 | true 52 | 512 53 | 54 | 55 | 56 | 57 | language 58 | text 59 | 60 | true 61 | 64 62 | 63 | 64 | 65 | 66 | publisher 67 | text 68 | 69 | true 70 | 256 71 | 72 | 73 | 74 | 75 | isbn 76 | text 77 | 78 | true 79 | 16 80 | 81 | 82 | 83 | 84 | copyright 85 | text 86 | 87 | true 88 | 265 89 | 90 | 91 | 92 | 93 | description 94 | text 95 | 96 | true 97 | 4096 98 | 99 | 100 | 101 | 102 | subjects 103 | text 104 | 105 | true 106 | 2048 107 | 108 | 109 | 110 | 111 | cover 112 | text 113 | 114 | false 115 | 1024 116 | 117 | 118 | 119 | 120 | rescan 121 | timestamp 122 | 123 | false 124 | 125 | 126 | 127 | opds_metadata_id_index 128 | 129 | id 130 | 131 | 132 | 133 | 134 |
135 |
136 | -------------------------------------------------------------------------------- /files_opds/appinfo/info.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | files_opds 4 | OPDS catalog 5 | An OPDS catalog generator; publishes a sub-tree of the filesystem as an OPDS feed 6 | 7 | 20 | 21 | AGPL 22 | 0.8.8 23 | Frank de Lange 24 | tools 25 | files 26 | organization 27 | https://github.com/Yetangitu/owncloud-apps/files_opds/ 28 | https://github.com/Yetangitu/owncloud-apps/issues/ 29 | https://github.com/Yetangitu/owncloud-apps/files_opds/ 30 | 31 | https://github.com/Yetangitu/owncloud-apps/blob/master/files_opds/README.md 32 | 33 | https://raw.githubusercontent.com/Yetangitu/owncloud-apps/master/screenshots/files_opds-1.png 34 | 35 | 36 | pgsql 37 | sqlite 38 | mysql 39 | 40 | 41 | 42 | 43 | OCA\Files_Opds\Settings\Admin 44 | 45 | 168132 46 | 47 | 48 | -------------------------------------------------------------------------------- /files_opds/appinfo/routes.php: -------------------------------------------------------------------------------- 1 | create('opds_catalog', '/') 14 | ->actionInclude('files_opds/index.php'); 15 | $this->create('opds_catalog_admin_settings', 'ajax/admin.php') 16 | ->actionInclude('files_opds/ajax/admin.php'); 17 | $this->create('opds_catalog_personal_settings', 'ajax/personal.php') 18 | ->actionInclude('files_opds/ajax/personal.php'); 19 | $this->create('opds_catalog_clear_bookshelf', 'ajax/clear_bookshelf.php') 20 | ->actionInclude('files_opds/ajax/clear_bookshelf.php'); 21 | $this->create('opds_catalog_schedule_rescan', 'ajax/schedule_rescan.php') 22 | ->actionInclude('files_opds/ajax/schedule_rescan.php'); 23 | -------------------------------------------------------------------------------- /files_opds/css/settings.css: -------------------------------------------------------------------------------- 1 | #opds .indent { 2 | padding-left: 1em; 3 | } 4 | 5 | #opds .double-indent { 6 | padding-left: 2em; 7 | } 8 | 9 | .nav-icon-opds { 10 | background-image: url('../img/app.svg?v=1'); 11 | } 12 | -------------------------------------------------------------------------------- /files_opds/index.php: -------------------------------------------------------------------------------- 1 | getUserFolder(\OC::$server->getUserSession()->getUser()->getUID()); 42 | $id = $rootFolder->getId(); 43 | } 44 | 45 | $dir = \OC\Files\Filesystem::normalizePath(\OC\Files\Filesystem::getPath($id)); 46 | $root = Config::get('root_path', '/Library'); 47 | 48 | /* Only feed files descending from designated root directory */ 49 | if (!(Files::isChild($root,$dir))) { 50 | $dir = $root; 51 | } 52 | 53 | $dirInfo = \OC\Files\Filesystem::getFileInfo($dir); 54 | 55 | /* If requested resource is a file, serve it, otherwise produce opds feed */ 56 | switch ($dirInfo->getType()) { 57 | case 'file': 58 | if ($type) { 59 | Feed::servePreview($dir,$type); 60 | } else { 61 | Feed::serveFile($dir,$id); 62 | } 63 | break; 64 | case 'dir': 65 | Feed::serveFeed($dir, $id, $type); 66 | break; 67 | default: 68 | Util::logWarn("I don't know how to handle files of type " . $dirInfo->getType()); 69 | break; 70 | } 71 | -------------------------------------------------------------------------------- /files_opds/js/admin.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function(){ 2 | // save settings 3 | var opdsAdminSettings = { 4 | save : function() { 5 | var epub = document.getElementById('opds-preview-epub').checked ? 'true' : 'false'; 6 | var fb2 = document.getElementById('opds-preview-fb2').checked ? 'true' : 'false'; 7 | var pdf = document.getElementById('opds-preview-pdf').checked ? 'true' : 'false'; 8 | var opendocument = document.getElementById('opds-preview-opendocument').checked ? 'true' : 'false'; 9 | var msoffice = document.getElementById('opds-preview-msoffice').checked ? 'true' : 'false'; 10 | var data = { 11 | opdsPreviewEpub : epub, 12 | opdsPreviewFb2 : fb2, 13 | opdsPreviewPdf : pdf, 14 | opdsPreviewOpenDocument : opendocument, 15 | opdsPreviewMsOffice : msoffice 16 | }; 17 | OC.msg.startSaving('#opds-admin .msg'); 18 | $.post(OC.filePath('files_opds', 'ajax', 'admin.php'), data, opdsAdminSettings.afterSave); 19 | }, 20 | afterSave : function(data){ 21 | OC.msg.finishedSaving('#opds-admin .msg', data); 22 | } 23 | }; 24 | 25 | var opdsAdminCoverSettings = { 26 | save : function() { 27 | var data = { 28 | opdsCoverX : $('#opds-cover-x').val(), 29 | opdsCoverY : $('#opds-cover-y').val(), 30 | opdsThumbX : $('#opds-thumb-x').val(), 31 | opdsThumbY : $('#opds-thumb-y').val(), 32 | opdsFeedSubtitle : $('#opds-feed-subtitle').val(), 33 | opdsIsbndbKey : $('#opds-isbndb-key').val(), 34 | opdsGoogleKey : $('#opds-google-key').val() 35 | }; 36 | OC.msg.startSaving('#opds-admin .msg'); 37 | $.post(OC.filePath('files_opds', 'ajax', 'admin.php'), data, opdsAdminCoverSettings.afterSave); 38 | }, 39 | afterSave : function(data){ 40 | OC.msg.finishedSaving('#opds-admin .msg', data); 41 | } 42 | }; 43 | 44 | $('#opds-preview-epub').on("change", opdsAdminSettings.save); 45 | $('#opds-preview-fb2').on("change", opdsAdminSettings.save); 46 | $('#opds-preview-pdf').on("change", opdsAdminSettings.save); 47 | $('#opds-preview-opendocument').on("change", opdsAdminSettings.save); 48 | $('#opds-preview-msoffice').on("change", opdsAdminSettings.save); 49 | 50 | $('#opds-cover-x,#opds-cover-y,#opds-thumb-x,#opds-thumb-y,#opds-feed-subtitle,#opds-isbndb-key,#opds-google-key').blur(opdsAdminCoverSettings.save); 51 | $('#opds-cover-x,#opds-cover-y,#opds-thumb-x,#opds-thumb-y,#opds-feed-subtitle,#opds-isbndb-key,#opds-google-key').keypress(function( event ) { 52 | if (event.which == 13) { 53 | event.preventDefault(); 54 | opdsAdminCoverSettings.save(); 55 | } 56 | }); 57 | 58 | }); 59 | 60 | -------------------------------------------------------------------------------- /files_opds/js/personal.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function(){ 2 | // clear bookshelf 3 | $('#opds-clear-bookshelf').on("click", function() { 4 | $('#opds-really-clear-bookshelf,#opds-dont-clear-bookshelf').show(); 5 | }); 6 | $('#opds-dont-clear-bookshelf').on("click", function() { 7 | $('#opds-really-clear-bookshelf,#opds-dont-clear-bookshelf').hide(); 8 | }); 9 | $('#opds-really-clear-bookshelf').on("click", function() { 10 | $.post(OC.filePath('files_opds','ajax','clear_bookshelf.php'), {}, 11 | function(result){ 12 | if(result) { 13 | OC.msg.finishedSaving('#opds-personal .clr', result); 14 | $('#opds-book-count').hide(); 15 | } 16 | }); 17 | $('#opds-really-clear-bookshelf,#opds-dont-clear-bookshelf').hide(); 18 | }); 19 | 20 | // schedule rescan 21 | $('#opds-rescan').on("click", function() { 22 | $('#opds-really-rescan,#opds-dont-rescan').show(); 23 | }); 24 | $('#opds-dont-rescan').on("click", function() { 25 | $('#opds-really-rescan,#opds-dont-rescan').hide(); 26 | }); 27 | $('#opds-really-rescan').on("click", function() { 28 | $.post(OC.filePath('files_opds','ajax','schedule_rescan.php'), {}, 29 | function(result){ 30 | if(result) { 31 | OC.msg.finishedSaving('#opds-personal .scn', result); 32 | } 33 | }); 34 | $('#opds-really-rescan,#opds-dont-rescan').hide(); 35 | }); 36 | 37 | 38 | // save settings 39 | var opdsSettings = { 40 | save : function() { 41 | var opdsEnable = document.getElementById('opds-enable').checked ? 'true' : 'false'; 42 | var data = { 43 | opdsEnable : opdsEnable, 44 | rootPath : $('#opds-root-path').val(), 45 | fileTypes : $('#opds-file-types').val(), 46 | skipList : $('#opds-skip-list').val(), 47 | feedTitle : $('#opds-feed-title').val() 48 | }; 49 | OC.msg.startSaving('#opds-personal .msg'); 50 | $.post(OC.filePath('files_opds', 'ajax', 'personal.php'), data, opdsSettings.afterSave); 51 | }, 52 | afterSave : function(data){ 53 | OC.msg.finishedSaving('#opds-personal .msg', data); 54 | } 55 | }; 56 | $('#opds-root-path,#opds-file-types,#opds-feed-title,#opds-skip-list').blur(opdsSettings.save); 57 | $('#opds-root-path,#opds-file-types,#opds-feed-title,#opds-skip-list').keypress(function( event ) { 58 | if (event.which == 13) { 59 | event.preventDefault(); 60 | opdsSettings.save(); 61 | } 62 | }); 63 | $('#opds-enable').on("change", opdsSettings.save); 64 | }); 65 | 66 | -------------------------------------------------------------------------------- /files_opds/lib/bookshelf.php: -------------------------------------------------------------------------------- 1 | registerXPathNamespace('o', "http://www.idpf.org/2007/opf"); 32 | if(($cover = $package->xpath('//o:reference[@type="cover"]/@href')[0]) && (file_exists($dir . '/' . $cover))) { 33 | $meta['cover'] = $cover; 34 | } 35 | return self::parse($package->metadata->children('dc', true),$meta); 36 | } else { 37 | return false; 38 | } 39 | } 40 | 41 | /** 42 | * @brief parse Calibre metadata.opf into OPDS $meta array 43 | * 44 | * @param SimpleXMLElement $data SimpleXMLElement object containing DC/OPF metadata 45 | * @param arrayref &$meta 46 | * @return bool true if metadata is valid 47 | */ 48 | static function parse($data,&$meta) { 49 | foreach ($data as $key => $value) { 50 | switch ($key) { 51 | case 'title': 52 | $meta['title'] = strip_tags($value); 53 | break; 54 | case 'creator': 55 | if(!($author = json_decode($meta['author'],true))) { 56 | $author = array(); 57 | } 58 | $fileAs = $value->attributes('opf',true)->{'file-as'}; 59 | $author[(string) $fileAs] = strip_tags($value); 60 | $meta['author'] = json_encode($author); 61 | break; 62 | case 'description': 63 | $meta['description'] = strip_tags($value); 64 | break; 65 | case 'publisher': 66 | $meta['publisher'] = strip_tags($value); 67 | break; 68 | case 'identifier': 69 | if('ISBN' == $value->attributes('opf',true)->scheme) { 70 | $meta['isbn'] = strip_tags($value); 71 | } 72 | break; 73 | case 'subject': 74 | if(!($subject = json_decode($meta['subjects'],true))) { 75 | $subject = array(); 76 | } 77 | array_push($subject,strip_tags($value)); 78 | $meta['subjects'] = json_encode($subject); 79 | break; 80 | case 'date': 81 | $meta['date'] = strip_tags($value); 82 | break; 83 | case 'language': 84 | $meta['language'] = strip_tags($value); 85 | break; 86 | } 87 | } 88 | 89 | return Meta::isValid($meta); 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /files_opds/lib/config.php: -------------------------------------------------------------------------------- 1 | getFileInfo($path); 29 | if(!$fileInfo) { 30 | return false; 31 | } 32 | 33 | $absPath = $fileview->toTmpFile($path); 34 | 35 | $epub = new \OCA\Files_Opds\Epub($absPath); 36 | 37 | $cover = $epub->Cover(); 38 | 39 | if ($cover) { 40 | $image = new \OC_Image(); 41 | 42 | $image->loadFromData($cover['data']); 43 | } 44 | 45 | return (($cover !== null) && $image->valid()) ? $image : false; 46 | } 47 | 48 | public function isAvailable(\OCP\Files\FileInfo $file) { 49 | return $file->getSize() > 0; 50 | } 51 | } 52 | 53 | -------------------------------------------------------------------------------- /files_opds/lib/fb2preview.php: -------------------------------------------------------------------------------- 1 | getFileInfo($path); 29 | if(!$fileInfo) { 30 | return false; 31 | } 32 | 33 | $absPath = $fileview->toTmpFile($path); 34 | 35 | $fb2 = new \OCA\Files_Opds\FB2($absPath); 36 | 37 | $cover = $fb2->Cover(); 38 | 39 | if ($cover) { 40 | $image = new \OC_Image(); 41 | 42 | $image->loadFromData($cover['data']); 43 | } 44 | 45 | return (($cover !== null) && $image->valid()) ? $image : false; 46 | } 47 | 48 | public function isAvailable(\OCP\Files\FileInfo $file) { 49 | return $file->getSize() > 0; 50 | } 51 | } 52 | 53 | -------------------------------------------------------------------------------- /files_opds/lib/files.php: -------------------------------------------------------------------------------- 1 | getName(); 32 | $entry['type'] = $i['type']; 33 | if ($i['type'] === 'file') { 34 | $entry['mimetype'] = $i['mimetype']; 35 | $entry['humansize'] = \OCP\Util::humanFileSize($i['size']); 36 | $entry['meta'] = Meta::get($i['fileid']); 37 | } 38 | return $entry; 39 | } 40 | 41 | /** 42 | * Format file info for OPDS feed 43 | * @param \OCP\Files\FileInfo[] $fileInfos file infos 44 | */ 45 | public static function formatFileInfos($fileInfos) { 46 | $files = array(); 47 | /* if set, add only files with given extensions */ 48 | $fileTypes = array_filter(explode(',', strtolower(Config::get('file_types', '')))); 49 | $skipList = array_filter(explode(',', strtolower(Config::get('skip_list', 'metadata.opf,cover.jpg')))); 50 | foreach ($fileInfos as $i) { 51 | if (strcmp($i->getType(), 'dir') !== 0) { 52 | if ((!empty($fileTypes)) && (!in_array(strtolower(substr(strrchr($i->getName(), "."), 1)), $fileTypes))) { 53 | continue; 54 | } 55 | if ((!empty($skipList)) && (in_array($i->getName(), $skipList))) { 56 | continue; 57 | } 58 | } 59 | 60 | $files[] = self::formatFileInfo($i); 61 | } 62 | 63 | return $files; 64 | } 65 | 66 | /* 67 | * @brief check if $child is a subdirectory of $parent 68 | * 69 | * @param string $parent a directory 70 | * @param string $child a directory 71 | * @return bool true if $child is a subdirectory of $parent 72 | */ 73 | public static function isChild($parent, $child) { 74 | 75 | if ($parent[0] !== '/') { 76 | $parent = '/' . $parent; 77 | } 78 | if (strlen($parent) > 1 && substr($parent, -1) !== '/') { 79 | $parent .= '/'; 80 | } 81 | 82 | return (strpos($child, $parent) === 0 && strcmp($child, $parent) !== 0); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /files_opds/lib/google.php: -------------------------------------------------------------------------------- 1 | 0) { 36 | self::parse($data['items'][0]['volumeInfo'],$meta); 37 | return true; 38 | } else { 39 | $meta['rescan'] = date("Y-m-d\TH:i:sP", time() + Isbn::RESCAN_NOT_FOUND); 40 | return Isbn::NOT_FOUND; 41 | } 42 | 43 | /* not reached */ 44 | return Isbn::ERROR; 45 | } 46 | 47 | /** 48 | * @brief parse Google response into OPDS $meta array 49 | * 50 | * @param array $data Google response (json_decoded into array) 51 | * @param arrayref &$meta OPDS metadata array 52 | * @return int errorcode (0 if success) 53 | */ 54 | static function parse($data,&$meta) { 55 | foreach ($data as $key => $value) { 56 | switch ($key) { 57 | case 'description': 58 | $meta['description'] = $value; 59 | if(array_key_exists('notes',$data)) { 60 | $meta['description'] .= ((trim($value) == false) ? '' : "\n\n") . $data['notes']; 61 | } 62 | break; 63 | case 'subject_ids': 64 | $meta['subjects'] = json_encode($value); 65 | break; 66 | /* rather pointless, ISBN is what brought us here in the first place and is alread set 67 | case 'industryIdentifiers': 68 | foreach($value as $array) { 69 | if ($array['type'] = 'ISBN_13') { 70 | $isbn13 = $array['identifier']; 71 | } elseif ($array['type'] = 'ISBN_10') { 72 | $isbn10 = $array['identifier']; 73 | } 74 | } 75 | 76 | $meta['isbn'] = (isset($isbn13)) ? $isbn13 : $isbn10; 77 | break; 78 | */ 79 | case 'title': 80 | $meta['title'] = $value; 81 | break; 82 | case 'authors': 83 | $meta['author'] = json_encode($value); 84 | break; 85 | case 'language': 86 | $meta['language'] = $value; 87 | break; 88 | case 'publisher': 89 | $meta['publisher'] = $value; 90 | break; 91 | case 'publishedDate': 92 | $meta['date'] = $value; 93 | break; 94 | } 95 | } 96 | 97 | return true; 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /files_opds/personal.php: -------------------------------------------------------------------------------- 1 | getL10N('files_opds'); 16 | 17 | #\OCP\Util::addScript('files_opds', 'personal'); 18 | 19 | $tmpl = new \OCP\Template('files_opds', 'personal'); 20 | $opdsEnable = Config::get('enable', false); 21 | $tmpl->assign('opdsEnable-checked', ($opdsEnable === 'true') ? 'checked="checked"' : ''); 22 | $tmpl->assign('opdsEnable-value', ($opdsEnable === 'true') ? '1' : '0'); 23 | $tmpl->assign('rootPath', Config::get('root_path', '/Library')); 24 | $tmpl->assign('fileTypes', Config::get('file_types', '')); 25 | $tmpl->assign('skipList', Config::get('skip_list', 'metadata.opf,cover.jpg')); 26 | $tmpl->assign('feedTitle', Config::get('feed_title', $l->t("%s's Library", \OCP\User::getDisplayName()))); 27 | $tmpl->assign('bookshelf-count', Bookshelf::count()); 28 | $tmpl->assign('feedUrl', Util::linkToAbsolute('','index.php') . '/apps/files_opds/'); 29 | 30 | return $tmpl->fetchPage(); 31 | 32 | -------------------------------------------------------------------------------- /files_opds/templates/admin.php: -------------------------------------------------------------------------------- 1 | getL10N('files_opds'); 14 | 15 | function checkBox($format) { 16 | foreach($format as $name => $enabled) { 17 | echo '' : '>'); 18 | echo ''; 19 | } 20 | } 21 | 22 | ?> 23 | 24 |
25 | 26 | 27 | 28 | 29 |

t('OPDS')); ?>

 
30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 |
" value="" />
" value="" />
" value="" />
44 |
45 |

t('Enable preview for:')); ?>

46 |
47 | 48 |
49 | 50 |
51 | 52 |
53 |
54 |
55 |

t('Cover size')); ?>

56 | 57 | " value="" /> 58 | 59 | " value="" /> 60 |
61 |
62 |

t('Cover thumbnail size')); ?>

63 | 64 | " value="" /> 65 | 66 | " value="" /> 67 |
68 |
69 | 70 | -------------------------------------------------------------------------------- /files_opds/templates/feed.php: -------------------------------------------------------------------------------- 1 | '; 21 | ?> 22 | 23 | 27 | id: 28 | <?php p($_['feed_title']); ?> 29 | 30 | 31 | 32 | 33 | 34 | 35 | 38 | 41 | 42 | 43 | inc('part.feed.root')); 47 | break; 48 | 49 | case 'bookshelf': 50 | foreach ($_['bookshelf'] as $file) { 51 | print_unescaped($this->inc('part.feed.acquisition', [ 'file' => $file ])); 52 | } 53 | break; 54 | 55 | 56 | /* intentional fall-through */ 57 | case 'author': 58 | case 'title': 59 | case 'genre': 60 | case 'directory': 61 | default: 62 | foreach ($_['files'] as $file) { 63 | if ($file['type'] == 'dir') { 64 | print_unescaped($this->inc('part.feed.navigation', [ 'file' => $file ])); 65 | } else { 66 | print_unescaped($this->inc('part.feed.acquisition', [ 'file' => $file ])); 67 | } 68 | } 69 | break; 70 | } 71 | ?> 72 | 73 | 74 | -------------------------------------------------------------------------------- /files_opds/templates/part.feed.acquisition.php: -------------------------------------------------------------------------------- 1 | 2 | <?php p($_['file']['meta']['title']); ?> 3 | 4 | id: 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | urn:isbn: 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 24 | 27 | 30 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /files_opds/templates/part.feed.navigation.php: -------------------------------------------------------------------------------- 1 | 2 | <?php p($_['file']['name']); ?> 3 | 4 | id: 5 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /files_opds/templates/part.feed.root.php: -------------------------------------------------------------------------------- 1 | 2 | <?php p($l->t("Browse catalog")); ?> 3 | 4 | t("Browse the catalog in alphabetical order")); ?> 5 | 7 | id:by_directory 8 | 9 | 10 | <?php p($l->t("%s's bookshelf", array($_['user']))); ?> 11 | 12 | t("This bookshelf contains %s books", array($_['bookshelf-count']))); ?> 13 | 15 | id:by_bookshelf 16 | 17 | -------------------------------------------------------------------------------- /files_opds/templates/personal.php: -------------------------------------------------------------------------------- 1 | 17 | 18 |
19 | 20 | 21 | 22 | 23 |

t('OPDS')); ?>

 
24 |
25 | type="checkbox" class="checkbox"> 26 | 27 |
28 |
29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 |
" value="" />
" value="" />
" value="" />
" value="" />
47 |
48 |
49 | 50 | " value=" t('Yes, I really want to schedule a rescan of all metadata')); ?>" hidden /> 51 | 52 | 53 |
54 |
55 |
56 | 57 | " value=" t('Yes, I really want to clear my personal bookshelf')); ?>" hidden /> 58 | 59 | 60 |
61 | t('There are %s books on your personal bookshelf', array($_['bookshelf-count']))); ?>  62 |
63 |
64 |
65 |
66 | t("OPDS URL")); ?>: 67 | 68 |
t("Use your Owncloud username and password.")); ?>
69 |
70 |
71 | 72 | -------------------------------------------------------------------------------- /files_opds/templates/search.php: -------------------------------------------------------------------------------- 1 | '; 17 | ?> 18 | 19 | 20 | OPDS Catalog Search 21 | Search 22 | 23 | 24 | 26 | 28 | 30 | Search - 31 | linkTo('files_opds', 'img/app.svg')) ?> 32 | 33 | Example.com Development Team 34 | en-us 35 | UTF-8 36 | UTF-8 37 | 38 | -------------------------------------------------------------------------------- /files_reader/TODO: -------------------------------------------------------------------------------- 1 | - annotations 2 | - rtl and ltr 3 | - test canvas size restriction 4 | - add IDs to highlights so they can be marked when hovered - or when related list item is hovered 5 | 6 | -------------------------------------------------------------------------------- /files_reader/ajax/personal.php: -------------------------------------------------------------------------------- 1 | getL10N('files_reader'); 19 | 20 | $EpubEnable = isset($_POST['EpubEnable']) ? $_POST['EpubEnable'] : 'false'; 21 | $PdfEnable = isset($_POST['PdfEnable']) ? $_POST['PdfEnable'] : 'false'; 22 | $CbxEnable = isset($_POST['CbxEnable']) ? $_POST['CbxEnable'] : 'false'; 23 | 24 | Config::set('epub_enable', $EpubEnable); 25 | Config::set('pdf_enable', $PdfEnable); 26 | Config::set('cbx_enable', $CbxEnable); 27 | 28 | \OCP\JSON::success( 29 | array( 30 | 'data' => array('message'=> $l->t('Settings updated successfully.')) 31 | ) 32 | ); 33 | 34 | exit(); 35 | 36 | -------------------------------------------------------------------------------- /files_reader/appinfo/app.php: -------------------------------------------------------------------------------- 1 | getL10N('files_reader'); 19 | 20 | \OCA\Files_Reader\Hooks::register(); 21 | Util::addscript('files_reader', 'plugin'); 22 | \OCP\App::registerPersonal('files_reader', 'personal'); 23 | -------------------------------------------------------------------------------- /files_reader/appinfo/info.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | files_reader 4 | Reader (ebook reader) 5 | Files_Reader 6 | A multi-format browser-based ebook reader, supports EPUB and CBR/CBZ 7 | 8 | 32 | 33 | 1.2.3 34 | AGPL 35 | Frank de Lange 36 | 37 | https://github.com/Yetangitu/owncloud-apps/blob/master/files_reader/README.md 38 | 39 | https://github.com/Yetangitu/owncloud-apps/issues 40 | https://github.com/Yetangitu/owncloud-apps/tree/master/files_reader 41 | https://raw.githubusercontent.com/Yetangitu/owncloud-apps/master/screenshots/files_reader-1.png 42 | https://raw.githubusercontent.com/Yetangitu/owncloud-apps/master/screenshots/files_reader-3.png 43 | https://raw.githubusercontent.com/Yetangitu/owncloud-apps/master/screenshots/files_reader_PDF_005.png 44 | https://raw.githubusercontent.com/Yetangitu/owncloud-apps/master/screenshots/files_reader_PDF_006.png 45 | https://raw.githubusercontent.com/Yetangitu/owncloud-apps/master/screenshots/photo_2017-03-15_17-22-00.jpg 46 | https://raw.githubusercontent.com/Yetangitu/owncloud-apps/master/screenshots/photo_2017-03-15_17-22-02.jpg 47 | files 48 | multimedia 49 | office 50 | 51 | 52 | 53 | 54 | 55 | 56 | pgsql 57 | sqlite 58 | mysql 59 | 60 | 167127 61 | 62 | -------------------------------------------------------------------------------- /files_reader/appinfo/routes.php: -------------------------------------------------------------------------------- 1 | create('reader_personal_settings', 'ajax/personal.php')->actionInclude('files_reader/ajax/personal.php'); 14 | 15 | return ['routes' => [ 16 | // Page 17 | ['name' => 'page#showReader', 'url' => '/', 'verb' => 'GET'], 18 | 19 | // Bookmarks 20 | ['name' => 'bookmark#get_cursor', 'url' => '/bookmark/cursor/{fileId}', 'verb' => 'GET'], 21 | ['name' => 'bookmark#set_cursor', 'url' => '/bookmark/cursor', 'verb' => 'POST'], 22 | ['name' => 'bookmark#delete_cursor', 'url' => '/bookmark/cursor/{fileId}', 'verb' => 'DELETE'], 23 | ['name' => 'bookmark#get', 'url' => '/bookmark/{fileId}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']], 24 | ['name' => 'bookmark#get', 'url' => '/bookmark/{fileId}/{type}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']], 25 | ['name' => 'bookmark#set', 'url' => '/bookmark', 'verb' => 'POST'], 26 | ['name' => 'bookmark#delete', 'url' => '/bookmark/{fileId}/{name}', 'verb' => 'DELETE'], 27 | 28 | // Metadata 29 | ['name' => 'metadata#get', 'url' => '/metadata/{fileId}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']], 30 | ['name' => 'metadata#set', 'url' => '/metadata/{fileId}/{name}/{value}', 'verb' => 'POST'], 31 | 32 | // Preferences 33 | ['name' => 'preference#get_default', 'url' => '/preference/default/{scope}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']], 34 | ['name' => 'preference#set_default', 'url' => '/preference/default', 'verb' => 'POST'], 35 | ['name' => 'preference#delete_default', 'url' => '/preference/default/{scope}/{name}', 'verb' => 'DELETE'], 36 | ['name' => 'preference#get', 'url' => '/preference/{fileId}/{scope}/{name}', 'verb' => 'GET', 'defaults' => ['name' => '']], 37 | ['name' => 'preference#set', 'url' => '/preference', 'verb' => 'POST'], 38 | ['name' => 'preference#delete', 'url' => '/preference/{fileId}/{scope}/{name}', 'verb' => 'DELETE'], 39 | ]]; 40 | 41 | -------------------------------------------------------------------------------- /files_reader/css/settings.css: -------------------------------------------------------------------------------- 1 | .nav-icon-reader { 2 | background-image: url('../img/app.svg?v=2'); 3 | } 4 | -------------------------------------------------------------------------------- /files_reader/img/app.svg: -------------------------------------------------------------------------------- 1 | 2 | 13 | 15 | 16 | 18 | image/svg+xml 19 | 21 | 22 | 23 | 24 | 25 | 27 | 31 | 35 | 36 |   46 | 50 | 51 | -------------------------------------------------------------------------------- /files_reader/img/book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/files_reader/img/book.png -------------------------------------------------------------------------------- /files_reader/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/files_reader/img/loading.gif -------------------------------------------------------------------------------- /files_reader/js/lib/blob.js: -------------------------------------------------------------------------------- 1 | Blob = (function() { 2 | var nativeBlob = Blob; 3 | 4 | // Add unprefixed slice() method. 5 | if (Blob.prototype.webkitSlice) { 6 | Blob.prototype.slice = Blob.prototype.webkitSlice; 7 | } 8 | else if (Blob.prototype.mozSlice) { 9 | Blob.prototype.slice = Blob.prototype.mozSlice; 10 | } 11 | 12 | // Temporarily replace Blob() constructor with one that checks support. 13 | return function(parts, properties) { 14 | try { 15 | // Restore native Blob() constructor, so this check is only evaluated once. 16 | Blob = nativeBlob; 17 | return new Blob(parts || [], properties || {}); 18 | } 19 | catch (e) { 20 | // If construction fails provide one that uses BlobBuilder. 21 | Blob = function (parts, properties) { 22 | var bb = new (WebKitBlobBuilder || MozBlobBuilder), i; 23 | for (i in parts) { 24 | bb.append(parts[i]); 25 | } 26 | 27 | return bb.getBlob(properties && properties.type ? properties.type : undefined); 28 | }; 29 | } 30 | }; 31 | }()); 32 | -------------------------------------------------------------------------------- /files_reader/js/personal.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function(){ 2 | // save settings 3 | var readerSettings = { 4 | save : function() { 5 | var data = { 6 | EpubEnable: document.getElementById('EpubEnable').checked ? 'true' : 'false', 7 | PdfEnable: document.getElementById('PdfEnable').checked ? 'true' : 'false', 8 | CbxEnable: document.getElementById('CbxEnable').checked ? 'true' : 'false' 9 | }; 10 | 11 | OC.msg.startSaving('#reader-personal .msg'); 12 | $.post(OC.filePath('files_reader', 'lib', 'personal-back.php'), data, readerSettings.afterSave); 13 | }, 14 | afterSave : function(data){ 15 | OC.msg.finishedSaving('#reader-personal .msg', data); 16 | } 17 | }; 18 | $('#EpubEnable').on("change", readerSettings.save); 19 | $('#PdfEnable').on("change", readerSettings.save); 20 | $('#CbxEnable').on("change", readerSettings.save); 21 | }); 22 | 23 | -------------------------------------------------------------------------------- /files_reader/js/settings.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function(){ 2 | // save settings 3 | var readerSettings = { 4 | save : function() { 5 | var data = { 6 | EpubEnable: document.getElementById('EpubEnable').checked ? 'true' : 'false', 7 | PdfEnable: document.getElementById('PdfEnable').checked ? 'true' : 'false', 8 | CbxEnable: document.getElementById('CbxEnable').checked ? 'true' : 'false' 9 | }; 10 | 11 | OC.msg.startSaving('#reader-personal .msg'); 12 | $.post(OC.filePath('files_reader', 'ajax', 'personal.php'), data, readerSettings.afterSave); 13 | }, 14 | afterSave : function(data){ 15 | OC.msg.finishedSaving('#reader-personal .msg', data); 16 | } 17 | }; 18 | $('#EpubEnable').on("change", readerSettings.save); 19 | $('#PdfEnable').on("change", readerSettings.save); 20 | $('#CbxEnable').on("change", readerSettings.save); 21 | }); 22 | 23 | -------------------------------------------------------------------------------- /files_reader/lib/Controller/BookmarkController.php: -------------------------------------------------------------------------------- 1 | bookmarkService = $bookmarkService; 35 | } 36 | 37 | /** 38 | * @brief return bookmark 39 | * 40 | * @NoAdminRequired 41 | * @NoCSRFRequired 42 | * 43 | * @param int $fileId 44 | * @param string $name 45 | * 46 | * @return array|\OCP\AppFramework\Http\JSONResponse 47 | */ 48 | public function get($fileId, $name, $type=null) { 49 | return $this->bookmarkService->get($fileId, $name, $type); 50 | } 51 | 52 | /** 53 | * @brief write bookmark 54 | * 55 | * @NoAdminRequired 56 | * @NoCSRFRequired 57 | * 58 | * @param int $fileId 59 | * @param string $name 60 | * @param string $value 61 | * 62 | * @return array|\OCP\AppFramework\Http\JSONResponse 63 | */ 64 | public function set($fileId, $name, $value, $type=null, $content=null) { 65 | return $this->bookmarkService->set($fileId, $name, $value, $type, $content); 66 | } 67 | 68 | 69 | /** 70 | * @brief return cursor for $fileId 71 | * 72 | * @NoAdminRequired 73 | * @NoCSRFRequired 74 | * 75 | * @param int $fileId 76 | * 77 | * @return array|\OCP\AppFramework\Http\JSONResponse 78 | */ 79 | public function getCursor($fileId) { 80 | return $this->bookmarkService->getCursor($fileId); 81 | } 82 | 83 | /** 84 | * @brief write cursor for $fileId 85 | * 86 | * @NoAdminRequired 87 | * @NoCSRFRequired 88 | * 89 | * @param int $fileId 90 | * @param string $value 91 | * 92 | * @return array|\OCP\AppFramework\Http\JSONResponse 93 | */ 94 | public function setCursor($fileId, $value) { 95 | return $this->bookmarkService->setCursor($fileId, $value); 96 | } 97 | 98 | /** 99 | * @brief delete bookmark 100 | * 101 | * @NoAdminRequired 102 | * @NoCSRFRequired 103 | * 104 | * @param int $fileId 105 | * @param string name 106 | * 107 | */ 108 | public function delete($fileId, $name) { 109 | return $this->bookmarkService->delete($fileId, $name); 110 | } 111 | 112 | /** 113 | * @brief delete cursor 114 | * 115 | * @NoAdminRequired 116 | * @NoCSRFRequired 117 | * 118 | * @param int $fileId 119 | * 120 | */ 121 | public function deleteCursor($fileId) { 122 | return $this->bookmarkService->deleteCursor($fileId); 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /files_reader/lib/Controller/MetadataController.php: -------------------------------------------------------------------------------- 1 | metadataService = $metadataService; 33 | } 34 | 35 | 36 | /** 37 | * @brief write metadata 38 | * 39 | * @NoAdminRequired 40 | * 41 | * @param int $fileId 42 | * @param string $value 43 | * 44 | * @return array|\OCP\AppFramework\Http\JSONResponse 45 | */ 46 | public function setAll($fileId, $value) { 47 | return $this->metadataService->setAll($fileId, $value); 48 | } 49 | 50 | /** 51 | * @brief return metadata item 52 | * 53 | * @NoAdminRequired 54 | * @NoCSRFRequired 55 | * 56 | * @param int $fileId 57 | * @param string $name 58 | * 59 | * @return array|\OCP\AppFramework\Http\JSONResponse 60 | */ 61 | public function get($fileId, $name) { 62 | return $this->metadataService->get($fileId, $name); 63 | } 64 | 65 | /** 66 | * @brief write metadata item 67 | * 68 | * @NoAdminRequired 69 | * 70 | * @param int $fileId 71 | * @param string $name 72 | * @param string $value 73 | * 74 | * @return array|\OCP\AppFramework\Http\JSONResponse 75 | */ 76 | public function set($fileId, $name, $value) { 77 | return $this->metadataService->set($fileId, $name, $value); 78 | } 79 | 80 | } 81 | -------------------------------------------------------------------------------- /files_reader/lib/Controller/PreferenceController.php: -------------------------------------------------------------------------------- 1 | urlGenerator = $urlGenerator; 38 | $this->preferenceService = $preferenceService; 39 | } 40 | 41 | /** 42 | * @brief return preference for $fileId 43 | * 44 | * @NoAdminRequired 45 | * @NoCSRFRequired 46 | * 47 | * @param string $scope 48 | * @param int $fileId 49 | * @param string $name if null, return all preferences for $scope + $fileId 50 | * 51 | * @return array|\OCP\AppFramework\Http\JSONResponse 52 | */ 53 | public function get($scope, $fileId, $name) { 54 | return $this->preferenceService->get($scope, $fileId, $name); 55 | } 56 | 57 | /** 58 | * @brief write preference for $fileId 59 | * 60 | * @NoAdminRequired 61 | * @NoCSRFRequired 62 | * 63 | * @param string $scope 64 | * @param int $fileId 65 | * @param string $name 66 | * @param string $value 67 | * 68 | * @return array|\OCP\AppFramework\Http\JSONResponse 69 | */ 70 | public function set($scope, $fileId, $name, $value) { 71 | return $this->preferenceService->set($scope, $fileId, $name, $value); 72 | } 73 | 74 | 75 | /** 76 | * @brief return default preference 77 | * 78 | * @NoAdminRequired 79 | * @NoCSRFRequired 80 | * 81 | * @param string $scope 82 | * @param string $name if null, return all default preferences for scope 83 | * 84 | * @return array|\OCP\AppFramework\Http\JSONResponse 85 | */ 86 | public function getDefault($scope, $name) { 87 | return $this->preferenceService->getDefault($scope, $name); 88 | } 89 | 90 | /** 91 | * @brief write default preference 92 | * 93 | * @NoAdminRequired 94 | * @NoCSRFRequired 95 | * 96 | * @param string $scope 97 | * @param string $name 98 | * @param string $value 99 | * 100 | * @return array|\OCP\AppFramework\Http\JSONResponse 101 | */ 102 | public function setDefault($scope, $name, $value) { 103 | return $this->preferenceService->setDefault($scope, $name, $value); 104 | } 105 | 106 | /** 107 | * @brief delete preference 108 | * 109 | * @param string $scope 110 | * @param int $fileId 111 | * @param string $name 112 | * 113 | */ 114 | public function delete($scope, $fileId, $name) { 115 | return $this->preferenceService->delete($scope, $fileId, $name); 116 | } 117 | 118 | /** 119 | * @brief delete default preference 120 | * 121 | * @param $scope 122 | * @param $name 123 | * 124 | */ 125 | public function deleteDefault($scope, $name) { 126 | return $this->preferenceService->deleteDefault($scope, $name); 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /files_reader/lib/Db/Bookmark.php: -------------------------------------------------------------------------------- 1 | $this->getId(), 28 | 'userId' => $this->getUserId(), 29 | 'fileId' => $this->getFileId(), 30 | 'type' => $this->getType(), 31 | 'name' => $this->getName(), 32 | 'value' => static::conditional_json_decode($this->getValue()), 33 | 'content' => static::conditional_json_decode($this->getContent()), 34 | 'lastModified' => $this->getLastModified() 35 | ]; 36 | } 37 | 38 | public function toService() { 39 | return [ 40 | 'name' => $this->getName(), 41 | 'type' => $this->getType(), 42 | 'value' => $this->conditional_json_decode($this->getValue()), 43 | 'content' => $this->conditional_json_decode($this->getContent()), 44 | 'lastModified' => $this->getLastModified(), 45 | ]; 46 | } 47 | } 48 | 49 | -------------------------------------------------------------------------------- /files_reader/lib/Db/BookmarkMapper.php: -------------------------------------------------------------------------------- 1 | userId = $UserId; 31 | } 32 | 33 | /** 34 | * @brief get bookmarks for $fileId+$userId(+$name) 35 | * @param $fileId 36 | * @param string $name 37 | * @return array 38 | */ 39 | public function get($fileId, $name, $type=null) { 40 | $sql = "SELECT * FROM `*PREFIX*reader_bookmarks` WHERE file_id=? AND `user_id`=?"; 41 | $args = [ $fileId, $this->userId ]; 42 | if (!(null === $type)) { 43 | $sql .= " AND `type`=?"; 44 | $args[] = $type; 45 | } 46 | if (!(null === $name)) { 47 | $sql .= " AND `name`=?"; 48 | $args[] = $name; 49 | } 50 | 51 | return $this->findEntities($sql, $args); 52 | } 53 | 54 | /** 55 | * @brief write bookmark to database 56 | * 57 | * @param int $fileId 58 | * @param string $name 59 | * @param string $value 60 | * 61 | * @return Bookmark the newly created or updated bookmark 62 | */ 63 | public function set($fileId, $name, $value, $type, $content=null) { 64 | 65 | $result = $this->get($fileId, $name); 66 | 67 | if(empty($result)) { 68 | 69 | // anonymous bookmarks are named after their contents 70 | if (null === $name) { 71 | $name = $value; 72 | } 73 | 74 | // default type is "bookmark" 75 | if (null === $type) { 76 | $type = "bookmark"; 77 | } 78 | 79 | $bookmark = new Bookmark(); 80 | $bookmark->setFileId($fileId); 81 | $bookmark->setUserId($this->userId); 82 | $bookmark->setType($type); 83 | $bookmark->setName($name); 84 | $bookmark->setValue($value); 85 | $bookmark->setContent($content); 86 | 87 | $this->insert($bookmark); 88 | } else { 89 | $bookmark = $result[0]; 90 | $bookmark->setValue($value); 91 | $bookmark->setContent($content); 92 | 93 | $this->update($bookmark); 94 | } 95 | 96 | return $bookmark; 97 | } 98 | 99 | /* currently not used */ 100 | public function deleteForFileId($fileId) { 101 | $sql = "SELECT * FROM `*PREFIX*reader_bookmarks` WHERE file_id=?"; 102 | $args = [ $fileId ]; 103 | array_map( 104 | function($entity) { 105 | $this->delete($entity); 106 | }, $this->findEntities($sql, $args) 107 | ); 108 | } 109 | 110 | /* currently not used */ 111 | public function deleteForUserId($userId) { 112 | $sql = "SELECT * FROM `*PREFIX*reader_bookmarks` WHERE user_id=?"; 113 | $args = [ $userId ]; 114 | array_map( 115 | function($entity) { 116 | $this->delete($entity); 117 | }, $this->findEntities($sql, $args) 118 | ); 119 | } 120 | } 121 | 122 | -------------------------------------------------------------------------------- /files_reader/lib/Db/Preference.php: -------------------------------------------------------------------------------- 1 | $this->getId(), 27 | 'scope' => $this->getScope(), 28 | 'fileId' => $this->getFileId(), 29 | 'name' => $this->getName(), 30 | 'value' => $this->conditional_json_decode($this->getValue()), 31 | 'lastModified' => $this->getLastModified(), 32 | ]; 33 | } 34 | 35 | public function toService() { 36 | return [ 37 | 'name' => $this->getName(), 38 | 'value' => $this->conditional_json_decode($this->getValue()), 39 | ]; 40 | } 41 | } 42 | 43 | -------------------------------------------------------------------------------- /files_reader/lib/Db/PreferenceMapper.php: -------------------------------------------------------------------------------- 1 | userId = $UserId; 21 | } 22 | 23 | /** 24 | * @brief get preferences for $scope+$fileId+$userId(+$name) 25 | * 26 | * @param string $scope 27 | * @param int $fileId 28 | * @param string $name 29 | * @return array 30 | */ 31 | public function get($scope, $fileId, $name=null) { 32 | if(!empty($name)) { 33 | $sql = "SELECT * FROM `*PREFIX*reader_preferences` WHERE `scope`=? AND `file_id`=? AND `user_id`=? AND `name`=?"; 34 | $args = array( 35 | $scope, 36 | $fileId, 37 | $this->userId, 38 | $name); 39 | } else { 40 | $sql = "SELECT * FROM `*PREFIX*reader_preferences` WHERE `scope`=? AND `file_id`=? AND `user_id`=?"; 41 | $args = array( 42 | $scope, 43 | $fileId, 44 | $this->userId); 45 | } 46 | 47 | return $this->findEntities($sql, $args); 48 | } 49 | 50 | /** 51 | * @brief write preference to database 52 | * 53 | * @param string $scope 54 | * @param int $fileId 55 | * @param string $name 56 | * @param string $value 57 | * 58 | * @return Preference the newly created or updated preference 59 | */ 60 | public function set($scope, $fileId, $name, $value) { 61 | 62 | $result = $this->get($scope, $fileId, $name); 63 | 64 | if(empty($result)) { 65 | 66 | $preference = new Preference(); 67 | $preference->setScope($scope); 68 | $preference->setFileId($fileId); 69 | $preference->setUserId($this->userId); 70 | $preference->setName($name); 71 | $preference->setValue($value); 72 | 73 | $this->insert($preference); 74 | } else { 75 | $preference = $result[0]; 76 | $preference->setValue($value); 77 | 78 | $this->update($preference); 79 | } 80 | 81 | return $preference; 82 | } 83 | 84 | /* currently not used*/ 85 | public function deleteForFileId($fileId) { 86 | $sql = "SELECT * FROM `*PREFIX*reader_preferences` WHERE file_id=?"; 87 | $args = [ $fileId ]; 88 | array_map( 89 | function($entity) { 90 | $this->delete($entity); 91 | }, $this->findEntities($sql, $args) 92 | ); 93 | } 94 | 95 | /* currently not used*/ 96 | public function deleteForUserId($userId) { 97 | $sql = "SELECT * FROM `*PREFIX*reader_preferences` WHERE user_id=?"; 98 | $args = [ $userId ]; 99 | array_map( 100 | function($entity) { 101 | $this->delete($entity); 102 | }, $this->findEntities($sql, $args) 103 | ); 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /files_reader/lib/Db/ReaderEntity.php: -------------------------------------------------------------------------------- 1 | $this->getName(), 31 | 'type' => $this->getType(), 32 | 'value' => $this->conditional_json_decode($this->getValue()), 33 | 'content' => $this->conditional_json_decode($this->getContent()), 34 | 'lastModified' => $this->getLastModified(), 35 | ]; 36 | } 37 | */ 38 | } 39 | 40 | -------------------------------------------------------------------------------- /files_reader/lib/Db/ReaderMapper.php: -------------------------------------------------------------------------------- 1 | time = $time; 29 | } 30 | 31 | public function update(Entity $entity) { 32 | $entity->setLastModified($this->time->getMicroTime()); 33 | return parent::update($entity); 34 | } 35 | 36 | public function insert(Entity $entity) { 37 | $entity->setLastModified($this->time->getMicroTime()); 38 | return parent::insert($entity); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /files_reader/lib/Hooks.php: -------------------------------------------------------------------------------- 1 | getRootFolder()->listen('\OC\Files', 'preDelete', function (Node $node) { 25 | $fileId = $node->getId(); 26 | $connection = \OC::$server->getDatabaseConnection(); 27 | self::deleteFile($connection, $fileId); 28 | }); 29 | \OC::$server->getUserManager()->listen('\OC\User', 'preDelete', function (User $user) { 30 | $userId = $user->getUID(); 31 | $connection = \OC::$server->getDatabaseConnection(); 32 | self::deleteUser($connection, $userId); 33 | }); 34 | } 35 | 36 | public static function announce_settings(array $settings) { 37 | // Nextcloud encodes this as JSON, Owncloud does not (yet) (#75) 38 | // TODO: rmeove this when Owncloud starts encoding oc_appconfig as JSON just like it already encodes most other properties 39 | $isJson = self::isJson($settings['array']['oc_appconfig']); 40 | $array = ($isJson) ? json_decode($settings['array']['oc_appconfig'], true) : $settings['array']['oc_appconfig']; 41 | $array['filesReader']['enableEpub'] = Config::get('epub_enable', 'true'); 42 | $array['filesReader']['enablePdf'] = Config::get('pdf_enable', 'true'); 43 | $array['filesReader']['enableCbx'] = Config::get('cbx_enable', 'true'); 44 | $settings['array']['oc_appconfig'] = ($isJson) ? json_encode($array) : $array; 45 | } 46 | 47 | protected static function deleteFile(IDBConnection $connection, $fileId) { 48 | $queryBuilder = $connection->getQueryBuilder(); 49 | $queryBuilder->delete('reader_bookmarks')->where('file_id = :file_id')->setParameter(':file_id', $fileId); 50 | $queryBuilder->execute(); 51 | 52 | $queryBuilder = $connection->getQueryBuilder(); 53 | $queryBuilder->delete('reader_preferences')->where('file_id = :file_id')->setParameter(':file_id', $fileId); 54 | $queryBuilder->execute(); 55 | } 56 | 57 | protected static function deleteUser(IDBConnection $connection, $userId) { 58 | $queryBuilder = $connection->getQueryBuilder(); 59 | $queryBuilder->delete('reader_bookmarks')->where('user_id = :user_id')->setParameter(':user_id', $userId); 60 | $queryBuilder->execute(); 61 | 62 | $queryBuilder = $connection->getQueryBuilder(); 63 | $queryBuilder->delete('reader_preferences')->where('user_id = :user_id')->setParameter(':user_id', $userId); 64 | $queryBuilder->execute(); 65 | } 66 | 67 | private static function isJson($string) { 68 | return is_string($string) && is_array(json_decode($string, true)) && (json_last_error() == JSON_ERROR_NONE) ? true : false; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /files_reader/lib/Service/BookmarkService.php: -------------------------------------------------------------------------------- 1 | bookmarkMapper = $bookmarkMapper; 28 | $this->userId = $UserId; 29 | } 30 | 31 | /** 32 | * @brief get bookmark 33 | * 34 | * bookmark type is format-dependent, eg CFI for epub, page number for CBR/CBZ, etc 35 | * 36 | * @param int $fileId 37 | * @param string $name 38 | * 39 | * @return array 40 | */ 41 | public function get($fileId, $name=null, $type=null) { 42 | $result = $this->bookmarkMapper->get($fileId, $name, $type); 43 | return array_map( 44 | function($entity) { 45 | return $entity->toService(); 46 | }, $result); 47 | } 48 | 49 | /** 50 | * @brief write bookmark 51 | * 52 | * position type is format-dependent, eg CFI for epub, page number for CBR/CBZ, etc 53 | * 54 | * @param int $fileId 55 | * @param string $name 56 | * @param string $value 57 | * 58 | * @return array 59 | */ 60 | public function set($fileId, $name, $value, $type=null, $content=null) { 61 | return $this->bookmarkMapper->set($fileId, $name, $value, $type, $content); 62 | } 63 | 64 | /** 65 | * @brief get cursor (current position in book) 66 | * 67 | * @param int $fileId 68 | * 69 | * @return array 70 | */ 71 | public function getCursor($fileId) { 72 | $result = $this->get($fileId, static::CURSOR); 73 | if (count($result) === 1) { 74 | return $result[0]; 75 | } 76 | } 77 | 78 | /** 79 | * @brief set cursor (current position in book) 80 | * 81 | * @param int $fileId 82 | * @param string $value 83 | * 84 | * @return array 85 | */ 86 | public function setCursor($fileId, $value) { 87 | return $this->bookmarkMapper->set($fileId, static::CURSOR, $value, static::bookmark_type); 88 | } 89 | 90 | /** 91 | * @brief delete bookmark 92 | * 93 | * @param int $fileId 94 | * @param string $name 95 | * 96 | */ 97 | public function delete($fileId, $name, $type=null) { 98 | foreach ($this->bookmarkMapper->get($fileId, $name, $type) as $bookmark) { 99 | $this->bookmarkMapper->delete($bookmark); 100 | } 101 | } 102 | 103 | /** 104 | * @brief delete cursor 105 | * 106 | * @param int $fileId 107 | * 108 | */ 109 | public function deleteCursor($fileId) { 110 | $this->delete($fileId, static::CURSOR, static::bookmark_type); 111 | } 112 | } 113 | 114 | -------------------------------------------------------------------------------- /files_reader/lib/Service/MetadataService.php: -------------------------------------------------------------------------------- 1 | appManager = $appManager; 24 | } 25 | 26 | /** 27 | * @brief get metadata item(s) 28 | * 29 | * @param int $fileId 30 | * @param string $name 31 | * 32 | * @return array 33 | */ 34 | public function get($fileId, $name=null) { 35 | if ($this->appManager->isInstalled('files_opds')) { 36 | if ($meta = \OCA\Files_Opds\Meta::get($fileId)) { 37 | if (!empty($name) && array_key_exists($name, $meta)) { 38 | return [$item => $meta[$name]]; 39 | } else { 40 | return $meta; 41 | } 42 | } 43 | } 44 | 45 | return []; 46 | } 47 | 48 | /** 49 | * @brief write metadata to database 50 | * 51 | * @param int $fileId 52 | * @param array $value 53 | * 54 | * @return array 55 | */ 56 | public function setAll($fileId, $value) { 57 | // no-op for now 58 | return []; 59 | } 60 | 61 | /** 62 | * @brief write metadata item to database 63 | * 64 | * @param int $fileId 65 | * @param string $name 66 | * @param array $value 67 | * 68 | * @return array 69 | */ 70 | public function set($fileId, $name, $value) { 71 | // no-op for now 72 | return []; 73 | } 74 | } 75 | 76 | -------------------------------------------------------------------------------- /files_reader/lib/Service/PreferenceService.php: -------------------------------------------------------------------------------- 1 | preferenceMapper = $preferenceMapper; 29 | } 30 | 31 | /** 32 | * @brief get preference 33 | * 34 | * scope identifies preference source, i.e. which renderer the preference applies to 35 | * preference type is format-dependent, eg CFI for epub, page number for CBR/CBZ, etc 36 | * 37 | * @param string $scope 38 | * @param int $fileId 39 | * @param string $name 40 | * 41 | * @return array 42 | */ 43 | public function get($scope, $fileId, $name=null) { 44 | $result = $this->preferenceMapper->get($scope, $fileId, $name); 45 | return array_map( 46 | function($entity) { 47 | return $entity->toService(); 48 | }, $result); 49 | } 50 | 51 | /** 52 | * @brief write preference 53 | * 54 | * scope identifies preference source, i.e. which renderer the preference applies to 55 | * position type is format-dependent, eg CFI for epub, page number for CBR/CBZ, etc 56 | * 57 | * @param string $scope 58 | * @param int $fileId 59 | * @param string $name 60 | * @param string $value 61 | * 62 | * @return array 63 | */ 64 | public function set($scope, $fileId, $name, $value) { 65 | return $this->preferenceMapper->set($scope, $fileId, $name, $value); 66 | } 67 | 68 | /** 69 | * @brief get default preference 70 | * 71 | * @param string $scope 72 | * @param string $name 73 | * 74 | * @return array 75 | */ 76 | public function getDefault($scope, $name=null) { 77 | return $this->get($scope, static::DEFAULTS, $name); 78 | } 79 | 80 | /** 81 | * @brief set default preference 82 | * 83 | * @param string $scope 84 | * @param string $name 85 | * @param string $value 86 | * 87 | * @return array 88 | */ 89 | public function setDefault($scope, $name, $value) { 90 | return $this->preferenceMapper->set($scope, static::DEFAULTS, $name, $value); 91 | } 92 | 93 | /** 94 | * @brief delete preference 95 | * 96 | * @param string $scope 97 | * @param int $fileId 98 | * @param string $name 99 | * 100 | */ 101 | public function delete($scope, $fileId, $name) { 102 | foreach($this->preferenceMapper->get($scope, $fileId, $name) as $preference) { 103 | $this->preferenceMapper->delete($preference); 104 | } 105 | } 106 | 107 | /** 108 | * @brief delete default 109 | * 110 | * @param string $scope 111 | * @param string $name 112 | * 113 | */ 114 | public function deleteDefault($scope, $name) { 115 | $this->delete($scope, static::DEFAULTS, $name); 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /files_reader/lib/Service/Service.php: -------------------------------------------------------------------------------- 1 | mapper = $mapper; 21 | } 22 | } 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /files_reader/lib/Utility/Time.php: -------------------------------------------------------------------------------- 1 | getL10N('files_reader'); 16 | 17 | $tmpl = new \OCP\Template('files_reader', 'settings-personal'); 18 | $EpubEnable = Config::get('epub_enable', 'true'); 19 | $PdfEnable = Config::get('pdf_enable', 'true'); 20 | $CbxEnable = Config::get('cbx_enable', 'true'); 21 | $tmpl->assign('EpubEnable', $EpubEnable); 22 | $tmpl->assign('PdfEnable', $PdfEnable); 23 | $tmpl->assign('CbxEnable', $CbxEnable); 24 | 25 | return $tmpl->fetchPage(); 26 | -------------------------------------------------------------------------------- /files_reader/templates/settings-personal.php: -------------------------------------------------------------------------------- 1 | 15 | 16 |
17 |

t('Reader'));?>

 
18 |

t('Select file types for which Reader should be the default viewer.')); ?>

19 | 20 |

21 | /> 23 | 26 |

27 | 28 |

29 | /> 31 |
34 |

35 |

36 | /> 38 |
41 |

42 |
43 | -------------------------------------------------------------------------------- /files_reader/vendor/bitjs/io/bytebuffer.js: -------------------------------------------------------------------------------- 1 | /* 2 | * bytestream.js 3 | * 4 | * Provides a writer for bytes. 5 | * 6 | * Licensed under the MIT License 7 | * 8 | * Copyright(c) 2011 Google Inc. 9 | * Copyright(c) 2011 antimatter15 10 | */ 11 | 12 | var bitjs = bitjs || {}; 13 | bitjs.io = bitjs.io || {}; 14 | 15 | 16 | /** 17 | * A write-only Byte buffer which uses a Uint8 Typed Array as a backing store. 18 | */ 19 | bitjs.io.ByteBuffer = class { 20 | /** 21 | * @param {number} numBytes The number of bytes to allocate. 22 | */ 23 | constructor(numBytes) { 24 | if (typeof numBytes != typeof 1 || numBytes <= 0) { 25 | throw "Error! ByteBuffer initialized with '" + numBytes + "'"; 26 | } 27 | this.data = new Uint8Array(numBytes); 28 | this.ptr = 0; 29 | } 30 | 31 | 32 | /** 33 | * @param {number} b The byte to insert. 34 | */ 35 | insertByte(b) { 36 | // TODO: throw if byte is invalid? 37 | this.data[this.ptr++] = b; 38 | } 39 | 40 | /** 41 | * @param {Array.|Uint8Array|Int8Array} bytes The bytes to insert. 42 | */ 43 | insertBytes(bytes) { 44 | // TODO: throw if bytes is invalid? 45 | this.data.set(bytes, this.ptr); 46 | this.ptr += bytes.length; 47 | } 48 | 49 | /** 50 | * Writes an unsigned number into the next n bytes. If the number is too large 51 | * to fit into n bytes or is negative, an error is thrown. 52 | * @param {number} num The unsigned number to write. 53 | * @param {number} numBytes The number of bytes to write the number into. 54 | */ 55 | writeNumber(num, numBytes) { 56 | if (numBytes < 1) { 57 | throw 'Trying to write into too few bytes: ' + numBytes; 58 | } 59 | if (num < 0) { 60 | throw 'Trying to write a negative number (' + num + 61 | ') as an unsigned number to an ArrayBuffer'; 62 | } 63 | if (num > (Math.pow(2, numBytes * 8) - 1)) { 64 | throw 'Trying to write ' + num + ' into only ' + numBytes + ' bytes'; 65 | } 66 | 67 | // Roll 8-bits at a time into an array of bytes. 68 | const bytes = []; 69 | while (numBytes-- > 0) { 70 | const eightBits = num & 255; 71 | bytes.push(eightBits); 72 | num >>= 8; 73 | } 74 | 75 | this.insertBytes(bytes); 76 | } 77 | 78 | /** 79 | * Writes a signed number into the next n bytes. If the number is too large 80 | * to fit into n bytes, an error is thrown. 81 | * @param {number} num The signed number to write. 82 | * @param {number} numBytes The number of bytes to write the number into. 83 | */ 84 | writeSignedNumber(num, numBytes) { 85 | if (numBytes < 1) { 86 | throw 'Trying to write into too few bytes: ' + numBytes; 87 | } 88 | 89 | const HALF = Math.pow(2, (numBytes * 8) - 1); 90 | if (num >= HALF || num < -HALF) { 91 | throw 'Trying to write ' + num + ' into only ' + numBytes + ' bytes'; 92 | } 93 | 94 | // Roll 8-bits at a time into an array of bytes. 95 | const bytes = []; 96 | while (numBytes-- > 0) { 97 | const eightBits = num & 255; 98 | bytes.push(eightBits); 99 | num >>= 8; 100 | } 101 | 102 | this.insertBytes(bytes); 103 | } 104 | 105 | /** 106 | * @param {string} str The ASCII string to write. 107 | */ 108 | writeASCIIString(str) { 109 | for (let i = 0; i < str.length; ++i) { 110 | const curByte = str.charCodeAt(i); 111 | if (curByte < 0 || curByte > 255) { 112 | throw 'Trying to write a non-ASCII string!'; 113 | } 114 | this.insertByte(curByte); 115 | } 116 | }; 117 | } 118 | -------------------------------------------------------------------------------- /files_reader/vendor/cbrjs/css/idevice.css: -------------------------------------------------------------------------------- 1 | .view { 2 | overflow-y: scroll; 3 | -webkit-overflow-scrolling: touch; 4 | } 5 | -------------------------------------------------------------------------------- /files_reader/vendor/cbrjs/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/files_reader/vendor/cbrjs/img/loading.gif -------------------------------------------------------------------------------- /files_reader/vendor/epubjs/css/annotations.css: -------------------------------------------------------------------------------- 1 | .ui-loader { 2 | display: none; 3 | } 4 | 5 | .annotator-hl { 6 | box-shadow: none !important; 7 | cursor: pointer !important; 8 | } -------------------------------------------------------------------------------- /files_reader/vendor/epubjs/css/font/fontello.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/files_reader/vendor/epubjs/css/font/fontello.eot -------------------------------------------------------------------------------- /files_reader/vendor/epubjs/css/font/fontello.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/files_reader/vendor/epubjs/css/font/fontello.ttf -------------------------------------------------------------------------------- /files_reader/vendor/epubjs/css/font/fontello.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/files_reader/vendor/epubjs/css/font/fontello.woff -------------------------------------------------------------------------------- /files_reader/vendor/epubjs/css/idevice.css: -------------------------------------------------------------------------------- 1 | .notes, 2 | .search-results, 3 | .view { 4 | overflow-y: scroll; 5 | -webkit-overflow-scrolling: touch; 6 | } 7 | 8 | .search-results { 9 | height: calc(100% - 5em); 10 | } 11 | 12 | .notes { 13 | height: calc(100% - 9em); 14 | } 15 | -------------------------------------------------------------------------------- /files_reader/vendor/epubjs/css/popup.css: -------------------------------------------------------------------------------- 1 | /* http://davidwalsh.name/css-tooltips */ 2 | /* base CSS element */ 3 | .popup { 4 | background: #eee; 5 | border: 1px solid #ccc; 6 | padding: 10px; 7 | border-radius: 8px; 8 | box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); 9 | position: fixed; 10 | max-width: 300px; 11 | font-size: 12px; 12 | 13 | display: none; 14 | margin-left: 2px; 15 | 16 | margin-top: 30px; 17 | } 18 | 19 | .popup.above { 20 | margin-top: -10px; 21 | } 22 | 23 | .popup.left { 24 | margin-left: -20px; 25 | } 26 | 27 | .popup.right { 28 | margin-left: 40px; 29 | } 30 | 31 | .pop_content { 32 | max-height: 225px; 33 | overflow-y: auto; 34 | } 35 | 36 | .pop_content > p { 37 | margin-top: 0; 38 | } 39 | 40 | /* below */ 41 | .popup:before { 42 | position: absolute; 43 | display: inline-block; 44 | border-bottom: 10px solid #eee; 45 | border-right: 10px solid transparent; 46 | border-left: 10px solid transparent; 47 | border-bottom-color: rgba(0, 0, 0, 0.2); 48 | left: 50%; 49 | top: -10px; 50 | margin-left: -6px; 51 | content: ''; 52 | } 53 | 54 | .popup:after { 55 | position: absolute; 56 | display: inline-block; 57 | border-bottom: 9px solid #eee; 58 | border-right: 9px solid transparent; 59 | border-left: 9px solid transparent; 60 | left: 50%; 61 | top: -9px; 62 | margin-left: -5px; 63 | content: ''; 64 | } 65 | 66 | /* above */ 67 | .popup.above:before { 68 | border-bottom: none; 69 | border-top: 10px solid #eee; 70 | border-top-color: rgba(0, 0, 0, 0.2); 71 | top: 100%; 72 | } 73 | 74 | .popup.above:after { 75 | border-bottom: none; 76 | border-top: 9px solid #eee; 77 | top: 100%; 78 | } 79 | 80 | .popup.left:before, 81 | .popup.left:after 82 | { 83 | left: 20px; 84 | } 85 | 86 | .popup.right:before, 87 | .popup.right:after 88 | { 89 | left: auto; 90 | right: 20px; 91 | } 92 | 93 | 94 | .popup.show, .popup.on { 95 | display: block; 96 | } 97 | 98 | .note-marker, 99 | .EPUBJS-CFI-MARKER, 100 | .EPUBJS-CFI-SPLIT { 101 | vertical-align: super; 102 | font-size: 0.75em; 103 | line-height: 1em; 104 | padding: 0.1em; 105 | background-color: #fffa96; 106 | border-radius: 5px; 107 | cursor: pointer; 108 | } 109 | 110 | -------------------------------------------------------------------------------- /files_reader/vendor/epubjs/hooks/default/smartimages.js: -------------------------------------------------------------------------------- 1 | EPUBJS.Hooks.register("beforeChapterDisplay").smartimages = function(callback, renderer){ 2 | var images = renderer.contents.querySelectorAll('img'), 3 | items = Array.prototype.slice.call(images), 4 | iheight = renderer.height,//chapter.bodyEl.clientHeight,//chapter.doc.body.getBoundingClientRect().height, 5 | oheight; 6 | 7 | if(renderer.layoutSettings.layout != "reflowable") { 8 | callback(); 9 | return; //-- Only adjust images for reflowable text 10 | } 11 | 12 | items.forEach(function(item){ 13 | 14 | var size = function() { 15 | var itemRect = item.getBoundingClientRect(), 16 | rectHeight = itemRect.height, 17 | top = itemRect.top, 18 | oHeight = item.getAttribute('data-height'), 19 | height = oHeight || rectHeight, 20 | newHeight, 21 | fontSize = Number(getComputedStyle(item, "").fontSize.match(/(\d*(\.\d*)?)px/)[1]), 22 | fontAdjust = fontSize ? fontSize / 2 : 0; 23 | 24 | iheight = renderer.contents.clientHeight; 25 | if(top < 0) top = 0; 26 | 27 | if(height + top >= iheight) { 28 | 29 | if(top < iheight/2) { 30 | // Remove top and half font-size from height to keep container from overflowing 31 | newHeight = iheight - top - fontAdjust; 32 | item.style.maxHeight = newHeight + "px"; 33 | item.style.width= "auto"; 34 | }else{ 35 | if(height > iheight) { 36 | item.style.maxHeight = iheight + "px"; 37 | item.style.width= "auto"; 38 | itemRect = item.getBoundingClientRect(); 39 | height = itemRect.height; 40 | } 41 | item.style.display = "block"; 42 | item.style["WebkitColumnBreakBefore"] = "always"; 43 | item.style["breakBefore"] = "column"; 44 | 45 | } 46 | 47 | item.setAttribute('data-height', newHeight); 48 | 49 | }else{ 50 | item.style.removeProperty('max-height'); 51 | item.style.removeProperty('margin-top'); 52 | } 53 | } 54 | 55 | var unloaded = function(){ 56 | // item.removeEventListener('load', size); // crashes in IE 57 | renderer.off("renderer:resized", size); 58 | renderer.off("renderer:chapterUnload", this); 59 | }; 60 | 61 | item.addEventListener('load', size, false); 62 | 63 | renderer.on("renderer:resized", size); 64 | 65 | renderer.on("renderer:chapterUnload", unloaded); 66 | 67 | size(); 68 | 69 | }); 70 | 71 | if(callback) callback(); 72 | 73 | } 74 | -------------------------------------------------------------------------------- /files_reader/vendor/epubjs/hooks/extensions/highlight.js: -------------------------------------------------------------------------------- 1 | EPUBJS.Hooks.register("beforeChapterDisplay").highlight = function(callback, renderer){ 2 | 3 | // EPUBJS.core.addScript("js/libs/jquery.highlight.js", null, renderer.doc.head); 4 | 5 | var s = document.createElement("style"); 6 | s.innerHTML =".highlight { background: yellow; font-weight: normal; }"; 7 | 8 | renderer.render.document.head.appendChild(s); 9 | 10 | if(callback) callback(); 11 | 12 | } 13 | 14 | 15 | -------------------------------------------------------------------------------- /files_reader/vendor/epubjs/libs/screenfull.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * screenfull 3 | * v1.1.0 - 2013-09-06 4 | * https://github.com/sindresorhus/screenfull.js 5 | * (c) Sindre Sorhus; MIT License 6 | */ 7 | !function(a,b){"use strict";var c="undefined"!=typeof Element&&"ALLOW_KEYBOARD_INPUT"in Element,d=function(){for(var a,c,d=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenchange","MSFullscreenerror"]],e=0,f=d.length,g={};f>e;e++)if(a=d[e],a&&a[1]in b){for(e=0,c=a.length;c>e;e++)g[d[0][e]]=a[e];return g}return!1}(),e={request:function(a){var e=d.requestFullscreen;a=a||b.documentElement,/5\.1[\.\d]* Safari/.test(navigator.userAgent)?a[e]():a[e](c&&Element.ALLOW_KEYBOARD_INPUT)},exit:function(){b[d.exitFullscreen]()},toggle:function(a){this.isFullscreen?this.exit():this.request(a)},onchange:function(){},onerror:function(){},raw:d};return d?(Object.defineProperties(e,{isFullscreen:{get:function(){return!!b[d.fullscreenElement]}},element:{enumerable:!0,get:function(){return b[d.fullscreenElement]}},enabled:{enumerable:!0,get:function(){return!!b[d.fullscreenEnabled]}}}),b.addEventListener(d.fullscreenchange,function(a){e.onchange.call(e,a)}),b.addEventListener(d.fullscreenerror,function(a){e.onerror.call(e,a)}),a.screenfull=e,void 0):(a.screenfull=!1,void 0)}(window,document); -------------------------------------------------------------------------------- /files_reader/vendor/icomoon/fonts/icomoon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/files_reader/vendor/icomoon/fonts/icomoon.eot -------------------------------------------------------------------------------- /files_reader/vendor/icomoon/fonts/icomoon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/files_reader/vendor/icomoon/fonts/icomoon.ttf -------------------------------------------------------------------------------- /files_reader/vendor/icomoon/fonts/icomoon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/files_reader/vendor/icomoon/fonts/icomoon.woff -------------------------------------------------------------------------------- /files_reader/vendor/jquery/put-delete.js: -------------------------------------------------------------------------------- 1 | jQuery.each( [ "put", "delete" ], function( i, method ) { 2 | jQuery[ method ] = function( url, data, callback, type ) { 3 | if ( jQuery.isFunction( data ) ) { 4 | type = type || callback; 5 | callback = data; 6 | data = undefined; 7 | } 8 | 9 | return jQuery.ajax({ 10 | url: url, 11 | type: method, 12 | dataType: type, 13 | data: data, 14 | success: callback 15 | }); 16 | }; 17 | }); 18 | 19 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/controllers/annotationlayer_controller.js: -------------------------------------------------------------------------------- 1 | PDFJS.Reader.AnnotationLayerController = function (options, reader) { 2 | 3 | this.reader = reader; 4 | this.annotationDiv = options.annotationDiv; 5 | this.pdfPage = options.pdfPage; 6 | this.renderInteractiveForms = options.renderInteractiveForms; 7 | this.linkService = options.linkService; 8 | this.downloadManager = options.downloadManager; 9 | 10 | this.div = null; 11 | 12 | return this; 13 | }; 14 | 15 | PDFJS.Reader.AnnotationLayerController.prototype.render = function (viewport, intent) { 16 | var self = this; 17 | var parameters = { 18 | intent: (intent === undefined ? 'display' : intent), 19 | }; 20 | 21 | this.pdfPage.getAnnotations(parameters).then(function (annotations) { 22 | viewport = viewport.clone({ dontFlip: true }); 23 | parameters = { 24 | viewport: viewport, 25 | div: self.div, 26 | annotations: annotations, 27 | page: self.pdfPage, 28 | renderInteractiveForms: self.renderInteractiveForms, 29 | linkService: self.linkService, 30 | downloadManager: self.downloadManager, 31 | }; 32 | 33 | if (self.div) { 34 | // If an annotationLayer already exists, refresh its children's 35 | // transformation matrices. 36 | PDFJS.AnnotationLayer.update(parameters); 37 | } else { 38 | // Create an annotation layer div and render the annotations 39 | // if there is at least one annotation. 40 | if (annotations.length === 0) { 41 | return; 42 | } 43 | 44 | self.div = self.annotationDiv; 45 | parameters.div = self.div; 46 | 47 | PDFJS.AnnotationLayer.render(parameters); 48 | } 49 | }); 50 | }; 51 | 52 | PDFJS.Reader.AnnotationLayerController.prototype.hide = function () { 53 | 54 | if (!this.div) { 55 | return; 56 | } 57 | 58 | this.div.setAttribute('hidden', 'true'); 59 | }; 60 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/controllers/bookmarks_controller.js: -------------------------------------------------------------------------------- 1 | PDFJS.reader.BookmarksController = function() { 2 | 3 | var reader = this, 4 | eventBus = this.eventBus, 5 | book = this.book, 6 | annotations = reader.settings.annotations; 7 | 8 | var $bookmarks = $("#bookmarksView"), 9 | $list = $bookmarks.find("#bookmarks"), 10 | $bookmark = $("#bookmark"); 11 | 12 | var show = function() { 13 | $bookmarks.addClass('open'); 14 | }; 15 | 16 | var hide = function() { 17 | $bookmarks.removeClass('open'); 18 | }; 19 | 20 | var addBookmarkItem = function (bookmark) { 21 | $list.append(reader.NotesController.createItem(bookmark)); 22 | //reader.settings.session.setBookmark(bookmark.id, bookmark.anchor, bookmark.type, bookmark); 23 | }; 24 | 25 | eventBus.on('bookmarkcreated', function createBookmark1(e) { 26 | var id = e.id, 27 | $item = $("#"+id); 28 | 29 | addBookmarkItem(reader.getAnnotation(id)); 30 | 31 | if (id === reader.pageToId(reader.settings.currentPage)) 32 | $bookmark 33 | .addClass("icon-turned_in") 34 | .removeClass("icon-turned_in_not"); 35 | }); 36 | 37 | eventBus.on('bookmarkremoved', function removeBookmark1(e) { 38 | var id = e.id, 39 | $item = $("#"+id); 40 | 41 | console.log($item); 42 | 43 | console.log("event bookmarkremoved caught:",e,id); 44 | 45 | if (reader.isBookmarked(id)) { 46 | //delete reader.settings.annotations[id]; 47 | //reader.settings.session.deleteBookmark(id); 48 | console.log("removing bookmark ", $item, reader.pageToId(reader.settings.currentPage), id); 49 | 50 | $item.remove(); 51 | $item.remove(); 52 | $item.remove(); 53 | $item.remove(); 54 | 55 | if (id === reader.pageToId(reader.settings.currentPage)) 56 | $bookmark 57 | .removeClass("icon-turned_in") 58 | .addClass("icon-turned_in_not"); 59 | } 60 | }); 61 | 62 | for (var bookmark in annotations) { 63 | if (annotations.hasOwnProperty(bookmark) && (annotations[bookmark].type === "bookmark")) 64 | addBookmarkItem(annotations[bookmark]); 65 | }; 66 | 67 | return { 68 | "show" : show, 69 | "hide" : hide, 70 | "addItem" : addBookmarkItem, 71 | }; 72 | }; 73 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/controllers/meta_controller.js: -------------------------------------------------------------------------------- 1 | PDFJS.reader.MetaController = function(meta) { 2 | var title = meta.bookTitle, 3 | author = meta.creator; 4 | 5 | var $title = $("#book-title"), 6 | $author = $("#chapter-title"), 7 | $dash = $("#title-seperator"); 8 | 9 | document.title = title+" – "+author; 10 | 11 | $title.html(title); 12 | $author.html(author); 13 | $dash.show(); 14 | }; -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/controllers/outline_controller.js: -------------------------------------------------------------------------------- 1 | PDFJS.reader.OutlineController = function(_outline) { 2 | 3 | var reader = this, 4 | book = this.book, 5 | outline = _outline || []; 6 | 7 | var outlineView = document.getElementById("outlineView"); 8 | 9 | var DEFAULT_TITLE = '\u2013'; 10 | 11 | var generateOutlineItems = function (outline, level) { 12 | 13 | var container = document.createElement("ul"); 14 | 15 | if(!level) level = 1; 16 | 17 | outline.forEach(function (chapter) { 18 | 19 | var listitem = document.createElement("li"), 20 | link = document.createElement("a"), 21 | toggle = document.createElement("a"), 22 | subitems; 23 | 24 | listitem.id = "outline-"+chapter.dest; 25 | listitem.classList.add('list_item'); 26 | 27 | link.textContent = PDFJS.removeNullCharacters(chapter.title) || DEFAULT_TITLE; 28 | reader.bindLink(link, chapter); 29 | reader.setStyles(link, chapter); 30 | link.classList.add('outline_link'); 31 | 32 | listitem.appendChild(link); 33 | 34 | if(chapter.items.length > 0) { 35 | level++; 36 | subitems = generateOutlineItems(chapter.items, level); 37 | toggle.classList.add('outline_toggle'); 38 | listitem.insertBefore(toggle, link); 39 | listitem.appendChild(subitems); 40 | } 41 | 42 | container.appendChild(listitem); 43 | }); 44 | 45 | return container; 46 | } 47 | 48 | var onShow = function() { 49 | outlineView.classList.add('open'); 50 | }; 51 | 52 | var onHide = function() { 53 | outlineView.classList.remove('open'); 54 | }; 55 | 56 | outlineView.appendChild(generateOutlineItems(outline)); 57 | 58 | $(outlineView).find(".outline_toggle").on("click", function(event){ 59 | var $el = $(this).parent('li'), 60 | open = $el.hasClass("openChapter"); 61 | 62 | event.preventDefault(); 63 | if(open){ 64 | $el.removeClass("openChapter"); 65 | } else { 66 | $el.addClass("openChapter"); 67 | } 68 | }); 69 | 70 | return { 71 | "show" : onShow, 72 | "hide" : onHide 73 | }; 74 | }; 75 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/controllers/progress_controller.js: -------------------------------------------------------------------------------- 1 | PDFJS.reader.ProgressController = function() { 2 | var reader = this, 3 | settings = reader.settings, 4 | percentage = 0; 5 | 6 | var $progress = $("#progress"), 7 | $bar = $(".bar"), 8 | $download_icon = $("#download_icon"), 9 | $message = $(".message-text"); 10 | 11 | var show = function () { 12 | $progress.removeClass("hide"); 13 | }; 14 | 15 | var hide = function () { 16 | $progress.addClass("hide"); 17 | }; 18 | 19 | var setSize = function (size) { 20 | settings.fileSize = size; 21 | }; 22 | 23 | var setProgress = function (progress) { 24 | 25 | if (percentage < 1) 26 | $download_icon.addClass("active"); 27 | 28 | percentage = Math.floor((progress.loaded / progress.total) * 100); 29 | $bar.css("width", percentage + "%"); 30 | 31 | if (percentage === 100) 32 | $download_icon.removeClass("active").addClass("ok"); 33 | }; 34 | 35 | var reset = function() { 36 | $bar.css("width", 0); 37 | }; 38 | 39 | var setMessage = function (text, category, state) { 40 | 41 | var $category_icon = $("#" + category + "_icon"); 42 | 43 | $message.text(text); 44 | 45 | $category_icon[0].classList.remove("ok", "active", "error"); 46 | $category_icon.addClass(state); 47 | }; 48 | 49 | 50 | return { 51 | "show": show, 52 | "hide": hide, 53 | "setSize": setSize, 54 | "setProgress": setProgress, 55 | "setMessage": setMessage 56 | }; 57 | }; 58 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/controllers/settings_controller.js: -------------------------------------------------------------------------------- 1 | PDFJS.reader.SettingsController = function() { 2 | 3 | var reader = this, 4 | book = this.book, 5 | settings = reader.settings; 6 | 7 | var $settings = $("#settingsView"), 8 | $viewer = $("#viewer"), 9 | $overlay = $(".overlay"), 10 | $next = $("#next"), 11 | $prev = $("#prev"), 12 | $close = $("#close"), 13 | $sidebarReflow = $('#sidebarReflow'), 14 | $scrollToTop = $('#scrollToTop'), 15 | $touch_nav = $("#touch_nav"), 16 | $page_turn_arrows = $("#page_turn_arrows"), 17 | $prev_arrow = $("#prev :first-child"), 18 | $next_arrow = $("#next :first-child"); 19 | 20 | var show = function() { 21 | $settings.addClass('open'); 22 | }; 23 | 24 | var hide = function() { 25 | $settings.removeClass('open'); 26 | }; 27 | 28 | if (settings.scrollToTop) { 29 | $scrollToTop.prop('checked', true); 30 | } else { 31 | $scrollToTop.prop('checked', false); 32 | } 33 | 34 | $scrollToTop.off('click').on('click', function() { 35 | settings.scrollToTop = !settings.scrollToTop; 36 | settings.session.setDefault("scrollToTop", settings.scrollToTop); 37 | }); 38 | 39 | if (settings.sidebarReflow) { 40 | $sidebarReflow.prop('checked', true); 41 | } else { 42 | $sidebarReflow.prop('checked', false); 43 | } 44 | 45 | $sidebarReflow.off('click').on('click', function() { 46 | settings.sidebarReflow = !settings.sidebarReflow; 47 | if (settings.sidebarReflow && reader.sidebarOpen) reader.ReaderController.slideOut(); 48 | if (!settings.sidebarReflow && !reader.sidebarOpen) reader.ReaderController.slideIn(); 49 | settings.session.setDefault("sidebarReflow", settings.sidebarReflow); 50 | }); 51 | 52 | $settings.find(".closer").on("click", function() { 53 | hide(); 54 | }); 55 | 56 | $overlay.on("click", function() { 57 | hide(); 58 | }); 59 | 60 | // only enable close button when launched in an iframe default 61 | if (parent !== window) { 62 | $close.show(); 63 | $close.on("click", function () { 64 | reader.book.destroy(); 65 | parent.OCA.Files_Reader.Plugin.hide(); 66 | }); 67 | } 68 | 69 | // default for extra wide navigation controls; 70 | // devices with touch navigation: on 71 | // devices without touch navigation: off 72 | $touch_nav.prop('checked', !('ontouchstart' in document.documentElement)); 73 | if (!($touch_nav.prop('checked'))) { 74 | $next.addClass("touch_nav"); 75 | $prev.addClass("touch_nav"); 76 | } 77 | 78 | // extra wide nagivation controls 79 | $touch_nav.off('change').on('change', function() { 80 | if ($(this).prop('checked')) { 81 | $prev.removeClass("touch_nav"); 82 | $next.removeClass("touch_nav"); 83 | } else { 84 | $prev.addClass("touch_nav"); 85 | $next.addClass("touch_nav"); 86 | } 87 | }); 88 | 89 | // page turn arrows default 90 | if (settings.pageArrows) { 91 | $page_turn_arrows.prop('checked', true); 92 | $prev_arrow.removeClass("translucent"); 93 | $next_arrow.removeClass("translucent"); 94 | } else { 95 | $page_turn_arrows.prop('checked', false); 96 | $prev_arrow.addClass("translucent"); 97 | $next_arrow.addClass("translucent"); 98 | } 99 | 100 | // page turn arrows 101 | $page_turn_arrows.off('change').on('change', function() { 102 | if ($(this).prop('checked')) { 103 | settings.pageArrows = true; 104 | $prev_arrow.removeClass("translucent"); 105 | $next_arrow.removeClass("translucent"); 106 | } else { 107 | settings.pageArrows = false; 108 | $prev_arrow.addClass("translucent"); 109 | $next_arrow.addClass("translucent"); 110 | } 111 | 112 | settings.session.setDefault("pageArrows", settings.pageArrows); 113 | }); 114 | 115 | return { 116 | "show" : show, 117 | "hide" : hide 118 | }; 119 | }; 120 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/controllers/sidebar_controller.js: -------------------------------------------------------------------------------- 1 | PDFJS.reader.SidebarController = function(book) { 2 | var reader = this, 3 | settings = reader.settings; 4 | 5 | var $sidebar = $("#sidebar"), 6 | $panels = $("#panels"), 7 | $views = $("#views"), 8 | $close = $("#hide-Sidebar"); 9 | $slider = $("#slider"); 10 | 11 | var activePanel = "Toc"; 12 | 13 | var changePanelTo = function(viewName) { 14 | var controllerName = viewName + "Controller"; 15 | 16 | if (!(activePanel == viewName || typeof reader[controllerName] === 'undefined' )) { 17 | reader[activePanel+ "Controller"].hide(); 18 | reader[controllerName].show(); 19 | activePanel = viewName; 20 | 21 | //$panels.find('.open').removeClass("open"); 22 | $sidebar.find('.open').removeClass("open"); 23 | $panels.find("#show-" + viewName ).addClass("open"); 24 | $views.find("#" + viewName.toLowerCase() + "View").addClass("open"); 25 | } 26 | show(); 27 | }; 28 | 29 | var getActivePanel = function() { 30 | return activePanel; 31 | }; 32 | 33 | var show = function() { 34 | reader.sidebarOpen = true; 35 | if (settings.sidebarReflow) reader.ReaderController.slideOut(); 36 | $slider.hide(); 37 | $sidebar.addClass("open"); 38 | if (getActivePanel() === "Toc") 39 | reader.TocController.scrollToPage(settings.currentPage); 40 | } 41 | 42 | var hide = function() { 43 | reader.sidebarOpen = false; 44 | $slider.show(); 45 | reader.ReaderController.slideIn(); 46 | $sidebar.removeClass("open"); 47 | }; 48 | 49 | var toggle = function () { 50 | (reader.sidebarOpen) ? hide() : show(); 51 | }; 52 | 53 | $close.on("click", function () { 54 | reader.SidebarController.hide(); 55 | // $slider.addClass("icon-menu"); 56 | // $slider.removeClass("icon-right"); 57 | 58 | }); 59 | 60 | $panels.find(".show_view").on("click", function(e) { 61 | var view = $(this).data("view"); 62 | 63 | changePanelTo(view); 64 | e.preventDefault(); 65 | }); 66 | 67 | $sidebar.css("width", "calc(" + parseInt(settings.thumbnailWidth) + "px + 2em)"); 68 | 69 | return { 70 | 'show' : show, 71 | 'hide' : hide, 72 | 'toggle' : toggle, 73 | 'getActivePanel' : getActivePanel, 74 | 'changePanelTo' : changePanelTo 75 | }; 76 | }; 77 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/controllers/styles_controller.js: -------------------------------------------------------------------------------- 1 | PDFJS.reader.StylesController = function (renderer) { 2 | 3 | var reader = this, 4 | settings = reader.settings, 5 | customStyles = reader.settings.customStyles, 6 | activeStyles = reader.settings.activeStyles, 7 | $main = $("#main"), 8 | $nightmode_form = $('#nightmode_form'), 9 | $nightmode_reset = $('#nightmode_reset'), 10 | $night_brightness = $('#night_brightness'), 11 | $night_contrast = $('#night_contrast'), 12 | $night_sepia = $('#night_sepia'), 13 | $night_huerotate = $('#night_huerotate'), 14 | $night_saturate = $('#night_saturate'), 15 | $nightshift = $('.nightshift'); 16 | 17 | this.addStyle("nightMode", "*", { 18 | filter: 'invert(1) sepia(' + $night_sepia.val() + ') hue-rotate(' + $night_huerotate.val() + 'deg) brightness(' + $night_brightness.val() + ') contrast(' + $night_contrast.val() + ') saturate(' + $night_saturate.val() + ')' 19 | }); 20 | 21 | this.addStyle("appleBugs", "document, html, body, p, span, div", { 22 | "cursor": "pointer" 23 | }); 24 | 25 | // fix click-bug in apple products 26 | if (navigator.userAgent.match(/(iPad|iPhone|iPod)/g)) 27 | activeStyles['appleBugs'] = true; 28 | 29 | for (var style in activeStyles) { 30 | if (!activeStyles.hasOwnProperty(style)) continue; 31 | 32 | switch (style) { 33 | case "nightMode": 34 | reader.ControlsController.setNightmodeIcon(true); 35 | break; 36 | case "appleBugs": 37 | console.log("Apple mobile bugs detected, applying workarounds..."); 38 | break; 39 | } 40 | 41 | reader.enableStyle(customStyles[style]); 42 | } 43 | 44 | $night_brightness.off('change').on('change', function() { 45 | updateNightmode(); 46 | }); 47 | 48 | $night_contrast.off('change').on('change', function() { 49 | updateNightmode(); 50 | }); 51 | 52 | $night_sepia.off('change').on('change', function() { 53 | updateNightmode(); 54 | }); 55 | 56 | $night_huerotate.off('change').on('change', function() { 57 | updateNightmode(); 58 | }); 59 | 60 | $night_saturate.off('change').on('change', function() { 61 | updateNightmode(); 62 | }); 63 | 64 | $nightmode_form.off('reset').on('reset', function () { 65 | setTimeout(function() { 66 | updateNightmode(); 67 | }, 10); 68 | }); 69 | 70 | var parseFilter = function(str, element) { 71 | var re = new RegExp(element+'\\(([\\d.]+)\\S*\\)'), 72 | value = null; 73 | 74 | if (re.test(str)) 75 | value = str.match(re)[1]; 76 | 77 | return value; 78 | }; 79 | 80 | var updateNightmode = function() { 81 | customStyles.nightMode.rules.filter = 'invert(1) sepia(' + $night_sepia.val() + ') hue-rotate(' + $night_huerotate.val() + 'deg) brightness(' + $night_brightness.val() + ') contrast(' + $night_contrast.val() + ') saturate(' + $night_saturate.val() + ')'; 82 | reader.updateStyle(customStyles.nightMode); 83 | }; 84 | 85 | $night_brightness.val(parseFilter(customStyles.nightMode.rules.filter,"brightness")); 86 | $night_contrast.val(parseFilter(customStyles.nightMode.rules.filter,"contrast")); 87 | $night_sepia.val(parseFilter(customStyles.nightMode.rules.filter,"sepia")); 88 | $night_huerotate.val(parseFilter(customStyles.nightMode.rules.filter,"hue-rotate")); 89 | $night_saturate.val(parseFilter(customStyles.nightMode.rules.filter,"saturate")); 90 | 91 | return { 92 | }; 93 | }; 94 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/css/annotations.css: -------------------------------------------------------------------------------- 1 | .ui-loader { 2 | display: none; 3 | } 4 | 5 | .annotator-hl { 6 | box-shadow: none !important; 7 | cursor: pointer !important; 8 | } -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/css/idevice.css: -------------------------------------------------------------------------------- 1 | .notes, 2 | .search-results, 3 | .view { 4 | overflow-y: scroll; 5 | -webkit-overflow-scrolling: touch; 6 | } 7 | 8 | .search-results { 9 | height: calc(100% - 5em); 10 | } 11 | 12 | .notes { 13 | height: calc(100% - 9em); 14 | } 15 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/css/images/annotation-check.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/css/images/annotation-comment.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/css/images/annotation-help.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 16 | 18 | 21 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/css/images/annotation-insert.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/css/images/annotation-key.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/css/images/annotation-newparagraph.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/css/images/annotation-noicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/css/images/annotation-note.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 14 | 21 | 28 | 35 | 42 | 43 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/css/images/annotation-paragraph.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/css/popup.css: -------------------------------------------------------------------------------- 1 | /* http://davidwalsh.name/css-tooltips */ 2 | /* base CSS element */ 3 | .popup { 4 | background: #eee; 5 | border: 1px solid #ccc; 6 | padding: 10px; 7 | border-radius: 8px; 8 | box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); 9 | position: fixed; 10 | max-width: 300px; 11 | font-size: 12px; 12 | 13 | display: none; 14 | margin-left: 2px; 15 | 16 | margin-top: 30px; 17 | } 18 | 19 | .popup.above { 20 | margin-top: -10px; 21 | } 22 | 23 | .popup.left { 24 | margin-left: -20px; 25 | } 26 | 27 | .popup.right { 28 | margin-left: 40px; 29 | } 30 | 31 | .pop_content { 32 | max-height: 225px; 33 | overflow-y: auto; 34 | } 35 | 36 | .pop_content > p { 37 | margin-top: 0; 38 | } 39 | 40 | /* below */ 41 | .popup:before { 42 | position: absolute; 43 | display: inline-block; 44 | border-bottom: 10px solid #eee; 45 | border-right: 10px solid transparent; 46 | border-left: 10px solid transparent; 47 | border-bottom-color: rgba(0, 0, 0, 0.2); 48 | left: 50%; 49 | top: -10px; 50 | margin-left: -6px; 51 | content: ''; 52 | } 53 | 54 | .popup:after { 55 | position: absolute; 56 | display: inline-block; 57 | border-bottom: 9px solid #eee; 58 | border-right: 9px solid transparent; 59 | border-left: 9px solid transparent; 60 | left: 50%; 61 | top: -9px; 62 | margin-left: -5px; 63 | content: ''; 64 | } 65 | 66 | /* above */ 67 | .popup.above:before { 68 | border-bottom: none; 69 | border-top: 10px solid #eee; 70 | border-top-color: rgba(0, 0, 0, 0.2); 71 | top: 100%; 72 | } 73 | 74 | .popup.above:after { 75 | border-bottom: none; 76 | border-top: 9px solid #eee; 77 | top: 100%; 78 | } 79 | 80 | .popup.left:before, 81 | .popup.left:after 82 | { 83 | left: 20px; 84 | } 85 | 86 | .popup.right:before, 87 | .popup.right:after 88 | { 89 | left: auto; 90 | right: 20px; 91 | } 92 | 93 | 94 | .popup.show, .popup.on { 95 | display: block; 96 | } 97 | 98 | .note-marker, 99 | .EPUBJS-CFI-MARKER, 100 | .EPUBJS-CFI-SPLIT { 101 | vertical-align: super; 102 | font-size: 0.75em; 103 | line-height: 1em; 104 | padding: 0.1em; 105 | background-color: #fffa96; 106 | border-radius: 5px; 107 | cursor: pointer; 108 | } 109 | 110 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/css/text_layer_builder.css: -------------------------------------------------------------------------------- 1 | /* Copyright 2014 Mozilla Foundation 2 | * 3 | * Licensed under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. 5 | * You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | 16 | .textLayer { 17 | position: absolute; 18 | left: 0; 19 | top: 0; 20 | right: 0; 21 | bottom: 0; 22 | /* overflow: hidden; */ 23 | opacity: 0.2; 24 | line-height: 1.0; 25 | } 26 | 27 | .textLayer > div { 28 | color: transparent; 29 | position: absolute; 30 | white-space: pre; 31 | cursor: text; 32 | -webkit-transform-origin: 0% 0%; 33 | -moz-transform-origin: 0% 0%; 34 | -o-transform-origin: 0% 0%; 35 | -ms-transform-origin: 0% 0%; 36 | transform-origin: 0% 0%; 37 | } 38 | 39 | .textLayer .highlight { 40 | margin: -1px; 41 | padding: 1px; 42 | 43 | background-color: rgb(180, 0, 170); 44 | border-radius: 4px; 45 | } 46 | 47 | .textLayer .highlight.begin { 48 | border-radius: 4px 0px 0px 4px; 49 | } 50 | 51 | .textLayer .highlight.end { 52 | border-radius: 0px 4px 4px 0px; 53 | } 54 | 55 | .textLayer .highlight.middle { 56 | border-radius: 0px; 57 | } 58 | 59 | .textLayer .highlight.selected { 60 | background-color: rgb(0, 100, 0); 61 | } 62 | 63 | .textLayer ::selection { background: rgb(0,0,255); } 64 | .textLayer ::-moz-selection { background: rgb(0,0,255); } 65 | 66 | .textLayer .endOfContent { 67 | display: block; 68 | position: absolute; 69 | left: 0px; 70 | top: 100%; 71 | right: 0px; 72 | bottom: 0px; 73 | z-index: -1; 74 | cursor: default; 75 | -webkit-user-select: none; 76 | -ms-user-select: none; 77 | -moz-user-select: none; 78 | } 79 | 80 | .textLayer .endOfContent.active { 81 | top: 0px; 82 | } 83 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/services/eventbus_service.js: -------------------------------------------------------------------------------- 1 | PDFJS.Reader.EventBus = function () { 2 | 3 | this._listeners = Object.create(null); 4 | 5 | return this; 6 | }; 7 | 8 | PDFJS.Reader.EventBus.prototype.on = function (eventName, listener) { 9 | var eventListeners = this._listeners[eventName]; 10 | if (!eventListeners) { 11 | eventListeners = []; 12 | this._listeners[eventName] = eventListeners; 13 | } 14 | eventListeners.push(listener); 15 | }; 16 | 17 | PDFJS.Reader.EventBus.prototype.off = function (eventName, listener) { 18 | var eventListeners = this._listeners[eventName]; 19 | var i; 20 | if (!eventListeners || ((i = eventListeners.indexOf(listener)) < 0)) { 21 | return; 22 | } 23 | eventListeners.splice(i, 1); 24 | }; 25 | 26 | PDFJS.Reader.EventBus.prototype.dispatch = function (eventName) { 27 | var eventListeners = this._listeners[eventName]; 28 | if (!eventListeners || eventListeners.length === 0) { 29 | return; 30 | } 31 | // Passing all arguments after the eventName to the listeners. 32 | var args = Array.prototype.slice.call(arguments, 1); 33 | // Making copy of the listeners array in case if it will be modified 34 | // during dispatch. 35 | eventListeners.slice(0).forEach(function (listener) { 36 | listener.apply(null, args); 37 | }); 38 | }; 39 | 40 | -------------------------------------------------------------------------------- /files_reader/vendor/pdfjs/services/simple_link_service.js: -------------------------------------------------------------------------------- 1 | PDFJS.Reader.SimpleLinkService = function () { 2 | 3 | return this; 4 | }; 5 | 6 | Object.defineProperties(PDFJS.Reader.SimpleLinkService, { 7 | 'page': { 8 | get: function () { return 0; }, 9 | set: function(value) {} 10 | } 11 | }); 12 | 13 | PDFJS.Reader.SimpleLinkService.prototype.navigateTo = function (destUrl) { 14 | }; 15 | 16 | PDFJS.Reader.SimpleLinkService.prototype.getDestinationHash = function (destination) { 17 | return "#"; 18 | }; 19 | 20 | PDFJS.Reader.SimpleLinkService.prototype.getAnchorUrl = function (anchor) { 21 | return "#"; 22 | }; 23 | 24 | PDFJS.Reader.SimpleLinkService.prototype.setHash = function (hash) { 25 | }; 26 | 27 | PDFJS.Reader.SimpleLinkService.prototype.executeNamedAction = function (action) { 28 | }; 29 | 30 | PDFJS.Reader.SimpleLinkService.prototype.onFileAttachmentAnnotation = function (params) { 31 | }; 32 | 33 | PDFJS.Reader.SimpleLinkService.prototype.cachePageRef = function (pageNum, pageRef) { 34 | }; 35 | -------------------------------------------------------------------------------- /files_reader/vendor/pixastic/pixastic.worker.js: -------------------------------------------------------------------------------- 1 | Pixastic.Worker = function() { 2 | var me = this; 3 | function processMessage(data) { 4 | var queue = data.queue, 5 | inData = data.inData, 6 | outData = data.outData, 7 | width = data.width, 8 | height = data.height, 9 | tmpData; 10 | 11 | for (var i=0;i 0) { 16 | tmpData = inData; 17 | inData = outData; 18 | outData = tmpData; 19 | } 20 | 21 | Pixastic.Effects[e](inData.data, outData.data, width, height, options); 22 | 23 | me.onmessage({ 24 | data : { 25 | event : "progress", 26 | data : (i+1) / queue.length 27 | } 28 | }); 29 | } 30 | 31 | me.onmessage({ 32 | data : { 33 | event : "done", 34 | data : outData 35 | } 36 | }); 37 | } 38 | 39 | this.postMessage = function(data) { 40 | setTimeout(function() { 41 | processMessage(data) 42 | }, 0); 43 | } 44 | 45 | this.onmessage = function() {}; 46 | 47 | } 48 | -------------------------------------------------------------------------------- /files_reader/vendor/sindresorhus/screenfull.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * screenfull 3 | * v3.0.0 - 2015-11-24 4 | * (c) Sindre Sorhus; MIT License 5 | */ 6 | (function () { 7 | 'use strict'; 8 | 9 | var isCommonjs = typeof module !== 'undefined' && module.exports; 10 | var keyboardAllowed = typeof Element !== 'undefined' && 'ALLOW_KEYBOARD_INPUT' in Element; 11 | 12 | var fn = (function () { 13 | var val; 14 | var valLength; 15 | 16 | var fnMap = [ 17 | [ 18 | 'requestFullscreen', 19 | 'exitFullscreen', 20 | 'fullscreenElement', 21 | 'fullscreenEnabled', 22 | 'fullscreenchange', 23 | 'fullscreenerror' 24 | ], 25 | // new WebKit 26 | [ 27 | 'webkitRequestFullscreen', 28 | 'webkitExitFullscreen', 29 | 'webkitFullscreenElement', 30 | 'webkitFullscreenEnabled', 31 | 'webkitfullscreenchange', 32 | 'webkitfullscreenerror' 33 | 34 | ], 35 | // old WebKit (Safari 5.1) 36 | [ 37 | 'webkitRequestFullScreen', 38 | 'webkitCancelFullScreen', 39 | 'webkitCurrentFullScreenElement', 40 | 'webkitCancelFullScreen', 41 | 'webkitfullscreenchange', 42 | 'webkitfullscreenerror' 43 | 44 | ], 45 | [ 46 | 'mozRequestFullScreen', 47 | 'mozCancelFullScreen', 48 | 'mozFullScreenElement', 49 | 'mozFullScreenEnabled', 50 | 'mozfullscreenchange', 51 | 'mozfullscreenerror' 52 | ], 53 | [ 54 | 'msRequestFullscreen', 55 | 'msExitFullscreen', 56 | 'msFullscreenElement', 57 | 'msFullscreenEnabled', 58 | 'MSFullscreenChange', 59 | 'MSFullscreenError' 60 | ] 61 | ]; 62 | 63 | var i = 0; 64 | var l = fnMap.length; 65 | var ret = {}; 66 | 67 | for (; i < l; i++) { 68 | val = fnMap[i]; 69 | if (val && val[1] in document) { 70 | for (i = 0, valLength = val.length; i < valLength; i++) { 71 | ret[fnMap[0][i]] = val[i]; 72 | } 73 | return ret; 74 | } 75 | } 76 | 77 | return false; 78 | })(); 79 | 80 | var screenfull = { 81 | request: function (elem) { 82 | var request = fn.requestFullscreen; 83 | 84 | elem = elem || document.documentElement; 85 | 86 | // Work around Safari 5.1 bug: reports support for 87 | // keyboard in fullscreen even though it doesn't. 88 | // Browser sniffing, since the alternative with 89 | // setTimeout is even worse. 90 | if (/5\.1[\.\d]* Safari/.test(navigator.userAgent)) { 91 | elem[request](); 92 | } else { 93 | elem[request](keyboardAllowed && Element.ALLOW_KEYBOARD_INPUT); 94 | } 95 | }, 96 | exit: function () { 97 | document[fn.exitFullscreen](); 98 | }, 99 | toggle: function (elem) { 100 | if (this.isFullscreen) { 101 | this.exit(); 102 | } else { 103 | this.request(elem); 104 | } 105 | }, 106 | raw: fn 107 | }; 108 | 109 | if (!fn) { 110 | if (isCommonjs) { 111 | module.exports = false; 112 | } else { 113 | window.screenfull = false; 114 | } 115 | 116 | return; 117 | } 118 | 119 | Object.defineProperties(screenfull, { 120 | isFullscreen: { 121 | get: function () { 122 | return Boolean(document[fn.fullscreenElement]); 123 | } 124 | }, 125 | element: { 126 | enumerable: true, 127 | get: function () { 128 | return document[fn.fullscreenElement]; 129 | } 130 | }, 131 | enabled: { 132 | enumerable: true, 133 | get: function () { 134 | // Coerce to boolean in case of old WebKit 135 | return Boolean(document[fn.fullscreenEnabled]); 136 | } 137 | } 138 | }); 139 | 140 | if (isCommonjs) { 141 | module.exports = screenfull; 142 | } else { 143 | window.screenfull = screenfull; 144 | } 145 | })(); 146 | -------------------------------------------------------------------------------- /l10n/ignorelist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/l10n/ignorelist -------------------------------------------------------------------------------- /l10n/templates/files_opds.pot: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: ownCloud Core 8.0.0\n" 10 | "Report-Msgid-Bugs-To: translations@owncloud.org\n" 11 | "POT-Creation-Date: 2014-12-10 12:20+0100\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=CHARSET\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: ajax/clear_bookshelf.php:21 21 | msgid "Bookshelf cleared" 22 | msgstr "" 23 | 24 | #: ajax/personal.php:28 25 | msgid "Directory does not exist!" 26 | msgstr "" 27 | 28 | #: ajax/personal.php:35 29 | msgid "Settings updated successfully." 30 | msgstr "" 31 | 32 | #: templates/feed.php:20 33 | #, php-format 34 | msgid "%s's library" 35 | msgstr "" 36 | 37 | #: templates/feed.php:21 38 | #, php-format 39 | msgid "%s OPDS Catalog" 40 | msgstr "" 41 | 42 | #: templates/feed.php:35 43 | msgid "Browse catalog" 44 | msgstr "" 45 | 46 | #: templates/feed.php:36 47 | msgid "Browse the catalog in alphabetical order" 48 | msgstr "" 49 | 50 | #: templates/feed.php:42 51 | #, php-format 52 | msgid "%s's bookshelf" 53 | msgstr "" 54 | 55 | #: templates/feed.php:43 56 | #, php-format 57 | msgid "This bookshelf contains %s books" 58 | msgstr "" 59 | 60 | #: templates/personal.php:16 61 | msgid "OPDS" 62 | msgstr "" 63 | 64 | #: templates/personal.php:19 65 | msgid "enable OPDS catalog" 66 | msgstr "" 67 | 68 | #: templates/personal.php:22 69 | msgid "Root directory:" 70 | msgstr "" 71 | 72 | #: templates/personal.php:23 73 | msgid "Enter root directory for OPDS catalog." 74 | msgstr "" 75 | 76 | #: templates/personal.php:26 77 | msgid "Supported extensions:" 78 | msgstr "" 79 | 80 | #: templates/personal.php:27 81 | msgid "" 82 | "Enter list of comma-separated extensions (eg. pdf,epub,doc,txt). Leave blank " 83 | "to publish all file types." 84 | msgstr "" 85 | 86 | #: templates/personal.php:30 87 | msgid "Clear Bookshelf" 88 | msgstr "" 89 | 90 | #: templates/personal.php:31 91 | msgid "" 92 | "Clear list of downloaded books from bookshelf. This only clears the list, it " 93 | "does not delete any books." 94 | msgstr "" 95 | 96 | #: templates/personal.php:31 97 | msgid "Yes, I really want to clear my personal bookshelf" 98 | msgstr "" 99 | 100 | #: templates/personal.php:32 101 | msgid "No, I do not want to clear my bookshelf" 102 | msgstr "" 103 | 104 | #: templates/personal.php:35 105 | #, php-format 106 | msgid "There are %s books on your personal bookshelf" 107 | msgstr "" 108 | -------------------------------------------------------------------------------- /l10n/templates/files_reader.pot: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: ownCloud Core 8.0.0\n" 10 | "Report-Msgid-Bugs-To: translations@owncloud.org\n" 11 | "POT-Creation-Date: 2014-12-10 12:20+0100\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=CHARSET\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: templates/reader.php:34 21 | msgid "Search" 22 | msgstr "" 23 | 24 | #: templates/reader.php:37 25 | msgid "TOC" 26 | msgstr "" 27 | 28 | #: templates/reader.php:40 29 | msgid "Bookmarks" 30 | msgstr "" 31 | 32 | #: templates/reader.php:43 33 | msgid "Notes" 34 | msgstr "" 35 | 36 | #: templates/reader.php:61 37 | msgid "Anchor" 38 | msgstr "" 39 | 40 | #: templates/reader.php:72 41 | msgid "Menu" 42 | msgstr "" 43 | 44 | #: templates/reader.php:86 45 | msgid "Bookmark" 46 | msgstr "" 47 | 48 | #: templates/reader.php:89 templates/reader.php:120 49 | msgid "Settings" 50 | msgstr "" 51 | 52 | #: templates/reader.php:92 53 | msgid "Fullscreen" 54 | msgstr "" 55 | 56 | #: templates/reader.php:95 57 | msgid "Close" 58 | msgstr "" 59 | 60 | #: templates/reader.php:126 61 | msgid "Always use" 62 | msgstr "" 63 | 64 | #: templates/reader.php:139 65 | msgid "font scaled to" 66 | msgstr "" 67 | 68 | #: templates/reader.php:144 69 | msgid "Et nos esse veri viri scire volemus" 70 | msgstr "" 71 | 72 | #: templates/reader.php:149 73 | msgid "Reflow text when sidebars are open." 74 | msgstr "" 75 | 76 | #: templates/reader.php:153 77 | msgid "Night mode background" 78 | msgstr "" 79 | 80 | #: templates/reader.php:155 81 | msgid "and text" 82 | msgstr "" 83 | 84 | #: templates/reader.php:157 85 | msgid "colour" 86 | msgstr "" 87 | 88 | #: templates/reader.php:167 89 | msgid "Disable extra-wide page turn areas" 90 | msgstr "" 91 | 92 | #: templates/reader.php:169 93 | msgid "" 94 | "The extra-wide page turn areas as used by default on touch-screen devices " 95 | "interfere with the ability to select links in ebooks. When this option is " 96 | "enabled, the page-turn area is always outside the ebook margins so links are " 97 | "reachable." 98 | msgstr "" 99 | -------------------------------------------------------------------------------- /screenshots/Screenshot_2014-09-29-20-21-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/Screenshot_2014-09-29-20-21-50.png -------------------------------------------------------------------------------- /screenshots/Screenshot_2014-10-02-19-16-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/Screenshot_2014-10-02-19-16-18.png -------------------------------------------------------------------------------- /screenshots/Screenshot_2017-03-15_195840_593917640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/Screenshot_2017-03-15_195840_593917640.png -------------------------------------------------------------------------------- /screenshots/Screenshot_2017-03-15_200124_360946567.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/Screenshot_2017-03-15_200124_360946567.png -------------------------------------------------------------------------------- /screenshots/files_opds-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/files_opds-1.png -------------------------------------------------------------------------------- /screenshots/files_reader-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/files_reader-1.png -------------------------------------------------------------------------------- /screenshots/files_reader-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/files_reader-2.png -------------------------------------------------------------------------------- /screenshots/files_reader-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/files_reader-3.png -------------------------------------------------------------------------------- /screenshots/files_reader_PDF_001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/files_reader_PDF_001.png -------------------------------------------------------------------------------- /screenshots/files_reader_PDF_002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/files_reader_PDF_002.png -------------------------------------------------------------------------------- /screenshots/files_reader_PDF_003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/files_reader_PDF_003.png -------------------------------------------------------------------------------- /screenshots/files_reader_PDF_004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/files_reader_PDF_004.png -------------------------------------------------------------------------------- /screenshots/files_reader_PDF_005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/files_reader_PDF_005.png -------------------------------------------------------------------------------- /screenshots/files_reader_PDF_006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/files_reader_PDF_006.png -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-21-30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-21-30.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-21-37.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-21-37.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-21-39.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-21-39.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-21-40.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-21-40.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-21-41.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-21-41.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-21-43.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-21-43.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-21-49.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-21-49.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-21-51.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-21-51.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-21-52.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-21-52.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-21-53.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-21-53.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-21-54.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-21-54.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-21-56.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-21-56.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-21-57.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-21-57.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-21-58.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-21-58.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-21-59.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-21-59.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-00.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-00.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-01.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-02.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-03.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-04.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-05.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-06.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-08.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-09.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-10.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-11.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-12.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-13.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-14.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-15.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-16.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-17.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-18.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-19.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-20.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-21.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-22.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-23.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-24.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-26.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-27.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_17-22-28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_17-22-28.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_18-28-36.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_18-28-36.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_18-28-37.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_18-28-37.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_18-28-43.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_18-28-43.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_18-28-46.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_18-28-46.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_18-28-49.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_18-28-49.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_18-28-52.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_18-28-52.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_18-28-54.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_18-28-54.jpg -------------------------------------------------------------------------------- /screenshots/photo_2017-03-15_18-28-56.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yetangitu/owncloud-apps/ad32b523b88e133fbe681bf3a7b51928b01f2c1d/screenshots/photo_2017-03-15_18-28-56.jpg --------------------------------------------------------------------------------