164 Commits
0.2 ... 0.7.1

Author SHA1 Message Date
Luc Didry
e767f850bf update CHANGELOG 2016-06-21 23:26:53 +02:00
Luc Didry
374b99f77d Add CSS::Minifier::XS dependency
It seems that it was not automatically installed as a dependency of
Mojolicious::Plugin::AssetPack :-(
2016-06-21 23:26:40 +02:00
Luc Didry
c58edbae83 Add "download zip" URL + better copy to clipboard method 2016-06-21 23:03:54 +02:00
Luc Didry
c03082c2c1 Do not try to remove EXIF tags from xcf or webp images 2016-06-09 23:37:43 +02:00
Luc Didry
9f872a3f6a Fix gallery URL not updated when closing image alert block 2016-06-09 23:36:54 +02:00
Luc Didry
fd3d9a6e31 Do not try to create thumbnails of webp images 2016-06-09 22:47:05 +02:00
Luc Didry
fbcc133e47 Do not thumbnail xcf files (gimp) 2016-06-08 21:51:26 +02:00
Luc Didry
e8eb804d3c Add files extension to gallery URL
This allows to have extensions in the zip package.

Plus do not add to the gallery URL if file is an xcf (gimp) in order to
prevent zip generation fail.
2016-06-08 21:47:44 +02:00
Luc Didry
453bc5d2c5 Fix #22 2016-06-08 18:14:36 +02:00
Luc Didry
c450b27c0d Change lightbox overlay color 2016-06-06 22:51:10 +02:00
Luc Didry
1bd82463d1 Fix typo in french translation 2016-06-06 22:39:04 +02:00
Luc Didry
6a4b0910d4 Fix typo in conf template 2016-06-06 22:28:32 +02:00
Luc Didry
ef6509a3bc Fix #20 2016-06-06 22:26:37 +02:00
Luc Didry
0a318dc4d4 Avoid having "gallery" as shortened URL 2016-06-06 22:09:39 +02:00
Luc Didry
58901989dd Only use the first frame of a gif to create the thumbnail
With a great number of frames, ImageMagick crashes.
2016-06-06 22:07:50 +02:00
Luc Didry
08a07cd93d Update dependencies 2016-06-06 22:07:31 +02:00
Luc Didry
a7884e8785 Fix gallery URL on image block closing 2016-06-06 22:00:22 +02:00
Luc Didry
41fef61f7c Fix SVG upload, broken when working on EXIF tags 2016-06-06 21:58:27 +02:00
Luc Didry
a1ce8618de Fix #16 2016-06-06 21:29:43 +02:00
Luc Didry
b60a849752 Fix #19 2016-06-06 21:23:41 +02:00
Luc Didry
b33c7d3d23 Update translation files 2016-06-06 21:16:27 +02:00
Luc Didry
99e5ea8c75 Changing all links from git.framasoft.org to framagit.org 2016-06-06 21:11:30 +02:00
Luc Didry
dced03c964 Update CHANGELOG 2016-06-06 21:11:08 +02:00
Luc Didry
fe06675d0b Add gallery. Fix #15 2016-06-06 21:07:12 +02:00
Luc Didry
1082f42682 Allow to set the encryption length in lutim.conf 2015-10-08 11:35:11 +02:00
Luc Didry
1dff747b64 Update Changelog 2015-10-08 11:26:58 +02:00
Luc Didry
c33840f3aa Use cryptographically secure random generator 2015-10-08 11:25:03 +02:00
Luc Didry
a9669b5f7b Add german translation (thx Thor77) 2015-10-04 15:44:53 +02:00
Luc Didry
86ee5287bf Fixes #11 Select input text when focus 2015-09-24 01:26:05 +02:00
Luc Didry
e51e8f3d3a Add CONTRIBUTING file 2015-09-24 01:07:13 +02:00
Luc Didry
688f4517c1 Rename Changes file 2015-09-24 01:06:15 +02:00
Luc Didry
1cb5aab686 Remove Item from localStorage when deleted (button or expired) 2015-09-24 01:03:30 +02:00
Luc Didry
0c23c9ba67 Fixe mistake on deletion link in myfiles page 2015-09-23 08:21:11 +02:00
Luc Didry
204df6bf08 Small UI change (make alert blocks more compact) 2015-09-21 22:15:33 +02:00
Luc Didry
2f96407f5c Add view links to thumbnails and filenames 2015-09-21 21:18:32 +02:00
Luc Didry
14943906d3 Add links before the input fields 2015-09-19 16:14:20 +02:00
Luc Didry
1aa6e9b859 Update Changes 2015-09-18 00:14:40 +02:00
Luc Didry
a64808f206 Fixes #3 - Add list of of user's images in localstorage 2015-09-18 00:12:15 +02:00
Luc Didry
af9323365c Move javascript which don't need templating to static js file 2015-09-17 21:47:37 +02:00
Luc Didry
7a7eb8f4cc Make copy-all button disappear if there is no more links 2015-09-17 21:37:10 +02:00
Luc Didry
170546df64 Update translations 2015-09-17 12:04:43 +02:00
Luc Didry
1ad1929a0e Add file extension to view link 2015-09-17 00:52:28 +02:00
Luc Didry
8b76684fcd Add Copy to clipboard buttons (each link + all links) 2015-09-17 00:18:42 +02:00
Luc Didry
71576ce749 Update twitter bootstrap 2015-09-11 00:28:19 +02:00
Luc Didry
e0b05ff0d1 Update Changes file 2015-09-10 01:27:05 +02:00
Luc Didry
f121a9f807 Remove infos in README since they are in the wiki
https://git.framasoft.org/luc/lutim/wikis/home
2015-09-10 01:14:24 +02:00
Luc Didry
d98f95811f Lower case Kharec's last name 2015-09-10 00:50:51 +02:00
Luc Didry
7472650b59 Put authors in a separate file 2015-09-10 00:50:01 +02:00
Luc Didry
a1fc2997c7 Update dependencies 2015-09-09 23:09:44 +02:00
Luc Didry
bb9fae43e2 Improve init files
Hypnotoad does not use "user" and "group" settings anymore. So I
removed the setting in the configuration template and changed some
things in the init files accordingly.

+ some fixes for annoying behavior in initV and systemd files
2015-09-09 23:07:13 +02:00
Luc Didry
bb5c7050bb Fixes #6 - Cron tasks: more doc 2015-09-09 21:57:15 +02:00
Luc Didry
6fab43b15b Fixes #8 - Add markdown code to copy/paste 2015-09-09 21:34:38 +02:00
Luc Didry
2f7b2f5fbb Remove debug info log 2015-09-09 21:16:21 +02:00
Luc Didry
2ca4ba1f0e Fixes #7 - make cron stop printing debug info 2015-09-09 21:15:58 +02:00
Luc Didry
62e82b8224 Put javascript in a partial template 2015-09-09 21:04:24 +02:00
Luc Didry
7b9ed1fa4a Little change to API description table 2015-08-08 12:04:15 +02:00
Luc Didry
4aa9a649be Merge branch 'thor77/lutim-api-table' 2015-08-08 11:58:02 +02:00
Thor77
6d260af932 convert api-description into table 2015-08-08 11:47:09 +02:00
Luc Didry
5bcd010055 Don't Repeat Yourself (and use partial templates) 2015-08-08 00:15:26 +02:00
Luc Didry
0f7d8e745e Delete EXIF tags without ImageMagick + add option to keep EXIF tags
Fixes #4
2015-08-08 00:13:48 +02:00
Luc Didry
1f0aa046d4 Add systemd .service file + documentation in README 2015-08-07 22:05:30 +02:00
Luc Didry
b6c3af7bc6 Fix bug preventing to store delete_at_day parameter 2015-08-06 11:01:33 +02:00
Luc Didry
c86faf208d Add DebugDumperHelper plugin 2015-08-06 11:00:34 +02:00
Luc Didry
4fe657d0d7 Merge branch 'thor77/lutim-master't push origin master 2015-08-05 15:41:39 +02:00
Thor77
023952648e add upstart-script 2015-08-05 15:27:33 +02:00
Luc Didry
baaf4ab861 Add Thor77 as contributor 2015-08-05 13:28:20 +02:00
Luc Didry
ae450a9649 Merge branch 'Thor77-patch-1' 2015-08-05 13:25:10 +02:00
Thor77
b4d06a21a0 add response-section to API
explains response parameters
2015-08-05 12:39:12 +02:00
Luc Didry
b0a19e3e42 Autorotate image + delete EXIF tags (for more privacy) 2015-08-03 00:07:28 +02:00
Luc Didry
e1840e96b0 Fix # 48 Allow to change location of the database 2015-08-02 23:34:58 +02:00
Luc Didry
e7138a40ab Update fonts
I forgot to update fonts when I switch to gitlab address, so:
* add git icon
* remove github icon
2015-08-02 22:44:08 +02:00
Luc Didry
080542fd95 Fix #47 Allow to upload svg images 2015-08-02 22:29:16 +02:00
Luc Didry
774f3ebda9 Update Changes file 2015-08-02 21:28:32 +02:00
Luc Didry
2e8f0eda2a Allow to use lutim under a sub-directory (example.org/lutim)
Fix #46 and #57
2015-08-02 21:07:50 +02:00
Luc Didry
a9ea0d35e6 Add Net::Domain::TLD to handle tld like .xyz or .link 2015-08-02 16:08:07 +02:00
Luc Didry
a049163646 Fixes #46 2015-08-02 15:41:25 +02:00
Luc Didry
2e5a3c9c0b Remove deprecated configuration option
The option had a typo. I hope people have changed their configuration.
2015-08-02 15:27:51 +02:00
Luc Didry
db50470ef8 Merge branch 'Thor77-master' 2015-08-02 15:00:27 +02:00
Luc Didry
1cb3ec09e3 Merge branch 'master' of https://github.com/Thor77/lutim into Thor77-master 2015-08-02 14:59:43 +02:00
Luc Didry
fa47a97be7 Merge branch 'i18n' into 'master'
I18n



See merge request !1
2015-08-02 14:56:48 +02:00
Luc Didry
afb377faca Update ES translation 2015-08-02 13:08:39 +02:00
Luc Didry
339cdf39b2 Use .po files for i18n + add spanish translation 2015-08-02 00:54:26 +02:00
Luc Didry
f1c096fd68 Add new dependencies 2015-06-11 21:43:06 +02:00
Luc Didry
fc28efa116 Update dependencies (cpanfile.snapshot) 2015-06-11 21:36:07 +02:00
Luc Didry
152b677614 Re-add IO::Socket::SSL as dependancy 2015-03-16 09:56:21 +01:00
Thor77
9431b60f9b Add reference to screencloud-integration 2015-02-19 15:14:58 +01:00
Luc Didry
9e27e0df59 Bump version 2014-10-03 00:40:25 +02:00
Luc Didry
0544a1b346 Update info page on rights on uploaded images 2014-10-03 00:38:47 +02:00
Luc Didry
bb1b43e215 Replace twitter page by social page (icon, description, etc)
+ small changes in README
2014-10-03 00:27:22 +02:00
Luc Didry
ad04bdd571 Add opengraph tags on twitter page.
Since the twitter page can now be embedded in Facebook and other social
networks which relies on opengraph tag, this page is now called the
social page.
2014-10-02 23:31:59 +02:00
Luc Didry
23c130750e Improve Twitter animated card (gif) (#45) 2014-09-25 01:41:42 +02:00
Luc Didry
a0b507e48e Fixes #45 + Update README.md and Changelog 2014-09-24 01:41:36 +02:00
Luc Didry
9692504096 Fix broken icon class 2014-09-12 14:29:42 +02:00
Luc Didry
8386a2f4d2 Add license mention in manifest.webapp + manifest.webapp version 2014-09-12 14:28:56 +02:00
Luc Didry
bef9dfaca3 Update description in manifest.webapp 2014-08-05 23:42:08 +02:00
Luc Didry
b71c25bf54 Close #42 2014-08-05 23:00:50 +02:00
Luc Didry
b0e5f771f2 Add Kharec as contributor 2014-07-21 16:48:12 +02:00
Sandro CAZZANIGA
2b361fce26 Fix pod description 2014-07-21 16:47:31 +02:00
Luc Didry
64e0db48f2 Change URL of official instance to the secured URL 2014-07-19 11:19:53 +02:00
Luc Didry
241e8b8ea1 Remove IO::Socket::SSL dependancy and add EV dependancy 2014-07-12 22:15:16 +02:00
Luc Didry
e0f13489a4 Update modules (cpanfile.snapshot) 2014-07-12 22:11:00 +02:00
Luc Didry
1ca3137dd1 Fix same I18N keyword used two times 2014-07-12 22:09:46 +02:00
Luc Didry
b791c609c2 Update Changelog 2014-07-12 22:01:15 +02:00
Luc Didry
388feba7c0 Replace some js in external file 2014-07-12 21:50:56 +02:00
Luc Didry
542d3efdf5 Fix #12 2014-07-12 21:50:31 +02:00
Luc Didry
a57815a2ea Add navigation bar in the webapp. 2014-07-11 12:33:34 +02:00
Luc Didry
44c0d5a9c9 Update I18N 2014-07-11 12:25:04 +02:00
Luc Didry
ebb5282579 Add "share" button for Firefox OS 2014-07-11 12:00:58 +02:00
Luc Didry
d03ce97c8b Add more icons of different sizes in manifest.webapp 2014-07-11 12:00:12 +02:00
Luc Didry
a4ca866790 Add Dattaz as dev in about page 2014-07-11 11:59:05 +02:00
Luc Didry
73b09d28c6 Small change in an img url 2014-07-11 00:20:52 +02:00
Luc Didry
5c45be0099 Hide install-app button by default, reveal it when necessary
+ avoid mozSetMessageHandler error in console when not available
2014-07-11 00:19:18 +02:00
Luc Didry
150f27bf9b Add icons & meta tags to be able to install as webapp in Chrome & Safari 2014-07-11 00:05:30 +02:00
dattaz
d0b388834f hide app button already install
add js code to hide app install button when app already install
2014-07-10 22:05:23 +02:00
Luc Didry
e951a44324 Refactor message function to build_message
Relative to webapp message fail.
2014-07-10 13:16:32 +02:00
Luc Didry
9fcefcdbd4 Small fix for webapp detection 2014-07-10 12:09:43 +02:00
dattaz
05892366d8 hide install web app
add js to hide install web app, when your already on the webapp
2014-07-10 11:53:16 +02:00
Luc Didry
989412046b Add Dattaz as part of the main developers 2014-07-08 23:42:29 +02:00
Luc Didry
f2baf273ca Webapp development, trying to send the image
Image sending is ok, but for some unknown reason, we can't have status
message displayed once upload is complete.
2014-07-08 23:24:50 +02:00
dattaz
420a37ee75 new file: public/img/lutim128.png
modified:   templates/index.html.ep
	modified:   templates/layouts/default.html.ep
	new file:   templates/manifest.webapp.ep
Add icon 128px for openwebapp (firefox os)
Add accept="image/*" in the form for accept only images
Add JS for install openwebapp and share image to lutim app
Add manifest for openwebapp
2014-07-08 16:54:45 +02:00
Luc Didry
940faed363 Fix #35 2014-07-07 21:54:36 +02:00
Luc Didry
f86b0e71d1 Make uploader label responsive 2014-07-07 21:18:20 +02:00
Luc Didry
7f99d73691 Fix bootstrap error for upload_by_url message when small screen 2014-07-06 17:59:42 +02:00
Chocobozzz
4633fdacef More lisibility for options of the documentation 2014-06-14 15:40:14 +02:00
Luc Didry
bf0e2d47b9 Update Shutter plugin (delete link) 2014-06-06 10:51:53 +02:00
Luc Didry
f044c1e953 Use Lutim namespace for commands 2014-06-03 21:41:30 +02:00
Luc Didry
277053d2a8 Fix asset bundles 2014-06-03 21:32:20 +02:00
Luc Didry
b450ea7607 Small fix on short url generation 2014-06-03 21:30:58 +02:00
Luc Didry
510bfb3eed Small bugfixes
Production always gives surprises !
2014-06-01 18:59:34 +02:00
Luc Didry
673d80cec2 Official release of Lutim 0.3 2014-06-01 18:44:25 +02:00
Luc Didry
d8498b89fd Small fixes 2014-06-01 18:40:51 +02:00
Luc Didry
846d8a1bfe Fix #28 2014-06-01 18:40:16 +02:00
Luc Didry
75dde62989 Modify cache header 2014-06-01 16:25:43 +02:00
Luc Didry
d9c094ff16 No more modal 2014-06-01 16:24:56 +02:00
Luc Didry
37244e866c Small changes in README 2014-06-01 16:21:52 +02:00
Luc Didry
124ccd6ec2 Use Mojolicious::Plugin::AssetPack
Less requests, concatenated and minified css and js => faster !
2014-06-01 16:14:26 +02:00
Luc Didry
3fb3bac3ef Add Chocobozzz as contributor 2014-05-19 21:08:47 +02:00
Chocobozzz
00ccb56c8a correct small error (missing comma) 2014-05-19 14:54:53 +02:00
Luc Didry
8696cd43c4 Update documentation 2014-05-01 21:12:13 +02:00
Luc Didry
313bae584c Change LUTIm to Lutim (easier to write) 2014-05-01 21:05:22 +02:00
Luc Didry
63651bd277 Add Nginx configuration exemple and remove Varnish exemple 2014-05-01 20:54:37 +02:00
Luc Didry
04d38bfdf7 Update Changelog 2014-05-01 20:24:25 +02:00
Luc Didry
d05827102e Fix #27 2014-05-01 20:20:28 +02:00
Luc Didry
eb0dac2b4b Replace SimpleGraph by morris.js in README 2014-05-01 19:26:32 +02:00
Luc Didry
9f130e1761 Update README (markdown corrections) 2014-05-01 19:20:56 +02:00
Luc Didry
1b580a2e76 Add init script 2014-05-01 19:20:10 +02:00
Luc Didry
2a7cb615ba Change in Cache-Control header 2014-05-01 18:38:35 +02:00
Luc Didry
6e9a8a79c8 Add the sticker image
Yes, I know, I shouldn't store binary files like this here, but it's the
best place to me : I will not lost them :)
2014-05-01 18:06:12 +02:00
Luc Didry
a7704987a3 Rewrite the shutter plugin from the official documentation 2014-05-01 18:03:35 +02:00
Luc Didry
6d155a57ab Fix sentence 2014-05-01 17:16:34 +02:00
Luc Didry
cc99fba3fa Update README.md for Gitlab's markdown compliance 2014-05-01 17:15:55 +02:00
Luc Didry
cd699dd6e8 Improve default config values
With Mojolicious::Plugin::ConfigHashMerge, it's a lot simplier to have
default config values.

This simplification induces some simplification in other parts of Lutim.
2014-05-01 17:11:04 +02:00
Luc Didry
c84d5cf691 Update Changelog 2014-04-30 01:33:06 +02:00
Luc Didry
ac301e104c Use the X-Forwarded-Proto header to set the scheme to https if needed
The "https" option in configuration file is deprecated and will be removed in 0.4
2014-04-30 01:31:12 +02:00
Luc Didry
b0af4ccd75 Remote port detection can now use the X-Remote-Port header if set 2014-04-30 00:54:06 +02:00
Luc Didry
6b71bbaf35 Update .gitignore 2014-04-30 00:17:54 +02:00
Luc Didry
0f3b99e617 Improved stats page 2014-04-30 00:17:11 +02:00
Luc Didry
ad5032b720 Fix bugs
* IO::Socket::SSL dependancy for HTTPS downloads by URL
* error message if the downloaded by URL image is too big
* typo in internationalization call
2014-04-30 00:07:21 +02:00
Luc Didry
7e60f4876a Fix #29
Configurable antiflood protection for the "Download by URL" feature
2014-04-29 23:54:27 +02:00
Luc Didry
8264356176 Small bugfix for max_delay handling 2014-03-22 00:06:25 +01:00
Luc Didry
52b1005b69 Comments in configuration template 2014-03-21 23:47:16 +01:00
Luc Didry
c7c8a7d786 Use Henny Penny font for app title
https://www.google.com/fonts#UsePlace:use/Collection:Henny+Penny
2014-03-17 13:03:11 +01:00
Luc Didry
12e0bf093a Fix bug in stats date sorting 2014-03-17 00:15:16 +01:00
Luc Didry
2c4416985b Fix #25
Add explations for the hypnotoad part of the lutim.conf.template
2014-03-07 17:11:09 +01:00
209 changed files with 49363 additions and 2343 deletions

4
.gitignore vendored
View File

@@ -1,6 +1,10 @@
*.swp
lutim.conf
lutim.db
script/hypnotoad.pid
local/*
files/*
templates/data.html.ep
public/img/rezopole.png
public/img/rezopole.xcf
public/packed/*

8
.tx/config Normal file
View File

@@ -0,0 +1,8 @@
[main]
host = https://www.transifex.com
[lutim.enpo]
source_file = lib/Lutim/I18N/en.po
source_lang = en
type = PO
file_filter = lib/Lutim/I18N/<lang>.po

15
AUTHORS.md Normal file
View File

@@ -0,0 +1,15 @@
# Lutim's authors
## Main developers
* Luc Didry, aka Sky (<http://www.fiat-tux.fr>), core developer, @framasky on [Twitter](https://twitter.com/framasky) and on [Diaspora*](https://framasphere.org/public/framasky)
* Dattaz (<http://dattaz.fr>), webapp developer, [@dat_taz](https://twitter.com/dat_taz)
## Contributors
* Jean-Bernard Marcon, aka Goofy (<https://github.com/goofy-bz>)
* Jean-Christophe Bach (<https://github.com/jcb>)
* Florian Bigard, aka Chocobozzz (<https://github.com/Chocobozzz>)
* Sandro Cazzaniga, aka Kharec (<http://sandrocazzaniga.fr>), [@Kharec](https://twitter.com/Kharec)
* Laura Arjona Reina (<https://wiki.debian.org/LauraArjona>), spanish translation
* Thor77 (<http://thor77.org>), german translation, among other things

82
CHANGELOG Normal file
View File

@@ -0,0 +1,82 @@
Revision history for Lutim
0.7.1 2016-06-21
- Fix dependency bug
0.7 2016-06-21
- Use .po files for internationalization
- Add spanish translation (thx to Laura Arjona Reina)
- Allow Lutim to be on a sub-directory (like http://example.org/lutim/) (#46 and #57)
- Remove deprecated (due to typo) option "provisionning".
- Allow to upload svg images (no thumbnail for now, ImageMagick in Debian Jessie don't work with svg) (#47)
- Allow to change location of the database (#48)
- Autorotate images
- Purge images from their EXIF tags (for more privacy)
- Provide markdown syntax at upload for using lutim's hosted images
- Now using a wiki: makes README lighter (https://git.framasoft.org/luc/lutim/wikis/home)
- Update twitter bootstrap
- Add "Copy to clipboard" buttons to each link
- Add "Copy all links" button
- Add file extension to view link
- Add list of user's images in localStorage and a page to list the user's images
- Use cryptographically secure random generator
- Allow to set the encryption length in lutim.conf
- Add the possibility of displaying images in a gallery
- Add the possibility to download a zip file
- bugfixes
0.6 2014-10-03
- Add OpenGraph tags in social page (ex-twitter page)
- Update README.md
- Update info page
0.5 2014-09-24
- Add support for animated gif in Twitter cards (#45)
- Update README.md with Twitter integration informations
- bugfixes
0.4 2014-07-12
- Webapp ! Downloadable directly from the Lutim instance
- Configure expiration delay after uploading (#12)
- Twitter share button in the "upload success" message (#35)
0.3 2014-06-01
- Add a delete link to images (#28)
- Concatenated css and js with Mojolicious::Plugin::AssetPack
- Antiflood protection for the "Download by URL" feature (#29)
- Stats page improved
- Self-documented configuration template
- Remote port detection can now use the X-Remote-Port header if set
- Lutim now uses the X-Forwarded-Proto header to set the scheme to https if needed
The "https" option in configuration file is deprecated and will be removed in 0.4
- Optionally delete images that are no longer viewed after a configurable delay in order to avoid saturation (#27)
- Provide init script
- Update Shutter plugin
- Small bugfixes
0.2 2014-03-07
- Server-side encryption available
- Thumbnails of uploaded images in response
- Bugfixes
- HTML validity
- Stats (via cron stats command)
- Anonymize IP in DB after a delay (via cron cleanbdd command)
- Watch files directory size (via cron watch command)
- Anonymize logs (log only the senders' IP address)
- Favicon and logo
- Better MIME type detection
- Broadcast message on all pages available
- File max size configurable
- Progress bar
- More options for suppression delay
- Updated documentation
- Cross-domain API
- Upload by image URL
- Add HTTP headers Expires and Content-Cache
0.1 2014-02-15
- Image viewing link
- Image downloading link
- Image twitter card link
- Shutter Plugin
- Configurable "Hosted by" information

3
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,3 @@
# Contributing
See how to contribute on the [wiki](https://framagit.org/luc/lutim/wikis/contribute).

28
Changes
View File

@@ -1,28 +0,0 @@
Revision history for LUTIm
0.2 2014-03-07
- Server-side encryption available
- Thumbnails of uploaded images in response
- Bugfixes
- HTML validity
- Stats (via cron stats command)
- Anonymize IP in DB after a delay (via cron cleanbdd command)
- Watch files directory size (via cron watch command)
- Anonymize logs (log only the senders' IP address)
- Favicon and logo
- Better MIME type detection
- Broadcast message on all pages available
- File max size configurable
- Progress bar
- More options for suppression delay
- Updated documentation
- Cross-domain API
- Upload by image URL
- Add HTTP headers Expires and Content-Cache
0.1 2014-02-15
- Image viewing link
- Image downloading link
- Image twitter card link
- Shutter Plugin
- Configurable "Hosted by" information

21
Makefile Normal file
View File

@@ -0,0 +1,21 @@
EXTRACTFILES=utilities/locales_files.txt
EN=lib/Lutim/I18N/en.po
FR=lib/Lutim/I18N/fr.po
DE=lib/Lutim/I18N/de.po
ES=lib/Lutim/I18N/es.po
XGETTEXT=carton exec local/bin/xgettext.pl
CARTON=carton exec
LUTIM=script/lutim
locales:
$(XGETTEXT) -W -f $(EXTRACTFILES) -o $(EN) 2>/dev/null
$(XGETTEXT) -W -f $(EXTRACTFILES) -o $(FR) 2>/dev/null
$(XGETTEXT) -W -f $(EXTRACTFILES) -o $(DE) 2>/dev/null
$(XGETTEXT) -W -f $(EXTRACTFILES) -o $(ES) 2>/dev/null
dev:
rm public/packed/*
$(CARTON) morbo $(LUTIM) --listen http://0.0.0.0:3000
devlog:
multitail log/development.log

224
README.md
View File

@@ -1,210 +1,66 @@
#LUTIm
# Lutim
##What LUTIm means?
## What Lutim means?
It means Let's Upload That Image.
##What does it do?
It stores images and allows you to see them or download them.
## What does it do?
It stores images and allows you to see them, download them or share them on social networks. From version 0.5, the gif images can be displayed as animated gifs in Twitter, but you need a HTTPS server (Twitter requires that. Lutim detects if you have a HTTPS server and displays an static image twitter card if you don't);
Images are indefinitly stored unless you request that they will be deleted at first view or after 24 hours / one week / one month / one year.
##License
LUTIm is licensed under the terms of the AGPL. See the LICENSE file.
## License
Lutim is licensed under the terms of the AGPL. See the LICENSE file.
##Official instance
You can see it working at http://lut.im.
## Official instance
You can see it working at https://lut.im.
##Logo
LUTIm's logo is an adaptation of [Lutin](http://commons.wikimedia.org/wiki/File:Lutin_by_godo.jpg) by [Godo](http://godoillustrateur.wordpress.com/), licensed under the terms of the CC-BY-SA 3.0 license.
## Logo
Lutim's logo is an adaptation of [Lutin](http://commons.wikimedia.org/wiki/File:Lutin_by_godo.jpg) by [Godo](http://godoillustrateur.wordpress.com/), licensed under the terms of the CC-BY-SA 3.0 license.
![LUTIm's logo](http://lut.im/img/LUTIm_small.png)
![Lutim's logo](https://lut.im/img/Lutim_small.png)
##Dependencies
* Carton : Perl dependencies manager, it will get what you need, so don't bother for dependencies (but you can read the file `cpanfile` if you want).
## Wiki
```shell
sudo cpan Carton
The official wiki contains all what you need to know about Lutim (installation, API, etc). Go to <https://framagit.org/luc/lutim/wikis/home> or clone it:
```
git clone https://framagit.org/luc/lutim.wiki.git
```
or
## Encryption
```shell
sudo apt-get install carton
```
Lutim does encryption on the server if asked to, but does not store the key.
###Thumbnails dependancy
If you want to provide thumbnails of uploaded images, you have to install the *ImageMagick* image manipulation software (<http://www.imagemagick.org/>) and the Image::Magick CPAN module.
The encryption is made on the server since Lutim is made to be usable even without javascript. If you want to add client-side encryption for javascript-enabled browsers, patches are welcome.
On Debian, you can do:
```shell
sudo apt-get install perlmagick
```
## Internationalization
##Installation
After installing Carton :
```shell
git clone https://github.com/ldidry/lutim.git
cd lutim
carton install
cp lutim.conf.template lutim.conf
vi lutim.conf
```
##Configuration
* hypnotoad: listen to listen to, user and group which runs hypnotoad ;
* contact: write something which make people able to contact you (contact form URL, email address, whatever) ;
* secrets: an array of random string. Used by Mojolicious for encrypting session cookies.
* piwik\_img: the Piwik image provides you records of visits without javascript (better privacy than js and cookies) ;
* length: length of the random string part of image's URL (default is 8) ;
* provis\_step: LUTIm provisions random strings for image's URL per pack of `provis_step` (default is 5) ;
* provisioning: number of random strings to provision (default is 100) ;
* hosted\_by: if someone hosts your LUTIm instance, you can add some HTML (a logo for example) to make it appear on index page ;
* tweet\_card\_via: a Twitter account which will appear on Twitter cards ;
* max\_file\_size: well, this is explicit (default is 10Mio = 10485760 octets) ;
* https: 1 if you want to provide secure images URLs (default is 0) ;
* stats\_day\_num: when you generate statistics with `script/lutim cron stats`, you will have stats for the last `stats_day_num` days (default is 365) ;
* keep\_ip\_during: when you delete IP addresses of image's senders with `script/lutim cron cleanbdd`, the IP addresses of images older than `keep_ip_during` days will be deleted (default is 365) ;
* broadcast\_message: put some string (not HTML) here and this message will be displayed on all LUTIm pages (not in JSON responses) ;
* allowed\_domains: array of authorized domains for API calls. Example: `['http://1.example.com', 'http://2.example.com']`. If you want to authorize everyone to use the API: `['*']`.
* default\_delay: what is the default time limit for files? Valid values are 0, 1, 7, 30 and 365;
* max\_delay: if defined, the images will be deleted after that delay (in days), even if they were uploaded with "no delay" (or value superior to max\_delay) option and a warning message will be displayed on homepage;
# always\_encrypt: if set to 1, all images will be encrypted.
##Usage
```
carton exec hypnotoad script/lutim
```
##Update
```
git pull
carton install
carton exec hypnotoad script/lutim
```
Yup, that's all (Mojolicious magic), it will listen at "http://127.0.0.1:8080".
For more options (interfaces, user, etc.), change the configuration in `lutim.conf` (have a look at http://mojolicio.us/perldoc/Mojo/Server/Hypnotoad#SETTINGS for the available options).
##Reverse proxy
You can use a reverse proxy like Nginx or Varnish (or Apache with the mod\_proxy module). The web is full of tutos.
Here's a valid *Varnish* configuration:
```
backend lutim {
.host = "127.0.0.1";
.port = "8080";
}
sub vcl_recv {
if (req.restarts == 0) {
set req.http.X-Forwarded-For = client.ip;
}
if (req.http.host == "lut.im") {
set req.backend = lutim;
}
}
```
##Cron jobs
LUTIm have commands which can be used in cron jobs.
To see what commands are available:
```shell
carton exec script/lutim cron
```
###Statistics
To generate statistics which can be viewed at the address `/stats` (we need to reload hypnotoad after the stats generation):
```shell
carton exec script/lutim cron stats && carton exec hypnotoad script/lutim
```
###Delete IP adresses from database
To automatically delete the IP addresses of image's senders after a configurable delay:
```shell
carton exec script/lutim cron cleanbdd
```
###Delete expired files
To automatically delete files which availability delay is over (when you choose that your image will be deleted after 24h / one week / etc.)
```shell
carton exec script/lutim cron cleanfiles
```
###Watch the size of the files directory
To execute an action when the files directory is heavier than `max_total_size`.
The available actions are `warn` and `stop-upload`:
* `warn` prints a message on the standard out (which is normally mailed to you by `cron`) ;
* `stop-upload` prints a message on the standard out and creates the `stop-upload` file which prevents uploading and put a warn on LUTIm interface ;
* **DANGEROUS OPTION!!!** `delete` prints a message on the standard out and delete older images until the files directory goes under quota.
If the files directory go under quota, the `stop-upload` file is deleted. If you want to manually prevents uploading, create a file named `stop-upload.manual`.
```shell
carton exec script/lutim cron watch
```
##Broadcast message
Set a string in the `broadcast_message` option of `lutim.conf` and reload the server with:
```shell
carton exec hypnotoad script/lutim
```
It may take a few reloads of page before the message is displayed.
##Encryption
LUTIm do encryption on the server if asked to, but does not store the key.
The encryption is made on the server since LUTIm is made to be usable even without javascript. If you want to add client-side encryption for javascript-enabled browsers, patches are welcome.
##API
You can add images by using the API. Here's the parameters of the `POST` request to `/` adress:.
* format: json
MANDATORY if you want to get a json response, otherwise it will send a web page
* file: the image file
MANDATORY
* delete-day: number of days you want the image to stay
OPTIONAL if 0, it will be available undefinitely
* first-view: 1
OPTIONAL if not 0, the image will be deleted at first view
Lutim comes with English, French and Spanish languages. It will choose the language to display from the browser's settings.
Exemple with curl:
```shell
curl -F "format=json" -F "file=@/tmp/snap0001.jpg" http://lut.im
```
## Authors
You can allow people to use your instance of LUTIm from other domains.
Add the allowed domains as an array in the `allowed_domains` conf option. Put '`[*]`' if you want to allow all domains.
See [AUTHORS.md](AUTHORS.md) file.
##Shutter integration
See where Shutter (<http://en.wikipedia.org/wiki/Shutter_%28software%29>) keeps its plugins on your computer.
On my computer, it's in `/usr/share/shutter/resources/system/upload_plugins/upload`.
## Contribute!
Then:
```
sudo cp utilities/Shutter.pm /usr/share/shutter/resources/system/upload_plugins/upload/Lutim.pm
```
Please consider contributing, either by [reporting issues](https://framagit.org/luc/lutim/issues) or by helping the [internationalization](https://pootle.framasoft.org/projects/lutim/). And of course, code contribution are welcome!
And restart Shutter if it was running.
The details on how to contribute are on the [wiki](https://framagit.org/luc/lutim/wikis/contribute).
Of course, this plugin is configured for the official instance of LUTIm (<http://lut.im>), feel free to edit it for your own instance.
## Others projects dependancies
##Internationalization
LUTIm comes with English and French languages. It will choose the language to display from the browser's settings.
Lutim is written in Perl with the [Mojolicious](http://mojolicio.us) framework.
If you want to add more languages, for example German:
```shell
cd lib/I18N
cp en.pm de.pm
vim de.pm
```
It uses:
There's just a few sentences, so it will be quick to translate. Please consider to send me you language file in order to help the other users :smile:.
##Others projects dependancies
LUTIm is written in Perl with the [Mojolicious](http://mojolicio.us) framework, uses the [Twitter bootstrap](http://getbootstrap.com) framework to look not too ugly, [JQuery](http://jquery.com) and [JQuery File Uploader](https://github.com/danielm/uploader/) (slightly modified) to add some modernity, [Raphaël](http://raphaeljs.com/) and [SimpleGraph](http://benaskins.github.io/simplegraph/) for stats graphs.
##Contributors
* Luc Didry, aka Sky (<http://www.fiat-tux.fr>), main developer
* Jean-Bernard Marcon, aka Goofy (<https://github.com/goofy-bz>)
* Jean-Christophe Bach (<https://github.com/jcb>)
* [Twitter bootstrap](http://getbootstrap.com) framework to look not too ugly
* [JQuery](http://jquery.com) and [JQuery File Uploader](https://github.com/danielm/uploader/) (slightly modified) to add some modernity
* [Raphaël](http://raphaeljs.com/) and [morris.js](http://www.oesmith.co.uk/morris.js/) for stats graphs
* [freezeframe.js](http://freezeframe.chrisantonellis.com/) (slightly modified) to be able to freeze animated gifs in twitter card
* [Moment.js](http://momentjs.com/) for displaying real dates instead of unix timestamps.
* [Fontello](http://fontello.com/) and the [markdown font](https://github.com/dcurtis/markdown-mark/) for the icons, licenses for the fontello icons fonts are in `public/font/LICENSE.txt`
* [Henny Penny](https://www.google.com/fonts/specimen/Henny+Penny) font designed by Olga Umpeleva for [Brownfox](http://brownfox.org)
* [Unite gallery](http://unitegallery.net/) for the gallery
* [JSZip](https://stuk.github.io/jszip/) for generating a zip containing all the images in the gallery
* [FileSaver.js](https://github.com/eligrey/FileSaver.js/) for saving the zip

View File

@@ -1,5 +1,6 @@
{
"vars": {
"@gray-base": "#000",
"@gray-darker": "lighten(#000, 13.5%)",
"@gray-dark": "lighten(#000, 20%)",
"@gray": "lighten(#000, 33.5%)",
@@ -14,6 +15,7 @@
"@text-color": "@gray-dark",
"@link-color": "@brand-primary",
"@link-hover-color": "darken(@link-color, 15%)",
"@link-hover-decoration": "underline",
"@font-family-sans-serif": "\"Helvetica Neue\", Helvetica, Arial, sans-serif",
"@font-family-serif": "Georgia, \"Times New Roman\", Times, serif",
"@font-family-monospace": "Menlo, Monaco, Consolas, \"Courier New\", monospace",
@@ -33,6 +35,9 @@
"@headings-font-weight": "500",
"@headings-line-height": "1.1",
"@headings-color": "inherit",
"@icon-font-path": "\"../fonts/\"",
"@icon-font-name": "\"glyphicons-halflings-regular\"",
"@icon-font-svg-id": "\"glyphicons_halflingsregular\"",
"@padding-base-vertical": "6px",
"@padding-base-horizontal": "12px",
"@padding-large-vertical": "10px",
@@ -77,20 +82,27 @@
"@btn-danger-bg": "@brand-danger",
"@btn-danger-border": "darken(@btn-danger-bg, 5%)",
"@btn-link-disabled-color": "@gray-light",
"@btn-border-radius-base": "@border-radius-base",
"@btn-border-radius-large": "@border-radius-large",
"@btn-border-radius-small": "@border-radius-small",
"@input-bg": "#fff",
"@input-bg-disabled": "@gray-lighter",
"@input-color": "@gray",
"@input-border": "#ccc",
"@input-border-radius": "@border-radius-base",
"@input-border-radius-large": "@border-radius-large",
"@input-border-radius-small": "@border-radius-small",
"@input-border-focus": "#66afe9",
"@input-color-placeholder": "@gray-light",
"@input-height-base": "(@line-height-computed + (@padding-base-vertical * 2) + 2)",
"@input-height-large": "(ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2)",
"@input-height-small": "(floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2)",
"@form-group-margin-bottom": "15px",
"@legend-color": "@gray-dark",
"@legend-border-color": "#e5e5e5",
"@input-group-addon-bg": "@gray-lighter",
"@input-group-addon-border-color": "@input-border",
"@cursor-disabled": "not-allowed",
"@dropdown-bg": "#fff",
"@dropdown-border": "rgba(0,0,0,.15)",
"@dropdown-fallback-border": "#ccc",
@@ -170,7 +182,6 @@
"@nav-link-hover-bg": "@gray-lighter",
"@nav-disabled-link-color": "@gray-light",
"@nav-disabled-link-hover-color": "@gray-light",
"@nav-open-link-hover-color": "#fff",
"@nav-tabs-border-color": "#ddd",
"@nav-tabs-link-hover-border-color": "@gray-lighter",
"@nav-tabs-active-link-hover-bg": "@body-bg",
@@ -205,6 +216,7 @@
"@jumbotron-bg": "@gray-lighter",
"@jumbotron-heading-color": "inherit",
"@jumbotron-font-size": "ceil((@font-size-base * 1.5))",
"@jumbotron-heading-font-size": "ceil((@font-size-base * 4.5))",
"@state-success-text": "#3c763d",
"@state-success-bg": "#dff0d8",
"@state-success-border": "darken(spin(@state-success-bg, -10), 5%)",
@@ -271,6 +283,7 @@
"@alert-danger-border": "@state-danger-border",
"@progress-bg": "#f5f5f5",
"@progress-bar-color": "#fff",
"@progress-border-radius": "@border-radius-base",
"@progress-bar-bg": "@brand-primary",
"@progress-bar-success-bg": "@brand-success",
"@progress-bar-warning-bg": "@brand-warning",
@@ -284,10 +297,16 @@
"@list-group-active-bg": "@component-active-bg",
"@list-group-active-border": "@list-group-active-bg",
"@list-group-active-text-color": "lighten(@list-group-active-bg, 40%)",
"@list-group-disabled-color": "@gray-light",
"@list-group-disabled-bg": "@gray-lighter",
"@list-group-disabled-text-color": "@list-group-disabled-color",
"@list-group-link-color": "#555",
"@list-group-link-hover-color": "@list-group-link-color",
"@list-group-link-heading-color": "#333",
"@panel-bg": "#fff",
"@panel-body-padding": "15px",
"@panel-heading-padding": "10px 15px",
"@panel-footer-padding": "@panel-heading-padding",
"@panel-border-radius": "@border-radius-base",
"@panel-inner-border": "#ddd",
"@panel-footer-bg": "#f5f5f5",
@@ -323,6 +342,7 @@
"@badge-active-color": "@link-color",
"@badge-active-bg": "#fff",
"@badge-font-weight": "bold",
"@badge-line-height": "1",
"@badge-border-radius": "10px",
"@breadcrumb-padding-vertical": "8px",
"@breadcrumb-padding-horizontal": "15px",
@@ -349,6 +369,7 @@
"@pre-color": "@gray-dark",
"@pre-border-color": "#ccc",
"@pre-scrollable-max-height": "340px",
"@component-offset-horizontal": "180px",
"@text-muted": "@gray-light",
"@abbr-border-color": "@gray-light",
"@headings-small-color": "@gray-light",
@@ -356,8 +377,8 @@
"@blockquote-font-size": "(@font-size-base * 1.25)",
"@blockquote-border-color": "@gray-lighter",
"@page-header-border-color": "@gray-lighter",
"@hr-border": "@gray-lighter",
"@component-offset-horizontal": "180px"
"@dl-horizontal-offset": "@component-offset-horizontal",
"@hr-border": "@gray-lighter"
},
"css": [
"print.less",
@@ -366,18 +387,16 @@
"tables.less",
"forms.less",
"buttons.less",
"responsive-utilities.less",
"input-groups.less",
"alerts.less",
"progress-bars.less",
"close.less",
"component-animations.less",
"modals.less",
"utilities.less",
"responsive-utilities.less"
"component-animations.less"
],
"js": [
"alert.js",
"modal.js",
"transition.js"
]
],
"customizerUrl": "http://getbootstrap.com/customize/?id=1ae09bdf270195e14997"
}

View File

@@ -1,8 +1,13 @@
requires 'Mojolicious';
requires 'EV';
requires 'IO::Socket::SSL';
requires 'Data::Validate::URI';
requires 'Net::Domain::TLD', '>= 1.73'; # Must have the last version to handle (at least) .xyz and .link
requires 'Mojolicious::Plugin::I18N';
requires 'Mojolicious::Plugin::AssetPack';
requires 'CSS::Minifier::XS';
requires 'Mojolicious::Plugin::DebugDumperHelper';
requires 'ORLite';
requires 'File::Type';
requires 'Text::Unidecode';
requires 'DateTime';
requires 'Filesys::DiskUsage';
@@ -10,3 +15,11 @@ requires 'Switch';
requires 'Data::Validate::URI';
requires 'Crypt::CBC';
requires 'Crypt::Blowfish';
requires 'Locale::Maketext';
requires 'Locale::Maketext::Extract';
requires 'File::MimeInfo';
requires 'IO::Scalar';
requires 'Image::ExifTool';
requires 'Data::Entropy';
requires 'List::MoreUtils', '> 0.33';
requires 'Archive::Zip';

File diff suppressed because it is too large Load Diff

94
fontello-config.json Normal file
View File

@@ -0,0 +1,94 @@
{
"name": "fontello",
"css_prefix_text": "icon-",
"css_use_suffix": false,
"hinting": true,
"units_per_em": 1000,
"ascent": 850,
"glyphs": [
{
"uid": "12f4ece88e46abd864e40b35e05b11cd",
"css": "ok",
"code": 59392,
"src": "fontawesome"
},
{
"uid": "c5fd349cbd3d23e4ade333789c29c729",
"css": "eye",
"code": 59393,
"src": "fontawesome"
},
{
"uid": "9a76bc135eac17d2c8b8ad4a5774fc87",
"css": "download",
"code": 59394,
"src": "fontawesome"
},
{
"uid": "4aad6bb50b02c18508aae9cbe14e784e",
"css": "share",
"code": 59395,
"src": "fontawesome"
},
{
"uid": "f48ae54adfb27d8ada53d0fd9e34ee10",
"css": "trash",
"code": 59396,
"src": "fontawesome"
},
{
"uid": "2cb15eb2b295ee3c33fab1530e18a924",
"css": "bitcoin",
"code": 59397,
"src": "fontawesome"
},
{
"uid": "e7cb72a17f3b21e3576f35c3f0a7639b",
"css": "git",
"code": 59398,
"src": "fontawesome"
},
{
"uid": "627abcdb627cb1789e009c08e2678ef9",
"css": "twitter",
"code": 59399,
"src": "fontawesome"
},
{
"uid": "1a27e6346cdf0480c9c22351378bebbb",
"css": "clipboard",
"code": 59400,
"src": "typicons"
},
{
"uid": "fccd3ea0efb711b849045bee686b1ceb",
"css": "spinner",
"code": 59401,
"src": "mfglabs"
},
{
"uid": "c71d7db10ede1349b3a8ae0293b1dbf8",
"css": "flattr",
"code": 59402,
"src": "zocial"
},
{
"uid": "499b745a2e2485bdd059c3a53d048e5f",
"css": "cancel",
"code": 59403,
"src": "elusive"
},
{
"uid": "baa375529925294ea0a2bc889c93ba2d",
"css": "picture",
"code": 59404,
"src": "websymbols"
},
{
"uid": "e80ae555c1413a4ec18b33fb348b4049",
"css": "file-archive",
"code": 59405,
"src": "fontawesome"
}
]
}

View File

@@ -3,6 +3,18 @@ use Mojo::Base 'Mojolicious';
use Mojo::Util qw(quote);
use LutimModel;
use Crypt::CBC;
use Data::Entropy qw(entropy_source);
use vars qw($im_loaded);
BEGIN {
eval "use Image::Magick";
if ($@) {
warn "You don't have Image::Magick installed so you won't have thumbnails.";
$im_loaded = 0;
} else {
$im_loaded = 1;
}
}
$ENV{MOJO_TMPDIR} = 'tmp';
mkdir($ENV{MOJO_TMPDIR}, 0700) unless (-d $ENV{MOJO_TMPDIR});
@@ -10,35 +22,48 @@ mkdir($ENV{MOJO_TMPDIR}, 0700) unless (-d $ENV{MOJO_TMPDIR});
sub startup {
my $self = shift;
$self->{wait_for_it} = {};
$self->plugin('I18N');
$self->plugin('AssetPack');
$self->plugin('DebugDumperHelper');
my $config = $self->plugin('Config');
# Default values
$config->{provisioning} = 100 unless (defined($config->{provisionning}));
$config->{provisioning} = 100 unless (defined($config->{provisioning}));
$config->{provis_step} = 5 unless (defined($config->{provis_step}));
$config->{length} = 8 unless (defined($config->{length}));
$config->{always_encrypt} = 0 unless (defined($config->{always_encrypt}));
my $config = $self->plugin('Config', {
default => {
provisioning => 100,
provis_step => 5,
length => 8,
always_encrypt => 0,
anti_flood_delay => 5,
tweet_card_via => '@framasky',
max_file_size => 10*1024*1024,
https => 0,
default_delay => 0,
max_delay => 0,
token_length => 24,
crypto_key_length => 8,
thumbnail_size => 100,
}
});
die "You need to provide a contact information in lutim.conf !" unless (defined($config->{contact}));
$ENV{MOJO_MAX_MESSAGE_SIZE} = $config->{max_file_size} if (defined($config->{max_file_size}));
$ENV{MOJO_MAX_MESSAGE_SIZE} = $config->{max_file_size};
$self->secrets($config->{secrets});
$self->helper(
render_file => sub {
my $c = shift;
my ($filename, $path, $mediatype, $dl, $expires, $nocache, $key) = @_;
my ($filename, $path, $mediatype, $dl, $expires, $nocache, $key, $thumb) = @_;
$filename = quote($filename);
my $asset;
unless ( -f $path && -r _ ) {
unless (-f $path && -r $path) {
$c->app->log->error("Cannot read file [$path]. error [$!]");
$c->flash(
msg => $c->l('image_not_found')
msg => $c->l('Unable to find the image: it has been deleted.')
);
return 500;
}
@@ -47,7 +72,7 @@ sub startup {
my $headers = Mojo::Headers->new();
if ($nocache) {
$headers->add('Cache-Control' => 'no-cache');
$headers->add('Cache-Control' => 'no-cache, no-store, max-age=0, must-revalidate');
} else {
$headers->add('Expires' => $expires);
}
@@ -55,12 +80,23 @@ sub startup {
$headers->add('Content-Disposition' => $dl.';filename='.$filename);
$c->res->content->headers($headers);
$c->app->log->debug($key);
if ($key) {
$asset = $c->decrypt($key, $path);
} else {
$asset = Mojo::Asset::File->new(path => $path);
}
if (defined $thumb && $im_loaded && $mediatype ne 'image/svg+xml' && $mediatype !~ m#image/(x-)?xcf# && $mediatype ne 'image/webp') { # ImageMagick don't work in Debian with svg (for now?)
my $im = Image::Magick->new;
$im->BlobToImage($asset->slurp);
# Create the thumbnail
$im->Resize(geometry=>'x'.$c->config('thumbnail_size'));
# Replace the asset with the thumbnail
$asset = Mojo::Asset::Memory->new->add_chunk($im->ImageToBlob());
}
$c->res->content->asset($asset);
$headers->add('Content-Length' => $asset->size);
@@ -71,14 +107,15 @@ sub startup {
$self->helper(
ip => sub {
my $c = shift;
my $ip_only = shift || 0;
my $proxy = $c->req->headers->header('X-Forwarded-For');
my $proxy = '';
my @x_forward = $c->req->headers->header('X-Forwarded-For');
for my $x (@x_forward) {
$proxy .= join(', ', @$x);
}
my $ip = ($proxy) ? $proxy : $c->tx->remote_address;
return $ip.' Remote port: '.$c->tx->remote_port;
my $remote_port = (defined($c->req->headers->header('X-Remote-Port'))) ? $c->req->headers->header('X-Remote-Port') : $c->tx->remote_port;
return ($ip_only) ? $ip : "$ip remote port:$remote_port";
}
);
@@ -93,14 +130,15 @@ sub startup {
my $short;
do {
$short= $c->shortener($c->config->{length});
} while (LutimModel::Lutim->count('WHERE short = ?', $short) || $short eq 'about' || $short eq 'stats');
} while (LutimModel::Lutim->count('WHERE short = ?', $short) || $short eq 'about' || $short eq 'stats' || $short eq 'd' || $short eq 'm' || $short eq 'gallery' || $short eq 'zip');
LutimModel::Lutim->create(
short => $short,
counter => 0,
enabled => 1,
delete_at_first_view => 0,
delete_at_day => 0
delete_at_day => 0,
mod_token => $c->shortener($c->config->{token_length})
);
LutimModel->commit;
}
@@ -117,7 +155,7 @@ sub startup {
my @chars = ('a'..'z','A'..'Z','0'..'9');
my $result = '';
foreach (1..$length) {
$result .= $chars[rand scalar(@chars)];
$result .= $chars[entropy_source->get_int(scalar(@chars))];
}
return $result;
}
@@ -129,7 +167,7 @@ sub startup {
if (-f 'stop-upload' || -f 'stop-upload.manual') {
$c->stash(
stop_upload => $c->l('stop_upload', $config->{contact})
stop_upload => $c->l('Uploading is currently disabled, please try later or contact the administrator (%1).', $config->{contact})
);
return 1;
}
@@ -141,14 +179,9 @@ sub startup {
max_delay => sub {
my $c = shift;
if (defined($c->config->{max_delay})) {
my $delay = $c->config->{max_delay};
if ($delay >= 0) {
return $delay;
} else {
warn "max_delay set to a negative value. Default to 0."
}
}
return $c->config->{max_delay} if ($c->config->{max_delay} >= 0);
warn "max_delay set to a negative value. Default to 0.";
return 0;
}
);
@@ -157,14 +190,9 @@ sub startup {
default_delay => sub {
my $c = shift;
if (defined($c->config->{default_delay})) {
my $delay = $c->config->{default_delay};
if ($delay >= 0) {
return $delay;
} else {
warn "default_delay set to a negative value. Default to 0."
}
}
return $c->config->{default_delay} if ($c->config->{default_delay} >= 0);
warn "default_delay set to a negative value. Default to 0.";
return 0;
}
);
@@ -184,7 +212,7 @@ sub startup {
my $upload = shift;
my $filename = shift;
my $key = $c->shortener(8);
my $key = $c->shortener($c->config('crypto_key_length'));
my $cipher = Crypt::CBC->new(
-key => $key,
@@ -236,10 +264,21 @@ sub startup {
}
);
$self->helper(
delete_image => sub {
my $c = shift;
my $image = shift;
unlink $image->path();
$image->update(enabled => 0);
}
);
$self->hook(
before_dispatch => sub {
my $c = shift;
$c->stop_upload();
# API allowed domains
if (defined($c->config->{allowed_domains})) {
if ($c->config->{allowed_domains}->[0] eq '*') {
$c->res->headers->header('Access-Control-Allow-Origin' => '*');
@@ -252,15 +291,32 @@ sub startup {
}
}
}
# Scheme detection
if ((defined($c->req->headers->header('X-Forwarded-Proto')) && $c->req->headers->header('X-Forwarded-Proto') eq 'https') || $c->config->{https}) {
$c->req->url->base->scheme('https');
}
}
);
$self->hook(
after_dispatch => sub {
shift->provisioning();
my $c = shift;
$c->provisioning();
# Purge expired anti-flood protection
my $wait_for_it = $c->app->{wait_for_it};
delete @{$wait_for_it}{grep { time - $wait_for_it->{$_} > $c->config->{anti_flood_delay} } keys %{$wait_for_it}} if (defined($wait_for_it));
}
);
$self->asset('index.css' => 'css/bootstrap.min.css', 'css/fontello-embedded.css', 'css/animation.css', 'css/uploader.css', 'css/hennypenny.css', 'css/lutim.css', 'css/markdown.css');
$self->asset('stats.css' => 'css/bootstrap.min.css', 'css/fontello-embedded.css', 'css/morris-0.4.3.min.css', 'css/hennypenny.css', 'css/lutim.css');
$self->asset('about.css' => 'css/bootstrap.min.css', 'css/fontello-embedded.css', 'css/hennypenny.css', 'css/lutim.css');
$self->asset('index.js' => 'js/jquery-2.1.0.min.js', 'js/bootstrap.min.js', 'js/lutim.js', 'js/dmuploader.min.js');
$self->asset('stats.js' => 'js/jquery-2.1.0.min.js', 'js/bootstrap.min.js', 'js/lutim.js', 'js/raphael-min.js', 'js/morris-0.4.3.min.js', 'js/stats.js');
$self->asset('freeze.js' => 'js/jquery-2.1.0.min.js', 'js/freezeframe.min.js');
$self->defaults(layout => 'default');
@@ -287,14 +343,50 @@ sub startup {
to('Controller#stats')->
name('stats');
$r->get('/gallery' => sub {
shift->render(
template => 'gallery',
);
})->name('gallery');
$r->get('/myfiles' => sub {
shift->render(
template => 'myfiles'
);
})->name('myfiles');
$r->get('/manifest.webapp')->
to('Controller#webapp')->
name('manifest.webapp');
$r->get('/zip')
->to('Controller#zip')
->name('zip');
$r->post('/')->
to('Controller#add')->
name('add');
$r->get('/:short')->
$r->get('/d/:short/:token')->
to('Controller#delete')->
name('delete');
$r->post('/m/:short/:token')->
to('Controller#modify')->
name('modify');
$r->post('/c')->
to('Controller#get_counter')->
name('counter');
$r->get('/(:short).(:f)')->
to('Controller#short')->
name('short');
$r->get('/:short')->
to('Controller#short');
$r->get('/:short/(:key).(:f)')->
to('Controller#short');
$r->get('/:short/:key')->
to('Controller#short');
}

View File

@@ -1,4 +1,4 @@
package Mojolicious::Command::cron;
package Lutim::Command::cron;
use Mojo::Base 'Mojolicious::Commands';
has description => 'Execute tasks.';
@@ -7,7 +7,7 @@ has hint => <<EOF;
See 'script/lutim cron help TASK' for more information on a specific task.
EOF
has message => sub { shift->extract_usage . "\nCron tasks:\n" };
has namespaces => sub { ['Mojolicious::Command::cron'] };
has namespaces => sub { ['Lutim::Command::cron'] };
sub help { shift->run(@_) }
@@ -17,7 +17,7 @@ sub help { shift->run(@_) }
=head1 NAME
Mojolicious::Command::cron - Cron commands
Lutim::Command::cron - Cron commands
=head1 SYNOPSIS

View File

@@ -1,8 +1,9 @@
package Mojolicious::Command::cron::cleanbdd;
package Lutim::Command::cron::cleanbdd;
use Mojo::Base 'Mojolicious::Command';
use LutimModel;
use Mojo::Util qw(slurp decode);
use Mojolicious::Plugin::Config;
use FindBin qw($Bin);
use File::Spec qw(catfile);
has description => 'Delete IP addresses from database after configured delay.';
has usage => sub { shift->extract_usage };
@@ -10,9 +11,12 @@ has usage => sub { shift->extract_usage };
sub run {
my $c = shift;
my $config = Mojolicious::Plugin::Config->parse(decode('UTF-8', slurp 'lutim.conf'), 'lutim.conf');
$config->{keep_ip_during} = (defined($config->{keep_ip_during})) ? $config->{keep_ip_during} : 365;
my $config = $c->app->plugin('Config', {
file => File::Spec->catfile($Bin, '..' ,'lutim.conf'),
default => {
keep_ip_during => 365,
}
});
my $separation = time() - $config->{keep_ip_during} * 86400;
@@ -27,7 +31,7 @@ sub run {
=head1 NAME
Mojolicious::Command::cron::cleanbdd - Delete IP addresses from database after configured delay
Lutim::Command::cron::cleanbdd - Delete IP addresses from database after configured delay
=head1 SYNOPSIS

View File

@@ -0,0 +1,49 @@
package Lutim::Command::cron::cleanfiles;
use Mojo::Base 'Mojolicious::Command';
use LutimModel;
use Lutim;
use Mojo::Util qw(slurp decode);
use FindBin qw($Bin);
use File::Spec qw(catfile);
has description => 'Delete expired files.';
has usage => sub { shift->extract_usage };
sub run {
my $c = shift;
my $l = Lutim->new;
my $time = time();
my @images = LutimModel::Lutim->select('WHERE enabled = 1 AND (delete_at_day * 86400) < (? - created_at) AND delete_at_day != 0', $time);
for my $image (@images) {
$l->app->delete_image($image);
}
my $config = $c->app->plugin('Config', {
file => File::Spec->catfile($Bin, '..' ,'lutim.conf'),
});
if (defined($config->{delete_no_longer_viewed_files}) && $config->{delete_no_longer_viewed_files} > 0) {
$time = time() - $config->{delete_no_longer_viewed_files} * 86400;
@images = LutimModel::Lutim->select('WHERE enabled = 1 AND last_access_at < ?', $time);
for my $image (@images) {
$l->app->delete_image($image);
}
}
}
=encoding utf8
=head1 NAME
Lutim::Command::cron::cleanfiles - Delete expired files
=head1 SYNOPSIS
Usage: script/lutim cron cleanfiles
=cut
1;

View File

@@ -1,19 +1,24 @@
package Mojolicious::Command::cron::stats;
package Lutim::Command::cron::stats;
use Mojo::Base 'Mojolicious::Command';
use LutimModel;
use Mojo::DOM;
use Mojo::Util qw(slurp spurt decode);
use DateTime;
use Mojolicious::Plugin::Config;
use FindBin qw($Bin);
use File::Spec qw(catfile);
has description => 'Generate statistics about LUTIm.';
has description => 'Generate statistics about Lutim.';
has usage => sub { shift->extract_usage };
sub run {
my $c = shift;
my $config = Mojolicious::Plugin::Config->parse(decode('UTF-8', slurp 'lutim.conf'), 'lutim.conf');
$config->{stats_day_num} = (defined($config->{stats_day_num})) ? $config->{stats_day_num} : 365;
my $config = $c->app->plugin('Config', {
file => File::Spec->catfile($Bin, '..' ,'lutim.conf'),
default => {
stats_day_num => 365
}
});
my $text = slurp('templates/data.html.ep.template');
my $dom = Mojo::DOM->new($text);
@@ -36,9 +41,9 @@ sub run {
}
my $total = LutimModel::Lutim->count('WHERE path IS NOT NULL AND created_at < ?', $separation);
for my $year (sort keys %data) {
for my $month (sort keys %{$data{$year}}) {
for my $day (sort keys %{$data{$year}->{$month}}) {
for my $year (sort {$a <=> $b} keys %data) {
for my $month (sort {$a <=> $b} keys %{$data{$year}}) {
for my $day (sort {$a <=> $b} keys %{$data{$year}->{$month}}) {
$thead_tr->append_content('<th>'."$day/$month/$year".'</th>'."\n");
$tbody_tr->append_content('<td>'.$data{$year}->{$month}->{$day}.'</td>'."\n");
$total += $data{$year}->{$month}->{$day};
@@ -53,7 +58,7 @@ sub run {
=head1 NAME
Mojolicious::Command::cron::stats - Stats generator
Lutim::Command::cron::stats - Stats generator
=head1 SYNOPSIS

View File

@@ -0,0 +1,70 @@
package Lutim::Command::cron::watch;
use Mojo::Base 'Mojolicious::Command';
use Mojo::Util qw(slurp decode);
use Filesys::DiskUsage qw/du/;
use LutimModel;
use Switch;
use FindBin qw($Bin);
use File::Spec qw(catfile);
has description => 'Watch the files directory and take action when over quota';
has usage => sub { shift->extract_usage };
sub run {
my $c = shift;
my $config = $c->app->plugin('Config', {
file => File::Spec->catfile($Bin, '..' ,'lutim.conf'),
default => {
policy_when_full => 'warn'
}
});
if (defined($config->{max_total_size})) {
my $total = du(qw/files/);
if ($total > $config->{max_total_size}) {
say "[Lutim cron job watch] Files directory is over quota ($total > ".$config->{max_total_size}.")";
switch ($config->{policy_when_full}) {
case 'warn' {
say "[Lutim cron job watch] Please, delete some files or increase quota (".$config->{max_total_size}.")";
}
case 'stop-upload' {
open (my $fh, '>', 'stop-upload') or die ("Couldn't open stop-upload: $!");
close($fh);
say '[Lutim cron job watch] Uploads are stopped. Delete some images and the stop-upload file to reallow uploads.';
}
case 'delete' {
say '[Lutim cron job watch] Older files are being deleted';
do {
for my $img (LutimModel::Lutim->select('WHERE path IS NOT NULL AND enabled = 1 ORDER BY created_at ASC LIMIT 50')) {
unlink $img->path() or warn "Could not unlink ".$img->path.": $!";
$img->update(enabled => 0);
}
} while (du(qw/files/) > $config->{max_total_size});
}
else {
say '[Lutim cron job watch] Unrecognized policy_when_full option: '.$config->{policy_when_full}.'. Aborting.';
}
}
} else {
unlink 'stop-upload' if (-f 'stop-upload');
}
} else {
say "[Lutim cron job watch] No max_total_size found in the configuration file. Aborting.";
}
}
=encoding utf8
=head1 NAME
Lutim::Command::cron::watch - Watch the files directory and take action when over quota
=head1 SYNOPSIS
Usage: script/lutim cron watch
=cut
1;

View File

@@ -2,11 +2,16 @@
package Lutim::Controller;
use Mojo::Base 'Mojolicious::Controller';
use Mojo::Util qw(url_unescape b64_encode);
use Mojo::Asset::Memory;
use Mojo::JSON qw(true false);
use DateTime;
use File::Type;
use Digest::file qw(digest_file_hex);
use Text::Unidecode;
use Data::Validate::URI qw(is_http_uri is_https_uri);
use File::MimeInfo::Magic qw(mimetype extensions);
use IO::Scalar;
use Image::ExifTool;
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
use vars qw($im_loaded);
BEGIN {
@@ -46,28 +51,224 @@ sub stats {
);
}
sub webapp {
my $c = shift;
my $headers = Mojo::Headers->new();
$headers->add('Content-Type' => 'application/x-web-app-manifest+json');
$c->res->content->headers($headers);
$c->render(
template => 'manifest',
format => 'webapp'
);
}
sub get_counter {
my $c = shift;
my $short = $c->param('short');
my $token = $c->param('token');
my @images = LutimModel::Lutim->select('WHERE short = ? AND path IS NOT NULL AND mod_token = ?', ($short, $token));
if (scalar(@images)) {
return $c->render(
json => {
success => true,
counter => $images[0]->counter,
enabled => ($images[0]->enabled) ? true : false
}
);
}
$c->render(
json => {
success => false,
msg => $c->l('Unable to get counter')
}
);
}
sub modify {
my $c = shift;
my $short = $c->param('short');
my $token = $c->param('token');
my $url = $c->param('url');
my @images = LutimModel::Lutim->select('WHERE short = ? AND path IS NOT NULL', $short);
if (scalar(@images)) {
my $image = $images[0];
my $msg;
if ($image->mod_token() ne $token || $token eq '') {
$msg = $c->l('The delete token is invalid.');
} else {
$c->app->log->info('[MODIFICATION] someone modify '.$image->filename.' with token method (path: '.$image->path.')');
$image->update(
delete_at_day => ($c->param('delete-day') && ($c->param('delete-day') <= $c->max_delay || $c->max_delay == 0)) ? $c->param('delete-day') : $c->max_delay,
delete_at_first_view => ($c->param('first-view')) ? 1 : 0,
);
$msg = $c->l('The image\'s delay has been successfully modified');
if (defined($c->param('format')) && $c->param('format') eq 'json') {
return $c->render(
json => {
success => Mojo::JSON->true,
msg => $msg
}
);
} else {
$msg .= ' (<a href="'.$url.'">'.$url.'</a>)' unless (!defined($url));
$c->flash(
success => $msg
);
return $c->redirect_to('/');
}
}
if (defined($c->param('format')) && $c->param('format') eq 'json') {
return $c->render(
json => {
success => Mojo::JSON->false,
msg => $msg
}
);
} else {
$c->flash(
msg => $msg
);
return $c->redirect_to('/');
}
} else {
$c->app->log->info('[UNSUCCESSFUL] someone tried to modify '.$short.' but it does\'nt exist.');
# Image never existed
my $msg = $c->l('Unable to find the image %1.', $short);
if (defined($c->param('format')) && $c->param('format') eq 'json') {
return $c->render(
json => {
success => Mojo::JSON->false,
msg => $msg
}
);
} else {
$c->flash(
msg => $msg
);
return $c->redirect_to('/');
}
}
}
sub delete {
my $c = shift;
my $short = $c->param('short');
my $token = $c->param('token');
my @images = LutimModel::Lutim->select('WHERE short = ? AND path IS NOT NULL', $short);
if (scalar(@images)) {
my $image = $images[0];
my $msg;
if ($image->mod_token() ne $token || $token eq '') {
$msg = $c->l('The delete token is invalid.');
} elsif ($image->enabled() == 0) {
$msg = $c->l('The image %1 has already been deleted.', $image->filename);
} else {
$c->app->log->info('[DELETION] someone made '.$image->filename.' removed with token method (path: '.$image->path.')');
$c->delete_image($image);
return $c->respond_to(
json => {
json => {
success => true,
msg => $c->l('The image %1 has been successfully deleted', $image->filename)
}
},
any => sub {
$c->flash(
success => $c->l('The image %1 has been successfully deleted', $image->filename)
);
return $c->redirect_to('/');
}
);
}
return $c->respond_to(
json => {
json => {
success => false,
msg => $msg
}
},
any => sub {
$c->flash(
msg => $msg
);
return $c->redirect_to('/');
}
);
} else {
$c->app->log->info('[UNSUCCESSFUL] someone tried to delete '.$short.' but it does\'nt exist.');
# Image never existed
return $c->respond_to(
json => {
json => {
success => false,
msg => $c->l('Unable to find the image %1.', $short)
}
},
any => sub {
shift->render_not_found;
}
);
}
}
sub add {
my $c = shift;
my $upload = $c->param('file');
my $file_url = $c->param('lutim-file-url');
my $c = shift;
my $upload = $c->param('file');
my $file_url = $c->param('lutim-file-url');
my $keep_exif = $c->param('keep-exif');
if(!defined($c->stash('stop_upload'))) {
if (defined($file_url) && $file_url) {
if (is_http_uri($file_url) || is_https_uri($file_url)) {
# Anti-flood protection
my $ip = $c->ip(1);
while (defined($c->app->{wait_for_it}->{$ip}) && (time - $c->app->{wait_for_it}->{$ip}) <= $c->config->{anti_flood_delay} ) {
sleep($c->config->{anti_flood_delay});
}
my $ua = Mojo::UserAgent->new;
my $tx = $ua->get($file_url => {DNT => 1});
if (my $res = $tx->success) {
$file_url = url_unescape $file_url;
$file_url =~ m#^.*/([^/]*)$#;
$file_url =~ m#^.*/([^/?]*)\??.*$#;
my $filename = $1;
$filename = 'uploaded.image' unless (defined($filename));
$filename .= '.image' if (index($filename, '.') == -1);
$upload = Mojo::Upload->new(
asset => $tx->res->content->asset,
asset => $res->content->asset,
filename => $filename
);
$c->app->{wait_for_it}->{$ip} = time;
} elsif ($tx->res->is_limit_exceeded) {
my $msg = $c->l('The file exceed the size limit (%1)', $tx->res->max_message_size);
if (defined($c->param('format')) && $c->param('format') eq 'json') {
return $c->render(
json => {
success => Mojo::JSON->false,
msg => {
filename => $file_url,
msg => $msg
}
}
);
} else {
$c->flash(msg => $msg);
$c->flash(filename => $upload->filename);
return $c->redirect_to('/');
}
} else {
my $msg = $c->l('download_error');
my $msg = $c->l('An error occured while downloading the image.');
$c->app->log->warn('[DOWNLOAD ERROR]'.$c->dumper($tx->error));
if (defined($c->param('format')) && $c->param('format') eq 'json') {
return $c->render(
json => {
@@ -85,7 +286,7 @@ sub add {
}
}
} else {
my $msg = $c->l('no_valid_url');
my $msg = $c->l('The URL is not valid.');
if (defined($c->param('format')) && $c->param('format') eq 'json') {
return $c->render(
json => {
@@ -104,19 +305,21 @@ sub add {
}
}
my $ft = File::Type->new();
my $mediatype = $ft->mime_type($upload->slurp());
my $io_scalar = new IO::Scalar \$upload->slurp();
my $mediatype = mimetype($io_scalar);
my ($ext) = ($upload->filename =~ m/.*\.(.*)$/);
my $ip = $c->ip;
my ($msg, $short, $thumb);
my ($msg, $short, $real_short, $token, $thumb, $limit, $created);
# Check file type
if (index($mediatype, 'image/') >= 0) {
# Create directory if needed
mkdir('files', 0700) unless (-d 'files');
if ($c->req->is_limit_exceeded) {
$msg = l('file_too_big', $c->req->max_message_size);
$msg = $c->l('The file exceed the size limit (%1)', $c->req->max_message_size);
if (defined($c->param('format')) && $c->param('format') eq 'json') {
return $c->render(
json => {
@@ -137,53 +340,111 @@ sub add {
my $filename = unidecode($upload->filename);
my $ext = ($filename =~ m/([^.]+)$/)[0];
my $path = 'files/'.$records[0]->short.'.'.$ext;
if ($im_loaded) {
my $im = Image::Magick->new;
my ($width, $height);
if ($im_loaded && $mediatype ne 'image/svg+xml' && $mediatype !~ m#image/(x-)?xcf# && $mediatype ne 'image/webp') { # ImageMagick don't work in Debian with svg (for now?)
my $im = Image::Magick->new;
$im->BlobToImage($upload->slurp);
# Automatic rotation from EXIF tag
$im->AutoOrient();
# Update the uploaded file with it's auto-rotated clone
my $asset = Mojo::Asset::Memory->new->add_chunk($im->ImageToBlob());
$upload->asset($asset);
# Create the thumbnail
$width = $im->Get('width');
$height = $im->Get('height');
$im->Resize(geometry=>'x85');
$thumb = 'data:'.$mediatype.';base64,';
$thumb .= b64_encode $im->ImageToBlob();
if ($mediatype eq 'image/gif') {
$thumb .= b64_encode $im->[0]->ImageToBlob();
} else {
$thumb .= b64_encode $im->ImageToBlob();
}
}
unless ((defined($keep_exif) && $keep_exif) || $mediatype eq 'image/svg+xml' || $mediatype !~ m#image/(x-)?xcf# || $mediatype ne 'image/webp') {
# Remove the EXIF tags
my $data = new IO::Scalar \$upload->slurp();
my $et = new Image::ExifTool;
# Use $data in Image::ExifTool object
$et->ExtractInfo($data);
# Remove all metadata
$et->SetNewValue('*', undef);
# Create a temporary IO::Scalar to write into
my $temp;
my $a = new IO::Scalar \$temp;
$et->WriteInfo($data, $a);
# Update the uploaded file with it's no-tags clone
$data = Mojo::Asset::Memory->new->add_chunk($temp);
$upload->asset($data);
}
my $key;
if ($c->param('crypt') || $c->config->{always_encrypt}) {
($upload, $key) = $c->crypt($upload, $filename);
}
$upload->move_to($path);
$records[0]->update(
path => $path,
filename => $filename,
mediatype => $mediatype,
footprint => digest_file_hex($path, 'SHA-512'),
enabled => 1,
delete_at_day => ($c->param('delete-day')) ? $c->param('delete-day') : $c->max_delay,
delete_at_day => ($c->param('delete-day') && ($c->param('delete-day') <= $c->max_delay || $c->max_delay == 0)) ? $c->param('delete-day') : $c->max_delay,
delete_at_first_view => ($c->param('first-view')) ? 1 : 0,
created_at => time(),
created_by => $ip
created_by => $ip,
width => $width,
height => $height
);
# Log image creation
$c->app->log->info('[CREATION] '.$c->ip.' pushed '.$filename.' (path: '.$path.')');
$c->app->log->info('[CREATION] '.$ip.' pushed '.$filename.' (path: '.$path.')');
# Give url to user
$short = $records[0]->short;
$short .= '/'.$key if (defined($key));
$short = $records[0]->short;
$real_short = $short;
if (!defined($records[0]->mod_token)) {
$records[0]->update(
mod_token => $c->shortener($c->config->{token_length})
);
}
$token = $records[0]->mod_token;
$short .= '/'.$key if (defined($key));
$limit = $records[0]->delete_at_day;
$created = $records[0]->created_at;
} else {
# Houston, we have a problem
$msg = $c->l('no_more_short', $c->config->{contact});
$msg = $c->l('There is no more available URL. Retry or contact the administrator. %1', $c->config->{contact});
}
}
LutimModel->commit;
} else {
$msg = $c->l('no_valid_file', $upload->filename);
$msg = $c->l('The file %1 is not an image.', $upload->filename);
}
if (defined($c->param('format')) && $c->param('format') eq 'json') {
if (defined($short)) {
$msg = {
filename => $upload->filename,
short => $short,
thumb => $thumb
filename => $upload->filename,
short => $short,
real_short => $real_short,
token => $token,
ext => $ext || extensions($mediatype),
thumb => $thumb,
del_at_view => ($c->param('first-view')) ? true : false,
limit => $limit,
created_at => $created
};
} else {
$msg = {
@@ -203,9 +464,12 @@ sub add {
$c->flash(filename => $upload->filename);
return $c->redirect_to('/');
} else {
$c->stash(short => $short) if (defined($short));
$c->stash(thumb => $thumb);
$c->stash(filename => $upload->filename);
$c->stash(short => $short) if (defined($short));
$c->stash(real_short => $real_short);
$c->stash(token => $token);
$c->stash(ext => $ext || extensions($mediatype));
$c->stash(thumb => $thumb);
$c->stash(filename => $upload->filename);
return $c->render(
template => 'index',
max_file_size => $c->req->max_message_size
@@ -236,6 +500,7 @@ sub short {
my $short = $c->param('short');
my $touit = $c->param('t');
my $key = $c->param('key');
my $thumb = $c->param('thumb');
my $dl = (defined($c->param('dl'))) ? 'attachment' : 'inline';
my @images = LutimModel::Lutim->select('WHERE short = ? AND ENABLED = 1 AND path IS NOT NULL', $short);
@@ -246,12 +511,11 @@ sub short {
$c->app->log->info('[DELETION] someone tried to view '.$images[0]->filename.' but it has been removed by expiration (path: '.$images[0]->path.')');
# Delete image
unlink $images[0]->path();
$images[0]->update(enabled => 0);
$c->delete_image($images[0]);
# Warn user
$c->flash(
msg => $c->l('image_not_found')
msg => $c->l('Unable to find the image: it has been deleted.')
);
return $c->redirect_to('/');
}
@@ -261,19 +525,53 @@ sub short {
$test = 1;
my $short = $images[0]->short;
$short .= '/'.$key if (defined($key));
my ($width, $height) = (340,340);
if ($images[0]->mediatype eq 'image/gif') {
if (defined($images[0]->width) && defined($images[0]->height)) {
($width, $height) = ($images[0]->width, $images[0]->height);
} elsif ($im_loaded) {
my $upload = $c->decrypt($key, $images[0]->path);
my $im = Image::Magick->new;
$im->BlobToImage($upload->slurp);
$width = $im->Get('width');
$height = $im->Get('height');
$images[0]->update(
width => $width,
height => $height
);
}
}
return $c->render(
template => 'twitter',
layout => undef,
short => $short,
filename => $images[0]->filename
filename => $images[0]->filename,
mimetype => ($c->req->url->to_abs()->scheme eq 'https') ? $images[0]->mediatype : '',
width => $width,
height => $height
);
} else {
my $expires = ($images[0]->delete_at_day) ? $images[0]->delete_at_day : 360;
my $dt = DateTime->from_epoch( epoch => $expires * 86400 + $images[0]->created_at);
$dt->set_time_zone('GMT');
$expires = $dt->strftime("%a, %d %b %Y %H:%M:%S GMT");
# Delete image if needed
if ($images[0]->delete_at_first_view && $images[0]->counter >= 1) {
# Log deletion
$c->app->log->info('[DELETION] someone made '.$images[0]->filename.' removed (path: '.$images[0]->path.')');
$test = $c->render_file($images[0]->filename, $images[0]->path, $images[0]->mediatype, $dl, $expires, $images[0]->delete_at_first_view, $key);
# Delete image
$c->delete_image($images[0]);
$c->flash(
msg => $c->l('Unable to find the image: it has been deleted.')
);
return $c->redirect_to('/');
} else {
my $expires = ($images[0]->delete_at_day) ? $images[0]->delete_at_day : 360;
my $dt = DateTime->from_epoch( epoch => $expires * 86400 + $images[0]->created_at);
$dt->set_time_zone('GMT');
$expires = $dt->strftime("%a, %d %b %Y %H:%M:%S GMT");
$test = $c->render_file($images[0]->filename, $images[0]->path, $images[0]->mediatype, $dl, $expires, $images[0]->delete_at_first_view, $key, $thumb);
}
}
if ($test != 500) {
@@ -294,8 +592,7 @@ sub short {
$c->app->log->info('[DELETION] someone made '.$images[0]->filename.' removed (path: '.$images[0]->path.')');
# Delete image
unlink $images[0]->path();
$images[0]->update(enabled => 0);
$c->delete_image($images[0]);
}
});
}
@@ -304,11 +601,11 @@ sub short {
if (scalar(@images)) {
# Log access try
$c->app->log->info('[NOT FOUND] someone tried to view '.$short.' but it does\'nt exist.');
$c->app->log->info('[NOT FOUND] someone tried to view '.$short.' but it does\'nt exist anymore.');
# Warn user
$c->flash(
msg => $c->l('image_not_found')
msg => $c->l('Unable to find the image: it has been deleted.')
);
return $c->redirect_to('/');
} else {
@@ -318,4 +615,109 @@ sub short {
}
}
sub zip {
my $c = shift;
my $imgs = $c->every_param('i');
my $zip = Archive::Zip->new();
# We HAVE to add a png file at the beginning, otherwise the $zip
# could use the mimetype of an SVG file if it's the first file asked.
$zip->addFile('public/img/favicon.png', 'hosted_with_lutim.png');
$zip->addDirectory('images/');
for my $img (@{$imgs}) {
my ($short, $key) = split('/', $img);
if (defined $key) {
$key =~ s/\.[^.]*//;
} else {
$short =~ s/\.[^.]*//;
}
my @images = LutimModel::Lutim->select('WHERE short = ? AND ENABLED = 1 AND path IS NOT NULL', $short);
if (scalar(@images)) {
my $filename = $images[0]->filename;
if($images[0]->delete_at_day && $images[0]->created_at + $images[0]->delete_at_day * 86400 <= time()) {
# Log deletion
$c->app->log->info('[DELETION] someone tried to view '.$images[0]->filename.' but it has been removed by expiration (path: '.$images[0]->path.')');
# Delete image
$c->delete_image($images[0]);
# Warn user
$zip->addString($c->l('Unable to find the image: it has been deleted.'), 'images/'.$filename.'.txt');
next;
}
# Delete image if needed
if ($images[0]->delete_at_first_view && $images[0]->counter >= 1) {
# Log deletion
$c->app->log->info('[DELETION] someone made '.$images[0]->filename.' removed (path: '.$images[0]->path.')');
# Delete image
$c->delete_image($images[0]);
$zip->addString($c->l('Unable to find the image: it has been deleted.'), 'images/'.$filename.'.txt');
next;
} else {
my $expires = ($images[0]->delete_at_day) ? $images[0]->delete_at_day : 360;
my $dt = DateTime->from_epoch( epoch => $expires * 86400 + $images[0]->created_at);
$dt->set_time_zone('GMT');
$expires = $dt->strftime("%a, %d %b %Y %H:%M:%S GMT");
my $path = $images[0]->path;
unless ( -f $path && -r $path ) {
$c->app->log->error("Cannot read file [$path]. error [$!]");
$zip->addString($c->l('Unable to find the image: it has been deleted.'), 'images/'.$filename.'.txt');
next;
}
if ($key) {
$zip->addString($c->decrypt($key, $path)->slurp, "images/$filename");
} else {
$zip->addFile($path, "images/$filename");
}
# Log access
$c->app->log->info('[VIEW] someone viewed '.$images[0]->filename.' (path: '.$images[0]->path.')');
# Update counter
$images[0]->update(counter => $images[0]->counter + 1);
# Update record
$images[0]->update(last_access_at => time());
}
} else {
@images = LutimModel::Lutim->select('WHERE short = ? AND ENABLED = 0 AND path IS NOT NULL', $short);
if (scalar(@images)) {
# Log access try
$c->app->log->info('[NOT FOUND] someone tried to view '.$short.' but it does\'nt exist anymore.');
# Warn user
$zip->addString($c->l('Unable to find the image: it has been deleted.'), 'images/'.$images[0]->filename.'.txt');
next;
} else {
$zip->addString($c->l('Image not found.'), 'images/'.$short.'.txt');
next;
}
}
}
my ($fh, $zipfile) = Archive::Zip::tempFile();
unless ($zip->writeToFileNamed($zipfile) == AZ_OK) {
$c->flash(
msg => $c->l('Something went wrong when creating the zip file. Try again later or contact the administrator (%1).', $c->config('contact'))
);
return $c->redirect_to('/');
}
$c->res->content->headers->content_type('application/zip;name=images.zip');
$c->res->content->headers->content_disposition('attachment;filename=images.zip');;
my $asset = Mojo::Asset::File->new(path => $zipfile);
$c->res->content->asset($asset);
$c->res->content->headers->content_length($asset->size);
unlink $zipfile;
return $c->rendered(200);
}
1;

12
lib/Lutim/I18N.pm Normal file
View File

@@ -0,0 +1,12 @@
package Lutim::I18N;
use base 'Locale::Maketext';
use File::Basename qw/dirname/;
use Locale::Maketext::Lexicon {
_auto => 1,
_decode => 1,
_style => 'gettext',
'*' => [Gettext => dirname(__FILE__) . '/I18N/*.po']
};
1;

479
lib/Lutim/I18N/de.po Normal file
View File

@@ -0,0 +1,479 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Translators:
# Thor77 <thor77@thor77.org>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Lutim\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2015-09-18 13:34+0000\n"
"Last-Translator: Thor77 <thor77@thor77.org>\n"
"Language-Team: German (http://www.transifex.com/fiat-tux/lutim/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. ($delay)
#. (config('max_delay')
#: templates/partial/lutim.js.ep:238
#: templates/partial/lutim.js.ep:247
#: templates/partial/lutim.js.ep:248
msgid "%1 days"
msgstr "%1 Tage"
#. ($total)
#: templates/stats.html.ep:2
msgid "%1 sent images on this instance from beginning."
msgstr "%1 Bilder wurden bisher über diese Instanz versendet."
#: templates/index.html.ep:190
msgid "-or-"
msgstr "-oder-"
#: templates/index.html.ep:5
msgid "1 year"
msgstr "1 Jahr"
#: templates/index.html.ep:4
#: templates/partial/lutim.js.ep:247
msgid "24 hours"
msgstr "24 Stunden"
#: templates/myfiles.html.ep:79
msgid ": Error while trying to get the counter."
msgstr ":Fehler beim Abrufen des Zählers."
#: lib/Lutim/Controller.pm:270
msgid "An error occured while downloading the image."
msgstr "Beim Herunterladen des Bildes ist ein Fehler aufgetreten."
#: templates/about.html.ep:40
#: templates/myfiles.html.ep:27
#: templates/stats.html.ep:13
msgid "Back to homepage"
msgstr "Zurück zur Hauptseite"
#: templates/index.html.ep:193
#: templates/index.html.ep:194
msgid "Click to open the file browser"
msgstr "Klicken um den Dateibrowser zu öffnen"
#: templates/about.html.ep:30
msgid "Contributors"
msgstr "Mitwirkende"
#: templates/partial/lutim.js.ep:313
#: templates/partial/lutim.js.ep:361
#: templates/partial/lutim.js.ep:435
msgid "Copy all view links to clipboard"
msgstr "Alle Links zum Anschauen in die Zwischenablage kopieren"
#: templates/index.html.ep:18
#: templates/index.html.ep:36
#: templates/index.html.ep:69
#: templates/index.html.ep:77
#: templates/index.html.ep:85
#: templates/index.html.ep:93
#: templates/partial/lutim.js.ep:180
#: templates/partial/lutim.js.ep:192
#: templates/partial/lutim.js.ep:206
#: templates/partial/lutim.js.ep:220
msgid "Copy to clipboard"
msgstr "In die Zwischenablage kopieren"
#: templates/myfiles.html.ep:15
msgid "Counter"
msgstr "Zähler"
#: templates/index.html.ep:115
#: templates/index.html.ep:147
#: templates/index.html.ep:178
#: templates/myfiles.html.ep:16
#: templates/partial/lutim.js.ep:259
msgid "Delete at first view?"
msgstr "Nach erstem Aufruf löschen?"
#: templates/index.html.ep:98
#: templates/myfiles.html.ep:19
#: templates/partial/common.js.ep:36
msgid "Deletion link"
msgstr "Link zum Löschen"
#: templates/gallery.html.ep:6
#: templates/gallery.html.ep:63
msgid "Download all images"
msgstr "Laden Sie alle Bilder"
#: templates/index.html.ep:81
#: templates/index.html.ep:83
#: templates/partial/lutim.js.ep:198
#: templates/partial/lutim.js.ep:202
msgid "Download link"
msgstr "Link zum Herunterladen"
#: templates/index.html.ep:28
#: templates/index.html.ep:31
msgid "Download zip link"
msgstr "Link zum Archivbilder"
#: templates/index.html.ep:189
msgid "Drag & drop images here"
msgstr "Bilder hierher ziehen"
#: templates/about.html.ep:7
msgid "Drag and drop an image in the appropriate area or use the traditional way to send files and Lutim will provide you four URLs. One to view the image, an other to directly download it, one you can use on social networks and a last to delete the image when you want."
msgstr "Ziehe Bilder in den dafür vorgesehenen Bereich und Lutim wird vier URLs generieren. Eine zum Anschauen, eine zum direkten Herunterladen, eine zum Nutzen in sozialen Netzwerken und eine letzte um das Bild zu löschen."
#: templates/index.html.ep:150
#: templates/index.html.ep:181
msgid "Encrypt the image (Lutim does not keep the key)."
msgstr "Verschlüssle das Bild (Lutim behält den Key nicht)"
#: templates/partial/lutim.js.ep:74
msgid "Error while trying to modify the image."
msgstr "Beim bearbeiten des Bildes ist ein Fehler aufgetreten."
#: templates/stats.html.ep:9
msgid "Evolution of total files"
msgstr "Entwicklung der Anzahl an Dateien"
#: templates/myfiles.html.ep:18
msgid "Expires at"
msgstr "Läuft ab am"
#: templates/myfiles.html.ep:13
msgid "File name"
msgstr "Dateiname"
#: templates/about.html.ep:24
msgid "For more details, see the <a href=\"https://framagit.org/luc/lutim\">homepage of the project</a>."
msgstr "Besuche für mehr Details die <a href=\"https://framagit.org/luc/lutim\">Homepage des Projekts</a>."
#: templates/layouts/default.html.ep:50
msgid "Fork me!"
msgstr "Fork me!"
#: templates/index.html.ep:10
#: templates/index.html.ep:13
msgid "Gallery link"
msgstr "Link zur Galerie"
#: templates/partial/lutim.js.ep:127
#: templates/partial/lutim.js.ep:145
msgid "Hit Enter, then Ctrl+C to copy the short link"
msgstr "Drücke Enter und dann STRG+C um den Kurz-Link zu kopieren."
#: templates/layouts/default.html.ep:45
msgid "Homepage"
msgstr "Webseite"
#: templates/about.html.ep:20
msgid "How do you pronounce Lutim?"
msgstr "Wie spricht man Lutim aus?"
#: templates/about.html.ep:6
msgid "How does it work?"
msgstr "Wie funktionert das?"
#: templates/about.html.ep:18
msgid "How to report an image?"
msgstr "Wie kann ich ein Bild melden?"
#: templates/about.html.ep:14
msgid "If the files are deleted if you ask it while posting it, their SHA512 footprint are retained."
msgstr "Wenn du versuchst, ein Bild während dem Hochladen zu löschen, wird die SHA512-Summe des Bildes behalten."
#: templates/index.html.ep:163
#: templates/index.html.ep:203
msgid "Image URL"
msgstr "Bild-URL"
#: lib/Lutim/Controller.pm:711
msgid "Image not found."
msgstr "Bild nicht gefunden"
#: templates/layouts/default.html.ep:49
msgid "Informations"
msgstr "Informationen"
#: templates/layouts/default.html.ep:55
msgid "Install webapp"
msgstr "Installiere die Webapp"
#: templates/about.html.ep:11
msgid "Is it really anonymous?"
msgstr "Ist es wirklich anonym?"
#: templates/about.html.ep:9
msgid "Is it really free (as in free beer)?"
msgstr "Is es wirklich kostenlos?"
#: templates/about.html.ep:21
msgid "Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
msgstr "Genauso wie das französische Wort <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
#: templates/index.html.ep:153
#: templates/index.html.ep:184
msgid "Keep EXIF tags"
msgstr "Behalte EXIF-Daten"
#: templates/index.html.ep:118
#: templates/index.html.ep:166
#: templates/index.html.ep:206
#: templates/partial/lutim.js.ep:263
msgid "Let's go!"
msgstr "Los gehts!"
#: templates/layouts/default.html.ep:48
msgid "License:"
msgstr "Lizenz:"
#: templates/index.html.ep:89
#: templates/index.html.ep:91
#: templates/partial/lutim.js.ep:212
#: templates/partial/lutim.js.ep:216
msgid "Link for share on social networks"
msgstr "Links zum teilen auf sozialen Netzwerken"
#: templates/about.html.ep:4
msgid "Lutim is a free (as in free beer) and anonymous image hosting service. It's also the name of the free (as in free speech) software which provides this service."
msgstr ""
"Lutim ist ein freier und anonymer Bilder-Upload-Service.\n"
"Es ist auch der Name der freien Software, die diesen Service bietet."
#: templates/about.html.ep:25
msgid "Main developers"
msgstr "Haupt-Entwickler"
#: templates/index.html.ep:73
#: templates/index.html.ep:75
#: templates/partial/lutim.js.ep:186
#: templates/partial/lutim.js.ep:189
msgid "Markdown syntax"
msgstr "Markdown Syntax"
#: templates/layouts/default.html.ep:54
#: templates/myfiles.html.ep:2
msgid "My images"
msgstr "Meine Bilder"
#: templates/myfiles.html.ep:39
msgid "No limit"
msgstr "Keine Begrenzung"
#: templates/index.html.ep:165
#: templates/index.html.ep:198
msgid "Only images are allowed"
msgstr "Es sind nur Bilder erlaubt"
#: templates/myfiles.html.ep:6
msgid "Only the images sent with this browser will be listed here. The informations are stored in localStorage: if you delete your localStorage data, you'll loose this informations."
msgstr "Nur die Bilder, die über diesen Browser versendet wurden, werden hier angezeigt. Die Informationen werden im localStorage gespeichert, wenn du diesen leerst, sind die Informationen verloren."
#: templates/about.html.ep:16
msgid "Only the uploader! (well, only if he's the only owner of the images' rights before the upload)"
msgstr "Nur der Hochladende (natürlich nur, wenn er vorher auch Rechteinhaber des Bildes war)"
#. (config('contact')
#: templates/about.html.ep:19
msgid "Please contact the administrator: %1"
msgstr "Kontaktiere den Administrator: %1"
#: templates/gallery.html.ep:51
msgid "Please wait"
msgstr "Warten Sie mal"
#: templates/index.html.ep:158
msgid "Send an image"
msgstr "Sende ein Bild"
#: templates/partial/lutim.js.ep:53
msgid "Share it!"
msgstr "Teile es!"
#: templates/layouts/default.html.ep:51
msgid "Share on Twitter"
msgstr "Teile es auf Twitter"
#: templates/index.html.ep:133
#: templates/partial/lutim.js.ep:274
msgid "Something bad happened"
msgstr "Es ist ein Fehler aufgetreten"
#. ($c->config('contact')
#: lib/Lutim/Controller.pm:719
msgid "Something went wrong when creating the zip file. Try again later or contact the administrator (%1)."
msgstr "Es ist ein Fehler aufgetreten. Versuche es erneut oder kontaktiere den Administrator (%1)."
#: templates/about.html.ep:13
msgid "The IP address of the image's sender is retained for a delay which depends of the administrator's choice (for the official instance, which is located in France, it's one year)."
msgstr "Die IP-Adresse des Nutzers wird für eine bestimmte Zeit gespeichert. Diese kann der Administrator frei wählen (für die offizielle Instanz, die in Frankreich gehostet ist, liegt diese Zeit bei einem Jahr)"
#: templates/about.html.ep:23
msgid "The Lutim software is a <a href=\"http://en.wikipedia.org/wiki/Free_software\">free software</a>, which allows you to download and install it on you own server. Have a look at the <a href=\"https://www.gnu.org/licenses/agpl-3.0.html\">AGPL</a> to see what you can do."
msgstr "Lutim ist <a href=\"https://de.wikipedia.org/wiki/Freie_Software\">freie Software</a>, was dir erlaubt sie herunterzuladen und sie auf deinem eigenem Server zu installieren. Schau dir die <a href=\"https://www.gnu.org/licenses/agpl-3.0.html\">AGPL</a> an um deine Recht zu sehen."
#: lib/Lutim/Controller.pm:289
msgid "The URL is not valid."
msgstr "Die URL ist nicht gültig."
#: lib/Lutim/Controller.pm:101
#: lib/Lutim/Controller.pm:170
msgid "The delete token is invalid."
msgstr "Das Token zum Löschen ist ungültig."
#. ($upload->filename)
#: lib/Lutim/Controller.pm:433
msgid "The file %1 is not an image."
msgstr "Die Datei %1 ist kein Bild."
#. ($max_file_size)
#. ($tx->res->max_message_size)
#. ($c->req->max_message_size)
#: lib/Lutim/Controller.pm:253
#: lib/Lutim/Controller.pm:322
#: templates/partial/lutim.js.ep:337
msgid "The file exceed the size limit (%1)"
msgstr "Die Datei überschreitet die Größenbeschränkung (%1)"
#: templates/stats.html.ep:11
msgid "The graph's datas are not updated in real-time."
msgstr "Die Daten des Graphs werden nicht in Echtzeit aktualisiert."
#. ($image->filename)
#: lib/Lutim/Controller.pm:172
msgid "The image %1 has already been deleted."
msgstr "Das Bild %1 wurde schon gelöscht."
#. ($image->filename)
#: lib/Lutim/Controller.pm:181
#: lib/Lutim/Controller.pm:186
msgid "The image %1 has been successfully deleted"
msgstr "Das Bild %1 wurde erfolgreich gelöscht."
#: lib/Lutim/Controller.pm:109
msgid "The image's delay has been successfully modified"
msgstr "Die Zeit bis zum Löschen des Bildes wurde erfolgreich geändert."
#: templates/index.html.ep:45
msgid "The images are encrypted on the server (Lutim does not keep the key)."
msgstr "Die Bilder werden auf dem Server verschlüsselt (Lutim behält den Key nicht)"
#: templates/about.html.ep:5
msgid "The images you post on Lutim can be stored indefinitely or be deleted at first view or after a delay selected from those proposed."
msgstr "Die Bilder, die du auf Lutim hochlädst, können entweder nie, nach dem ersten Aufruf oder nach einer bestimmten Zeit gelöscht werden."
#. ($c->config->{contact})
#: lib/Lutim/Controller.pm:428
msgid "There is no more available URL. Retry or contact the administrator. %1"
msgstr "Es sind keine URLs mehr verfügbar. Versuche es erneut oder kontaktiere den Administrator. %1"
#: templates/index.html.ep:60
#: templates/partial/lutim.js.ep:46
msgid "Tweet it!"
msgstr "Twittere es!"
#. ($short)
#: lib/Lutim/Controller.pm:143
#: lib/Lutim/Controller.pm:215
msgid "Unable to find the image %1."
msgstr "Konnte das Bild %1 nicht finden."
#: lib/Lutim.pm:66
#: lib/Lutim/Controller.pm:518
#: lib/Lutim/Controller.pm:564
#: lib/Lutim/Controller.pm:608
#: lib/Lutim/Controller.pm:648
#: lib/Lutim/Controller.pm:660
#: lib/Lutim/Controller.pm:671
#: lib/Lutim/Controller.pm:708
msgid "Unable to find the image: it has been deleted."
msgstr "Dieses Bild wurde gelöscht."
#: lib/Lutim/Controller.pm:85
msgid "Unable to get counter"
msgstr "Konnte den Zähler nicht abrufen"
#: templates/about.html.ep:17
msgid "Unlike many image sharing services, you don't give us rights on uploaded images."
msgstr "Im Gegensatz zu anderen Bild-Hosting-Diensten, überträgst du uns nicht die Rechte an hochgeladenen Bildern."
#: templates/index.html.ep:162
#: templates/index.html.ep:201
msgid "Upload an image with its URL"
msgstr "Lade ein Bild über seine URL hoch"
#: templates/myfiles.html.ep:17
msgid "Uploaded at"
msgstr "Hochgeladen am"
#: templates/stats.html.ep:6
msgid "Uploaded files by days"
msgstr "Hochgeladene Bilder pro Tag"
#. ($config->{contact})
#: lib/Lutim.pm:170
msgid "Uploading is currently disabled, please try later or contact the administrator (%1)."
msgstr "Hochladen ist momentan deaktiviert. Versuche es später erneut oder kontaktiere den Administrator (%1)."
#: templates/index.html.ep:65
#: templates/index.html.ep:67
#: templates/myfiles.html.ep:14
#: templates/partial/lutim.js.ep:172
#: templates/partial/lutim.js.ep:176
msgid "View link"
msgstr "Link ansehen"
#: templates/about.html.ep:22
msgid "What about the software which provides the service?"
msgstr "Welche Software stellt diesen Dienst bereit?"
#: templates/about.html.ep:3
msgid "What is Lutim?"
msgstr "Was ist Lutim?"
#: templates/about.html.ep:15
msgid "Who owns rights on images uploaded on Lutim?"
msgstr "Wer hat die Rechte an auf Lutim hochgeladenen Bildern?"
#: templates/about.html.ep:12
msgid "Yes, it is! On the other side, for legal reasons, your IP address will be stored when you send an image. Don't panic, it is normally the case of all sites on which you send files!"
msgstr "Ja, ist es! Auf der anderen Seite wird deine IP-Adresse, wegen rechtlichen Gründen, beim hochladen gespeichert. Keine Panik, das ist normalerweise der Fall für alle Seiten, an die du Dateien sendest!"
#. (url_for('/')
#: templates/about.html.ep:10
msgid "Yes, it is! On the other side, if you want to support the developer, you can do it via <a href=\"https://flattr.com/submit/auto?user_id=_SKy_&amp;url=%1&amp;title=Lutim&amp;category=software\">Flattr</a> or with <a href=\"bitcoin:1JCEtmx9pyzWfitMQj2pKAk8GNgyix7RmA?label=lutim\">BitCoin</a>."
msgstr "Ja, ist es! Auf der anderen Seite kannst du den Entwickler via <a href=\"https://flattr.com/submit/auto?user_id=_SKy_&amp;url=%1&amp;title=Lutim&amp;category=software\">Flattr</a> oder <a href=\"bitcoin:1JCEtmx9pyzWfitMQj2pKAk8GNgyix7RmA?label=lutim\">Bitcoin</a> unterstützen."
#: templates/about.html.ep:8
msgid "You can, optionally, request that the image(s) posted on Lutim to be deleted at first view (or download) or after the delay selected from those proposed."
msgstr "Du kannst Bilder, die du auf Lutim hochlädst, entweder nach dem ernsten Ansehen (oder Herunterladen) oder nach einem der vorgeschlagenen Zeiten löschen lassen."
#: templates/about.html.ep:27
msgid "and on"
msgstr "und auf"
#: templates/about.html.ep:27
msgid "core developer"
msgstr "Haupt-Entwickler"
#: templates/index.html.ep:3
msgid "no time limit"
msgstr "keine Zeit-Begrenzung"
#: templates/about.html.ep:27
msgid "on"
msgstr "auf"
#: templates/about.html.ep:36
msgid "spanish translation"
msgstr "spanische Übersetzung"
#: templates/about.html.ep:28
msgid "webapp developer"
msgstr "Webapp-Entwickler"

View File

@@ -1,77 +0,0 @@
package Lutim::I18N::en;
use Mojo::Base 'Lutim::I18N';
my $inf_body = <<EOF;
<h4>What is LUTIm?</h4>
<p>LUTIm is a free (as in free beer) and anonymous image hosting service. It's also the name of the free (as in free speech) software which provides this service.</p>
<p>The images you post on LUTIm can be stored indefinitely or be deleted at first view or after 24 hours.</p>
<h4>How does it work?</h4>
<p>Drag and drop an image in the appropriate area or use the traditional way to send files and LUTIm will provide you two URLs. One to view the image, the other to directly download it.</p>
<p>You can, optionally, request that the image(s) posted on LUTIm to be deleted at first view (or download) or after 24 hours.</p>
<h4>Is it really free (as in free beer)?</h4>
<p>Yes, it is! On the other side, if you want to support the developer, you can do it via <a href="https://flattr.com/submit/auto?user_id=_SKy_&amp;url=[_1]&amp;title=LUTIm&amp;category=software">Flattr</a> or with <a href="bitcoin:1K3n4MXNRSMHk28oTfXEvDunWFthePvd8v?label=lutim">BitCoin</a>.</p>
<h4>Is it really anonymous?</h4>
<p>Yes, it is! On the other side, for legal reasons, your IP address will be stored when you send an image. Don't panic, it is normally the case of all sites on which you send files!</p>
<p>The IP address of the image's sender is permanently retained.</p>
<p>If the files are deleted if you ask it while posting it, their SHA512 footprint are retained.</p>
<h4>How to report an image?</h4>
<p>Please contact the administrator: [_2]</p>
<h4>How do you pronounce LUTIm?</h4>
<p>Juste like you pronounce the French word <a href="https://fr.wikipedia.org/wiki/Lutin">lutin</a> (/ly.tɛ̃/).</p>
<h4>What about the software which provides the service?</h4>
<p>The LUTIm software is a <a href="http://en.wikipedia.org/wiki/Free_software">free software</a>, which allows you to download and install it on you own server. Have a look at the <a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL</a> to see what you can do.</p>
<p>For more details, see the <a href="https://github.com/ldidry/lutim">Github</a> page of the project.</p>
<h4>Contributors</h4>
<ul>
<li>Luc Didry, aka Sky (<a href="http://www.fiat-tux.fr">http://www.fiat-tux.fr</a>), main developer</li>
<li>Jean-Bernard Marcon, aka Goofy (<a href="https://github.com/goofy-bz">https://github.com/goofy-bz</a>)</li>
<li>Jean-Christophe Bach (<a href="https://github.com/jcb">https://github.com/jcb</a>)</li>
</ul>
EOF
our %Lexicon = (
'license' => 'License:',
'fork-me' => 'Fork me on Github !',
'share-twitter' => 'Share on Twitter',
'informations' => 'Informations',
'informations-body' => $inf_body,
'view-link' => 'View link',
'download-link' => 'Download link',
'twitter-link' => 'Link for put in a tweet',
'some-bad' => 'Something bad happened',
'delete-first' => 'Delete at first view?',
'delete-day' => 'Delete after 24 hours?',
'upload_image' => 'Send an image',
'image-only' => 'Only images are allowed',
'go' => 'Let\'s go!',
'drag-n-drop' => 'Drag & drop images here',
'or' => '-or-',
'file-browser' => 'Click to open the file browser',
'image_not_found' => 'Unable to find the image',
'no_more_short' => 'There is no more available URL. Retry or contact the administrator. [_1]',
'no_valid_file' => 'The file [_1] is not an image.',
'file_too_big' => 'The file exceed the size limit ([_1])',
'no_time_limit' => 'No time limit',
'24_hours' => '24 hours',
'7_days' => '7 days',
'30_days' => '30 days',
'1_year' => 'One year',
'pushed-images' => ' sent images on this instance from beginning.',
'graph-data-once-a-day' => 'The graph\'s datas are not updated in real-time.',
'lutim-stats' => 'LUTIm\'s statistics',
'back-to-index' => 'Back to homepage',
'stop_upload' => 'Uploading is currently disabled, please try later or contact the administrator ([_1]).',
'download_error' => 'An error occured while downloading the image.',
'no_valid_url' => 'The URL is not valid.',
'image_url' => 'Image URL',
'upload_image_url' => 'Upload an image with its URL',
'delay_0' => 'no time limit',
'delay_1' => '24 hours',
'delay_days' => '[_1] days',
'delay_365' => '1 year',
'max_delay' => 'Warning! The maximum time limit for an image is [_1] day(s), even if you choose "no time limit".',
'crypt_image' => 'Encrypt the image (LUTIm does not keep the key).',
'always_encrypt' => 'The images are encrypted on the server (LUTIm does not keep the key).',
);
1;

475
lib/Lutim/I18N/en.po Normal file
View File

@@ -0,0 +1,475 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Lutim\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2015-09-10 23:28+0000\n"
"Last-Translator: Luc Didry <luc@didry.org>\n"
"Language-Team: English (http://www.transifex.com/fiat-tux/lutim/language/en/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. ($delay)
#. (config('max_delay')
#: templates/partial/lutim.js.ep:238
#: templates/partial/lutim.js.ep:247
#: templates/partial/lutim.js.ep:248
msgid "%1 days"
msgstr ""
#. ($total)
#: templates/stats.html.ep:2
msgid "%1 sent images on this instance from beginning."
msgstr "%1 sent images on this instance from beginning."
#: templates/index.html.ep:190
msgid "-or-"
msgstr "-or-"
#: templates/index.html.ep:5
msgid "1 year"
msgstr "1 year"
#: templates/index.html.ep:4
#: templates/partial/lutim.js.ep:247
msgid "24 hours"
msgstr "24 hours"
#: templates/myfiles.html.ep:79
msgid ": Error while trying to get the counter."
msgstr ""
#: lib/Lutim/Controller.pm:270
msgid "An error occured while downloading the image."
msgstr "An error occured while downloading the image."
#: templates/about.html.ep:40
#: templates/myfiles.html.ep:27
#: templates/stats.html.ep:13
msgid "Back to homepage"
msgstr "Back to homepage"
#: templates/index.html.ep:193
#: templates/index.html.ep:194
msgid "Click to open the file browser"
msgstr "Click to open the file browser"
#: templates/about.html.ep:30
msgid "Contributors"
msgstr "Contributors"
#: templates/partial/lutim.js.ep:313
#: templates/partial/lutim.js.ep:361
#: templates/partial/lutim.js.ep:435
msgid "Copy all view links to clipboard"
msgstr ""
#: templates/index.html.ep:18
#: templates/index.html.ep:36
#: templates/index.html.ep:69
#: templates/index.html.ep:77
#: templates/index.html.ep:85
#: templates/index.html.ep:93
#: templates/partial/lutim.js.ep:180
#: templates/partial/lutim.js.ep:192
#: templates/partial/lutim.js.ep:206
#: templates/partial/lutim.js.ep:220
msgid "Copy to clipboard"
msgstr "Copy to clipboard"
#: templates/myfiles.html.ep:15
msgid "Counter"
msgstr ""
#: templates/index.html.ep:115
#: templates/index.html.ep:147
#: templates/index.html.ep:178
#: templates/myfiles.html.ep:16
#: templates/partial/lutim.js.ep:259
msgid "Delete at first view?"
msgstr "Delete at first view?"
#: templates/index.html.ep:98
#: templates/myfiles.html.ep:19
#: templates/partial/common.js.ep:36
msgid "Deletion link"
msgstr "Deletion link"
#: templates/gallery.html.ep:6
#: templates/gallery.html.ep:63
msgid "Download all images"
msgstr ""
#: templates/index.html.ep:81
#: templates/index.html.ep:83
#: templates/partial/lutim.js.ep:198
#: templates/partial/lutim.js.ep:202
msgid "Download link"
msgstr "Download link"
#: templates/index.html.ep:28
#: templates/index.html.ep:31
msgid "Download zip link"
msgstr ""
#: templates/index.html.ep:189
msgid "Drag & drop images here"
msgstr "Drag & drop images here"
#: templates/about.html.ep:7
msgid "Drag and drop an image in the appropriate area or use the traditional way to send files and Lutim will provide you four URLs. One to view the image, an other to directly download it, one you can use on social networks and a last to delete the image when you want."
msgstr "Drag and drop an image in the appropriate area or use the traditional way to send files and Lutim will provide you four URLs. One to view the image, an other to directly download it, one you can use on social networks and a last to delete the image when you want."
#: templates/index.html.ep:150
#: templates/index.html.ep:181
msgid "Encrypt the image (Lutim does not keep the key)."
msgstr "Encrypt the image (Lutim does not keep the key)."
#: templates/partial/lutim.js.ep:74
msgid "Error while trying to modify the image."
msgstr ""
#: templates/stats.html.ep:9
msgid "Evolution of total files"
msgstr "Evolution of total files"
#: templates/myfiles.html.ep:18
msgid "Expires at"
msgstr ""
#: templates/myfiles.html.ep:13
msgid "File name"
msgstr ""
#: templates/about.html.ep:24
msgid "For more details, see the <a href=\"https://framagit.org/luc/lutim\">homepage of the project</a>."
msgstr "For more details, see the <a href=\"https://framagit.org/luc/lutim\">homepage of the project</a>."
#: templates/layouts/default.html.ep:50
msgid "Fork me!"
msgstr "Fork me!"
#: templates/index.html.ep:10
#: templates/index.html.ep:13
msgid "Gallery link"
msgstr ""
#: templates/partial/lutim.js.ep:127
#: templates/partial/lutim.js.ep:145
msgid "Hit Enter, then Ctrl+C to copy the short link"
msgstr ""
#: templates/layouts/default.html.ep:45
msgid "Homepage"
msgstr "Homepage"
#: templates/about.html.ep:20
msgid "How do you pronounce Lutim?"
msgstr "How do you pronounce Lutim?"
#: templates/about.html.ep:6
msgid "How does it work?"
msgstr "How does it work?"
#: templates/about.html.ep:18
msgid "How to report an image?"
msgstr "How to report an image?"
#: templates/about.html.ep:14
msgid "If the files are deleted if you ask it while posting it, their SHA512 footprint are retained."
msgstr "If the files are deleted if you ask it while posting it, their SHA512 footprint are retained."
#: templates/index.html.ep:163
#: templates/index.html.ep:203
msgid "Image URL"
msgstr "Image URL"
#: lib/Lutim/Controller.pm:711
msgid "Image not found."
msgstr ""
#: templates/layouts/default.html.ep:49
msgid "Informations"
msgstr "Informations"
#: templates/layouts/default.html.ep:55
msgid "Install webapp"
msgstr "Install webapp"
#: templates/about.html.ep:11
msgid "Is it really anonymous?"
msgstr "Is it really anonymous?"
#: templates/about.html.ep:9
msgid "Is it really free (as in free beer)?"
msgstr "Is it really free (as in free beer)?"
#: templates/about.html.ep:21
msgid "Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
msgstr "Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
#: templates/index.html.ep:153
#: templates/index.html.ep:184
msgid "Keep EXIF tags"
msgstr "Keep EXIF tags"
#: templates/index.html.ep:118
#: templates/index.html.ep:166
#: templates/index.html.ep:206
#: templates/partial/lutim.js.ep:263
msgid "Let's go!"
msgstr "Let's go!"
#: templates/layouts/default.html.ep:48
msgid "License:"
msgstr "License:"
#: templates/index.html.ep:89
#: templates/index.html.ep:91
#: templates/partial/lutim.js.ep:212
#: templates/partial/lutim.js.ep:216
msgid "Link for share on social networks"
msgstr "Link for share on social networks"
#: templates/about.html.ep:4
msgid "Lutim is a free (as in free beer) and anonymous image hosting service. It's also the name of the free (as in free speech) software which provides this service."
msgstr "Lutim is a free (as in free beer) and anonymous image hosting service. It's also the name of the free (as in free speech) software which provides this service."
#: templates/about.html.ep:25
msgid "Main developers"
msgstr "Main developers"
#: templates/index.html.ep:73
#: templates/index.html.ep:75
#: templates/partial/lutim.js.ep:186
#: templates/partial/lutim.js.ep:189
msgid "Markdown syntax"
msgstr "Markdown syntax"
#: templates/layouts/default.html.ep:54
#: templates/myfiles.html.ep:2
msgid "My images"
msgstr ""
#: templates/myfiles.html.ep:39
msgid "No limit"
msgstr ""
#: templates/index.html.ep:165
#: templates/index.html.ep:198
msgid "Only images are allowed"
msgstr "Only images are allowed"
#: templates/myfiles.html.ep:6
msgid "Only the images sent with this browser will be listed here. The informations are stored in localStorage: if you delete your localStorage data, you'll loose this informations."
msgstr ""
#: templates/about.html.ep:16
msgid "Only the uploader! (well, only if he's the only owner of the images' rights before the upload)"
msgstr "Only the uploader! (well, only if he's the only owner of the images' rights before the upload)"
#. (config('contact')
#: templates/about.html.ep:19
msgid "Please contact the administrator: %1"
msgstr "Please contact the administrator: %1"
#: templates/gallery.html.ep:51
msgid "Please wait"
msgstr ""
#: templates/index.html.ep:158
msgid "Send an image"
msgstr "Send an image"
#: templates/partial/lutim.js.ep:53
msgid "Share it!"
msgstr ""
#: templates/layouts/default.html.ep:51
msgid "Share on Twitter"
msgstr "Share on Twitter"
#: templates/index.html.ep:133
#: templates/partial/lutim.js.ep:274
msgid "Something bad happened"
msgstr "Something bad happened"
#. ($c->config('contact')
#: lib/Lutim/Controller.pm:719
msgid "Something went wrong when creating the zip file. Try again later or contact the administrator (%1)."
msgstr ""
#: templates/about.html.ep:13
msgid "The IP address of the image's sender is retained for a delay which depends of the administrator's choice (for the official instance, which is located in France, it's one year)."
msgstr "The IP address of the image's sender is retained for a delay which depends of the administrator's choice (for the official instance, which is located in France, it's one year)."
#: templates/about.html.ep:23
msgid "The Lutim software is a <a href=\"http://en.wikipedia.org/wiki/Free_software\">free software</a>, which allows you to download and install it on you own server. Have a look at the <a href=\"https://www.gnu.org/licenses/agpl-3.0.html\">AGPL</a> to see what you can do."
msgstr "The Lutim software is a <a href=\"http://en.wikipedia.org/wiki/Free_software\">free software</a>, which allows you to download and install it on you own server. Have a look at the <a href=\"https://www.gnu.org/licenses/agpl-3.0.html\">AGPL</a> to see what you can do."
#: lib/Lutim/Controller.pm:289
msgid "The URL is not valid."
msgstr "The URL is not valid."
#: lib/Lutim/Controller.pm:101
#: lib/Lutim/Controller.pm:170
msgid "The delete token is invalid."
msgstr "The delete token is invalid."
#. ($upload->filename)
#: lib/Lutim/Controller.pm:433
msgid "The file %1 is not an image."
msgstr "The file %1 is not an image."
#. ($max_file_size)
#. ($tx->res->max_message_size)
#. ($c->req->max_message_size)
#: lib/Lutim/Controller.pm:253
#: lib/Lutim/Controller.pm:322
#: templates/partial/lutim.js.ep:337
msgid "The file exceed the size limit (%1)"
msgstr "The file exceed the size limit (%1)"
#: templates/stats.html.ep:11
msgid "The graph's datas are not updated in real-time."
msgstr "The graph's datas are not updated in real-time."
#. ($image->filename)
#: lib/Lutim/Controller.pm:172
msgid "The image %1 has already been deleted."
msgstr "The image %1 has already been deleted."
#. ($image->filename)
#: lib/Lutim/Controller.pm:181
#: lib/Lutim/Controller.pm:186
msgid "The image %1 has been successfully deleted"
msgstr "The image %1 has been successfully deleted"
#: lib/Lutim/Controller.pm:109
msgid "The image's delay has been successfully modified"
msgstr "The image's delay has been successfully modified"
#: templates/index.html.ep:45
msgid "The images are encrypted on the server (Lutim does not keep the key)."
msgstr "The images are encrypted on the server (Lutim does not keep the key)."
#: templates/about.html.ep:5
msgid "The images you post on Lutim can be stored indefinitely or be deleted at first view or after a delay selected from those proposed."
msgstr "The images you post on Lutim can be stored indefinitely or be deleted at first view or after a delay selected from those proposed."
#. ($c->config->{contact})
#: lib/Lutim/Controller.pm:428
msgid "There is no more available URL. Retry or contact the administrator. %1"
msgstr "There is no more available URL. Retry or contact the administrator. %1"
#: templates/index.html.ep:60
#: templates/partial/lutim.js.ep:46
msgid "Tweet it!"
msgstr "Tweet it!"
#. ($short)
#: lib/Lutim/Controller.pm:143
#: lib/Lutim/Controller.pm:215
msgid "Unable to find the image %1."
msgstr "Unable to find the image %1."
#: lib/Lutim.pm:66
#: lib/Lutim/Controller.pm:518
#: lib/Lutim/Controller.pm:564
#: lib/Lutim/Controller.pm:608
#: lib/Lutim/Controller.pm:648
#: lib/Lutim/Controller.pm:660
#: lib/Lutim/Controller.pm:671
#: lib/Lutim/Controller.pm:708
msgid "Unable to find the image: it has been deleted."
msgstr "Unable to find the image: it has been deleted."
#: lib/Lutim/Controller.pm:85
msgid "Unable to get counter"
msgstr ""
#: templates/about.html.ep:17
msgid "Unlike many image sharing services, you don't give us rights on uploaded images."
msgstr "Unlike many image sharing services, you don't give us rights on uploaded images."
#: templates/index.html.ep:162
#: templates/index.html.ep:201
msgid "Upload an image with its URL"
msgstr "Upload an image with its URL"
#: templates/myfiles.html.ep:17
msgid "Uploaded at"
msgstr ""
#: templates/stats.html.ep:6
msgid "Uploaded files by days"
msgstr "Uploaded files by days"
#. ($config->{contact})
#: lib/Lutim.pm:170
msgid "Uploading is currently disabled, please try later or contact the administrator (%1)."
msgstr "Uploading is currently disabled, please try later or contact the administrator (%1)."
#: templates/index.html.ep:65
#: templates/index.html.ep:67
#: templates/myfiles.html.ep:14
#: templates/partial/lutim.js.ep:172
#: templates/partial/lutim.js.ep:176
msgid "View link"
msgstr "View link"
#: templates/about.html.ep:22
msgid "What about the software which provides the service?"
msgstr "What about the software which provides the service?"
#: templates/about.html.ep:3
msgid "What is Lutim?"
msgstr "What is Lutim?"
#: templates/about.html.ep:15
msgid "Who owns rights on images uploaded on Lutim?"
msgstr "Who owns rights on images uploaded on Lutim?"
#: templates/about.html.ep:12
msgid "Yes, it is! On the other side, for legal reasons, your IP address will be stored when you send an image. Don't panic, it is normally the case of all sites on which you send files!"
msgstr "Yes, it is! On the other side, for legal reasons, your IP address will be stored when you send an image. Don't panic, it is normally the case of all sites on which you send files!"
#. (url_for('/')
#: templates/about.html.ep:10
msgid "Yes, it is! On the other side, if you want to support the developer, you can do it via <a href=\"https://flattr.com/submit/auto?user_id=_SKy_&amp;url=%1&amp;title=Lutim&amp;category=software\">Flattr</a> or with <a href=\"bitcoin:1JCEtmx9pyzWfitMQj2pKAk8GNgyix7RmA?label=lutim\">BitCoin</a>."
msgstr "Yes, it is! On the other side, if you want to support the developer, you can do it via <a href=\"https://flattr.com/submit/auto?user_id=_SKy_&amp;url=%1&amp;title=Lutim&amp;category=software\">Flattr</a> or with <a href=\"bitcoin:1JCEtmx9pyzWfitMQj2pKAk8GNgyix7RmA?label=lutim\">BitCoin</a>."
#: templates/about.html.ep:8
msgid "You can, optionally, request that the image(s) posted on Lutim to be deleted at first view (or download) or after the delay selected from those proposed."
msgstr "You can, optionally, request that the image(s) posted on Lutim to be deleted at first view (or download) or after the delay selected from those proposed."
#: templates/about.html.ep:27
msgid "and on"
msgstr "and on"
#: templates/about.html.ep:27
msgid "core developer"
msgstr "core developer"
#: templates/index.html.ep:3
msgid "no time limit"
msgstr "no time limit"
#: templates/about.html.ep:27
msgid "on"
msgstr "on"
#: templates/about.html.ep:36
msgid "spanish translation"
msgstr "spanish translation"
#: templates/about.html.ep:28
msgid "webapp developer"
msgstr "webapp developer"

477
lib/Lutim/I18N/es.po Normal file
View File

@@ -0,0 +1,477 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Translators:
# Luc Didry <luc@didry.org>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Lutim\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2015-09-17 22:00+0000\n"
"Last-Translator: Luc Didry <luc@didry.org>\n"
"Language-Team: Spanish (http://www.transifex.com/fiat-tux/lutim/language/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. ($delay)
#. (config('max_delay')
#: templates/partial/lutim.js.ep:238
#: templates/partial/lutim.js.ep:247
#: templates/partial/lutim.js.ep:248
msgid "%1 days"
msgstr "%1 días"
#. ($total)
#: templates/stats.html.ep:2
msgid "%1 sent images on this instance from beginning."
msgstr "%1 imágenes enviadas a esta instancia desde el inicio."
#: templates/index.html.ep:190
msgid "-or-"
msgstr "-o-"
#: templates/index.html.ep:5
msgid "1 year"
msgstr "1 año"
#: templates/index.html.ep:4
#: templates/partial/lutim.js.ep:247
msgid "24 hours"
msgstr "24 horas"
#: templates/myfiles.html.ep:79
msgid ": Error while trying to get the counter."
msgstr ": Error al intentar obtener el contador."
#: lib/Lutim/Controller.pm:270
msgid "An error occured while downloading the image."
msgstr "Error al intentar modificar la imagen."
#: templates/about.html.ep:40
#: templates/myfiles.html.ep:27
#: templates/stats.html.ep:13
msgid "Back to homepage"
msgstr "Volver a la página inicial"
#: templates/index.html.ep:193
#: templates/index.html.ep:194
msgid "Click to open the file browser"
msgstr "Clic para abrir el explorador de archivos"
#: templates/about.html.ep:30
msgid "Contributors"
msgstr "Contribuidores"
#: templates/partial/lutim.js.ep:313
#: templates/partial/lutim.js.ep:361
#: templates/partial/lutim.js.ep:435
msgid "Copy all view links to clipboard"
msgstr "Copiar todos los enlaces de visualización al portapapeles"
#: templates/index.html.ep:18
#: templates/index.html.ep:36
#: templates/index.html.ep:69
#: templates/index.html.ep:77
#: templates/index.html.ep:85
#: templates/index.html.ep:93
#: templates/partial/lutim.js.ep:180
#: templates/partial/lutim.js.ep:192
#: templates/partial/lutim.js.ep:206
#: templates/partial/lutim.js.ep:220
msgid "Copy to clipboard"
msgstr "Copiar al portapapeles"
#: templates/myfiles.html.ep:15
msgid "Counter"
msgstr "Contador"
#: templates/index.html.ep:115
#: templates/index.html.ep:147
#: templates/index.html.ep:178
#: templates/myfiles.html.ep:16
#: templates/partial/lutim.js.ep:259
msgid "Delete at first view?"
msgstr "¿Borrar en la primera vista?"
#: templates/index.html.ep:98
#: templates/myfiles.html.ep:19
#: templates/partial/common.js.ep:36
msgid "Deletion link"
msgstr "Enlace para borrar"
#: templates/gallery.html.ep:6
#: templates/gallery.html.ep:63
msgid "Download all images"
msgstr "Descargar todas las imágenes"
#: templates/index.html.ep:81
#: templates/index.html.ep:83
#: templates/partial/lutim.js.ep:198
#: templates/partial/lutim.js.ep:202
msgid "Download link"
msgstr "Enlace de descarga"
#: templates/index.html.ep:28
#: templates/index.html.ep:31
msgid "Download zip link"
msgstr "Enlace de descarga del archivo de las imágenes"
#: templates/index.html.ep:189
msgid "Drag & drop images here"
msgstr "Arrastre y suelte imágenes aquí"
#: templates/about.html.ep:7
msgid "Drag and drop an image in the appropriate area or use the traditional way to send files and Lutim will provide you four URLs. One to view the image, an other to directly download it, one you can use on social networks and a last to delete the image when you want."
msgstr "Arrastre y suelte una imagen en el área apropiada, o use el método tradicional para enviar ficheros, y Lutim proporcionará cuatro URLs. Una para ver la imagen, otra para descargarla directamente, una que upede usar en redes sociales, y una última para borrar la imagen cuando lo desee."
#: templates/index.html.ep:150
#: templates/index.html.ep:181
msgid "Encrypt the image (Lutim does not keep the key)."
msgstr "Las imágenes se cifran en el servidor (Lutim no guarda la clave)."
#: templates/partial/lutim.js.ep:74
msgid "Error while trying to modify the image."
msgstr "Error al intentar modificar la imagen."
#: templates/stats.html.ep:9
msgid "Evolution of total files"
msgstr "Evolución de archivos en total"
#: templates/myfiles.html.ep:18
msgid "Expires at"
msgstr "Expira"
#: templates/myfiles.html.ep:13
msgid "File name"
msgstr "Nombre de archivo"
#: templates/about.html.ep:24
msgid "For more details, see the <a href=\"https://framagit.org/luc/lutim\">homepage of the project</a>."
msgstr "Para más detalles, vea la <a href=\"https://framagit.org/luc/lutim\">página del proyecto</a>."
#: templates/layouts/default.html.ep:50
msgid "Fork me!"
msgstr "¡Clóname!"
#: templates/index.html.ep:10
#: templates/index.html.ep:13
msgid "Gallery link"
msgstr "Enlace a la galería"
#: templates/partial/lutim.js.ep:127
#: templates/partial/lutim.js.ep:145
msgid "Hit Enter, then Ctrl+C to copy the short link"
msgstr "Presione Ingresar, entonces Ctrl + C para copiar el enlace"
#: templates/layouts/default.html.ep:45
msgid "Homepage"
msgstr "Página inicial"
#: templates/about.html.ep:20
msgid "How do you pronounce Lutim?"
msgstr "¿Cómo se pronuncia Lutim?"
#: templates/about.html.ep:6
msgid "How does it work?"
msgstr "¿Cómo funciona?"
#: templates/about.html.ep:18
msgid "How to report an image?"
msgstr "¿Cómo informar sobre una imagen?"
#: templates/about.html.ep:14
msgid "If the files are deleted if you ask it while posting it, their SHA512 footprint are retained."
msgstr "Si los ficheros se borran por haberlo solicitado al enviarlos, se retiene su huella digital SHA512."
#: templates/index.html.ep:163
#: templates/index.html.ep:203
msgid "Image URL"
msgstr "URL de la imagen"
#: lib/Lutim/Controller.pm:711
msgid "Image not found."
msgstr "Imagen no encontrada."
#: templates/layouts/default.html.ep:49
msgid "Informations"
msgstr "Informaciones"
#: templates/layouts/default.html.ep:55
msgid "Install webapp"
msgstr "Instalar webapp"
#: templates/about.html.ep:11
msgid "Is it really anonymous?"
msgstr "¿Es realmente anónimo?"
#: templates/about.html.ep:9
msgid "Is it really free (as in free beer)?"
msgstr "¿Es realmente gratis?"
#: templates/about.html.ep:21
msgid "Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
msgstr "Tal y como se pronuncia la palabra francesa <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
#: templates/index.html.ep:153
#: templates/index.html.ep:184
msgid "Keep EXIF tags"
msgstr "Mantener las etiquetas EXIF"
#: templates/index.html.ep:118
#: templates/index.html.ep:166
#: templates/index.html.ep:206
#: templates/partial/lutim.js.ep:263
msgid "Let's go!"
msgstr "¡Vamos allá!"
#: templates/layouts/default.html.ep:48
msgid "License:"
msgstr "Licencia:"
#: templates/index.html.ep:89
#: templates/index.html.ep:91
#: templates/partial/lutim.js.ep:212
#: templates/partial/lutim.js.ep:216
msgid "Link for share on social networks"
msgstr "Enlace para compartir en redes sociales"
#: templates/about.html.ep:4
msgid "Lutim is a free (as in free beer) and anonymous image hosting service. It's also the name of the free (as in free speech) software which provides this service."
msgstr "Lutim es un servicio de alojamiento de imágenes anónimo y gratuito. También es el nombre del software libre que proporciona este servicio."
#: templates/about.html.ep:25
msgid "Main developers"
msgstr "Desarrolladores principales"
#: templates/index.html.ep:73
#: templates/index.html.ep:75
#: templates/partial/lutim.js.ep:186
#: templates/partial/lutim.js.ep:189
msgid "Markdown syntax"
msgstr "Sintaxis de Markdown"
#: templates/layouts/default.html.ep:54
#: templates/myfiles.html.ep:2
msgid "My images"
msgstr "Mis Imágenes"
#: templates/myfiles.html.ep:39
msgid "No limit"
msgstr "Sin fecha de caducidad"
#: templates/index.html.ep:165
#: templates/index.html.ep:198
msgid "Only images are allowed"
msgstr "Sólo se admiten imágenes"
#: templates/myfiles.html.ep:6
msgid "Only the images sent with this browser will be listed here. The informations are stored in localStorage: if you delete your localStorage data, you'll loose this informations."
msgstr ""
#: templates/about.html.ep:16
msgid "Only the uploader! (well, only if he's the only owner of the images' rights before the upload)"
msgstr "¡Sólo el usuario! (bueno, sólo si él/ela es el único titular de los derechos de las imágenes antes de subirlas)"
#. (config('contact')
#: templates/about.html.ep:19
msgid "Please contact the administrator: %1"
msgstr "Por favor, contacte con el administrador: %1"
#: templates/gallery.html.ep:51
msgid "Please wait"
msgstr "Por favor espera"
#: templates/index.html.ep:158
msgid "Send an image"
msgstr "Enviar una imagen"
#: templates/partial/lutim.js.ep:53
msgid "Share it!"
msgstr "¡Compártelo!"
#: templates/layouts/default.html.ep:51
msgid "Share on Twitter"
msgstr "Compartir en Twitter"
#: templates/index.html.ep:133
#: templates/partial/lutim.js.ep:274
msgid "Something bad happened"
msgstr "Algo malo ha pasado"
#. ($c->config('contact')
#: lib/Lutim/Controller.pm:719
msgid "Something went wrong when creating the zip file. Try again later or contact the administrator (%1)."
msgstr "Algo malo ha pasado. Inténtelo de nuevo más tarde o contacte con el administrador (%1)."
#: templates/about.html.ep:13
msgid "The IP address of the image's sender is retained for a delay which depends of the administrator's choice (for the official instance, which is located in France, it's one year)."
msgstr "La dirección IP del remitente de la imagen se retiene durante un tiempo, que depende de lo que elija el administrador (para la instancia oficial, que está localizada en Francia, es un año)."
#: templates/about.html.ep:23
msgid "The Lutim software is a <a href=\"http://en.wikipedia.org/wiki/Free_software\">free software</a>, which allows you to download and install it on you own server. Have a look at the <a href=\"https://www.gnu.org/licenses/agpl-3.0.html\">AGPL</a> to see what you can do."
msgstr "El software Lutim es <a href=\"http://es.wikipedia.org/wiki/Software_libre\">software libre</a>, lo que le permite descargarlo e instalarlo en su propio servidor. Eche un vistazo a la licencia <a href=\"https://www.gnu.org/licenses/agpl-3.0.html\">AGPL</a> para ver qué puede hacer."
#: lib/Lutim/Controller.pm:289
msgid "The URL is not valid."
msgstr "La URL no es válida."
#: lib/Lutim/Controller.pm:101
#: lib/Lutim/Controller.pm:170
msgid "The delete token is invalid."
msgstr "El código de borrado no es válido."
#. ($upload->filename)
#: lib/Lutim/Controller.pm:433
msgid "The file %1 is not an image."
msgstr "El archivo %1 no es una imagen."
#. ($max_file_size)
#. ($tx->res->max_message_size)
#. ($c->req->max_message_size)
#: lib/Lutim/Controller.pm:253
#: lib/Lutim/Controller.pm:322
#: templates/partial/lutim.js.ep:337
msgid "The file exceed the size limit (%1)"
msgstr "El archivo supera el límite de tamaño (%1)"
#: templates/stats.html.ep:11
msgid "The graph's datas are not updated in real-time."
msgstr "Los datos del gráfico no se actualizan en tiempo real."
#. ($image->filename)
#: lib/Lutim/Controller.pm:172
msgid "The image %1 has already been deleted."
msgstr "La imagen %1 ya se ha borrado."
#. ($image->filename)
#: lib/Lutim/Controller.pm:181
#: lib/Lutim/Controller.pm:186
msgid "The image %1 has been successfully deleted"
msgstr "La imagen %1 se ha borrado correctamente"
#: lib/Lutim/Controller.pm:109
msgid "The image's delay has been successfully modified"
msgstr "Se ha modificado correctamente el tiempo de la imagen"
#: templates/index.html.ep:45
msgid "The images are encrypted on the server (Lutim does not keep the key)."
msgstr "Las imágenes se cifran en el servidor (Lutim no guarda la clave)."
#: templates/about.html.ep:5
msgid "The images you post on Lutim can be stored indefinitely or be deleted at first view or after a delay selected from those proposed."
msgstr "Puede, opcionalmente, solicitar que la imagen publicada en Lutim se elimine con la primera vista (o descarga) o tras un tiempo seleccionado de entre varios propuestos."
#. ($c->config->{contact})
#: lib/Lutim/Controller.pm:428
msgid "There is no more available URL. Retry or contact the administrator. %1"
msgstr "No más URL disponibles. Inténtelo de nuevo o contacte con el administrador. %1"
#: templates/index.html.ep:60
#: templates/partial/lutim.js.ep:46
msgid "Tweet it!"
msgstr "¡Tuitéalo!"
#. ($short)
#: lib/Lutim/Controller.pm:143
#: lib/Lutim/Controller.pm:215
msgid "Unable to find the image %1."
msgstr "No se ha podido encontrar la imagen %1."
#: lib/Lutim.pm:66
#: lib/Lutim/Controller.pm:518
#: lib/Lutim/Controller.pm:564
#: lib/Lutim/Controller.pm:608
#: lib/Lutim/Controller.pm:648
#: lib/Lutim/Controller.pm:660
#: lib/Lutim/Controller.pm:671
#: lib/Lutim/Controller.pm:708
msgid "Unable to find the image: it has been deleted."
msgstr "No se ha podido encontrar la imagen: ha sido borrada."
#: lib/Lutim/Controller.pm:85
msgid "Unable to get counter"
msgstr "Imposible recuperar el contador"
#: templates/about.html.ep:17
msgid "Unlike many image sharing services, you don't give us rights on uploaded images."
msgstr "A diferencia de muchos servicios de compartición de imágenes, usted no cede los derechos de las imágenes que sube."
#: templates/index.html.ep:162
#: templates/index.html.ep:201
msgid "Upload an image with its URL"
msgstr "Subir una imagen con la URL"
#: templates/myfiles.html.ep:17
msgid "Uploaded at"
msgstr "Enviado el"
#: templates/stats.html.ep:6
msgid "Uploaded files by days"
msgstr "Archivos enviados por día"
#. ($config->{contact})
#: lib/Lutim.pm:170
msgid "Uploading is currently disabled, please try later or contact the administrator (%1)."
msgstr "La carga está deshabilitada en estos momentos, por favor inténtelo más tarde o contacte con el administrador (%1)."
#: templates/index.html.ep:65
#: templates/index.html.ep:67
#: templates/myfiles.html.ep:14
#: templates/partial/lutim.js.ep:172
#: templates/partial/lutim.js.ep:176
msgid "View link"
msgstr "Enlace de visualización"
#: templates/about.html.ep:22
msgid "What about the software which provides the service?"
msgstr "¿Y qué hay sobre el software que proporciona el servicio?"
#: templates/about.html.ep:3
msgid "What is Lutim?"
msgstr "¿Qué es Lutim?"
#: templates/about.html.ep:15
msgid "Who owns rights on images uploaded on Lutim?"
msgstr "¿Quién posee los derechos de las imágenes que se suben a Lutim?"
#: templates/about.html.ep:12
msgid "Yes, it is! On the other side, for legal reasons, your IP address will be stored when you send an image. Don't panic, it is normally the case of all sites on which you send files!"
msgstr "¡Sí, lo es! Por otro lado, por razones legales, se almacena la dirección IP cuando se envía una imagen. Que no cunda el pánico, ¡es el caso habitual para todos los sitios a los cuales se envían ficheros!"
#. (url_for('/')
#: templates/about.html.ep:10
msgid "Yes, it is! On the other side, if you want to support the developer, you can do it via <a href=\"https://flattr.com/submit/auto?user_id=_SKy_&amp;url=%1&amp;title=Lutim&amp;category=software\">Flattr</a> or with <a href=\"bitcoin:1JCEtmx9pyzWfitMQj2pKAk8GNgyix7RmA?label=lutim\">BitCoin</a>."
msgstr "¡Sí, lo es! Por otro lado, si quiere ayudar a apoyar al desarrollador, puede hacerlo vía <a href=\"https://flattr.com/submit/auto?user_id=_SKy_&amp;url=%1&amp;title=Lutim&amp;category=software\">Flattr</a> o con <a href=\"bitcoin:1JCEtmx9pyzWfitMQj2pKAk8GNgyix7RmA?label=lutim\">BitCoin</a>."
#: templates/about.html.ep:8
msgid "You can, optionally, request that the image(s) posted on Lutim to be deleted at first view (or download) or after the delay selected from those proposed."
msgstr "Puede, opcionalmente, solicitar que la imagen publicada en Lutim se elimine con la primera vista (o descarga) o tras un tiempo seleccionado de entre varios propuestos."
#: templates/about.html.ep:27
msgid "and on"
msgstr "y en"
#: templates/about.html.ep:27
msgid "core developer"
msgstr "desarrollador principal"
#: templates/index.html.ep:3
msgid "no time limit"
msgstr "Sin tiempo límite"
#: templates/about.html.ep:27
msgid "on"
msgstr "en"
#: templates/about.html.ep:36
msgid "spanish translation"
msgstr "traducción al español"
#: templates/about.html.ep:28
msgid "webapp developer"
msgstr "desarrollador de la webapp"

View File

@@ -1,77 +0,0 @@
package Lutim::I18N::fr;
use Mojo::Base 'Lutim::I18N';
my $inf_body = <<EOF;
<h4>Quest-ce que LUTIm ?</h4>
<p>LUTIm est un service gratuit et anonyme dhébergement dimages. Il sagit aussi du nom du logiciel (libre) qui fournit ce service.</p>
<p>Les images déposées sur LUTIm peuvent être stockées indéfiniment, ou seffacer dès le premier affichage ou au bout de 24h.</p>
<h4>Comment ça marche ?</h4>
<p>Faites glisser des images dans la zone prévue à cet effet ou sélectionnez un fichier de façon classique et LUTIm vous fournira deux URLs en retour. Une pour afficher limage, lautre pour la télécharger directement.</p>
<p>Vous pouvez, de façon facultative, demander à ce que la ou les images déposées sur LUTIm soient supprimées après leur premier affichage (ou téléchargement) ou au bout de 24 heures.</p>
<h4>Cest vraiment gratuit ?</h4>
<p>Oui, ça lest ! Par contre, si vous avez envie de soutenir le développeur, vous pouvez faire un microdon avec <a href="https://flattr.com/submit/auto?user_id=_SKy_&amp;url=[_1]&amp;title=LUTIm&amp;category=software">Flattr</a> ou en <a href="bitcoin:1K3n4MXNRSMHk28oTfXEvDunWFthePvd8v?label=lutim">BitCoin</a>.</p>
<h4>Cest vraiment anonyme ?</h4>
<p>Oui, ça lest ! Par contre, pour des raisons légales, votre adresse IP sera enregistrée lorsque vous enverrez une image. Ne vous affolez pas, cest de toute façon normalement le cas de tous les sites sur lesquels vous envoyez des fichiers !</p>
<p>LIP de la personne ayant déposé limage est stockée de manière définitive.</p>
<p>Si les fichiers sont bien supprimés si vous en avez exprimé le choix, leur empreinte SHA512 est toutefois conservée.</p>
<h4>Comment peut-on faire pour signaler une image ?</h4>
<p>Veuillez contacter ladministrateur : [_2]</p>
<h4>Comment doit-on prononcer LUTIm ?</h4>
<p>Comme on prononce <a href="https://fr.wikipedia.org/wiki/Lutin">lutin</a> !</p>
<h4>Et à propos du logiciel qui fournit le service ?</h4>
<p>Le logiciel LUTIm est un <a href="https://fr.wikipedia.org/wiki/Logiciel_libre">logiciel libre</a>, ce qui vous permet de le télécharger et de linstaller sur votre propre serveur. Jetez un coup dœil à l<a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL</a> pour voir quels sont vos droits.</p>
<p>Pour plus de détails, consultez la page <a href="https://github.com/ldidry/lutim">Github</a> du projet.</p>
<h4>Contributeurs</h4>
<ul>
<li>Luc Didry, aka Sky (<a href="http://www.fiat-tux.fr">http://www.fiat-tux.fr</a>), développeur principal</li>
<li>Jean-Bernard Marcon, aka Goofy (<a href="https://github.com/goofy-bz">https://github.com/goofy-bz</a>)</li>
<li>Jean-Christophe Bach (<a href="https://github.com/jcb">https://github.com/jcb</a>)</li>
</ul>
EOF
our %Lexicon = (
'license' => 'Licence :',
'fork-me' => 'Fork me on Github',
'share-twitter' => 'Partager sur Twitter',
'informations' => 'Informations',
'informations-body' => $inf_body,
'view-link' => 'Lien d\'affichage',
'download-link' => 'Lien de téléchargement',
'twitter-link' => 'Lien pour mettre dans un tweet',
'some-bad' => 'Un problème est survenu',
'delete-first' => 'Supprimer au premier accès ?',
'delete-day' => 'Supprimer après 24 heures ?',
'upload_image' => 'Envoyez une image',
'image-only' => 'Seules les images sont acceptées',
'go' => 'Allons-y !',
'drag-n-drop' => 'Déposez vos images ici',
'or' => '-ou-',
'file-browser' => 'Cliquez pour utiliser le navigateur de fichier',
'image_not_found' => 'Impossible de trouver l\'image',
'no_more_short' => 'Il n\'y a plus d\'URL disponible. Veuillez réessayer ou contactez l\'administrateur. [_1].',
'no_valid_file' => 'Le fichier [_1] n\'est pas une image.',
'file_too_big' => 'Le fichier dépasse la limite de taille ([_1])',
'no_time_limit' => 'Pas de limitation de durée',
'24_hours' => '24 heures',
'7_days' => '7 jours',
'30_days' => '30 jours',
'1_year' => 'Un an',
'pushed-images' => ' images envoyées sur cette instance depuis le début.',
'graph-data-once-a-day' => 'Les données du graphique ne sont pas mises à jour en temps réél.',
'lutim-stats' => 'Statistiques de LUTIm',
'back-to-index' => 'Retour à la page d\'accueil',
'stop_upload' => 'L\'envoi d\'images est actuellement désactivé, veuillez réessayer plus ou contacter l\'administrateur ([_1]).',
'download_error' => 'Une erreur est survenue lors du téléchargement de l\'image.',
'no_valid_url' => 'l\'URL n\'est pas valide.',
'image_url' => 'URL de l\'image',
'upload_image_url' => 'Déposer une image par son URL',
'delay_0' => 'pas de limitation de durée',
'delay_1' => '24 heures',
'delay_days' => '[_1] jours',
'delay_365' => '1 an',
'max_delay' => 'Attention ! Le délai maximal de rétention d\'une image est de [_1] jour(s), même si vous choisissez « pas de limitation de durée ».',
'crypt_image' => 'Chiffrer l\'image (LUTIm ne stocke pas la clé).',
'always_encrypt' => 'Les images sont chiffrées sur le serveur (LUTIm ne stocke pas la clé).',
);
1;

479
lib/Lutim/I18N/fr.po Normal file
View File

@@ -0,0 +1,479 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Translators:
# Luc Didry <luc@didry.org>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Lutim\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2015-09-17 22:02+0000\n"
"Last-Translator: Luc Didry <luc@didry.org>\n"
"Language-Team: French (http://www.transifex.com/fiat-tux/lutim/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#. ($delay)
#. (config('max_delay')
#: templates/partial/lutim.js.ep:238
#: templates/partial/lutim.js.ep:247
#: templates/partial/lutim.js.ep:248
msgid "%1 days"
msgstr "%1 jours"
#. ($total)
#: templates/stats.html.ep:2
msgid "%1 sent images on this instance from beginning."
msgstr "%1 images envoyées sur cette instance depuis le début."
#: templates/index.html.ep:190
msgid "-or-"
msgstr "-ou-"
#: templates/index.html.ep:5
msgid "1 year"
msgstr "1 an"
#: templates/index.html.ep:4
#: templates/partial/lutim.js.ep:247
msgid "24 hours"
msgstr "24 heures"
#: templates/myfiles.html.ep:79
msgid ": Error while trying to get the counter."
msgstr " : Erreur en essayant de récupérer le compteur."
#: lib/Lutim/Controller.pm:270
msgid "An error occured while downloading the image."
msgstr "Une erreur est survenue lors du téléchargement de l'image."
#: templates/about.html.ep:40
#: templates/myfiles.html.ep:27
#: templates/stats.html.ep:13
msgid "Back to homepage"
msgstr "Retour à la page d'accueil"
#: templates/index.html.ep:193
#: templates/index.html.ep:194
msgid "Click to open the file browser"
msgstr "Cliquez pour utiliser le navigateur de fichier"
#: templates/about.html.ep:30
msgid "Contributors"
msgstr "Contributeurs"
#: templates/partial/lutim.js.ep:313
#: templates/partial/lutim.js.ep:361
#: templates/partial/lutim.js.ep:435
msgid "Copy all view links to clipboard"
msgstr "Copier tous les liens de visualisation dans le presse-papier"
#: templates/index.html.ep:18
#: templates/index.html.ep:36
#: templates/index.html.ep:69
#: templates/index.html.ep:77
#: templates/index.html.ep:85
#: templates/index.html.ep:93
#: templates/partial/lutim.js.ep:180
#: templates/partial/lutim.js.ep:192
#: templates/partial/lutim.js.ep:206
#: templates/partial/lutim.js.ep:220
msgid "Copy to clipboard"
msgstr "Copier dans le presse-papier"
#: templates/myfiles.html.ep:15
msgid "Counter"
msgstr "Compteur"
#: templates/index.html.ep:115
#: templates/index.html.ep:147
#: templates/index.html.ep:178
#: templates/myfiles.html.ep:16
#: templates/partial/lutim.js.ep:259
msgid "Delete at first view?"
msgstr "Supprimer au premier accès ?"
#: templates/index.html.ep:98
#: templates/myfiles.html.ep:19
#: templates/partial/common.js.ep:36
msgid "Deletion link"
msgstr "Lien de suppression"
#: templates/gallery.html.ep:6
#: templates/gallery.html.ep:63
msgid "Download all images"
msgstr "Télécharger toutes les images"
#: templates/index.html.ep:81
#: templates/index.html.ep:83
#: templates/partial/lutim.js.ep:198
#: templates/partial/lutim.js.ep:202
msgid "Download link"
msgstr "Lien de téléchargement"
#: templates/index.html.ep:28
#: templates/index.html.ep:31
msgid "Download zip link"
msgstr "Lien de téléchargement de l'archive des images"
#: templates/index.html.ep:189
msgid "Drag & drop images here"
msgstr "Déposez vos images ici"
#: templates/about.html.ep:7
msgid "Drag and drop an image in the appropriate area or use the traditional way to send files and Lutim will provide you four URLs. One to view the image, an other to directly download it, one you can use on social networks and a last to delete the image when you want."
msgstr "Faites glisser des images dans la zone prévue à cet effet ou sélectionnez un fichier de façon classique et Lutim vous fournira quatre URLs en retour. Une pour afficher limage, une autre pour la télécharger directement, une pour l'utiliser sur les réseaux sociaux et une dernière pour supprimer votre image quand vous le souhaitez"
#: templates/index.html.ep:150
#: templates/index.html.ep:181
msgid "Encrypt the image (Lutim does not keep the key)."
msgstr "Chiffrer l'image (Lutim ne stocke pas la clé)."
#: templates/partial/lutim.js.ep:74
msgid "Error while trying to modify the image."
msgstr "Une erreur est survenue en essayant de modifier l'image."
#: templates/stats.html.ep:9
msgid "Evolution of total files"
msgstr "Évolution du nombre total de fichiers"
#: templates/myfiles.html.ep:18
msgid "Expires at"
msgstr "Expire le"
#: templates/myfiles.html.ep:13
msgid "File name"
msgstr "Nom du fichier"
#: templates/about.html.ep:24
msgid "For more details, see the <a href=\"https://framagit.org/luc/lutim\">homepage of the project</a>."
msgstr "Pour plus de détails, consultez la page <a href=\"https://framagit.org/luc/lutim\">Github</a> du projet."
#: templates/layouts/default.html.ep:50
msgid "Fork me!"
msgstr "Créez un fork !"
#: templates/index.html.ep:10
#: templates/index.html.ep:13
msgid "Gallery link"
msgstr "Lien vers la galerie"
#: templates/partial/lutim.js.ep:127
#: templates/partial/lutim.js.ep:145
msgid "Hit Enter, then Ctrl+C to copy the short link"
msgstr "Appuyez sur la touche Entrée puis faites Ctrl+C pour copier le lien"
#: templates/layouts/default.html.ep:45
msgid "Homepage"
msgstr "Accueil"
#: templates/about.html.ep:20
msgid "How do you pronounce Lutim?"
msgstr "Comment doit-on prononcer Lutim ?"
#: templates/about.html.ep:6
msgid "How does it work?"
msgstr "Comment ça marche ?"
#: templates/about.html.ep:18
msgid "How to report an image?"
msgstr "Comment peut-on faire pour signaler une image ?"
#: templates/about.html.ep:14
msgid "If the files are deleted if you ask it while posting it, their SHA512 footprint are retained."
msgstr "Si les fichiers sont bien supprimés si vous en avez exprimé le choix, leur empreinte SHA512 est toutefois conservée."
#: templates/index.html.ep:163
#: templates/index.html.ep:203
msgid "Image URL"
msgstr "URL de l'image"
#: lib/Lutim/Controller.pm:711
msgid "Image not found."
msgstr "Image non trouvée."
#: templates/layouts/default.html.ep:49
msgid "Informations"
msgstr "Informations"
#: templates/layouts/default.html.ep:55
msgid "Install webapp"
msgstr "Installer la webapp"
#: templates/about.html.ep:11
msgid "Is it really anonymous?"
msgstr "Cest vraiment anonyme ?"
#: templates/about.html.ep:9
msgid "Is it really free (as in free beer)?"
msgstr "Cest vraiment gratuit ?"
#: templates/about.html.ep:21
msgid "Juste like you pronounce the French word <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
msgstr "Comme on prononce <a href=\"https://fr.wikipedia.org/wiki/Lutin\">lutin</a> (/ly.tɛ̃/)."
#: templates/index.html.ep:153
#: templates/index.html.ep:184
msgid "Keep EXIF tags"
msgstr "Conserver les données EXIF"
#: templates/index.html.ep:118
#: templates/index.html.ep:166
#: templates/index.html.ep:206
#: templates/partial/lutim.js.ep:263
msgid "Let's go!"
msgstr "Allons-y !"
#: templates/layouts/default.html.ep:48
msgid "License:"
msgstr "Licence :"
#: templates/index.html.ep:89
#: templates/index.html.ep:91
#: templates/partial/lutim.js.ep:212
#: templates/partial/lutim.js.ep:216
msgid "Link for share on social networks"
msgstr "Lien pour partager sur les réseaux sociaux"
#: templates/about.html.ep:4
msgid "Lutim is a free (as in free beer) and anonymous image hosting service. It's also the name of the free (as in free speech) software which provides this service."
msgstr "Lutim est un service gratuit et anonyme dhébergement dimages. Il sagit aussi du nom du logiciel (libre) qui fournit ce service."
#: templates/about.html.ep:25
msgid "Main developers"
msgstr "Développeurs de l'application"
#: templates/index.html.ep:73
#: templates/index.html.ep:75
#: templates/partial/lutim.js.ep:186
#: templates/partial/lutim.js.ep:189
msgid "Markdown syntax"
msgstr "Syntaxe Markdown"
#: templates/layouts/default.html.ep:54
#: templates/myfiles.html.ep:2
msgid "My images"
msgstr "Mes images"
#: templates/myfiles.html.ep:39
msgid "No limit"
msgstr "Pas de date d'expiration"
#: templates/index.html.ep:165
#: templates/index.html.ep:198
msgid "Only images are allowed"
msgstr "Seules les images sont acceptées"
#: templates/myfiles.html.ep:6
msgid "Only the images sent with this browser will be listed here. The informations are stored in localStorage: if you delete your localStorage data, you'll loose this informations."
msgstr "Seules les images envoyées avec ce navigateur seront listées ici. Les informations sont stockées en localStorage : si vous supprimez vos données localStorage, vous perdrez ces informations."
#: templates/about.html.ep:16
msgid "Only the uploader! (well, only if he's the only owner of the images' rights before the upload)"
msgstr "Seulement l'envoyeur ! (enfin, seulement s'il possède des droits exclusifs sur les images avant de les envoyer)"
#. (config('contact')
#: templates/about.html.ep:19
msgid "Please contact the administrator: %1"
msgstr "Veuillez contacter ladministrateur : %1"
#: templates/gallery.html.ep:51
msgid "Please wait"
msgstr "Veuillez patienter"
#: templates/index.html.ep:158
msgid "Send an image"
msgstr "Envoyer une image"
#: templates/partial/lutim.js.ep:53
msgid "Share it!"
msgstr "Partagez !"
#: templates/layouts/default.html.ep:51
msgid "Share on Twitter"
msgstr "Partager sur Twitter"
#: templates/index.html.ep:133
#: templates/partial/lutim.js.ep:274
msgid "Something bad happened"
msgstr "Un problème est survenu"
#. ($c->config('contact')
#: lib/Lutim/Controller.pm:719
msgid "Something went wrong when creating the zip file. Try again later or contact the administrator (%1)."
msgstr "Quelque chose s'est mal passé lors de la création de l'archive. Veuillez réessayer plus tard ou contactez l'administrateur (%1)."
#: templates/about.html.ep:13
msgid "The IP address of the image's sender is retained for a delay which depends of the administrator's choice (for the official instance, which is located in France, it's one year)."
msgstr ""
"LIP de la personne ayant déposé limage est stockée pendant un délai dépendant de l'administrateur de l'instance (pour l'instance officielle, dont le serveur est en France, c'est un délai\n"
" d'un an)."
#: templates/about.html.ep:23
msgid "The Lutim software is a <a href=\"http://en.wikipedia.org/wiki/Free_software\">free software</a>, which allows you to download and install it on you own server. Have a look at the <a href=\"https://www.gnu.org/licenses/agpl-3.0.html\">AGPL</a> to see what you can do."
msgstr "Le logiciel Lutim est un <a href=\"https://fr.wikipedia.org/wiki/Logiciel_libre\">logiciel libre</a>, ce qui vous permet de le télécharger et de linstaller sur votre propre serveur. Jetez un coup dœil à l<a href=\"https://www.gnu.org/licenses/agpl-3.0.html\">AGPL</a> pour voir quels sont vos droits"
#: lib/Lutim/Controller.pm:289
msgid "The URL is not valid."
msgstr "L'URL n'est pas valide."
#: lib/Lutim/Controller.pm:101
#: lib/Lutim/Controller.pm:170
msgid "The delete token is invalid."
msgstr "Le jeton de suppression est invalide."
#. ($upload->filename)
#: lib/Lutim/Controller.pm:433
msgid "The file %1 is not an image."
msgstr "Le fichier %1 n'est pas une image."
#. ($max_file_size)
#. ($tx->res->max_message_size)
#. ($c->req->max_message_size)
#: lib/Lutim/Controller.pm:253
#: lib/Lutim/Controller.pm:322
#: templates/partial/lutim.js.ep:337
msgid "The file exceed the size limit (%1)"
msgstr "Le fichier dépasse la limite de taille (%1)"
#: templates/stats.html.ep:11
msgid "The graph's datas are not updated in real-time."
msgstr "Les données du graphique ne sont pas mises à jour en temps réél."
#. ($image->filename)
#: lib/Lutim/Controller.pm:172
msgid "The image %1 has already been deleted."
msgstr "L'image %1 a déjà été supprimée."
#. ($image->filename)
#: lib/Lutim/Controller.pm:181
#: lib/Lutim/Controller.pm:186
msgid "The image %1 has been successfully deleted"
msgstr "L'image %1 a été supprimée avec succès."
#: lib/Lutim/Controller.pm:109
msgid "The image's delay has been successfully modified"
msgstr "Le délai de l'image a été modifié avec succès."
#: templates/index.html.ep:45
msgid "The images are encrypted on the server (Lutim does not keep the key)."
msgstr "Les images sont chiffrées sur le serveur (Lutim ne stocke pas la clé)."
#: templates/about.html.ep:5
msgid "The images you post on Lutim can be stored indefinitely or be deleted at first view or after a delay selected from those proposed."
msgstr "Les images déposées sur Lutim peuvent être stockées indéfiniment, ou seffacer dès le premier affichage ou au bout du délai choisi parmi ceux proposés."
#. ($c->config->{contact})
#: lib/Lutim/Controller.pm:428
msgid "There is no more available URL. Retry or contact the administrator. %1"
msgstr "Il n'y a plus d'URL disponible. Veuillez réessayer ou contacter l'administrateur. %1."
#: templates/index.html.ep:60
#: templates/partial/lutim.js.ep:46
msgid "Tweet it!"
msgstr "Tweetez !"
#. ($short)
#: lib/Lutim/Controller.pm:143
#: lib/Lutim/Controller.pm:215
msgid "Unable to find the image %1."
msgstr "Impossible de trouver l'image %1."
#: lib/Lutim.pm:66
#: lib/Lutim/Controller.pm:518
#: lib/Lutim/Controller.pm:564
#: lib/Lutim/Controller.pm:608
#: lib/Lutim/Controller.pm:648
#: lib/Lutim/Controller.pm:660
#: lib/Lutim/Controller.pm:671
#: lib/Lutim/Controller.pm:708
msgid "Unable to find the image: it has been deleted."
msgstr "Impossible de trouver l'image : elle a été supprimée."
#: lib/Lutim/Controller.pm:85
msgid "Unable to get counter"
msgstr "Impossible de récupérer le compteur"
#: templates/about.html.ep:17
msgid "Unlike many image sharing services, you don't give us rights on uploaded images."
msgstr "Au contraire de la majorité des services de partages d'image, vous ne nous cédez aucun droit sur les images envoyées."
#: templates/index.html.ep:162
#: templates/index.html.ep:201
msgid "Upload an image with its URL"
msgstr "Déposer une image par son URL"
#: templates/myfiles.html.ep:17
msgid "Uploaded at"
msgstr "Envoyé le"
#: templates/stats.html.ep:6
msgid "Uploaded files by days"
msgstr "Fichiers envoyés, par jour"
#. ($config->{contact})
#: lib/Lutim.pm:170
msgid "Uploading is currently disabled, please try later or contact the administrator (%1)."
msgstr "L'envoi d'images est actuellement désactivé, veuillez réessayer plus tard ou contacter l'administrateur (%1)."
#: templates/index.html.ep:65
#: templates/index.html.ep:67
#: templates/myfiles.html.ep:14
#: templates/partial/lutim.js.ep:172
#: templates/partial/lutim.js.ep:176
msgid "View link"
msgstr "Lien d'affichage"
#: templates/about.html.ep:22
msgid "What about the software which provides the service?"
msgstr "Et à propos du logiciel qui fournit le service ?"
#: templates/about.html.ep:3
msgid "What is Lutim?"
msgstr "Quest-ce que Lutim ?"
#: templates/about.html.ep:15
msgid "Who owns rights on images uploaded on Lutim?"
msgstr "Qui possède des droits sur les images envoyées sur Lutim ?"
#: templates/about.html.ep:12
msgid "Yes, it is! On the other side, for legal reasons, your IP address will be stored when you send an image. Don't panic, it is normally the case of all sites on which you send files!"
msgstr "Oui, ça lest ! Par contre, pour des raisons légales, votre adresse IP sera enregistrée lorsque vous enverrez une image. Ne vous affolez pas, cest de toute façon normalement le cas de tous les sites sur lesquels vous envoyez des fichiers !"
#. (url_for('/')
#: templates/about.html.ep:10
msgid "Yes, it is! On the other side, if you want to support the developer, you can do it via <a href=\"https://flattr.com/submit/auto?user_id=_SKy_&amp;url=%1&amp;title=Lutim&amp;category=software\">Flattr</a> or with <a href=\"bitcoin:1JCEtmx9pyzWfitMQj2pKAk8GNgyix7RmA?label=lutim\">BitCoin</a>."
msgstr "Oui, ça lest ! Par contre, si vous avez envie de soutenir le développeur, vous pouvez faire un microdon avec <a href=\"https://flattr.com/submit/auto?user_id=_SKy_&amp;url=%1&amp;title=Lutim&amp;category=software\">Flattr</a> ou en <a href=\"bitcoin:1JCEtmx9pyzWfitMQj2pKAk8GNgyix7RmA?label=lutim\">BitCoin</a>."
#: templates/about.html.ep:8
msgid "You can, optionally, request that the image(s) posted on Lutim to be deleted at first view (or download) or after the delay selected from those proposed."
msgstr "Vous pouvez, de façon facultative, demander à ce que la ou les images déposées sur Lutim soient supprimées après leur premier affichage (ou téléchargement) ou au bout d'un délai choisi parmi ceux proposés."
#: templates/about.html.ep:27
msgid "and on"
msgstr "et sur"
#: templates/about.html.ep:27
msgid "core developer"
msgstr "développeur principal"
#: templates/index.html.ep:3
msgid "no time limit"
msgstr "Pas de limitation de durée"
#: templates/about.html.ep:27
msgid "on"
msgstr "sur"
#: templates/about.html.ep:36
msgid "spanish translation"
msgstr "traduction espagnole"
#: templates/about.html.ep:28
msgid "webapp developer"
msgstr "développeur de la webapp"

View File

@@ -1,10 +1,25 @@
package LutimModel;
use Mojolicious;
use FindBin qw($Bin);
use File::Spec qw(catfile);
BEGIN {
my $m = Mojolicious->new;
our $config = $m->plugin('Config' =>
{
file => File::Spec->catfile($Bin, '..' ,'lutim.conf'),
default => {
db_path => 'lutim.db'
}
}
);
}
# Create database
use ORLite {
file => 'lutim.db',
file => $config->{db_path},
unicode => 1,
create => sub {
create => sub {
my $dbh = shift;
$dbh->do(
'CREATE TABLE lutim (
@@ -20,10 +35,12 @@ use ORLite {
created_at INTEGER,
created_by TEXT,
last_access_at INTEGER,
last_access_by INTEGER)'
mod_token TEXT,
width INTEGER,
height INTEGER)'
);
return 1;
}
}
};
1;

View File

@@ -1,36 +0,0 @@
package Mojolicious::Command::cron::cleanfiles;
use Mojo::Base 'Mojolicious::Command';
use LutimModel;
use Mojo::Util qw(slurp decode);
use Mojolicious::Plugin::Config;
has description => 'Delete expired files.';
has usage => sub { shift->extract_usage };
sub run {
my $c = shift;
my $config = Mojolicious::Plugin::Config->parse(decode('UTF-8', slurp 'lutim.conf'), 'lutim.conf');
my $time = time();
my @images = LutimModel::Lutim->select('WHERE enabled = 1 AND (delete_at_day * 86400) < (? - created_at) AND delete_at_day != 0', $time);
for my $image (@images) {
$image->update(enabled => 0);
unlink $image->path();
}
}
=encoding utf8
=head1 NAME
Mojolicious::Command::cron::cleanfiles - Delete expired files
=head1 SYNOPSIS
Usage: script/lutim cron cleanfiles
=cut
1;

View File

@@ -1,68 +0,0 @@
package Mojolicious::Command::cron::watch;
use Mojo::Base 'Mojolicious::Command';
use Mojo::Util qw(slurp decode);
use Mojolicious::Plugin::Config;
use Filesys::DiskUsage qw/du/;
use LutimModel;
use Switch;
has description => 'Watch the files directory and take action when over quota';
has usage => sub { shift->extract_usage };
sub run {
my $c = shift;
my $config = Mojolicious::Plugin::Config->parse(decode('UTF-8', slurp 'lutim.conf'), 'lutim.conf');
if (defined($config->{max_total_size})) {
my $total = du(qw/files/);
if ($total > $config->{max_total_size}) {
if (defined($config->{policy_when_full})) {
say "[LUTIm cron job watch] Files directory is over quota ($total > ".$config->{max_total_size}.")";
switch ($config->{policy_when_full}) {
case 'warn' {
say "[LUTIm cron job watch] Please, delete some files or increase quota (".$config->{max_total_size}.")";
}
case 'stop-upload' {
open (my $fh, '>', 'stop-upload') or die ("Couldn't open stop-upload: $!");
close($fh);
say '[LUTIm cron job watch] Uploads are stopped. Delete some images and the stop-upload file to reallow uploads.';
}
case 'delete' {
say '[LUTIm cron job watch] Older files are being deleted';
do {
for my $img (LutimModel::Lutim->select('WHERE path IS NOT NULL AND enabled = 1 ORDER BY created_at ASC LIMIT 50')) {
unlink $img->path() or warn "Could not unlink ".$img->path.": $!";
$img->update(enabled => 0);
}
} while (du(qw/files/) > $config->{max_total_size});
}
else {
say '[LUTIm cron job watch] Unrecognized policy_when_full option: '.$config->{policy_when_full}.'. Aborting.';
}
}
} else {
say "[LUTIm cron job watch] Files directory over quota ($total > ".$config->{max_total_size}.") but no configured policy_when_full option!" ;
}
} else {
unlink 'stop-upload' if (-f 'stop-upload');
}
} else {
say "[LUTIm cron job watch] No max_total_size found in the configuration file. Aborting.";
}
}
=encoding utf8
=head1 NAME
Mojolicious::Command::cron::watch - Delete IP addresses from database after configured delay
=head1 SYNOPSIS
Usage: script/lutim cron watch
=cut
1;

28
lib/Mounter.pm Normal file
View File

@@ -0,0 +1,28 @@
package Mounter;
use Mojo::Base 'Mojolicious';
use FindBin qw($Bin);
use File::Spec qw(catfile);
# This method will run once at server start
sub startup {
my $self = shift;
push @{$self->commands->namespaces}, 'Lutim::Command';
my $config = $self->plugin('Config' =>
{
file => File::Spec->catfile($Bin, '..' ,'lutim.conf'),
default => {
prefix => '/'
}
}
);
$config->{prefix} = $config->{url_sub_dir} if (defined($config->{url_sub_dir}) && $config->{prefix} eq '/');
$self->app->log->warn('"url_sub_dir" configuration option is deprecated. Use "prefix" instead. "url_sub_dir" will be removed in the future') if (defined($config->{url_sub_dir}));
$self->plugin('Mount' => {$config->{prefix} => File::Spec->catfile($Bin, '..', 'script', 'application')});
}
1;

View File

@@ -1,28 +1,149 @@
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
# See README.md for more explanations
{
####################
# Hypnotoad settings
####################
# see http://mojolicio.us/perldoc/Mojo/Server/Hypnotoad for a full list of settings
hypnotoad => {
# array of IP addresses and ports you want to listen to
listen => ['http://127.0.0.1:8080'],
user => 'www-data',
group => 'www-data'
# if you use Lutim behind a reverse proxy like Nginx, you want to set proxy to 1
# if you use Lutim directly, let it commented
#proxy => 1,
},
################
# Lutim settings
################
# put a way to contact you here and uncomment it
# mandatory
#contact => 'John Doe, admin[at]example.com',
secrets => ['fdjsofjoihrei'], # please provide a random string
length => 8, # optional
provis_step => 5, # optional
provisioning => 100, # optional
tweet_card_via => '@framasky', # optional
max_file_size => 10485760, # optional, size in octets, you can write it 10*1024*1024
#piwik_img => 'https://piwik.example.org/piwik.php?idsite=1&amp;rec=1', # optional, only the piwik image tracker is allowed, no javascript
#hosted_by => 'My super hoster <img src="http://hoster.example.com" alt="Hoster logo">', # optional
#https => 0, # optional, set to 1 if you use Lutim behind a secure web server
#stats_day_num => 365, # optional, number of days shown in /stats page (used with script/lutim cron stats)
#keep_ip_during => 365, # optional, number of days, after that delay, the IP addresses of image creators will be deleted (used with script/lutim cron cleanbdd)
#max_total_size => 10*1024*1024*1024, # optional, maximum total size of the files directory (used with script/lutim cron watch)
#policy_when_full => 'warn', # optional, policy when files directory is over max_total_size. Valid values are 'warn', 'stop-upload' and 'delete'. See README.
#broadcast_message => 'Maintenance', #optional, the broadcast_message is displayed on all pages of LUTIm (but no in json response)
#allowed_domains => ['http://1.example.com', 'http://2.example.com'], #optional, array of authorized domains for API calls. If you want to authorize everyone to use the API: ['*']
#default_delay => 0, #optional: what is the default time limit for files? Valid values are 0, 1, 7, 30 and 365.
#max_delay => 0, #optional, if defined, the images will be deleted after that delay (in days), even if they were uploaded with "no delay" (or value superior to max\_delay) option and a warning message will be displayed on homepage.
#always_encrypt => 0, #optional, if set to 1, all the images will be encrypted
# random string used to encrypt cookies
# mandatory
secrets => ['fdjsofjoihrei'],
# length of the images random URL
# optional, default is 8
#length => 8,
# length of the encryption key
# optional, default is 8
#crypto_key_length => 8,
# how many URLs will be provisioned in a batch ?
# optional, default is 5
#provis_step => 5,
# max number of URLs to be provisioned
# optional, default is 100
#provisioning => 100,
# anti-flood protection delay, in seconds
# users won't be able to ask Lutim to download images more than one per anti_flood_delay seconds
# optional, default is 5
#anti_flood_delay => 5,
# twitter account which will appear on twitter cards
# see https://dev.twitter.com/docs/cards/validation/validator to register your Lutim instance on twitter
# optional, default is @framasky
#tweet_card_via => '@framasky',
# max image size, in octets
# you can write it 10*1024*1024
# optional, default is 10485760
#max_file_size => 10485760,
# if you want to have piwik statistics, provide a piwik image tracker
# only the image tracker is allowed, no javascript
# optional, no default
#piwik_img => 'https://piwik.example.org/piwik.php?idsite=1&amp;rec=1',
# if you want to include something in the right of the screen, put it here
# here's an exemple to put the logo of your hoster
# optional, no default
#hosted_by => 'My super hoster <img src="http://hoster.example.com" alt="Hoster logo">',
# DEPRECATED DEPRECATED DEPRECATED DEPRECATED DEPRECATED DEPRECATED DEPRECATED DEPRECATED DEPRECATED DEPRECATED
# Lutim now checks if the X-Forwarded-Proto header is present and equal to https.
# set to 1 if you use Lutim behind a secure web server
# optional, default is 0
#https => 0,
# broadcast_message which will displayed on all pages of Lutim (but no in json response)
# optional, no default
#broadcast_message => 'Maintenance',
# array of authorized domains for API calls.
# if you want to authorize everyone to use the API: ['*']
# optional, no domains allowed by default
#allowed_domains => ['http://1.example.com', 'http://2.example.com'],
# default time limit for files
# valid values are 0, 1, 7, 30 and 365
# optional, default is 0 (no limit)
#default_delay => 0,
# number of days after which the images will be deleted, even if they were uploaded with "no delay" (or value superior to max_delay)
# a warning message will be displayed on homepage
# optional, default is 0 (no limit)
#max_delay => 0,
# if set to 1, all the images will be encrypted and the encryption option will no be displayed
# optional, default is 0
#always_encrypt => 0,
# length of the image's delete token
# optional, default is 24
#token_length => 24,
# URL sub-directory in which you want Lutim to be accessible
# example: you want to have Lutim under https://example.org/lutim/
# => set prefix to '/lutim' or to '/lutim/', it doesn't matter
# optional, defaut is /
#prefix => '/',
# define a path to the SQLite database
# you can define it relative to lutim directory or set an absolute path
# remember that it has to be in a directory writable by Lutim user
# optional, default is lutim.db
#db_path => 'lutim.db',
# define the height of the thumbnails generated at users' will
# this is not the height of the thumbnails send after upload,
# we're talking about thumbnails generated when someone asked for
# https://example.org/lutim/tesrinp?thumb
# this works only if you have ImageMagick
# optional, default is 100 (pixels)
#thumbnail_size => 100,
##########################
# Lutim cron jobs settings
##########################
# number of days shown in /stats page (used with script/lutim cron stats)
# optional, default is 365
#stats_day_num => 365,
# number of days senders' IP addresses are kept in database
# after that delay, they will be deleted from database (used with script/lutim cron cleanbdd)
# optional, default is 365
#keep_ip_during => 365,
# max size of the files directory, in octets
# used by script/lutim cron watch to trigger an action
# optional, no default
#max_total_size => 10*1024*1024*1024,
# default action when files directory is over max_total_size (used with script/lutim cron watch)
# valid values are 'warn', 'stop-upload' and 'delete'
# please, see readme
# optional, default is 'warn'
#policy_when_full => 'warn',
# images which are not viewed since delete_no_longer_viewed_files days will be deleted by the cron cleanfiles task
# if delete_no_longer_viewed_files is not set, the no longer viewed files will NOT be deleted
# optional, no default
#delete_no_longer_viewed_files => 90
};

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -1,8 +1,15 @@
.icon-eye:before { content: '\e806'; } /* '' */
.icon-download:before { content: '\e804'; } /* '' */
.icon-bitcoin:before { content: '\e802'; } /* '' */
.icon-spinner:before { content: '\e805'; } /* '' */
.icon-github-circled:before { content: '\e800'; } /* '' */
.icon-touiteur:before { content: '\e801'; } /* '' */
.icon-flattr:before { content: '\e803'; } /* '' */
.icon-ok:before { content: '\e800'; } /* '' */
.icon-eye:before { content: '\e801'; } /* '' */
.icon-download:before { content: '\e802'; } /* '' */
.icon-share:before { content: '\e803'; } /* '' */
.icon-trash:before { content: '\e804'; } /* '' */
.icon-bitcoin:before { content: '\e805'; } /* '' */
.icon-git:before { content: '\e806'; } /* '' */
.icon-twitter:before { content: '\e807'; } /* '' */
.icon-clipboard:before { content: '\e808'; } /* '' */
.icon-spinner:before { content: '\e809'; } /* '' */
.icon-flattr:before { content: '\e80a'; } /* '' */
.icon-cancel:before { content: '\e80b'; } /* '' */
.icon-picture:before { content: '\e80c'; } /* '' */
.icon-file-archive:before { content: '\e80d'; } /* '' */

File diff suppressed because one or more lines are too long

View File

@@ -1,8 +1,15 @@
.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
.icon-download { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe804;&nbsp;'); }
.icon-bitcoin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe802;&nbsp;'); }
.icon-spinner { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe805;&nbsp;'); }
.icon-github-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe800;&nbsp;'); }
.icon-touiteur { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe801;&nbsp;'); }
.icon-flattr { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe803;&nbsp;'); }
.icon-ok { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe800;&nbsp;'); }
.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe801;&nbsp;'); }
.icon-download { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe802;&nbsp;'); }
.icon-share { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe803;&nbsp;'); }
.icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe804;&nbsp;'); }
.icon-bitcoin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe805;&nbsp;'); }
.icon-git { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
.icon-twitter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe807;&nbsp;'); }
.icon-clipboard { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe808;&nbsp;'); }
.icon-spinner { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe809;&nbsp;'); }
.icon-flattr { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80a;&nbsp;'); }
.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80b;&nbsp;'); }
.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80c;&nbsp;'); }
.icon-file-archive { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80d;&nbsp;'); }

View File

@@ -10,10 +10,17 @@
/* font-size: 120%; */
}
.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
.icon-download { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe804;&nbsp;'); }
.icon-bitcoin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe802;&nbsp;'); }
.icon-spinner { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe805;&nbsp;'); }
.icon-github-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe800;&nbsp;'); }
.icon-touiteur { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe801;&nbsp;'); }
.icon-flattr { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe803;&nbsp;'); }
.icon-ok { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe800;&nbsp;'); }
.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe801;&nbsp;'); }
.icon-download { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe802;&nbsp;'); }
.icon-share { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe803;&nbsp;'); }
.icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe804;&nbsp;'); }
.icon-bitcoin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe805;&nbsp;'); }
.icon-git { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
.icon-twitter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe807;&nbsp;'); }
.icon-clipboard { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe808;&nbsp;'); }
.icon-spinner { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe809;&nbsp;'); }
.icon-flattr { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80a;&nbsp;'); }
.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80b;&nbsp;'); }
.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80c;&nbsp;'); }
.icon-file-archive { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80d;&nbsp;'); }

View File

@@ -1,10 +1,11 @@
@font-face {
font-family: 'fontello';
src: url('../font/fontello.eot?69050751');
src: url('../font/fontello.eot?69050751#iefix') format('embedded-opentype'),
url('../font/fontello.woff?69050751') format('woff'),
url('../font/fontello.ttf?69050751') format('truetype'),
url('../font/fontello.svg?69050751#fontello') format('svg');
src: url('../font/fontello.eot?79499210');
src: url('../font/fontello.eot?79499210#iefix') format('embedded-opentype'),
url('../font/fontello.woff2?79499210') format('woff2'),
url('../font/fontello.woff?79499210') format('woff'),
url('../font/fontello.ttf?79499210') format('truetype'),
url('../font/fontello.svg?79499210#fontello') format('svg');
font-weight: normal;
font-style: normal;
}
@@ -14,7 +15,7 @@
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: 'fontello';
src: url('../font/fontello.svg?69050751#fontello') format('svg');
src: url('../font/fontello.svg?79499210#fontello') format('svg');
}
}
*/
@@ -35,7 +36,7 @@
/* For safety - reset parent styles, that can break glyph codes*/
font-variant: normal;
text-transform: none;
/* fix buttons height, for twitter bootstrap */
line-height: 1em;
@@ -46,14 +47,25 @@
/* you can be more comfortable with increased icons size */
/* font-size: 120%; */
/* Font smoothing. That was taken from TWBS */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
/* Uncomment for 3D effect */
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
}
.icon-eye:before { content: '\e806'; } /* '' */
.icon-download:before { content: '\e804'; } /* '' */
.icon-bitcoin:before { content: '\e802'; } /* '' */
.icon-spinner:before { content: '\e805'; } /* '' */
.icon-github-circled:before { content: '\e800'; } /* '' */
.icon-touiteur:before { content: '\e801'; } /* '' */
.icon-flattr:before { content: '\e803'; } /* '' */
.icon-ok:before { content: '\e800'; } /* '' */
.icon-eye:before { content: '\e801'; } /* '' */
.icon-download:before { content: '\e802'; } /* '' */
.icon-share:before { content: '\e803'; } /* '' */
.icon-trash:before { content: '\e804'; } /* '' */
.icon-bitcoin:before { content: '\e805'; } /* '' */
.icon-git:before { content: '\e806'; } /* '' */
.icon-twitter:before { content: '\e807'; } /* '' */
.icon-clipboard:before { content: '\e808'; } /* '' */
.icon-spinner:before { content: '\e809'; } /* '' */
.icon-flattr:before { content: '\e80a'; } /* '' */
.icon-cancel:before { content: '\e80b'; } /* '' */
.icon-picture:before { content: '\e80c'; } /* '' */
.icon-file-archive:before { content: '\e80d'; } /* '' */

View File

@@ -0,0 +1,6 @@
@font-face {
font-family: 'Henny_Penny';
font-style: normal;
font-weight: 400;
src: local('Henny Penny'), local('HennyPenny-Regular'), url(../font/hennypenny.ttf) format('truetype');
}

62
public/css/lutim.css Normal file
View File

@@ -0,0 +1,62 @@
@media (max-width: 767px) {
body {
padding-top: 5px;
padding-bottom: 5px;
}
}
@media (min-width: 768px) {
body {
padding-top: 40px;
padding-bottom: 40px;
}
}
.container {
padding: 15px;
margin: 0 auto;
}
.jsonly {
display: none;
}
.thumbnail {
margin-right: 8px;
}
.hennypenny {
font-family: 'Henny_Penny', cursive;
font-size: 42px;
}
.logo {
margin-right: 10px;
}
label.always-encrypt {
display: none;
}
.link_nocol,
.link_nocol:hover{
color: #000000;
text-decoration: none;
}
#install-app img {
height: 22px;
}
#install-app {
display: none;
}
.form-control[readonly] {
background-color: #FFFFFF;
}
.alert .form-group {
margin-bottom: 5px;
}
#copy-all {
margin-bottom: 8px;
}
#gallery-url {
margin-bottom: 10px;
}

31
public/css/markdown.css Normal file
View File

@@ -0,0 +1,31 @@
@font-face {
font-family: 'markdown';
src:url('../font/markdown.eot?-6fnbp5');
src:url('../font/markdown.eot?#iefix-6fnbp5') format('embedded-opentype'),
url('../font/markdown.woff?-6fnbp5') format('woff'),
url('../font/markdown.ttf?-6fnbp5') format('truetype'),
url('../font/markdown.svg?-6fnbp5#markdown') format('svg');
font-weight: normal;
font-style: normal;
}
[class^="markdown-"], [class*=" markdown-"] {
font-family: 'markdown';
speak: none;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
/* Better Font Rendering =========== */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.markdown-mark:before {
content: "\e600";
}
.markdown-mark-solid:before {
content: "\e601";
}

2
public/css/morris-0.4.3.min.css vendored Normal file
View File

@@ -0,0 +1,2 @@
.morris-hover{position:absolute;z-index:1000;}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255, 255, 255, 0.8);border:solid 2px rgba(230, 230, 230, 0.8);font-family:sans-serif;font-size:12px;text-align:center;}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0;}
.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0;}

View File

@@ -26,6 +26,18 @@
padding: 10px;
}
@media (max-width:768px){
.uploader div.browser label {
max-width:95%;
}
}
@media (min-width:768px){
.uploader div.browser label {
width:300px;
}
}
.uploader div.browser label {
background-color: #5a7bc2;
padding: 5px 15px;
@@ -38,7 +50,6 @@
position: relative;
overflow: hidden;
display: block;
width: 300px;
margin: 20px auto 0px auto;
box-shadow: 2px 2px 2px #888888;

57
public/font/LICENSE.txt Normal file
View File

@@ -0,0 +1,57 @@
Font license info
## Font Awesome
Copyright (C) 2012 by Dave Gandy
Author: Dave Gandy
License: SIL ()
Homepage: http://fortawesome.github.com/Font-Awesome/
## Typicons
(c) Stephen Hutchings 2012
Author: Stephen Hutchings
License: SIL (http://scripts.sil.org/OFL)
Homepage: http://typicons.com/
## MFG Labs
Copyright (C) 2012 by Daniel Bruce
Author: MFG Labs
License: SIL (http://scripts.sil.org/OFL)
Homepage: http://www.mfglabs.com/
## Zocial
Copyright (C) 2012 by Sam Collins
Author: Sam Collins
License: MIT (http://opensource.org/licenses/mit-license.php)
Homepage: http://zocial.smcllns.com/
## Elusive
Copyright (C) 2013 by Aristeides Stathopoulos
Author: Aristeides Stathopoulos
License: SIL (http://scripts.sil.org/OFL)
Homepage: http://aristeides.com/
## Web Symbols
Copyright (c) 2011 by Just Be Nice studio. All rights reserved.
Author: Just Be Nice studio
License: SIL (http://scripts.sil.org/OFL)
Homepage: http://www.justbenicestudio.com/

Binary file not shown.

View File

@@ -1,18 +1,38 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Copyright (C) 2014 by original authors @ fontello.com</metadata>
<metadata>Copyright (C) 2016 by original authors @ fontello.com</metadata>
<defs>
<font id="fontello" horiz-adv-x="1000" >
<font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
<missing-glyph horiz-adv-x="1000" />
<glyph glyph-name="eye" unicode="&#xe806;" d="m929 314q-85 132-213 197q34-58 34-125q0-104-73-177t-177-73t-177 73t-73 177q0 67 34 125q-128-65-213-197q75-114 187-182t242-68t242 68t187 182z m-402 215q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-12 8-19t19-8t19 8t8 19q0 48 34 82t82 34q11 0 19 8t8 19z m473-215q0-19-11-38q-78-129-210-206t-279-77t-279 77t-210 206q-11 19-11 38t11 39q78 128 210 205t279 78t279-78t210-205q11-20 11-39z" horiz-adv-x="1000" />
<glyph glyph-name="download" unicode="&#xe804;" d="m714 100q0 15-10 25t-25 11t-26-11t-10-25t10-25t26-11t25 11t10 25z m143 0q0 15-10 25t-26 11t-25-11t-10-25t10-25t25-11t26 11t10 25z m72 125v-179q0-22-16-37t-38-16h-821q-23 0-38 16t-16 37v179q0 22 16 38t38 16h259l75-76q33-32 76-32t76 32l76 76h259q22 0 38-16t16-38z m-182 318q10-23-8-40l-250-250q-10-10-25-10t-25 10l-250 250q-17 17-8 40q10 21 33 21h143v250q0 15 11 25t25 11h143q14 0 25-11t10-25v-250h143q24 0 33-21z" horiz-adv-x="928.6" />
<glyph glyph-name="bitcoin" unicode="&#xe802;" d="m651 493q10-102-73-144q65-16 98-58t25-119q-4-40-18-70t-36-49t-54-33t-68-19t-81-9v-142h-86v140q-45 0-68 1v-141h-86v142q-10 0-30 1t-31 0h-112l18 102h62q27 0 32 28v225h9q-4 0-9 0v160q-7 38-50 38h-62v92l119-1q35 0 54 1v141h86v-138q45 1 68 1v137h86v-141q44-4 78-13t63-25t46-43t20-64z m-120-304q0 20-8 35t-21 26t-32 17t-36 10t-42 5t-38 2t-36 0t-27-1v-189q5 0 21 0t27 0t29 1t33 2t32 5t31 8t26 11t22 17t14 22t5 29z m-39 265q0 19-7 33t-17 23t-27 16t-31 9t-34 5t-33 1t-30 0t-22-1v-171q3 0 20 0t26 0t27 1t31 3t29 6t27 10t21 15t15 22t5 28z" horiz-adv-x="714.3" />
<glyph glyph-name="spinner" unicode="&#xe805;" d="m277 100q0-33-24-57t-57-23q-33 0-56 23t-24 57t24 57t56 23q33 0 57-23t24-57z m241-107q0-30-21-51t-51-21t-50 21t-21 51t21 50t50 21t51-21t21-50z m-339 357q0-37-27-63t-63-26t-63 26t-26 63t26 63t63 26t63-26t27-63z m580-250q0-26-18-44t-45-18t-44 18t-18 44t18 44t44 19t45-19t18-44z m-464 500q0-41-29-69t-70-29t-69 29t-29 69t29 69t69 29t70-29t29-69z m259 107q0-45-32-76t-76-31t-75 31t-32 76t32 76t75 31t76-31t32-76z m303-357q0-22-15-38t-38-16t-38 16t-16 38t16 38t38 16t38-16t15-38z m-116 250q0-18-13-32t-32-13t-31 13t-13 32t13 31t31 14t32-14t13-31z" horiz-adv-x="875" />
<glyph glyph-name="github-circled" unicode="&#xe800;" d="m857 350q0-140-82-252t-211-155q-15-3-22 4t-7 17v118q0 54-29 79q32 3 57 10t53 22t45 37t30 58t11 84q0 68-44 115q21 51-5 114q-15 5-45-6t-51-25l-21-13q-52 15-107 15t-108-15q-8 6-23 15t-47 22t-48 7q-24-63-4-114q-44-47-44-115q0-47 12-83t29-59t45-37t52-22t57-10q-22-20-27-58q-12-5-25-8t-32-3t-36 12t-31 35q-11 18-27 29t-28 14l-11 1q-12 0-16-2t-3-7t5-8t7-6l4-3q12-6 24-21t18-29l5-13q8-21 25-34t37-17t39-4t31 2l13 3q0-22 0-50t1-30q0-10-8-17t-22-4q-129 43-211 155t-82 252q0 117 58 215t155 156t216 58t215-58t156-156t57-215z" horiz-adv-x="857.1" />
<glyph glyph-name="touiteur" unicode="&#xe801;" d="m904 622q-37-54-90-93q0-8 0-23q0-73-21-145t-64-139t-103-117t-144-82t-181-30q-151 0-276 81q19-3 43-3q126 0 224 77q-59 2-105 36t-64 89q19-2 34-2q24 0 48 6q-63 13-104 62t-41 115v2q38-21 82-23q-37 25-59 64t-22 86q0 49 25 91q68-83 164-133t208-55q-5 21-5 41q0 75 53 127t127 53q79 0 132-57q61 12 114 44q-20-64-79-100q52 6 104 28z" horiz-adv-x="928.6" />
<glyph glyph-name="flattr" unicode="&#xe803;" d="m180 424l0-210l-180-180l0 414q0 302 278 302l442 0l-312-310q-6-6-10-6q-8 0-12 10l0 128q-98 0-112-2q-94-16-94-146z m440 64l180 180l0-414q0-304-278-304l-440 0l312 312q2 6 8 6q8 0 12-10l0-128q98 0 112 2q94 16 94 146l0 210z" horiz-adv-x="800" />
<glyph glyph-name="ok" unicode="&#xe800;" d="M932 534q0-22-15-38l-404-404-76-76q-16-15-38-15t-38 15l-76 76-202 202q-15 16-15 38t15 38l76 76q16 16 38 16t38-16l164-165 366 367q16 16 38 16t38-16l76-76q15-16 15-38z" horiz-adv-x="1000" />
<glyph glyph-name="eye" unicode="&#xe801;" d="M929 314q-85 132-213 197 34-58 34-125 0-104-73-177t-177-73-177 73-73 177q0 67 34 125-128-65-213-197 75-114 187-182t242-68 242 68 187 182z m-402 215q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-11 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m473-215q0-19-11-38-78-129-210-206t-279-77-279 77-210 206q-11 19-11 38t11 39q78 128 210 205t279 78 279-78 210-205q11-20 11-39z" horiz-adv-x="1000" />
<glyph glyph-name="download" unicode="&#xe802;" d="M714 100q0 15-10 25t-25 11-26-11-10-25 10-25 26-11 25 11 10 25z m143 0q0 15-10 25t-26 11-25-11-10-25 10-25 25-11 26 11 10 25z m72 125v-179q0-22-16-37t-38-16h-821q-23 0-38 16t-16 37v179q0 22 16 38t38 16h259l75-76q33-32 76-32t76 32l76 76h259q22 0 38-16t16-38z m-182 318q10-23-8-40l-250-250q-10-10-25-10t-25 10l-250 250q-17 17-8 40 10 21 33 21h143v250q0 15 11 25t25 11h143q14 0 25-11t10-25v-250h143q24 0 33-21z" horiz-adv-x="928.6" />
<glyph glyph-name="share" unicode="&#xe803;" d="M679 279q74 0 126-53t52-126-52-126-126-53-127 53-52 126q0 7 1 19l-201 100q-51-48-121-48-75 0-127 53t-52 126 52 126 127 53q70 0 121-48l201 100q-1 12-1 19 0 74 52 126t127 53 126-53 52-126-52-126-126-53q-71 0-122 48l-201-100q1-12 1-19t-1-19l201-100q51 48 122 48z" horiz-adv-x="857.1" />
<glyph glyph-name="trash" unicode="&#xe804;" d="M286 439v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m143 0v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m142 0v-321q0-8-5-13t-12-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q7 0 12-5t5-13z m72-404v529h-500v-529q0-12 4-22t8-15 6-5h464q2 0 6 5t8 15 4 22z m-375 601h250l-27 65q-4 5-9 6h-177q-6-1-10-6z m518-18v-36q0-8-5-13t-13-5h-54v-529q0-46-26-80t-63-34h-464q-37 0-63 33t-27 79v531h-53q-8 0-13 5t-5 13v36q0 8 5 13t13 5h172l39 93q9 21 31 35t44 15h178q22 0 44-15t30-35l39-93h173q8 0 13-5t5-13z" horiz-adv-x="785.7" />
<glyph glyph-name="bitcoin" unicode="&#xe805;" d="M651 493q10-102-73-144 65-16 98-58t25-119q-4-40-18-70t-36-49-54-33-68-19-81-9v-142h-86v140q-45 0-68 1v-141h-86v142q-10 0-30 1t-31 0h-112l18 102h62q27 0 32 28v225h9q-4 0-9 0v160q-7 38-50 38h-62v92l119-1q35 0 54 1v141h86v-138q45 1 68 1v137h86v-141q44-4 78-13t63-25 46-43 20-64z m-120-304q0 20-8 35t-21 26-32 17-36 10-42 5-38 2-36 0-27-1v-189q5 0 21 0t27 0 29 1 33 2 32 5 31 8 26 11 22 17 14 22 5 29z m-39 265q0 19-7 33t-17 23-27 16-31 9-34 5-33 1-30 0-22-1v-171q3 0 20 0t26 0 27 1 31 3 29 6 27 10 21 15 15 22 5 28z" horiz-adv-x="714.3" />
<glyph glyph-name="git" unicode="&#xe806;" d="M332 5q0 56-92 56-88 0-88-58 0-57 96-57 84 0 84 59z m-33 421q0 35-17 57t-49 23q-69 0-69-81 0-75 69-75 66 0 66 76z m150 181v-112q-20-7-44-13 9-24 9-47 0-70-41-120t-110-63q-22-5-33-15t-11-33q0-17 13-28t32-18 44-12 48-15 44-21 32-35 13-55q0-170-203-170-38 0-72 7t-65 23-49 46-18 71q0 92 102 125v3q-38 22-38 70 0 61 35 76v3q-40 13-66 60t-27 92q0 78 53 130t131 51q54 0 100-26 54 0 121 26z m178-491h-124q2 25 2 74v340q0 53-2 72h124q-3-19-3-70v-342q0-49 3-74z m335 124v-110q-40-22-97-22-35 0-60 12t-39 27-22 44-10 51-2 58v196h1v2q-4 0-11 0t-10 1q-12 0-33-3v106h54v42q0 30-4 50h127q-3-23-3-92h95v-106q-8 0-24 1t-24 1h-47v-204q0-73 48-73 34 0 61 19z m-321 528q0-32-22-57t-54-24q-32 0-54 24t-23 57q0 33 22 57t55 25q33 0 54-25t22-57z" horiz-adv-x="1000" />
<glyph glyph-name="twitter" unicode="&#xe807;" d="M904 622q-37-54-90-93 0-8 0-23 0-73-21-145t-64-139-103-117-144-82-181-30q-151 0-276 81 19-2 43-2 126 0 224 77-59 1-105 36t-64 89q19-3 34-3 24 0 48 6-63 13-104 62t-41 115v2q38-21 82-23-37 25-59 64t-22 86q0 49 25 91 68-83 164-133t208-55q-5 21-5 41 0 75 53 127t127 53q79 0 132-57 61 12 114 44-20-64-79-100 52 6 104 28z" horiz-adv-x="928.6" />
<glyph glyph-name="clipboard" unicode="&#xe808;" d="M678 819q65 0 110-46t46-110l0-625q0-65-46-111t-110-46l-522 0q-65 0-110 46t-46 111l0 625q0 65 46 110t110 46l522 0z m-418-104l0-52q0-21 16-37t37-16l208 0q22 0 37 16t15 37l0 52-313 0z m469-677l0 625q0 21-15 37t-36 15l-53 0 0-52q0-43-30-73t-74-31l-208 0q-43 0-74 31t-30 73l0 52-53 0q-21 0-37-15t-15-37l0-625q0-21 15-37t37-16l522 0q21 0 36 16t15 37z m-104 52l-416 0q-26 0-26 25 0 12 7 19t19 8l416 0q11 0 19-8t7-19q0-25-26-25z m0 157l-416 0q-11 0-19 7t-7 19q0 25 26 25l416 0q26 0 26-25 0-11-7-19t-19-7z m0 156l-416 0q-26 0-26 25 0 11 7 19t19 7l416 0q11 0 19-7t7-19q0-25-26-25z" horiz-adv-x="834" />
<glyph glyph-name="spinner" unicode="&#xe809;" d="M469 614v204q129 0 237-61t169-170 62-237h-204q0 72-36 133t-95 96-133 35z" horiz-adv-x="937.5" />
<glyph glyph-name="flattr" unicode="&#xe80a;" d="M0-37l0 514q0 179 85 278t259 99l548 0q-5-5-52-53t-100-101-109-109-95-93-42-37q-15 0-15 16l0 156-48 0q-59 0-94-6t-63-26-39-57-12-96l0-262z m67-117q5 5 53 53t100 101 109 110 95 93 41 36q15 0 15-16l0-156 48 0q116 0 162 36t45 149l0 262 224 223 0-514q0-179-84-278t-260-99l-548 0z" horiz-adv-x="959" />
<glyph glyph-name="cancel" unicode="&#xe80b;" d="M0 71l279 279-279 279 221 221 279-279 279 279 221-221-279-279 279-279-221-221-279 279-279-279z" horiz-adv-x="1000" />
<glyph glyph-name="picture" unicode="&#xe80c;" d="M1360 849v-1000h-1360v1000h1360z m-1240-880h1120v760h-1120v-760z m1000 560q0-33-23-56t-57-24-56 24-24 56 24 57 56 23 57-23 23-57z m43-473q2-1 1-4t-4-3h-956q-4 0-4 4v2q18 36 135 280t144 299q1 2 4 3t3-2l311-386 152 122h7l1-2q39-50 102-155t104-158z" horiz-adv-x="1360" />
<glyph glyph-name="file-archive" unicode="&#xe80d;" d="M357 636v71h-71v-71h71z m72-72v72h-72v-72h72z m-72-71v71h-71v-71h71z m72-72v72h-72v-72h72z m390 217q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-71v-72h-72v72h-286v-858h715z m-350 403l60-195q4-15 4-29 0-46-40-77t-103-30-102 30-41 77q0 14 5 29 12 35 67 221v71h71v-71h44q13 0 22-7t13-19z m-79-260q30 0 51 11t21 25-21 25-51 11-50-11-21-25 21-25 50-11z" horiz-adv-x="857.1" />
</font>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Binary file not shown.

BIN
public/font/fontello.woff2 Normal file

Binary file not shown.

BIN
public/font/hennypenny.ttf Normal file

Binary file not shown.

BIN
public/font/markdown.eot Normal file

Binary file not shown.

31
public/font/markdown.svg Normal file
View File

@@ -0,0 +1,31 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>
<json>
{
"fontFamily": "markdown",
"majorVersion": 1,
"minorVersion": 0,
"fontURL": "https://github.com/dcurtis/markdown-mark",
"designer": "Dustin Curtis",
"designerURL": "http://twitter.com/dcurtis",
"license": "CC0 UNIVERSAL PUBLIC DOMAIN DEDICATION LICENSE",
"licenseURL": "https://raw.githubusercontent.com/dcurtis/markdown-mark/master/LICENSE",
"version": "Version 1.0",
"fontId": "markdown",
"psName": "markdown",
"subFamily": "Regular",
"fullName": "markdown",
"description": "Generated by IcoMoon"
}
</json>
</metadata>
<defs>
<font id="markdown" horiz-adv-x="512">
<font-face units-per-em="512" ascent="480" descent="-32" />
<missing-glyph horiz-adv-x="512" />
<glyph unicode="&#x20;" d="" horiz-adv-x="256" />
<glyph unicode="&#xe600;" d="M120 88v272h80l80-100 80 100h80v-272h-80v156l-80-100-80 100v-156h-80zM620 88l-120 132h80v140h80v-140h80l-120-132zM0 428.021v-408.042c0-28.714 23.299-51.979 52.029-51.979h727.943c28.727 0 52.029 23.266 52.029 51.979v408.042c0 28.714-23.299 51.979-52.029 51.979h-727.943c-28.727 0-52.029-23.266-52.029-51.979zM779.971 440c6.651 0 12.029-5.369 12.029-11.979v-408.042c0-6.608-5.379-11.979-12.029-11.979h-727.943c-6.651 0-12.029 5.369-12.029 11.979v408.042c0 6.608 5.379 11.979 12.029 11.979h727.943z" horiz-adv-x="832" />
<glyph unicode="&#xe601;" d="M0 428.021v-408.042c0-28.714 23.299-51.979 52.029-51.979h727.943c28.727 0 52.029 23.266 52.029 51.979v408.042c0 28.714-23.299 51.979-52.029 51.979h-727.943c-28.727 0-52.029-23.266-52.029-51.979zM120 88v272h80l80-100 80 100h80v-272h-80v156l-80-100-80 100v-156h-80zM620 88l-120 132h80v140h80v-140h80l-120-132z" horiz-adv-x="832" />
</font></defs></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
public/font/markdown.ttf Normal file

Binary file not shown.

BIN
public/font/markdown.woff Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 933 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 688 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 946 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 858 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 540 B

4
public/gallery/js/jquery-11.0.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

10
public/gallery/js/unitegallery.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,423 @@
version 1.7.22
-bug fix: fixed bug related to video sizes in lightbox
-bug fix: fixed bug when right button was disabled on non fixed thumbs
version 1.7.21
-bug fix: fixed one row only bug in tiles grid
version 1.7.20
-bug fix: fixed youtube player destroy function, was a bug there
version 1.7.19
change: changed functionality to: tile_videoplay_icon_always_on
version 1.7.18
-bug fix: fixed various bugs from 17.7.17
version 1.7.17
-bug fix: fixed jquery 1.8 issue with fading.
-bug fix: fixed icon always on issue
version 1.7.16
-bug fix: fixed image border issue.
version 1.7.15
-bug fix: fixed tiles grid small issue with rtl
version 1.7.14
-bug fix: fixed nested type arrange on first load for mobile mode
version 1.7.13
-bug fix: fixed small js bug, about html variable
-bug fix: added better protection against unwanted css transitions
-bug fix: fixed vimeo didn't changed bug (vimeo removed the quick change video option)
version 1.7.12
-change: added line height to video title
-bug fix: bring back the fixed tiles_max_columns function
version 1.7.11
-bog fix: improved lightbox wide video player
version 1.7.10
-change: added theme_align option to tiles grid
version 1.7.9
-bug fix: fixed some preloader error with tabs
-bug fix: fixed tilegrid resize issues
version 1.7.8
-made some small js changes
version 1.7.7
-added support for image src as full image, and data-thumb as thumb
version 1.7.7
-bug fix: fixed direction arrows slide direction
-bug fix: fixed titles with html tags
version 1.7.6
-feature: added tile text panel description
-protection: added protection against width:100% css
version 1.7.5
-feature: added tile text panel top/bottom/middle positions (text outside image)
-bug fix: fixed ie11 fullscreen mode
version 1.7.4
-bug fix: fixed left / right buttons on input objects
version 1.7.3
-feature: added category tab select type
-bug fix: fixed video player misplaced on gallery resize
version 1.7.2
-protection: added protection agains lasy load
version 1.7.1
-feature: added "open lightbox at start" option for tiles theme
version 1.7
-feature: added "tiles - nested" gallery type
-feature: added API functions to carousel type
version 1.6.8
-addition: added protection against undefined big images url's for the slider.
-change: changed mediaelement to new version
-bug fix: added z-index:0 to the gallery to avoid menu over the gallery
version 1.6.7
-change: changed files order include
-change: improved error message on some cases
version 1.6.6
-bug fix: fixed min jquery version checking.
version 1.6.5
-feature: added minimal version jquery validation
-bug fix: fixed tiles text panel appear
version 1.6.4
-feature: keep order option in tiles columns
-bug fix: text panel was blined on tiles resize
version 1.6.3
-bug fix: fixed text panel always on on tiles types
version 1.6.2
-bug fix: text panel was not hided on some of the cases
-chagne: improved show/hide controls display
version 1.6.1
bug fix: fixed a small bug with tiles image effect
version 1.6
-feature: changed tiles view - make variable number of columns
-change: improvement transition movement of tiles and justified types
version 1.5.9
-feature: added option thumb_fixed_size that alow to run dynamic size strips.
version 1.5.8
-bug fix: the video player stayed on compact mode on slide change
version 1.5.7
-feature: added option: tiles_align for columns type
-change: changed default lightbox transition to "fade"
version 1.5.6
-bug fix: add "ug-rtl" style
-feature: added option: tile_videoplay_icon_always_on in tile design section
version 1.5.5
-bug fix: fixed size bugs in justified type
version 1.5.4
-bug fix: fixed video gallery with tabs
version 1.5.3
-feature: added "destroy function to API"
-bug fix: fixed destroy function
version 1.5.2
-bug fix: added remove html function to lightbox
-bug fix: fixed some ie8 related issues
-bug fix: disabled scrolling on lightbox with mousewheel: none
version 1.5.1
-bog fix: fixed theme default options (like autoplay=true) that was brocken in the last update
version 1.5
-feature: added "category tabs" support
version 1.4.6
-bug fix: fixed js error on carousel without navigation
version 1.4.5
- change: added support for "title" attribute as item description
version 1.4.4
-feature: enable slider area links
-bug fix: on playing mode slides was advanced even when images was not loaded
-bug fix: fixed mousewheel advance item on lightbox
version 1.4.3
-bug fix: gallery on hidden tab was dissapeared on fullscreen
version 1.4.2
-feature: added option gallery_shuffle
-bug fix: bullets miss position after back from full screen
version 1.4.1
-bug fix: fixed some bug in justified tiles view in mobile width
-bug fix: fixed issue with video size at tabs
version 1.4
-bug fix: add preloader to video player
-change: video in lightbox compact mode opens in frame instead of on full screen
version 1.3.9
-feature: added option: slider_background_opacity
-feature: added option: gallery_mousewheel_role
-feature: added scale mode: fitdown
-feature: added vertical page scroll on drag
-change: when go to full screen mode, disable the pause on mouseover mode
-bug fix: carousel tile was dissapeared when size change less then tile width
version 1.3.8
-bug fix: fixed carousel related bug that text panel was over the icons
version 1.3.7
-bug fix: fixed carousel text panel didn't appeared on cloned items
version 1.3.6
-bug fix: fixed bug when closing the lightbox
version 1.3.5
-bug fix: the lightbox was closing on video slider touch
version 1.3.4
-feature: added mobile hide options to slider buttons and zoom panel
version 1.3.3
-feature: added top position navigation option in carousel view
version 1.3.2
-bug fix: fixed the flickering when close compact lightbox with view playing.
-bug fix: fixed bug with text panel not always on on themes.
version 1.3.1
-bug fix: text panel was not show on carousel cloned items
-bug fix: fixed issue with one item only on carousel
version 1.3
-feature: added "compact" lightbox type
version 1.2.16
-bug fix: fixed the responsivness of regular themes.
version 1.2.15
-bug fix: fixed hide preloader on tiles theme
-bug fix: fixed empty image was trying to load
version 1.2.14
-feature: added lightbox close on escape key
version 1.2.13
-bug fix: make all the themes work within tabs
version 1.2.12
-bug fix: make the gallery to work within tabs
version 1.2.11
-bug fix: added clickable function for carousel and tiles grid mode for mobile and tablet
version 1.2.10
-bug fix: adopted tiles clickable functions for mobile and tablet
version 1.2.9
-bug fix: fixed text align in lightbox
version 1.2.8
-feature: added tiles text panel text source, title or description
version 1.2.7
-feature: added disable lightbox option (tile_enable_action).
version 1.2.6
-bug fix: fixed some bug with lightbox text cut off
version 1.2.5
-change: added css protection against unwanted css transitions
version 1.2.4
- bug fix: fixed destorted images on some of the themes like avada
version 1.2.3
-feature: added lightbox additional options including lightbox slider options
version 1.2.2
-bug fix: fixed lightbox textpanel positioning on mobile
version 1.2.1
-bug fix: fixed tiles type total height
-bug fix: adopted the tiles galleries for touch
-bug fix: fixed lightbox positioning when back from drag
-bug fix: fixed tiles youtube play issues
version 1.2
-added theme: tiles (columns,justified)
-added theme: tilesgrid
-added theme: carousel
-option add: added grid option: grid_padding.
-option add: added textpanel options: textpanel_fontfamily, etc.
-option add: added option: slider_background_color
-option add: added option: bullets_space_between to bullets object (for tiles types)
-option add: added option: tiles_height, tiles_width for tiles fixed type
-option add: added youtube video options: video_youtube_showinfo,
-change: removed background color from the gallery wrapper
-change: changed gallery min height and min width options to fit into mobile devices.
-bug fix: fixed video gallery autoplay for vimeo video
-bug fix: fixed video gallery description size
-bug fix: fixed keyboard navigation in google chrome
-bug fix: fixed bullets left margin on first item
version (1.1.2015) 1.1.6
- bug fix: fixed video gallery title and description skin mobile view
version (13.12.2014) 1.1.5
- feature: added bottom buttons for video gallery
- feature: added ugCheckForErrors function for error message output
version (2.12.2014) 1.1.4
- bug fix: fixed multiple video galleries on one page
version (2.12.2014) 1.1.3
- added video gallery theme
- added option to disble panel at start for some seconds
- bug fix: fixed small bug with youtube playback
version (29.11.2014) 1.1.2
- bug fix: when controls not alwqays on, don't show progress bar
- bug fix: fixed fullscreen on ie11
version 1.1.1
-feature: added option: slider_videoplay_button_type. slider video play button type, square or round
version 1.1 (20.10.2014)
-feature: add grid bottom and grid top types
-feature: added media players for youtube, vimeo, html5 video, soundcloud, wistia
-feature: get automatically youtube images and thumbs by id
-feature: added option: slider_zoom_max_ratio for limit the zooming
-feature: added option: slider_scale_mode_media - saparate scale mode option for slider media item
-bug fix: fixed first image was not loaded sometimes.
version 1.0.3
-feature: add grid bottom and grid top types
version 1.0.2
-bug fix: fixed avia strip navigation.
version 1.0.1
- bug fix: removed max-width:100% from the images
- bug fix: added strip arrows to alexis theme
- change: set option "debug errors" to false
- bug fix: added transition setting to strip scroll, was hard coded.
- bug fix: fixed small bug in compact theme related to galllery resize
- bug fix: fixed compatability with other draggable components
version 1.0 - first release

View File

@@ -0,0 +1,385 @@
/*------ Unite Gallery Alexis Skin -------*/
.---------Slider_Arrows--------{}
.ug-arrow-left.ug-skin-alexis,
.ug-arrow-right.ug-skin-alexis{
width:35px;
height:35px;
background-image:url('images/slider_arrow_left.png');
background-position:0px 0px;
}
.ug-arrow-right.ug-skin-alexis{
background-image:url('images/slider_arrow_right.png');
}
.ug-arrow-left.ug-skin-alexis.ug-arrow-hover,
.ug-arrow-right.ug-skin-alexis.ug-arrow-hover{
background-position:0px -35px;
}
.ug-arrow-left.ug-skin-alexis.ug-arrow-disabled,
.ug-arrow-right.ug-skin-alexis.ug-arrow-disabled{
background-position:0px -70px;
}
.---------Slider_Bullets--------{}
.ug-bullets.ug-skin-alexis .ug-bullet{
width:28px;
height:28px;
background-image:url('images/slider_bullets.png');
background-position:top left;
margin-left:5px;
}
.ug-bullets.ug-skin-alexis .ug-bullet.ug-bullet-active{
background-position:bottom left;
}
.---------Slider_Buttons--------{}
/* --- play button -- */
.ug-button-play.ug-skin-alexis{
position:absolute;
background-image:url('images/button_playpause.png');
width:35px;
height:35px;
cursor:pointer;
background-position:0px 0px;
}
.ug-button-play.ug-skin-alexis.ug-button-hover{
background-position:0px -35px;
}
.ug-button-play.ug-skin-alexis.ug-stop-mode{
background-position:0px -70px;
}
.ug-button-play.ug-skin-alexis.ug-stop-mode.ug-button-hover{
background-position:0px -105px;
}
/* --- fullscreen button -- */
.ug-button-fullscreen.ug-skin-alexis{
position:absolute;
background-image:url('images/button_fullscreen.png');
width:35px;
height:35px;
cursor:pointer;
background-position:0px 0px;
}
.ug-button-fullscreen.ug-skin-alexis.ug-button-hover{
background-position:0px -35px;
}
.ug-button-fullscreen.ug-skin-alexis.ug-fullscreenmode{
background-position:0px -70px;
}
.ug-button-fullscreen.ug-skin-alexis.ug-fullscreenmode.ug-button-hover{
background-position:0px -105px;
}
.---------Zoom_Panel--------{}
/* --- zoom panel --- */
.ug-zoompanel.ug-skin-alexis .ug-zoompanel-button{
background-repeat: no-repeat;
cursor:pointer;
height: 35px;
width: 35px;
margin-top:5px;
background-position: 0px 0px;
}
.ug-zoompanel.ug-skin-alexis .ug-zoompanel-plus{
margin-top:0px;
}
.ug-zoompanel.ug-skin-alexis .ug-zoompanel-plus{
background-image:url('images/button_zoom_plus.png');
}
.ug-zoompanel.ug-skin-alexis .ug-zoompanel-minus{
background-image:url('images/button_zoom_minus.png');
}
.ug-zoompanel.ug-skin-alexis .ug-zoompanel-return{
background-image:url('images/button_zoom_back.png');
}
.ug-zoompanel.ug-skin-alexis .ug-zoompanel-button.ug-button-hover{
background-position: 0px -35px;
}
.ug-zoompanel.ug-skin-alexis .ug-zoompanel-button-disabled,
.ug-zoompanel.ug-skin-alexis .ug-zoompanel-button.ug-button-hover.ug-zoompanel-button-disabled{
background-position: 0px -70px;
cursor:default;
}
.---------Grid_Panel_Arrows--------{}
/*--- down arrow ---*/
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-down.ug-skin-alexis{
width:40px;
height:25px;
background-position:0px -0px;
background-image:url('images/grid_arrow_down.png');
}
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-down.ug-skin-alexis.ug-button-hover{
background-position:0px -25px;
}
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-down.ug-skin-alexis.ug-button-hover.ug-button-disabled,
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-down.ug-skin-alexis.ug-button-disabled{
background-position:0px -50px;
}
/*--- up arrow ---*/
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-up.ug-skin-alexis{
width:40px;
height:25px;
background-position:0px 0px;
background-image:url('images/grid_arrow_up.png');
}
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-up.ug-skin-alexis.ug-button-hover{
background-position:0px -25px;
}
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-up.ug-skin-alexis.ug-button-hover.ug-button-disabled,
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-up.ug-skin-alexis.ug-button-disabled{
background-position:0px -50px;
}
/*--- left arrow ---*/
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-left.ug-skin-alexis{
width:40px;
height:40px;
background-position:0px 0px;
background-image:url('images/grid_arrow_left.png');
}
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-left.ug-skin-alexis.ug-button-hover{
background-position:0px -40px;
}
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-left.ug-skin-alexis.ug-button-hover.ug-button-disabled,
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-left.ug-skin-alexis.ug-button-disabled{
background-position:0px -80px;
}
/*--- right arrow ---*/
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-right.ug-skin-alexis{
width:40px;
height:40px;
background-position:0px 0px;
background-image:url('images/grid_arrow_right.png');
}
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-right.ug-skin-alexis.ug-button-hover{
background-position:0px -40px;
}
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-right.ug-skin-alexis.ug-button-hover.ug-button-disabled,
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-right.ug-skin-alexis.ug-button-disabled{
background-position:0px -80px;
}
/*--- left arrow - horizontal panel type ---*/
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-left-hortype.ug-skin-alexis{
width:15px;
height:30px;
background-image:url('images/grid_arrow_left_hortype.png');
background-position:0px 0px;
}
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-left-hortype.ug-skin-alexis.ug-button-hover{
background-position:0px -30px;
}
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-left-hortype.ug-skin-alexis.ug-button-hover.ug-button-disabled,
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-left-hortype.ug-skin-alexis.ug-button-disabled{
background-position:0px -60px;
}
/*--- right arrow - horizontal panel type ---*/
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-right-hortype.ug-skin-alexis{
width:15px;
height:30px;
background-image:url('images/grid_arrow_right_hortype.png');
background-position:0px 0px;
}
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-right-hortype.ug-skin-alexis.ug-button-hover{
background-position:0px -30px;
}
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-right-hortype.ug-skin-alexis.ug-button-hover.ug-button-disabled,
.ug-gallery-wrapper .ug-grid-panel .grid-arrow-right-hortype.ug-skin-alexis.ug-button-disabled{
background-position:0px -60px;
}
.---------Strip_Panel_Arrows--------{}
/* left and right arrows */
.ug-strip-panel .ug-strip-arrow-left.ug-skin-alexis,
.ug-strip-panel .ug-strip-arrow-right.ug-skin-alexis{
width:25px;
height:50px;
}
.ug-strip-panel .ug-strip-arrow-left.ug-skin-alexis .ug-strip-arrow-tip,
.ug-strip-panel .ug-strip-arrow-right.ug-skin-alexis .ug-strip-arrow-tip{
background-position:0px 0px;
background-repeat:no-repeat;
width:4px;
height:7px;
}
.ug-strip-panel .ug-strip-arrow-left.ug-skin-alexis .ug-strip-arrow-tip{
background-image:url('images/arrows_strip_left.png');
}
.ug-strip-panel .ug-strip-arrow-right.ug-skin-alexis .ug-strip-arrow-tip{
background-image:url('images/arrows_strip_right.png');
}
.ug-strip-panel .ug-strip-arrow-left.ug-skin-alexis.ug-button-hover .ug-strip-arrow-tip,
.ug-strip-panel .ug-strip-arrow-right.ug-skin-alexis.ug-button-hover .ug-strip-arrow-tip{
background-position:0px -7px;
}
/* up and down arrows */
.ug-strip-panel .ug-strip-arrow-up.ug-skin-alexis,
.ug-strip-panel .ug-strip-arrow-down.ug-skin-alexis{
height:25px;
width:50px;
}
.ug-strip-panel .ug-strip-arrow-up.ug-skin-alexis .ug-strip-arrow-tip,
.ug-strip-panel .ug-strip-arrow-down.ug-skin-alexis .ug-strip-arrow-tip{
background-position:0px 0px;
background-repeat:no-repeat;
width:7px;
height:4px;
}
.ug-strip-panel .ug-strip-arrow-up.ug-skin-alexis .ug-strip-arrow-tip{
background-image:url('images/arrows_strip_up.png');
}
.ug-strip-panel .ug-strip-arrow-down.ug-skin-alexis .ug-strip-arrow-tip{
background-image:url('images/arrows_strip_down.png');
}
.ug-strip-panel .ug-strip-arrow-up.ug-skin-alexis.ug-button-hover .ug-strip-arrow-tip,
.ug-strip-panel .ug-strip-arrow-down.ug-skin-alexis.ug-button-hover .ug-strip-arrow-tip{
background-position:-7px 0px;
}
.ug-strip-panel .ug-strip-arrow.ug-skin-alexis.ug-button-disabled .ug-strip-arrow-tip{
background-position:0px 0px;
opacity:0.5;
filter: alpha(opacity = 50);
}
.---------Panel_Handle_Tip--------{}
/* left and right handle */
.ug-gallery-wrapper .ug-handle-tip-left.ug-skin-alexis,
.ug-gallery-wrapper .ug-handle-tip-right.ug-skin-alexis{
width:37px;
height:40px;
background-image:url('images/grid_handle_right.png');
background-repeat:no-repeat;
background-position:0px 0px;
}
.ug-gallery-wrapper .ug-handle-tip-right.ug-skin-alexis{
background-image:url('images/grid_handle_left.png');
background-position:0px 0px;
}
.ug-gallery-wrapper .ug-handle-tip-left.ug-button-hover.ug-skin-alexis,
.ug-gallery-wrapper .ug-handle-tip-right.ug-button-hover.ug-skin-alexis{
background-position:0px 0px;
}
.ug-gallery-wrapper .ug-handle-tip-left.ug-skin-alexis.ug-button-closed{
background-image:url('images/grid_handle_left.png');
background-position:0px 0px;
}
.ug-gallery-wrapper .ug-handle-tip-right.ug-skin-alexis.ug-button-closed{
background-image:url('images/grid_handle_right.png');
background-position:0px 0px;
}
.ug-gallery-wrapper .ug-handle-tip-left.ug-skin-alexis.ug-button-closed.ug-button-hover{
background-position:0px 0px;
}
.ug-gallery-wrapper .ug-handle-tip-right.ug-skin-alexis.ug-button-closed.ug-button-hover{
background-position:0px 0px;
}
/* top and bottom handle */
.ug-gallery-wrapper .ug-handle-tip-top.ug-skin-alexis,
.ug-gallery-wrapper .ug-handle-tip-bottom.ug-skin-alexis{
width:36px;
height:19px;
background-image:url('images/grid_handle_up.png');
background-repeat:no-repeat;
background-position:-36px 0px;
}
.ug-gallery-wrapper .ug-handle-tip-bottom.ug-skin-alexis{
background-image:url('images/grid_handle_bottom.png');
background-position:-36px 0px;
}
.ug-gallery-wrapper .ug-handle-tip-top.ug-skin-alexis.ug-button-hover,
.ug-gallery-wrapper .ug-handle-tip-bottom.ug-skin-alexis.ug-button-hover{
background-position:0px 0px;
}
.ug-gallery-wrapper .ug-handle-tip-top.ug-skin-alexis.ug-button-closed,
.ug-gallery-wrapper .ug-handle-tip-bottom.ug-skin-alexis.ug-button-closed{
background-position:-108px 0px;
}
.ug-gallery-wrapper .ug-handle-tip-top.ug-skin-alexis.ug-button-closed.ug-button-hover,
.ug-gallery-wrapper .ug-handle-tip-bottom.ug-skin-alexis.ug-button-closed.ug-button-hover{
background-position:-72px 0px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Some files were not shown because too many files have changed in this diff Show More