├── .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 | t('OPDS')); ?> | |
28 |
29 |
30 |
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 |
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 |
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 |
3 |
4 | id:
5 |
8 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/files_opds/templates/part.feed.root.php:
--------------------------------------------------------------------------------
1 |
2 | t("Browse catalog")); ?>
3 |
4 | t("Browse the catalog in alphabetical order")); ?>
5 |
7 | id:by_directory
8 |
9 |
10 | 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 | t('OPDS')); ?> | |
22 |
23 |
24 |
25 | type="checkbox" class="checkbox">
26 |
27 |
28 |
29 |
47 |
48 |
49 |
50 | " value=" t('Yes, I really want to schedule a rescan of all metadata')); ?>" hidden />
51 |
52 |
53 |
54 |
55 |
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 |
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 |
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 |
12 |
--------------------------------------------------------------------------------
/files_reader/vendor/pdfjs/css/images/annotation-comment.svg:
--------------------------------------------------------------------------------
1 |
2 |
17 |
--------------------------------------------------------------------------------
/files_reader/vendor/pdfjs/css/images/annotation-help.svg:
--------------------------------------------------------------------------------
1 |
2 |
27 |
--------------------------------------------------------------------------------
/files_reader/vendor/pdfjs/css/images/annotation-insert.svg:
--------------------------------------------------------------------------------
1 |
2 |
11 |
--------------------------------------------------------------------------------
/files_reader/vendor/pdfjs/css/images/annotation-key.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
--------------------------------------------------------------------------------
/files_reader/vendor/pdfjs/css/images/annotation-newparagraph.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
--------------------------------------------------------------------------------
/files_reader/vendor/pdfjs/css/images/annotation-noicon.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/files_reader/vendor/pdfjs/css/images/annotation-note.svg:
--------------------------------------------------------------------------------
1 |
2 |
43 |
--------------------------------------------------------------------------------
/files_reader/vendor/pdfjs/css/images/annotation-paragraph.svg:
--------------------------------------------------------------------------------
1 |
2 |
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
--------------------------------------------------------------------------------