2013-08-04 18:58:31 +00:00
< ? php
/**
* poche , a read it later open source system
*
* @ category poche
* @ author Nicolas Lœuillet < support @ inthepoche . com >
* @ copyright 2013
* @ license http :// www . wtfpl . net / see COPYING file
*/
class Poche
{
2013-08-06 12:18:03 +00:00
public $user ;
2013-08-04 18:58:31 +00:00
public $store ;
public $tpl ;
2013-08-05 13:54:37 +00:00
public $messages ;
2013-08-05 19:56:32 +00:00
public $pagination ;
2013-08-04 18:58:31 +00:00
2013-08-07 12:24:07 +00:00
function __construct ()
2013-08-04 18:58:31 +00:00
{
2013-08-15 08:54:14 +00:00
$this -> initTpl ();
if ( ! $this -> checkBeforeInstall ()) {
exit ;
2013-08-09 09:47:37 +00:00
}
2013-08-07 12:24:07 +00:00
$this -> store = new Database ();
2013-08-04 18:58:31 +00:00
$this -> init ();
2013-08-05 19:56:32 +00:00
$this -> messages = new Messages ();
2013-08-04 18:58:31 +00:00
# installation
if ( ! $this -> store -> isInstalled ())
{
$this -> install ();
}
}
2013-08-15 08:54:14 +00:00
/**
* all checks before installation .
* @ return boolean
*/
private function checkBeforeInstall ()
2013-08-04 18:58:31 +00:00
{
2013-08-15 08:54:14 +00:00
$msg = '' ;
$allIsGood = TRUE ;
2013-08-16 18:19:31 +00:00
2013-08-16 18:40:31 +00:00
if ( ! is_writable ( CACHE )) {
Tools :: logm ( 'you don\'t have write access on cache directory' );
die ( 'You don\'t have write access on cache directory.' );
}
else if ( file_exists ( './install/update.php' ) && ! DEBUG_POCHE ) {
2013-08-23 20:24:41 +00:00
$msg = '<h1>setup</h1><p><strong>It\'s your first time here?</strong> Please copy /install/poche.sqlite in db folder. Then, delete install folder.<br /><strong>If you have already installed poche</strong>, an update is needed <a href="install/update.php">by clicking here</a>.</p>' ;
2013-08-16 18:19:31 +00:00
$allIsGood = FALSE ;
}
else if ( file_exists ( './install' ) && ! DEBUG_POCHE ) {
2013-08-23 20:24:41 +00:00
$msg = '<h1>setup</h1><p><strong>If you want to update your poche</strong>, you just have to delete /install folder. <br /><strong>To install your poche with sqlite</strong>, copy /install/poche.sqlite in /db and delete the folder /install. you have to delete the /install folder before using poche.</p>' ;
2013-08-15 08:54:14 +00:00
$allIsGood = FALSE ;
}
2013-08-16 18:19:31 +00:00
else if ( STORAGE == 'sqlite' && ! is_writable ( STORAGE_SQLITE )) {
Tools :: logm ( 'you don\'t have write access on sqlite file' );
2013-08-23 20:24:41 +00:00
$msg = '<h1>error</h1><p>You don\'t have write access on sqlite file.</p>' ;
2013-08-16 18:19:31 +00:00
$allIsGood = FALSE ;
}
2013-08-16 18:40:31 +00:00
2013-08-15 08:54:14 +00:00
if ( ! $allIsGood ) {
echo $this -> tpl -> render ( 'error.twig' , array (
'msg' => $msg
));
2013-08-06 13:51:48 +00:00
}
2013-08-06 12:18:03 +00:00
2013-08-15 08:54:14 +00:00
return $allIsGood ;
}
2013-08-04 18:58:31 +00:00
2013-08-15 08:54:14 +00:00
private function initTpl ()
{
2013-08-04 18:58:31 +00:00
# template engine
$loader = new Twig_Loader_Filesystem ( TPL );
2013-08-07 12:24:07 +00:00
if ( DEBUG_POCHE ) {
$twig_params = array ();
}
else {
$twig_params = array ( 'cache' => CACHE );
}
$this -> tpl = new Twig_Environment ( $loader , $twig_params );
2013-08-04 18:58:31 +00:00
$this -> tpl -> addExtension ( new Twig_Extensions_Extension_I18n ());
2013-08-05 13:54:37 +00:00
# filter to display domain name of an url
$filter = new Twig_SimpleFilter ( 'getDomain' , 'Tools::getDomain' );
$this -> tpl -> addFilter ( $filter );
2013-08-04 18:58:31 +00:00
2013-08-09 06:25:16 +00:00
# filter for reading time
$filter = new Twig_SimpleFilter ( 'getReadingTime' , 'Tools::getReadingTime' );
$this -> tpl -> addFilter ( $filter );
2013-08-15 08:54:14 +00:00
}
private function init ()
{
Tools :: initPhp ();
Session :: init ();
if ( isset ( $_SESSION [ 'poche_user' ]) && $_SESSION [ 'poche_user' ] != array ()) {
$this -> user = $_SESSION [ 'poche_user' ];
}
else {
# fake user, just for install & login screens
$this -> user = new User ();
$this -> user -> setConfig ( $this -> getDefaultConfig ());
}
# l10n
$language = $this -> user -> getConfigValue ( 'language' );
putenv ( 'LC_ALL=' . $language );
setlocale ( LC_ALL , $language );
bindtextdomain ( $language , LOCALE );
textdomain ( $language );
2013-08-09 06:25:16 +00:00
2013-08-06 12:18:03 +00:00
# Pagination
2013-08-06 13:51:48 +00:00
$this -> pagination = new Paginator ( $this -> user -> getConfigValue ( 'pager' ), 'p' );
2013-08-04 18:58:31 +00:00
}
private function install ()
{
Tools :: logm ( 'poche still not installed' );
echo $this -> tpl -> render ( 'install.twig' , array (
2013-08-05 19:56:32 +00:00
'token' => Session :: getToken ()
2013-08-04 18:58:31 +00:00
));
if ( isset ( $_GET [ 'install' ])) {
if (( $_POST [ 'password' ] == $_POST [ 'password_repeat' ])
&& $_POST [ 'password' ] != " " && $_POST [ 'login' ] != " " ) {
# let's rock, install poche baby !
2013-08-16 18:19:31 +00:00
if ( $this -> store -> install ( $_POST [ 'login' ], Tools :: encodeString ( $_POST [ 'password' ] . $_POST [ 'login' ])))
{
Session :: logout ();
Tools :: logm ( 'poche is now installed' );
Tools :: redirect ();
}
2013-08-05 19:56:32 +00:00
}
else {
Tools :: logm ( 'error during installation' );
2013-08-04 18:58:31 +00:00
Tools :: redirect ();
}
}
exit ();
}
2013-08-06 13:51:48 +00:00
public function getDefaultConfig ()
{
return array (
'pager' => PAGINATION ,
'language' => LANG ,
);
}
2013-08-04 18:58:31 +00:00
/**
* Call action ( mark as fav , archive , delete , etc . )
*/
2013-08-07 17:14:28 +00:00
public function action ( $action , Url $url , $id = 0 , $import = FALSE )
2013-08-04 18:58:31 +00:00
{
switch ( $action )
{
case 'add' :
if ( $parametres_url = $url -> fetchContent ()) {
2013-08-06 13:51:48 +00:00
if ( $this -> store -> add ( $url -> getUrl (), $parametres_url [ 'title' ], $parametres_url [ 'content' ], $this -> user -> getId ())) {
2013-08-04 18:58:31 +00:00
Tools :: logm ( 'add link ' . $url -> getUrl ());
2013-08-07 17:14:28 +00:00
$sequence = '' ;
if ( STORAGE == 'postgres' ) {
$sequence = 'entries_id_seq' ;
}
$last_id = $this -> store -> getLastId ( $sequence );
2013-08-04 18:58:31 +00:00
if ( DOWNLOAD_PICTURES ) {
$content = filtre_picture ( $parametres_url [ 'content' ], $url -> getUrl (), $last_id );
2013-08-09 21:30:20 +00:00
Tools :: logm ( 'updating content article' );
$this -> store -> updateContent ( $last_id , $content , $this -> user -> getId ());
2013-08-04 18:58:31 +00:00
}
2013-08-07 17:14:28 +00:00
if ( ! $import ) {
$this -> messages -> add ( 's' , _ ( 'the link has been added successfully' ));
}
2013-08-04 18:58:31 +00:00
}
else {
2013-08-07 17:14:28 +00:00
if ( ! $import ) {
$this -> messages -> add ( 'e' , _ ( 'error during insertion : the link wasn\'t added' ));
Tools :: logm ( 'error during insertion : the link wasn\'t added ' . $url -> getUrl ());
}
2013-08-04 18:58:31 +00:00
}
}
else {
2013-08-07 17:14:28 +00:00
if ( ! $import ) {
$this -> messages -> add ( 'e' , _ ( 'error during fetching content : the link wasn\'t added' ));
Tools :: logm ( 'error during content fetch ' . $url -> getUrl ());
}
}
if ( ! $import ) {
Tools :: redirect ();
2013-08-04 18:58:31 +00:00
}
break ;
case 'delete' :
2013-08-07 12:24:07 +00:00
$msg = 'delete link #' . $id ;
2013-08-06 13:51:48 +00:00
if ( $this -> store -> deleteById ( $id , $this -> user -> getId ())) {
2013-08-04 18:58:31 +00:00
if ( DOWNLOAD_PICTURES ) {
remove_directory ( ABS_PATH . $id );
}
2013-08-05 19:56:32 +00:00
$this -> messages -> add ( 's' , _ ( 'the link has been deleted successfully' ));
2013-08-04 18:58:31 +00:00
}
else {
2013-08-05 19:56:32 +00:00
$this -> messages -> add ( 'e' , _ ( 'the link wasn\'t deleted' ));
2013-08-07 12:24:07 +00:00
$msg = 'error : can\'t delete link #' . $id ;
2013-08-04 18:58:31 +00:00
}
2013-08-07 12:24:07 +00:00
Tools :: logm ( $msg );
Tools :: redirect ( '?' );
2013-08-04 18:58:31 +00:00
break ;
case 'toggle_fav' :
2013-08-06 13:51:48 +00:00
$this -> store -> favoriteById ( $id , $this -> user -> getId ());
2013-08-04 18:58:31 +00:00
Tools :: logm ( 'mark as favorite link #' . $id );
2013-08-07 17:14:28 +00:00
if ( ! $import ) {
Tools :: redirect ();
}
2013-08-04 18:58:31 +00:00
break ;
case 'toggle_archive' :
2013-08-06 13:51:48 +00:00
$this -> store -> archiveById ( $id , $this -> user -> getId ());
2013-08-04 18:58:31 +00:00
Tools :: logm ( 'archive link #' . $id );
2013-08-07 17:14:28 +00:00
if ( ! $import ) {
Tools :: redirect ();
}
2013-08-04 18:58:31 +00:00
break ;
default :
2013-08-15 09:29:28 +00:00
Tools :: logm ( 'action ' . $action . 'doesn\'t exist' );
2013-08-04 18:58:31 +00:00
break ;
}
}
function displayView ( $view , $id = 0 )
{
$tpl_vars = array ();
switch ( $view )
{
case 'config' :
2013-08-05 10:34:16 +00:00
$dev = $this -> getPocheVersion ( 'dev' );
$prod = $this -> getPocheVersion ( 'prod' );
$compare_dev = version_compare ( POCHE_VERSION , $dev );
$compare_prod = version_compare ( POCHE_VERSION , $prod );
$tpl_vars = array (
'dev' => $dev ,
'prod' => $prod ,
'compare_dev' => $compare_dev ,
'compare_prod' => $compare_prod ,
);
2013-08-04 18:58:31 +00:00
Tools :: logm ( 'config view' );
break ;
case 'view' :
2013-08-06 13:51:48 +00:00
$entry = $this -> store -> retrieveOneById ( $id , $this -> user -> getId ());
2013-08-04 18:58:31 +00:00
if ( $entry != NULL ) {
Tools :: logm ( 'view link #' . $id );
$content = $entry [ 'content' ];
if ( function_exists ( 'tidy_parse_string' )) {
$tidy = tidy_parse_string ( $content , array ( 'indent' => true , 'show-body-only' => true ), 'UTF8' );
$tidy -> cleanRepair ();
$content = $tidy -> value ;
}
$tpl_vars = array (
'entry' => $entry ,
'content' => $content ,
);
}
else {
2013-08-09 20:15:40 +00:00
Tools :: logm ( 'error in view call : entry is null' );
2013-08-04 18:58:31 +00:00
}
break ;
default : # home view
2013-08-06 13:51:48 +00:00
$entries = $this -> store -> getEntriesByView ( $view , $this -> user -> getId ());
2013-08-05 19:56:32 +00:00
$this -> pagination -> set_total ( count ( $entries ));
$page_links = $this -> pagination -> page_links ( '?view=' . $view . '&sort=' . $_SESSION [ 'sort' ] . '&' );
2013-08-06 13:51:48 +00:00
$datas = $this -> store -> getEntriesByView ( $view , $this -> user -> getId (), $this -> pagination -> get_limit ());
2013-08-04 18:58:31 +00:00
$tpl_vars = array (
2013-08-05 19:56:32 +00:00
'entries' => $datas ,
'page_links' => $page_links ,
2013-08-04 18:58:31 +00:00
);
2013-08-05 19:56:32 +00:00
Tools :: logm ( 'display ' . $view . ' view' );
2013-08-04 18:58:31 +00:00
break ;
}
return $tpl_vars ;
}
2013-08-04 19:42:46 +00:00
2013-08-08 10:33:02 +00:00
/**
* update the password of the current user .
* if MODE_DEMO is TRUE , the password can ' t be updated .
* @ todo add the return value
* @ todo set the new password in function header like this updatePassword ( $newPassword )
* @ return boolean
*/
2013-08-04 19:42:46 +00:00
public function updatePassword ()
{
2013-08-05 13:54:37 +00:00
if ( MODE_DEMO ) {
2013-08-06 13:51:48 +00:00
$this -> messages -> add ( 'i' , _ ( 'in demo mode, you can\'t update your password' ));
2013-08-05 13:54:37 +00:00
Tools :: logm ( 'in demo mode, you can\'t do this' );
2013-08-05 19:56:32 +00:00
Tools :: redirect ( '?view=config' );
2013-08-05 13:54:37 +00:00
}
else {
if ( isset ( $_POST [ 'password' ]) && isset ( $_POST [ 'password_repeat' ])) {
if ( $_POST [ 'password' ] == $_POST [ 'password_repeat' ] && $_POST [ 'password' ] != " " ) {
2013-08-06 13:51:48 +00:00
$this -> messages -> add ( 's' , _ ( 'your password has been updated' ));
$this -> store -> updatePassword ( $this -> user -> getId (), Tools :: encodeString ( $_POST [ 'password' ] . $this -> user -> getUsername ()));
2013-08-04 19:42:46 +00:00
Session :: logout ();
2013-08-06 13:51:48 +00:00
Tools :: logm ( 'password updated' );
2013-08-04 19:42:46 +00:00
Tools :: redirect ();
}
else {
2013-08-06 13:51:48 +00:00
$this -> messages -> add ( 'e' , _ ( 'the two fields have to be filled & the password must be the same in the two fields' ));
2013-08-05 19:56:32 +00:00
Tools :: redirect ( '?view=config' );
2013-08-04 19:42:46 +00:00
}
}
}
}
2013-08-08 10:33:02 +00:00
/**
* checks if login & password are correct and save the user in session .
* it redirects the user to the $referer link
* @ param string $referer the url to redirect after login
* @ todo add the return value
* @ return boolean
*/
2013-08-04 19:42:46 +00:00
public function login ( $referer )
{
if ( ! empty ( $_POST [ 'login' ]) && ! empty ( $_POST [ 'password' ])) {
2013-08-06 12:18:03 +00:00
$user = $this -> store -> login ( $_POST [ 'login' ], Tools :: encodeString ( $_POST [ 'password' ] . $_POST [ 'login' ]));
if ( $user != array ()) {
# Save login into Session
Session :: login ( $user [ 'username' ], $user [ 'password' ], $_POST [ 'login' ], Tools :: encodeString ( $_POST [ 'password' ] . $_POST [ 'login' ]), array ( 'poche_user' => new User ( $user )));
2013-08-06 13:51:48 +00:00
$this -> messages -> add ( 's' , _ ( 'welcome to your poche' ));
2013-08-04 19:42:46 +00:00
if ( ! empty ( $_POST [ 'longlastingsession' ])) {
$_SESSION [ 'longlastingsession' ] = 31536000 ;
$_SESSION [ 'expires_on' ] = time () + $_SESSION [ 'longlastingsession' ];
session_set_cookie_params ( $_SESSION [ 'longlastingsession' ]);
} else {
session_set_cookie_params ( 0 );
}
session_regenerate_id ( true );
2013-08-06 13:51:48 +00:00
Tools :: logm ( 'login successful' );
2013-08-04 19:42:46 +00:00
Tools :: redirect ( $referer );
}
2013-08-06 13:51:48 +00:00
$this -> messages -> add ( 'e' , _ ( 'login failed: bad login or password' ));
2013-08-04 19:42:46 +00:00
Tools :: logm ( 'login failed' );
Tools :: redirect ();
} else {
2013-08-06 13:51:48 +00:00
$this -> messages -> add ( 'e' , _ ( 'login failed: you have to fill all fields' ));
2013-08-04 19:42:46 +00:00
Tools :: logm ( 'login failed' );
Tools :: redirect ();
}
}
2013-08-08 10:33:02 +00:00
/**
* log out the poche user . It cleans the session .
* @ todo add the return value
* @ return boolean
*/
2013-08-04 19:42:46 +00:00
public function logout ()
{
2013-08-06 12:18:03 +00:00
$this -> user = array ();
2013-08-04 19:42:46 +00:00
Session :: logout ();
2013-08-07 17:14:28 +00:00
$this -> messages -> add ( 's' , _ ( 'see you soon!' ));
Tools :: logm ( 'logout' );
2013-08-04 19:42:46 +00:00
Tools :: redirect ();
}
2013-08-08 10:33:02 +00:00
/**
* import from Instapaper . poche needs a ./ instapaper - export . html file
* @ todo add the return value
2013-08-24 13:59:51 +00:00
* @ param string $targetFile the file used for importing
2013-08-08 10:33:02 +00:00
* @ return boolean
*/
2013-08-24 13:59:51 +00:00
private function importFromInstapaper ( $targetFile )
2013-08-04 19:42:46 +00:00
{
2013-08-05 08:32:15 +00:00
# TODO gestion des articles favs
2013-08-05 07:43:33 +00:00
$html = new simple_html_dom ();
2013-08-24 13:59:51 +00:00
$html -> load_file ( $targetFile );
2013-08-07 17:14:28 +00:00
Tools :: logm ( 'starting import from instapaper' );
2013-08-05 07:43:33 +00:00
$read = 0 ;
$errors = array ();
foreach ( $html -> find ( 'ol' ) as $ul )
{
foreach ( $ul -> find ( 'li' ) as $li )
{
$a = $li -> find ( 'a' );
$url = new Url ( base64_encode ( $a [ 0 ] -> href ));
2013-08-07 17:14:28 +00:00
$this -> action ( 'add' , $url , 0 , TRUE );
2013-08-05 07:43:33 +00:00
if ( $read == '1' ) {
2013-08-07 17:14:28 +00:00
$sequence = '' ;
if ( STORAGE == 'postgres' ) {
$sequence = 'entries_id_seq' ;
}
$last_id = $this -> store -> getLastId ( $sequence );
$this -> action ( 'toggle_archive' , $url , $last_id , TRUE );
2013-08-05 07:43:33 +00:00
}
}
2013-08-05 08:32:15 +00:00
# the second <ol> is for read links
2013-08-05 07:43:33 +00:00
$read = 1 ;
}
2013-08-06 13:51:48 +00:00
$this -> messages -> add ( 's' , _ ( 'import from instapaper completed' ));
2013-08-04 20:35:08 +00:00
Tools :: logm ( 'import from instapaper completed' );
Tools :: redirect ();
}
2013-08-04 19:42:46 +00:00
2013-08-08 10:33:02 +00:00
/**
* import from Pocket . poche needs a ./ ril_export . html file
* @ todo add the return value
2013-08-24 13:59:51 +00:00
* @ param string $targetFile the file used for importing
2013-08-08 10:33:02 +00:00
* @ return boolean
*/
2013-08-24 13:59:51 +00:00
private function importFromPocket ( $targetFile )
2013-08-04 20:35:08 +00:00
{
2013-08-05 08:32:15 +00:00
# TODO gestion des articles favs
2013-08-04 20:35:08 +00:00
$html = new simple_html_dom ();
2013-08-24 13:59:51 +00:00
$html -> load_file ( $targetFile );
2013-08-07 17:14:28 +00:00
Tools :: logm ( 'starting import from pocket' );
2013-08-04 20:35:08 +00:00
$read = 0 ;
$errors = array ();
foreach ( $html -> find ( 'ul' ) as $ul )
{
foreach ( $ul -> find ( 'li' ) as $li )
2013-08-04 19:42:46 +00:00
{
2013-08-04 20:35:08 +00:00
$a = $li -> find ( 'a' );
$url = new Url ( base64_encode ( $a [ 0 ] -> href ));
2013-08-07 17:14:28 +00:00
$this -> action ( 'add' , $url , 0 , TRUE );
2013-08-04 20:35:08 +00:00
if ( $read == '1' ) {
2013-08-07 17:14:28 +00:00
$sequence = '' ;
if ( STORAGE == 'postgres' ) {
$sequence = 'entries_id_seq' ;
}
$last_id = $this -> store -> getLastId ( $sequence );
$this -> action ( 'toggle_archive' , $url , $last_id , TRUE );
2013-08-04 19:42:46 +00:00
}
}
2013-08-05 08:32:15 +00:00
# the second <ul> is for read links
2013-08-04 20:35:08 +00:00
$read = 1 ;
2013-08-04 19:42:46 +00:00
}
2013-08-06 13:51:48 +00:00
$this -> messages -> add ( 's' , _ ( 'import from pocket completed' ));
2013-08-04 20:35:08 +00:00
Tools :: logm ( 'import from pocket completed' );
Tools :: redirect ();
}
2013-08-04 19:42:46 +00:00
2013-08-08 10:33:02 +00:00
/**
* import from Readability . poche needs a ./ readability file
* @ todo add the return value
2013-08-24 13:59:51 +00:00
* @ param string $targetFile the file used for importing
2013-08-08 10:33:02 +00:00
* @ return boolean
*/
2013-08-24 13:59:51 +00:00
private function importFromReadability ( $targetFile )
2013-08-04 20:35:08 +00:00
{
2013-08-05 08:32:15 +00:00
# TODO gestion des articles lus / favs
2013-08-24 13:59:51 +00:00
$str_data = file_get_contents ( $targetFile );
2013-08-04 20:35:08 +00:00
$data = json_decode ( $str_data , true );
2013-08-07 17:14:28 +00:00
Tools :: logm ( 'starting import from Readability' );
2013-08-15 09:29:28 +00:00
$count = 0 ;
2013-08-04 20:35:08 +00:00
foreach ( $data as $key => $value ) {
2013-08-15 09:29:28 +00:00
$url = NULL ;
$favorite = FALSE ;
$archive = FALSE ;
2013-08-05 08:32:15 +00:00
foreach ( $value as $attr => $attr_value ) {
if ( $attr == 'article__url' ) {
$url = new Url ( base64_encode ( $attr_value ));
2013-08-04 19:42:46 +00:00
}
2013-08-07 17:14:28 +00:00
$sequence = '' ;
if ( STORAGE == 'postgres' ) {
$sequence = 'entries_id_seq' ;
}
2013-08-15 09:29:28 +00:00
if ( $attr_value == 'true' ) {
if ( $attr == 'favorite' ) {
$favorite = TRUE ;
}
if ( $attr == 'archive' ) {
$archive = TRUE ;
}
}
}
# we can add the url
if ( ! is_null ( $url ) && $url -> isCorrect ()) {
$this -> action ( 'add' , $url , 0 , TRUE );
$count ++ ;
if ( $favorite ) {
$last_id = $this -> store -> getLastId ( $sequence );
$this -> action ( 'toggle_fav' , $url , $last_id , TRUE );
}
if ( $archive ) {
2013-08-07 17:14:28 +00:00
$last_id = $this -> store -> getLastId ( $sequence );
$this -> action ( 'toggle_archive' , $url , $last_id , TRUE );
}
2013-08-04 19:42:46 +00:00
}
}
2013-08-15 09:29:28 +00:00
$this -> messages -> add ( 's' , _ ( 'import from Readability completed. ' . $count . ' new links.' ));
2013-08-04 20:35:08 +00:00
Tools :: logm ( 'import from Readability completed' );
Tools :: redirect ();
2013-08-04 19:42:46 +00:00
}
2013-08-08 10:33:02 +00:00
/**
* import datas into your poche
* @ param string $from name of the service to import : pocket , instapaper or readability
* @ todo add the return value
* @ return boolean
*/
2013-08-04 20:35:08 +00:00
public function import ( $from )
2013-08-04 19:42:46 +00:00
{
2013-08-24 13:59:51 +00:00
$providers = array (
'pocket' => 'importFromPocket' ,
'readability' => 'importFromReadability' ,
'instapaper' => 'importFromInstapaper'
);
if ( ! isset ( $providers [ $from ])) {
$this -> messages -> add ( 'e' , _ ( 'Unknown import provider.' ));
Tools :: redirect ();
2013-08-04 20:35:08 +00:00
}
2013-08-24 13:59:51 +00:00
$targetDefinition = 'IMPORT_' . strtoupper ( $from ) . '_FILE' ;
$targetFile = constant ( $targetDefinition );
if ( ! defined ( $targetDefinition )) {
$this -> messages -> add ( 'e' , _ ( 'Incomplete inc/poche/define.inc.php file, please define "' . $targetDefinition . '".' ));
Tools :: redirect ();
2013-08-04 20:35:08 +00:00
}
2013-08-24 13:59:51 +00:00
if ( ! file_exists ( $targetFile )) {
$this -> messages -> add ( 'e' , _ ( 'Could not find required "' . $targetFile . '" import file.' ));
Tools :: redirect ();
2013-08-04 20:35:08 +00:00
}
2013-08-24 13:59:51 +00:00
$this -> $providers [ $from ]( $targetFile );
2013-08-04 20:35:08 +00:00
}
2013-08-04 19:42:46 +00:00
2013-08-08 10:33:02 +00:00
/**
* export poche entries in json
* @ return json all poche entries
*/
2013-08-04 20:35:08 +00:00
public function export ()
{
2013-08-06 13:51:48 +00:00
$entries = $this -> store -> retrieveAll ( $this -> user -> getId ());
2013-08-04 20:35:08 +00:00
echo $this -> tpl -> render ( 'export.twig' , array (
'export' => Tools :: renderJson ( $entries ),
));
Tools :: logm ( 'export view' );
2013-08-04 19:42:46 +00:00
}
2013-08-05 10:34:16 +00:00
2013-08-08 10:33:02 +00:00
/**
2013-08-08 11:49:57 +00:00
* Checks online the latest version of poche and cache it
2013-08-08 10:33:02 +00:00
* @ param string $which 'prod' or 'dev'
* @ return string latest $which version
*/
2013-08-05 10:34:16 +00:00
private function getPocheVersion ( $which = 'prod' )
{
$cache_file = CACHE . '/' . $which ;
2013-08-08 11:49:57 +00:00
# checks if the cached version file exists
2013-08-05 10:34:16 +00:00
if ( file_exists ( $cache_file ) && ( filemtime ( $cache_file ) > ( time () - 86400 ))) {
$version = file_get_contents ( $cache_file );
} else {
2013-08-07 12:24:07 +00:00
$version = file_get_contents ( 'http://static.inthepoche.com/versions/' . $which );
2013-08-05 10:34:16 +00:00
file_put_contents ( $cache_file , $version , LOCK_EX );
}
return $version ;
}
2013-08-04 18:58:31 +00:00
}