aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/Wallabag/CoreBundle/Controller/EntryController.php14
-rw-r--r--src/Wallabag/CoreBundle/Event/EntryDeletedEvent.php26
-rw-r--r--src/Wallabag/CoreBundle/Event/EntrySavedEvent.php26
-rw-r--r--src/Wallabag/CoreBundle/Event/Subscriber/DownloadImagesSubscriber.php117
-rw-r--r--src/Wallabag/CoreBundle/Helper/DownloadImages.php84
-rw-r--r--src/Wallabag/CoreBundle/Resources/config/services.yml6
-rw-r--r--tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php26
-rw-r--r--tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php29
8 files changed, 202 insertions, 126 deletions
diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php
index 97bb3d12..3f4eb17d 100644
--- a/src/Wallabag/CoreBundle/Controller/EntryController.php
+++ b/src/Wallabag/CoreBundle/Controller/EntryController.php
@@ -13,6 +13,8 @@ use Wallabag\CoreBundle\Form\Type\EntryFilterType;
13use Wallabag\CoreBundle\Form\Type\EditEntryType; 13use Wallabag\CoreBundle\Form\Type\EditEntryType;
14use Wallabag\CoreBundle\Form\Type\NewEntryType; 14use Wallabag\CoreBundle\Form\Type\NewEntryType;
15use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; 15use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
16use Wallabag\CoreBundle\Event\EntrySavedEvent;
17use Wallabag\CoreBundle\Event\EntryDeletedEvent;
16 18
17class EntryController extends Controller 19class EntryController extends Controller
18{ 20{
@@ -81,6 +83,9 @@ class EntryController extends Controller
81 $em->persist($entry); 83 $em->persist($entry);
82 $em->flush(); 84 $em->flush();
83 85
86 // entry saved, dispatch event about it!
87 $this->get('event_dispatcher')->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry));
88
84 return $this->redirect($this->generateUrl('homepage')); 89 return $this->redirect($this->generateUrl('homepage'));
85 } 90 }
86 91
@@ -107,6 +112,9 @@ class EntryController extends Controller
107 $em = $this->getDoctrine()->getManager(); 112 $em = $this->getDoctrine()->getManager();
108 $em->persist($entry); 113 $em->persist($entry);
109 $em->flush(); 114 $em->flush();
115
116 // entry saved, dispatch event about it!
117 $this->get('event_dispatcher')->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry));
110 } 118 }
111 119
112 return $this->redirect($this->generateUrl('homepage')); 120 return $this->redirect($this->generateUrl('homepage'));
@@ -343,6 +351,9 @@ class EntryController extends Controller
343 $em->persist($entry); 351 $em->persist($entry);
344 $em->flush(); 352 $em->flush();
345 353
354 // entry saved, dispatch event about it!
355 $this->get('event_dispatcher')->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry));
356
346 return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()])); 357 return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()]));
347 } 358 }
348 359
@@ -431,6 +442,9 @@ class EntryController extends Controller
431 UrlGeneratorInterface::ABSOLUTE_PATH 442 UrlGeneratorInterface::ABSOLUTE_PATH
432 ); 443 );
433 444
445 // entry deleted, dispatch event about it!
446 $this->get('event_dispatcher')->dispatch(EntryDeletedEvent::NAME, new EntryDeletedEvent($entry));
447
434 $em = $this->getDoctrine()->getManager(); 448 $em = $this->getDoctrine()->getManager();
435 $em->remove($entry); 449 $em->remove($entry);
436 $em->flush(); 450 $em->flush();
diff --git a/src/Wallabag/CoreBundle/Event/EntryDeletedEvent.php b/src/Wallabag/CoreBundle/Event/EntryDeletedEvent.php
new file mode 100644
index 00000000..e9061d04
--- /dev/null
+++ b/src/Wallabag/CoreBundle/Event/EntryDeletedEvent.php
@@ -0,0 +1,26 @@
1<?php
2
3namespace Wallabag\CoreBundle\Event;
4
5use Symfony\Component\EventDispatcher\Event;
6use Wallabag\CoreBundle\Entity\Entry;
7
8/**
9 * This event is fired as soon as an entry is deleted.
10 */
11class EntryDeletedEvent extends Event
12{
13 const NAME = 'entry.deleted';
14
15 protected $entry;
16
17 public function __construct(Entry $entry)
18 {
19 $this->entry = $entry;
20 }
21
22 public function getEntry()
23 {
24 return $this->entry;
25 }
26}
diff --git a/src/Wallabag/CoreBundle/Event/EntrySavedEvent.php b/src/Wallabag/CoreBundle/Event/EntrySavedEvent.php
new file mode 100644
index 00000000..5fdb5221
--- /dev/null
+++ b/src/Wallabag/CoreBundle/Event/EntrySavedEvent.php
@@ -0,0 +1,26 @@
1<?php
2
3namespace Wallabag\CoreBundle\Event;
4
5use Symfony\Component\EventDispatcher\Event;
6use Wallabag\CoreBundle\Entity\Entry;
7
8/**
9 * This event is fired as soon as an entry was saved.
10 */
11class EntrySavedEvent extends Event
12{
13 const NAME = 'entry.saved';
14
15 protected $entry;
16
17 public function __construct(Entry $entry)
18 {
19 $this->entry = $entry;
20 }
21
22 public function getEntry()
23 {
24 return $this->entry;
25 }
26}
diff --git a/src/Wallabag/CoreBundle/Event/Subscriber/DownloadImagesSubscriber.php b/src/Wallabag/CoreBundle/Event/Subscriber/DownloadImagesSubscriber.php
index 6fddcea9..4ebe837b 100644
--- a/src/Wallabag/CoreBundle/Event/Subscriber/DownloadImagesSubscriber.php
+++ b/src/Wallabag/CoreBundle/Event/Subscriber/DownloadImagesSubscriber.php
@@ -2,110 +2,85 @@
2 2
3namespace Wallabag\CoreBundle\Event\Subscriber; 3namespace Wallabag\CoreBundle\Event\Subscriber;
4 4
5use Doctrine\Common\EventSubscriber; 5use Symfony\Component\EventDispatcher\EventSubscriberInterface;
6use Doctrine\ORM\Event\LifecycleEventArgs;
7use Psr\Log\LoggerInterface; 6use Psr\Log\LoggerInterface;
8use Wallabag\CoreBundle\Helper\DownloadImages; 7use Wallabag\CoreBundle\Helper\DownloadImages;
9use Wallabag\CoreBundle\Entity\Entry; 8use Wallabag\CoreBundle\Entity\Entry;
9use Wallabag\CoreBundle\Event\EntrySavedEvent;
10use Wallabag\CoreBundle\Event\EntryDeletedEvent;
10use Doctrine\ORM\EntityManager; 11use Doctrine\ORM\EntityManager;
11use Craue\ConfigBundle\Util\Config;
12 12
13class DownloadImagesSubscriber implements EventSubscriber 13class DownloadImagesSubscriber implements EventSubscriberInterface
14{ 14{
15 private $configClass; 15 private $em;
16 private $downloadImages; 16 private $downloadImages;
17 private $enabled;
17 private $logger; 18 private $logger;
18 19
19 /** 20 public function __construct(EntityManager $em, DownloadImages $downloadImages, $enabled, LoggerInterface $logger)
20 * We inject the class instead of the service otherwise it generates a circular reference with the EntityManager.
21 * So we build the service ourself when we got the EntityManager (in downloadImages).
22 */
23 public function __construct(DownloadImages $downloadImages, $configClass, LoggerInterface $logger)
24 { 21 {
22 $this->em = $em;
25 $this->downloadImages = $downloadImages; 23 $this->downloadImages = $downloadImages;
26 $this->configClass = $configClass; 24 $this->enabled = $enabled;
27 $this->logger = $logger; 25 $this->logger = $logger;
28 } 26 }
29 27
30 public function getSubscribedEvents() 28 public static function getSubscribedEvents()
31 { 29 {
32 return array( 30 return [
33 'prePersist', 31 EntrySavedEvent::NAME => 'onEntrySaved',
34 'preUpdate', 32 EntryDeletedEvent::NAME => 'onEntryDeleted',
35 ); 33 ];
36 } 34 }
37 35
38 /** 36 /**
39 * In case of an entry has been updated. 37 * Download images and updated the data into the entry.
40 * We won't update the content field if it wasn't updated.
41 * 38 *
42 * @param LifecycleEventArgs $args 39 * @param EntrySavedEvent $event
43 */ 40 */
44 public function preUpdate(LifecycleEventArgs $args) 41 public function onEntrySaved(EntrySavedEvent $event)
45 { 42 {
46 $entity = $args->getEntity(); 43 if (!$this->enabled) {
44 $this->logger->debug('DownloadImagesSubscriber: disabled.');
47 45
48 if (!$entity instanceof Entry) {
49 return; 46 return;
50 } 47 }
51 48
52 $config = new $this->configClass(); 49 $entry = $event->getEntry();
53 $config->setEntityManager($args->getEntityManager());
54
55 if (!$config->get('download_images_enabled')) {
56 return;
57 }
58 50
59 // field content has been updated 51 $html = $this->downloadImages($entry);
60 if ($args->hasChangedField('content')) { 52 if (false !== $html) {
61 $html = $this->downloadImages($config, $entity); 53 $this->logger->debug('DownloadImagesSubscriber: updated html.');
62 54
63 if (false !== $html) { 55 $entry->setContent($html);
64 $args->setNewValue('content', $html);
65 }
66 } 56 }
67 57
68 // field preview picture has been updated 58 // update preview picture
69 if ($args->hasChangedField('previewPicture')) { 59 $previewPicture = $this->downloadPreviewImage($entry);
70 $previewPicture = $this->downloadPreviewImage($config, $entity); 60 if (false !== $previewPicture) {
61 $this->logger->debug('DownloadImagesSubscriber: update preview picture.');
71 62
72 if (false !== $previewPicture) { 63 $entry->setPreviewPicture($previewPicture);
73 $entity->setPreviewPicture($previewPicture);
74 }
75 } 64 }
65
66 $this->em->persist($entry);
67 $this->em->flush();
76 } 68 }
77 69
78 /** 70 /**
79 * When a new entry is saved. 71 * Remove images related to the entry.
80 * 72 *
81 * @param LifecycleEventArgs $args 73 * @param EntryDeletedEvent $event
82 */ 74 */
83 public function prePersist(LifecycleEventArgs $args) 75 public function onEntryDeleted(EntryDeletedEvent $event)
84 { 76 {
85 $entity = $args->getEntity(); 77 if (!$this->enabled) {
86 78 $this->logger->debug('DownloadImagesSubscriber: disabled.');
87 if (!$entity instanceof Entry) {
88 return;
89 }
90
91 $config = new $this->configClass();
92 $config->setEntityManager($args->getEntityManager());
93 79
94 if (!$config->get('download_images_enabled')) {
95 return; 80 return;
96 } 81 }
97 82
98 // update all images inside the html 83 $this->downloadImages->removeImages($event->getEntry()->getId());
99 $html = $this->downloadImages($config, $entity);
100 if (false !== $html) {
101 $entity->setContent($html);
102 }
103
104 // update preview picture
105 $previewPicture = $this->downloadPreviewImage($config, $entity);
106 if (false !== $previewPicture) {
107 $entity->setPreviewPicture($previewPicture);
108 }
109 } 84 }
110 85
111 /** 86 /**
@@ -113,16 +88,14 @@ class DownloadImagesSubscriber implements EventSubscriber
113 * 88 *
114 * @todo If we want to add async download, it should be done in that method 89 * @todo If we want to add async download, it should be done in that method
115 * 90 *
116 * @param Config $config 91 * @param Entry $entry
117 * @param Entry $entry
118 * 92 *
119 * @return string|false False in case of async 93 * @return string|false False in case of async
120 */ 94 */
121 public function downloadImages(Config $config, Entry $entry) 95 private function downloadImages(Entry $entry)
122 { 96 {
123 $this->downloadImages->setWallabagUrl($config->get('wallabag_url'));
124
125 return $this->downloadImages->processHtml( 97 return $this->downloadImages->processHtml(
98 $entry->getId(),
126 $entry->getContent(), 99 $entry->getContent(),
127 $entry->getUrl() 100 $entry->getUrl()
128 ); 101 );
@@ -133,16 +106,14 @@ class DownloadImagesSubscriber implements EventSubscriber
133 * 106 *
134 * @todo If we want to add async download, it should be done in that method 107 * @todo If we want to add async download, it should be done in that method
135 * 108 *
136 * @param Config $config 109 * @param Entry $entry
137 * @param Entry $entry
138 * 110 *
139 * @return string|false False in case of async 111 * @return string|false False in case of async
140 */ 112 */
141 public function downloadPreviewImage(Config $config, Entry $entry) 113 private function downloadPreviewImage(Entry $entry)
142 { 114 {
143 $this->downloadImages->setWallabagUrl($config->get('wallabag_url'));
144
145 return $this->downloadImages->processSingleImage( 115 return $this->downloadImages->processSingleImage(
116 $entry->getId(),
146 $entry->getPreviewPicture(), 117 $entry->getPreviewPicture(),
147 $entry->getUrl() 118 $entry->getUrl()
148 ); 119 );
diff --git a/src/Wallabag/CoreBundle/Helper/DownloadImages.php b/src/Wallabag/CoreBundle/Helper/DownloadImages.php
index e7982c56..c5298236 100644
--- a/src/Wallabag/CoreBundle/Helper/DownloadImages.php
+++ b/src/Wallabag/CoreBundle/Helper/DownloadImages.php
@@ -6,6 +6,7 @@ use Psr\Log\LoggerInterface;
6use Symfony\Component\DomCrawler\Crawler; 6use Symfony\Component\DomCrawler\Crawler;
7use GuzzleHttp\Client; 7use GuzzleHttp\Client;
8use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeExtensionGuesser; 8use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeExtensionGuesser;
9use Symfony\Component\Finder\Finder;
9 10
10class DownloadImages 11class DownloadImages
11{ 12{
@@ -17,10 +18,11 @@ class DownloadImages
17 private $mimeGuesser; 18 private $mimeGuesser;
18 private $wallabagUrl; 19 private $wallabagUrl;
19 20
20 public function __construct(Client $client, $baseFolder, LoggerInterface $logger) 21 public function __construct(Client $client, $baseFolder, $wallabagUrl, LoggerInterface $logger)
21 { 22 {
22 $this->client = $client; 23 $this->client = $client;
23 $this->baseFolder = $baseFolder; 24 $this->baseFolder = $baseFolder;
25 $this->wallabagUrl = rtrim($wallabagUrl, '/');
24 $this->logger = $logger; 26 $this->logger = $logger;
25 $this->mimeGuesser = new MimeTypeExtensionGuesser(); 27 $this->mimeGuesser = new MimeTypeExtensionGuesser();
26 28
@@ -28,17 +30,6 @@ class DownloadImages
28 } 30 }
29 31
30 /** 32 /**
31 * Since we can't inject CraueConfig service because it'll generate a circular reference when injected in the subscriber
32 * we use a different way to inject the current wallabag url.
33 *
34 * @param string $url Usually from `$config->get('wallabag_url')`
35 */
36 public function setWallabagUrl($url)
37 {
38 $this->wallabagUrl = rtrim($url, '/');
39 }
40
41 /**
42 * Setup base folder where all images are going to be saved. 33 * Setup base folder where all images are going to be saved.
43 */ 34 */
44 private function setFolder() 35 private function setFolder()
@@ -52,23 +43,24 @@ class DownloadImages
52 /** 43 /**
53 * Process the html and extract image from it, save them to local and return the updated html. 44 * Process the html and extract image from it, save them to local and return the updated html.
54 * 45 *
46 * @param int $entryId ID of the entry
55 * @param string $html 47 * @param string $html
56 * @param string $url Used as a base path for relative image and folder 48 * @param string $url Used as a base path for relative image and folder
57 * 49 *
58 * @return string 50 * @return string
59 */ 51 */
60 public function processHtml($html, $url) 52 public function processHtml($entryId, $html, $url)
61 { 53 {
62 $crawler = new Crawler($html); 54 $crawler = new Crawler($html);
63 $result = $crawler 55 $result = $crawler
64 ->filterXpath('//img') 56 ->filterXpath('//img')
65 ->extract(array('src')); 57 ->extract(array('src'));
66 58
67 $relativePath = $this->getRelativePath($url); 59 $relativePath = $this->getRelativePath($entryId);
68 60
69 // download and save the image to the folder 61 // download and save the image to the folder
70 foreach ($result as $image) { 62 foreach ($result as $image) {
71 $imagePath = $this->processSingleImage($image, $url, $relativePath); 63 $imagePath = $this->processSingleImage($entryId, $image, $url, $relativePath);
72 64
73 if (false === $imagePath) { 65 if (false === $imagePath) {
74 continue; 66 continue;
@@ -86,24 +78,27 @@ class DownloadImages
86 * - re-saved it (for security reason) 78 * - re-saved it (for security reason)
87 * - return the new local path. 79 * - return the new local path.
88 * 80 *
81 * @param int $entryId ID of the entry
89 * @param string $imagePath Path to the image to retrieve 82 * @param string $imagePath Path to the image to retrieve
90 * @param string $url Url from where the image were found 83 * @param string $url Url from where the image were found
91 * @param string $relativePath Relative local path to saved the image 84 * @param string $relativePath Relative local path to saved the image
92 * 85 *
93 * @return string Relative url to access the image from the web 86 * @return string Relative url to access the image from the web
94 */ 87 */
95 public function processSingleImage($imagePath, $url, $relativePath = null) 88 public function processSingleImage($entryId, $imagePath, $url, $relativePath = null)
96 { 89 {
97 if (null == $relativePath) { 90 if (null === $relativePath) {
98 $relativePath = $this->getRelativePath($url); 91 $relativePath = $this->getRelativePath($entryId);
99 } 92 }
100 93
94 $this->logger->debug('DownloadImages: working on image: '.$imagePath);
95
101 $folderPath = $this->baseFolder.'/'.$relativePath; 96 $folderPath = $this->baseFolder.'/'.$relativePath;
102 97
103 // build image path 98 // build image path
104 $absolutePath = $this->getAbsoluteLink($url, $imagePath); 99 $absolutePath = $this->getAbsoluteLink($url, $imagePath);
105 if (false === $absolutePath) { 100 if (false === $absolutePath) {
106 $this->logger->log('error', 'Can not determine the absolute path for that image, skipping.'); 101 $this->logger->error('DownloadImages: Can not determine the absolute path for that image, skipping.');
107 102
108 return false; 103 return false;
109 } 104 }
@@ -111,15 +106,15 @@ class DownloadImages
111 try { 106 try {
112 $res = $this->client->get($absolutePath); 107 $res = $this->client->get($absolutePath);
113 } catch (\Exception $e) { 108 } catch (\Exception $e) {
114 $this->logger->log('error', 'Can not retrieve image, skipping.', ['exception' => $e]); 109 $this->logger->error('DownloadImages: Can not retrieve image, skipping.', ['exception' => $e]);
115 110
116 return false; 111 return false;
117 } 112 }
118 113
119 $ext = $this->mimeGuesser->guess($res->getHeader('content-type')); 114 $ext = $this->mimeGuesser->guess($res->getHeader('content-type'));
120 $this->logger->log('debug', 'Checking extension', ['ext' => $ext, 'header' => $res->getHeader('content-type')]); 115 $this->logger->debug('DownloadImages: Checking extension', ['ext' => $ext, 'header' => $res->getHeader('content-type')]);
121 if (!in_array($ext, ['jpeg', 'jpg', 'gif', 'png'], true)) { 116 if (!in_array($ext, ['jpeg', 'jpg', 'gif', 'png'], true)) {
122 $this->logger->log('error', 'Processed image with not allowed extension. Skipping '.$imagePath); 117 $this->logger->error('DownloadImages: Processed image with not allowed extension. Skipping '.$imagePath);
123 118
124 return false; 119 return false;
125 } 120 }
@@ -133,7 +128,7 @@ class DownloadImages
133 } 128 }
134 129
135 if (false === $im) { 130 if (false === $im) {
136 $this->logger->log('error', 'Error while regenerating image', ['path' => $localPath]); 131 $this->logger->error('DownloadImages: Error while regenerating image', ['path' => $localPath]);
137 132
138 return false; 133 return false;
139 } 134 }
@@ -141,16 +136,16 @@ class DownloadImages
141 switch ($ext) { 136 switch ($ext) {
142 case 'gif': 137 case 'gif':
143 $result = imagegif($im, $localPath); 138 $result = imagegif($im, $localPath);
144 $this->logger->log('debug', 'Re-creating gif'); 139 $this->logger->debug('DownloadImages: Re-creating gif');
145 break; 140 break;
146 case 'jpeg': 141 case 'jpeg':
147 case 'jpg': 142 case 'jpg':
148 $result = imagejpeg($im, $localPath, self::REGENERATE_PICTURES_QUALITY); 143 $result = imagejpeg($im, $localPath, self::REGENERATE_PICTURES_QUALITY);
149 $this->logger->log('debug', 'Re-creating jpg'); 144 $this->logger->debug('DownloadImages: Re-creating jpg');
150 break; 145 break;
151 case 'png': 146 case 'png':
152 $result = imagepng($im, $localPath, ceil(self::REGENERATE_PICTURES_QUALITY / 100 * 9)); 147 $result = imagepng($im, $localPath, ceil(self::REGENERATE_PICTURES_QUALITY / 100 * 9));
153 $this->logger->log('debug', 'Re-creating png'); 148 $this->logger->debug('DownloadImages: Re-creating png');
154 } 149 }
155 150
156 imagedestroy($im); 151 imagedestroy($im);
@@ -159,23 +154,46 @@ class DownloadImages
159 } 154 }
160 155
161 /** 156 /**
157 * Remove all images for the given entry id.
158 *
159 * @param int $entryId ID of the entry
160 */
161 public function removeImages($entryId)
162 {
163 $relativePath = $this->getRelativePath($entryId);
164 $folderPath = $this->baseFolder.'/'.$relativePath;
165
166 $finder = new Finder();
167 $finder
168 ->files()
169 ->ignoreDotFiles(true)
170 ->in($folderPath);
171
172 foreach ($finder as $file) {
173 @unlink($file->getRealPath());
174 }
175
176 @rmdir($folderPath);
177 }
178
179 /**
162 * Generate the folder where we are going to save images based on the entry url. 180 * Generate the folder where we are going to save images based on the entry url.
163 * 181 *
164 * @param string $url 182 * @param int $entryId ID of the entry
165 * 183 *
166 * @return string 184 * @return string
167 */ 185 */
168 private function getRelativePath($url) 186 private function getRelativePath($entryId)
169 { 187 {
170 $hashUrl = hash('crc32', $url); 188 $hashId = hash('crc32', $entryId);
171 $relativePath = $hashUrl[0].'/'.$hashUrl[1].'/'.$hashUrl; 189 $relativePath = $hashId[0].'/'.$hashId[1].'/'.$hashId;
172 $folderPath = $this->baseFolder.'/'.$relativePath; 190 $folderPath = $this->baseFolder.'/'.$relativePath;
173 191
174 if (!file_exists($folderPath)) { 192 if (!file_exists($folderPath)) {
175 mkdir($folderPath, 0777, true); 193 mkdir($folderPath, 0777, true);
176 } 194 }
177 195
178 $this->logger->log('debug', 'Folder used for that url', ['folder' => $folderPath, 'url' => $url]); 196 $this->logger->debug('DownloadImages: Folder used for that Entry id', ['folder' => $folderPath, 'entryId' => $entryId]);
179 197
180 return $relativePath; 198 return $relativePath;
181 } 199 }
@@ -208,7 +226,7 @@ class DownloadImages
208 return $absolute->get_uri(); 226 return $absolute->get_uri();
209 } 227 }
210 228
211 $this->logger->log('error', 'Can not make an absolute link', ['base' => $base, 'url' => $url]); 229 $this->logger->error('DownloadImages: Can not make an absolute link', ['base' => $base, 'url' => $url]);
212 230
213 return false; 231 return false;
214 } 232 }
diff --git a/src/Wallabag/CoreBundle/Resources/config/services.yml b/src/Wallabag/CoreBundle/Resources/config/services.yml
index 1fb81a46..56d776ad 100644
--- a/src/Wallabag/CoreBundle/Resources/config/services.yml
+++ b/src/Wallabag/CoreBundle/Resources/config/services.yml
@@ -140,17 +140,19 @@ services:
140 wallabag_core.subscriber.download_images: 140 wallabag_core.subscriber.download_images:
141 class: Wallabag\CoreBundle\Event\Subscriber\DownloadImagesSubscriber 141 class: Wallabag\CoreBundle\Event\Subscriber\DownloadImagesSubscriber
142 arguments: 142 arguments:
143 - "@doctrine.orm.default_entity_manager"
143 - "@wallabag_core.entry.download_images" 144 - "@wallabag_core.entry.download_images"
144 - "%craue_config.config.class%" 145 - '@=service(''craue_config'').get(''download_images_enabled'')'
145 - "@logger" 146 - "@logger"
146 tags: 147 tags:
147 - { name: doctrine.event_subscriber } 148 - { name: kernel.event_subscriber }
148 149
149 wallabag_core.entry.download_images: 150 wallabag_core.entry.download_images:
150 class: Wallabag\CoreBundle\Helper\DownloadImages 151 class: Wallabag\CoreBundle\Helper\DownloadImages
151 arguments: 152 arguments:
152 - "@wallabag_core.entry.download_images.client" 153 - "@wallabag_core.entry.download_images.client"
153 - "%kernel.root_dir%/../web/assets/images" 154 - "%kernel.root_dir%/../web/assets/images"
155 - '@=service(''craue_config'').get(''wallabag_url'')'
154 - "@logger" 156 - "@logger"
155 157
156 wallabag_core.entry.download_images.client: 158 wallabag_core.entry.download_images.client:
diff --git a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php
index 514e9d89..4ab06dbf 100644
--- a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php
+++ b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php
@@ -869,10 +869,30 @@ class EntryControllerTest extends WallabagCoreTestCase
869 $this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $entry); 869 $this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $entry);
870 $this->assertEquals($url, $entry->getUrl()); 870 $this->assertEquals($url, $entry->getUrl());
871 $this->assertContains('Perpignan', $entry->getTitle()); 871 $this->assertContains('Perpignan', $entry->getTitle());
872 $this->assertContains('assets/images/8/e/8ec9229a/d9bc0fcd.jpeg', $entry->getContent()); 872 $this->assertContains('/d9bc0fcd.jpeg', $entry->getContent());
873 873
874 $em->remove($entry); 874 $client->getContainer()->get('craue_config')->set('download_images_enabled', 0);
875 $em->flush(); 875 }
876
877 /**
878 * @depends testNewEntryWithDownloadImagesEnabled
879 */
880 public function testRemoveEntryWithDownloadImagesEnabled()
881 {
882 $this->logInAs('admin');
883 $client = $this->getClient();
884
885 $url = 'http://www.20minutes.fr/montpellier/1952003-20161030-video-car-tombe-panne-rugbymen-perpignan-improvisent-melee-route';
886 $client->getContainer()->get('craue_config')->set('download_images_enabled', 1);
887
888 $content = $client->getContainer()
889 ->get('doctrine.orm.entity_manager')
890 ->getRepository('WallabagCoreBundle:Entry')
891 ->findByUrlAndUserId($url, $this->getLoggedInUserId());
892
893 $client->request('GET', '/delete/'.$content->getId());
894
895 $this->assertEquals(302, $client->getResponse()->getStatusCode());
876 896
877 $client->getContainer()->get('craue_config')->set('download_images_enabled', 0); 897 $client->getContainer()->get('craue_config')->set('download_images_enabled', 0);
878 } 898 }
diff --git a/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php b/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php
index 33d2e389..920c21d9 100644
--- a/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php
+++ b/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php
@@ -26,12 +26,11 @@ class DownloadImagesTest extends \PHPUnit_Framework_TestCase
26 $logHandler = new TestHandler(); 26 $logHandler = new TestHandler();
27 $logger = new Logger('test', array($logHandler)); 27 $logger = new Logger('test', array($logHandler));
28 28
29 $download = new DownloadImages($client, sys_get_temp_dir().'/wallabag_test', $logger); 29 $download = new DownloadImages($client, sys_get_temp_dir().'/wallabag_test', 'http://wallabag.io/', $logger);
30 $download->setWallabagUrl('http://wallabag.io/');
31 30
32 $res = $download->processHtml('<div><img src="http://i.imgur.com/T9qgcHc.jpg" /></div>', 'http://imgur.com/gallery/WxtWY'); 31 $res = $download->processHtml(123, '<div><img src="http://i.imgur.com/T9qgcHc.jpg" /></div>', 'http://imgur.com/gallery/WxtWY');
33 32
34 $this->assertContains('http://wallabag.io/assets/images/4/2/4258f71e/c638b4c2.png', $res); 33 $this->assertContains('http://wallabag.io/assets/images/9/b/9b0ead26/c638b4c2.png', $res);
35 } 34 }
36 35
37 public function testProcessHtmlWithBadImage() 36 public function testProcessHtmlWithBadImage()
@@ -47,8 +46,8 @@ class DownloadImagesTest extends \PHPUnit_Framework_TestCase
47 $logHandler = new TestHandler(); 46 $logHandler = new TestHandler();
48 $logger = new Logger('test', array($logHandler)); 47 $logger = new Logger('test', array($logHandler));
49 48
50 $download = new DownloadImages($client, sys_get_temp_dir().'/wallabag_test', $logger); 49 $download = new DownloadImages($client, sys_get_temp_dir().'/wallabag_test', 'http://wallabag.io/', $logger);
51 $res = $download->processHtml('<div><img src="http://i.imgur.com/T9qgcHc.jpg" /></div>', 'http://imgur.com/gallery/WxtWY'); 50 $res = $download->processHtml(123, '<div><img src="http://i.imgur.com/T9qgcHc.jpg" /></div>', 'http://imgur.com/gallery/WxtWY');
52 51
53 $this->assertContains('http://i.imgur.com/T9qgcHc.jpg', $res, 'Image were not replace because of content-type'); 52 $this->assertContains('http://i.imgur.com/T9qgcHc.jpg', $res, 'Image were not replace because of content-type');
54 } 53 }
@@ -79,10 +78,10 @@ class DownloadImagesTest extends \PHPUnit_Framework_TestCase
79 $logHandler = new TestHandler(); 78 $logHandler = new TestHandler();
80 $logger = new Logger('test', array($logHandler)); 79 $logger = new Logger('test', array($logHandler));
81 80
82 $download = new DownloadImages($client, sys_get_temp_dir().'/wallabag_test', $logger); 81 $download = new DownloadImages($client, sys_get_temp_dir().'/wallabag_test', 'http://wallabag.io/', $logger);
83 $res = $download->processSingleImage('T9qgcHc.jpg', 'http://imgur.com/gallery/WxtWY'); 82 $res = $download->processSingleImage(123, 'T9qgcHc.jpg', 'http://imgur.com/gallery/WxtWY');
84 83
85 $this->assertContains('/assets/images/4/2/4258f71e/ebe60399.'.$extension, $res); 84 $this->assertContains('/assets/images/9/b/9b0ead26/ebe60399.'.$extension, $res);
86 } 85 }
87 86
88 public function testProcessSingleImageWithBadUrl() 87 public function testProcessSingleImageWithBadUrl()
@@ -98,8 +97,8 @@ class DownloadImagesTest extends \PHPUnit_Framework_TestCase
98 $logHandler = new TestHandler(); 97 $logHandler = new TestHandler();
99 $logger = new Logger('test', array($logHandler)); 98 $logger = new Logger('test', array($logHandler));
100 99
101 $download = new DownloadImages($client, sys_get_temp_dir().'/wallabag_test', $logger); 100 $download = new DownloadImages($client, sys_get_temp_dir().'/wallabag_test', 'http://wallabag.io/', $logger);
102 $res = $download->processSingleImage('T9qgcHc.jpg', 'http://imgur.com/gallery/WxtWY'); 101 $res = $download->processSingleImage(123, 'T9qgcHc.jpg', 'http://imgur.com/gallery/WxtWY');
103 102
104 $this->assertFalse($res, 'Image can not be found, so it will not be replaced'); 103 $this->assertFalse($res, 'Image can not be found, so it will not be replaced');
105 } 104 }
@@ -117,8 +116,8 @@ class DownloadImagesTest extends \PHPUnit_Framework_TestCase
117 $logHandler = new TestHandler(); 116 $logHandler = new TestHandler();
118 $logger = new Logger('test', array($logHandler)); 117 $logger = new Logger('test', array($logHandler));
119 118
120 $download = new DownloadImages($client, sys_get_temp_dir().'/wallabag_test', $logger); 119 $download = new DownloadImages($client, sys_get_temp_dir().'/wallabag_test', 'http://wallabag.io/', $logger);
121 $res = $download->processSingleImage('http://i.imgur.com/T9qgcHc.jpg', 'http://imgur.com/gallery/WxtWY'); 120 $res = $download->processSingleImage(123, 'http://i.imgur.com/T9qgcHc.jpg', 'http://imgur.com/gallery/WxtWY');
122 121
123 $this->assertFalse($res, 'Image can not be loaded, so it will not be replaced'); 122 $this->assertFalse($res, 'Image can not be loaded, so it will not be replaced');
124 } 123 }
@@ -136,8 +135,8 @@ class DownloadImagesTest extends \PHPUnit_Framework_TestCase
136 $logHandler = new TestHandler(); 135 $logHandler = new TestHandler();
137 $logger = new Logger('test', array($logHandler)); 136 $logger = new Logger('test', array($logHandler));
138 137
139 $download = new DownloadImages($client, sys_get_temp_dir().'/wallabag_test', $logger); 138 $download = new DownloadImages($client, sys_get_temp_dir().'/wallabag_test', 'http://wallabag.io/', $logger);
140 $res = $download->processSingleImage('/i.imgur.com/T9qgcHc.jpg', 'imgur.com/gallery/WxtWY'); 139 $res = $download->processSingleImage(123, '/i.imgur.com/T9qgcHc.jpg', 'imgur.com/gallery/WxtWY');
141 140
142 $this->assertFalse($res, 'Absolute image can not be determined, so it will not be replaced'); 141 $this->assertFalse($res, 'Absolute image can not be determined, so it will not be replaced');
143 } 142 }