mirror of
https://github.com/wallabag/wallabag.git
synced 2024-11-15 21:41:06 +00:00
bring chrome and firefox as separate imports
This commit is contained in:
parent
f7c55b3812
commit
59201088b4
29 changed files with 1266 additions and 253 deletions
|
@ -349,9 +349,13 @@ import:
|
||||||
# how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
# how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
||||||
worker:
|
worker:
|
||||||
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
||||||
# browser:
|
# firefox:
|
||||||
# page_title: 'Import > Browser'
|
# page_title: 'Import > Firefox'
|
||||||
# description: "This importer will import all your Firefox or Chrome bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file. </p>For Chrome, the location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
# description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file."
|
||||||
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
#chrome:
|
||||||
|
# page_title: 'Import > Chrome'
|
||||||
|
# description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
||||||
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
|
||||||
developer:
|
developer:
|
||||||
|
|
|
@ -349,9 +349,13 @@ import:
|
||||||
# how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
# how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
||||||
worker:
|
worker:
|
||||||
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
||||||
# browser:
|
# firefox:
|
||||||
# page_title: 'Import > Browser'
|
# page_title: 'Import > Firefox'
|
||||||
# description: "This importer will import all your Firefox or Chrome bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file. </p>For Chrome, the location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
# description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file."
|
||||||
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
# chrome:
|
||||||
|
# page_title: 'Import > Chrome'
|
||||||
|
# description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
||||||
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
|
||||||
developer:
|
developer:
|
||||||
|
|
|
@ -349,9 +349,13 @@ import:
|
||||||
how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
||||||
worker:
|
worker:
|
||||||
enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
||||||
browser:
|
firefox:
|
||||||
page_title: 'Import > Browser'
|
page_title: 'Import > Firefox'
|
||||||
description: "This importer will import all your Firefox or Chrome bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file. </p>For Chrome, the location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file."
|
||||||
|
how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
chrome:
|
||||||
|
page_title: 'Import > Chrome'
|
||||||
|
description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
||||||
how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
|
||||||
developer:
|
developer:
|
||||||
|
|
|
@ -349,9 +349,13 @@ import:
|
||||||
# how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
# how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
||||||
worker:
|
worker:
|
||||||
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
||||||
# browser:
|
# firefox:
|
||||||
# page_title: 'Import > Browser'
|
# page_title: 'Import > Firefox'
|
||||||
# description: "This importer will import all your Firefox or Chrome bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file. </p>For Chrome, the location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
# description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file."
|
||||||
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
# chrome:
|
||||||
|
# page_title: 'Import > Chrome'
|
||||||
|
# description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
||||||
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
|
||||||
developer:
|
developer:
|
||||||
|
|
|
@ -349,9 +349,13 @@ import:
|
||||||
# how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
# how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
||||||
worker:
|
worker:
|
||||||
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
||||||
# browser:
|
# firefox:
|
||||||
# page_title: 'Import > Browser'
|
# page_title: 'Import > Firefox'
|
||||||
# description: "This importer will import all your Firefox or Chrome bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file. </p>For Chrome, the location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
# description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file."
|
||||||
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
# chrome:
|
||||||
|
# page_title: 'Import > Chrome'
|
||||||
|
# description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
||||||
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
|
||||||
developer:
|
developer:
|
||||||
|
|
|
@ -349,9 +349,13 @@ import:
|
||||||
how_to: "Choisissez le fichier de votre export Readability et cliquez sur le bouton ci-dessous pour l'importer."
|
how_to: "Choisissez le fichier de votre export Readability et cliquez sur le bouton ci-dessous pour l'importer."
|
||||||
worker:
|
worker:
|
||||||
enabled: "Les imports sont asynchrones. Une fois l'import commencé un worker externe traitera les messages un par un. Le service activé est :"
|
enabled: "Les imports sont asynchrones. Une fois l'import commencé un worker externe traitera les messages un par un. Le service activé est :"
|
||||||
browser:
|
firefox:
|
||||||
page_title: 'Import > Navigateur'
|
page_title: 'Import > Firefox'
|
||||||
description: "Cet outil va vous permettre d'importer tous vos marques-pages de Firefox ou de Google Chrome/Chromium. <p>Pour Firefox, ouvrez le panneau des marques-pages (Ctrl+Maj+O), puis dans « Importation et sauvegarde », choisissez « Sauvegarde... ». Vous allez récupérer un fichier .json. </p>Pour Google Chrome, la situation du fichier dépend de votre système d'exploitation : <ul><li>Sur GNU/Linux, allez dans le répertoire <code>~/.config/google-chrome/Default/</code></li><li>Sous Windows, il devrait se trouver à <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>Sur OS X, il devrait se trouver dans le fichier <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Une fois que vous y êtes, copiez le fichier Bookmarks à un endroit où vous le retrouverez.<em><br>Notez que si vous utilisez Chromium à la place de Chrome, vous devez corriger les chemins en conséquence.</em></p>"
|
description: "Cet outil va vous permettre d'importer tous vos marques-pages de Firefox. <p>Pour Firefox, ouvrez le panneau des marques-pages (Ctrl+Maj+O), puis dans « Importation et sauvegarde », choisissez « Sauvegarde... ». Vous allez récupérer un fichier .json. </p>"
|
||||||
|
how_to: "Choisissez le fichier de sauvegarde de vos marques-page et cliquez sur le bouton pour l'importer. Soyez avertis que le processus peut prendre un temps assez long car tous les articles doivent être récupérés en ligne."
|
||||||
|
chrome:
|
||||||
|
page_title: 'Import > Chrome'
|
||||||
|
description: "Cet outil va vous permettre d'importer tous vos marques-pages de Google Chrome/Chromium. Pour Google Chrome, la situation du fichier dépend de votre système d'exploitation : <ul><li>Sur GNU/Linux, allez dans le répertoire <code>~/.config/google-chrome/Default/</code></li><li>Sous Windows, il devrait se trouver à <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>Sur OS X, il devrait se trouver dans le fichier <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Une fois que vous y êtes, copiez le fichier Bookmarks à un endroit où vous le retrouverez.<em><br>Notez que si vous utilisez Chromium à la place de Chrome, vous devez corriger les chemins en conséquence.</em></p>"
|
||||||
how_to: "Choisissez le fichier de sauvegarde de vos marques-page et cliquez sur le bouton pour l'importer. Soyez avertis que le processus peut prendre un temps assez long car tous les articles doivent être récupérés en ligne."
|
how_to: "Choisissez le fichier de sauvegarde de vos marques-page et cliquez sur le bouton pour l'importer. Soyez avertis que le processus peut prendre un temps assez long car tous les articles doivent être récupérés en ligne."
|
||||||
|
|
||||||
developer:
|
developer:
|
||||||
|
|
|
@ -348,10 +348,14 @@ import:
|
||||||
# how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
# how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
||||||
worker:
|
worker:
|
||||||
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
||||||
# browser:
|
# firefox:
|
||||||
# page_title: 'Import > Browser'
|
# page_title: 'Import > Firefox'
|
||||||
# description: "This importer will import all your Firefox or Chrome bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file. </p>For Chrome, the location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
# description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file."
|
||||||
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched"
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
# chrome:
|
||||||
|
# page_title: 'Import > Chrome'
|
||||||
|
# description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
||||||
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
|
||||||
developer:
|
developer:
|
||||||
page_title: 'Sviluppatori'
|
page_title: 'Sviluppatori'
|
||||||
|
|
|
@ -349,9 +349,13 @@ import:
|
||||||
how_to: "Mercés de seleccionar vòstre Readability fichièr e de clicar sul boton dejós per lo telecargar e l'importar."
|
how_to: "Mercés de seleccionar vòstre Readability fichièr e de clicar sul boton dejós per lo telecargar e l'importar."
|
||||||
worker:
|
worker:
|
||||||
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
||||||
# browser:
|
# firefox:
|
||||||
# page_title: 'Import > Browser'
|
# page_title: 'Import > Firefox'
|
||||||
# description: "This importer will import all your Firefox or Chrome bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file. </p>For Chrome, the location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
# description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file."
|
||||||
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
# chrome:
|
||||||
|
# page_title: 'Import > Chrome'
|
||||||
|
# description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
||||||
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
|
||||||
developer:
|
developer:
|
||||||
|
|
|
@ -349,9 +349,13 @@ import:
|
||||||
how_to: 'Wybierz swój plik eksportu z Readability i kliknij poniższy przycisk, aby go załadować.'
|
how_to: 'Wybierz swój plik eksportu z Readability i kliknij poniższy przycisk, aby go załadować.'
|
||||||
worker:
|
worker:
|
||||||
enabled: "Import jest wykonywany asynchronicznie. Od momentu rozpoczęcia importu, zewnętrzna usługa może zajmować się na raz tylko jednym zadaniem. Bieżącą usługą jest:"
|
enabled: "Import jest wykonywany asynchronicznie. Od momentu rozpoczęcia importu, zewnętrzna usługa może zajmować się na raz tylko jednym zadaniem. Bieżącą usługą jest:"
|
||||||
# browser:
|
# firefox:
|
||||||
# page_title: 'Import > Browser'
|
# page_title: 'Import > Firefox'
|
||||||
# description: "This importer will import all your Firefox or Chrome bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file. </p>For Chrome, the location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
# description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file."
|
||||||
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
# chrome:
|
||||||
|
# page_title: 'Import > Chrome'
|
||||||
|
# description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
||||||
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
|
||||||
developer:
|
developer:
|
||||||
|
|
|
@ -349,9 +349,13 @@ import:
|
||||||
# how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
# how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
||||||
worker:
|
worker:
|
||||||
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
||||||
# browser:
|
# firefox:
|
||||||
# page_title: 'Import > Browser'
|
# page_title: 'Import > Firefox'
|
||||||
# description: "This importer will import all your Firefox or Chrome bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file. </p>For Chrome, the location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
# description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file."
|
||||||
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
# chrome:
|
||||||
|
# page_title: 'Import > Chrome'
|
||||||
|
# description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
||||||
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
|
||||||
developer:
|
developer:
|
||||||
|
|
|
@ -349,9 +349,13 @@ import:
|
||||||
# how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
# how_to: 'Please select your Readability export and click on the below button to upload and import it.'
|
||||||
worker:
|
worker:
|
||||||
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
# enabled: "Import is made asynchronously. Once the import task is started, an external worker will handle jobs one at a time. The current service is:"
|
||||||
# browser:
|
# firefox:
|
||||||
# page_title: 'Import > Browser'
|
# page_title: 'Import > Firefox'
|
||||||
# description: "This importer will import all your Firefox or Chrome bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file. </p>For Chrome, the location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
# description: "This importer will import all your Firefox bookmarks. <p>For Firefox, just go to your bookmarks (Ctrl+Maj+O), then into \"Import and backup\", choose \"Backup...\". You will obtain a .json file."
|
||||||
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
# chrome:
|
||||||
|
# page_title: 'Import > Chrome'
|
||||||
|
# description: "This importer will import all your Chrome bookmarks. The location of the file depends on your operating system : <ul><li>On Linux, go into the <code>~/.config/chromium/Default/</code> directory</li><li>On Windows, it should be at <code>%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default</code></li><li>On OS X, it should be at <code>~/Library/Application Support/Google/Chrome/Default/Bookmarks</code></li></ul>Once you got there, copy the Bookmarks file someplace you'll find.<em><br>Note that if you have Chromium instead of Chrome, you'll have to correct paths accordingly.</em></p>"
|
||||||
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
# how_to: "Please choose the bookmark backup file and click on the button below to import it. Note that the process may take a long time since all articles have to be fetched."
|
||||||
|
|
||||||
developer:
|
developer:
|
||||||
|
|
|
@ -17,7 +17,7 @@ class ImportCommand extends ContainerAwareCommand
|
||||||
->setDescription('Import entries from a JSON export from a wallabag v1 instance')
|
->setDescription('Import entries from a JSON export from a wallabag v1 instance')
|
||||||
->addArgument('userId', InputArgument::REQUIRED, 'User ID to populate')
|
->addArgument('userId', InputArgument::REQUIRED, 'User ID to populate')
|
||||||
->addArgument('filepath', InputArgument::REQUIRED, 'Path to the JSON file')
|
->addArgument('filepath', InputArgument::REQUIRED, 'Path to the JSON file')
|
||||||
->addOption('importer', null, InputArgument::OPTIONAL, 'The importer to use: wallabag v1, v2 or browser', 'v1')
|
->addOption('importer', null, InputArgument::OPTIONAL, 'The importer to use: wallabag v1, v2, firefox or chrome', 'v1')
|
||||||
->addOption('markAsRead', null, InputArgument::OPTIONAL, 'Mark all entries as read', false)
|
->addOption('markAsRead', null, InputArgument::OPTIONAL, 'Mark all entries as read', false)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
@ -44,8 +44,11 @@ class ImportCommand extends ContainerAwareCommand
|
||||||
case 'v2':
|
case 'v2':
|
||||||
$wallabag = $this->getContainer()->get('wallabag_import.wallabag_v2.import');
|
$wallabag = $this->getContainer()->get('wallabag_import.wallabag_v2.import');
|
||||||
break;
|
break;
|
||||||
case 'browser':
|
case 'firefox':
|
||||||
$wallabag = $this->getContainer()->get('wallabag_import.browser.import');
|
$wallabag = $this->getContainer()->get('wallabag_import.firefox.import');
|
||||||
|
break;
|
||||||
|
case 'chrome':
|
||||||
|
$wallabag = $this->getContainer()->get('wallabag_import.chrome.import');
|
||||||
break;
|
break;
|
||||||
case 'v1':
|
case 'v1':
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -8,27 +8,21 @@ use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Wallabag\ImportBundle\Form\Type\UploadImportType;
|
use Wallabag\ImportBundle\Form\Type\UploadImportType;
|
||||||
|
|
||||||
class BrowserController extends Controller
|
abstract class BrowserController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Return the service to handle the import.
|
* Return the service to handle the import.
|
||||||
*
|
*
|
||||||
* @return \Wallabag\ImportBundle\Import\ImportInterface
|
* @return \Wallabag\ImportBundle\Import\ImportInterface
|
||||||
*/
|
*/
|
||||||
protected function getImportService()
|
abstract protected function getImportService();
|
||||||
{
|
|
||||||
return $this->get('wallabag_import.browser.import');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the template used for the form.
|
* Return the template used for the form.
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected function getImportTemplate()
|
abstract protected function getImportTemplate();
|
||||||
{
|
|
||||||
return 'WallabagImportBundle:Browser:index.html.twig';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Route("/browser", name="import_browser")
|
* @Route("/browser", name="import_browser")
|
||||||
|
@ -43,15 +37,15 @@ class BrowserController extends Controller
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
$wallabag = $this->getImportService();
|
$wallabag = $this->getImportService();
|
||||||
|
$wallabag->setUser($this->getUser());
|
||||||
|
|
||||||
if ($form->isValid()) {
|
if ($form->isValid()) {
|
||||||
$file = $form->get('file')->getData();
|
$file = $form->get('file')->getData();
|
||||||
$markAsRead = $form->get('mark_as_read')->getData();
|
$markAsRead = $form->get('mark_as_read')->getData();
|
||||||
$name = $this->getUser()->getId().'.json';
|
$name = $this->getUser()->getId().'.json';
|
||||||
|
|
||||||
if (in_array($file->getClientMimeType(), $this->getParameter('wallabag_import.allow_mimetypes')) && $file->move($this->getParameter('wallabag_import.resource_dir'), $name)) {
|
if (null !== $file && in_array($file->getClientMimeType(), $this->getParameter('wallabag_import.allow_mimetypes')) && $file->move($this->getParameter('wallabag_import.resource_dir'), $name)) {
|
||||||
$res = $wallabag
|
$res = $wallabag
|
||||||
->setUser($this->getUser())
|
|
||||||
->setFilepath($this->getParameter('wallabag_import.resource_dir').'/'.$name)
|
->setFilepath($this->getParameter('wallabag_import.resource_dir').'/'.$name)
|
||||||
->setMarkAsRead($markAsRead)
|
->setMarkAsRead($markAsRead)
|
||||||
->import();
|
->import();
|
||||||
|
@ -60,12 +54,17 @@ class BrowserController extends Controller
|
||||||
|
|
||||||
if (true === $res) {
|
if (true === $res) {
|
||||||
$summary = $wallabag->getSummary();
|
$summary = $wallabag->getSummary();
|
||||||
// TODO : Pluralize these messages
|
|
||||||
$message = $this->get('translator')->trans('flashes.import.notice.summary', [
|
$message = $this->get('translator')->trans('flashes.import.notice.summary', [
|
||||||
'%imported%' => $summary['imported'],
|
'%imported%' => $summary['imported'],
|
||||||
'%skipped%' => $summary['skipped'],
|
'%skipped%' => $summary['skipped'],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
if (0 < $summary['queued']) {
|
||||||
|
$message = $this->get('translator')->trans('flashes.import.notice.summary_with_queue', [
|
||||||
|
'%queued%' => $summary['queued'],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
unlink($this->getParameter('wallabag_import.resource_dir').'/'.$name);
|
unlink($this->getParameter('wallabag_import.resource_dir').'/'.$name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
41
src/Wallabag/ImportBundle/Controller/ChromeController.php
Normal file
41
src/Wallabag/ImportBundle/Controller/ChromeController.php
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Wallabag\ImportBundle\Controller;
|
||||||
|
|
||||||
|
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
|
||||||
|
class ChromeController extends BrowserController
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function getImportService()
|
||||||
|
{
|
||||||
|
$service = $this->get('wallabag_import.chrome.import');
|
||||||
|
|
||||||
|
if ($this->get('craue_config')->get('import_with_rabbitmq')) {
|
||||||
|
$service->setProducer($this->get('old_sound_rabbit_mq.import_wallabag_v1_producer'));
|
||||||
|
} elseif ($this->get('craue_config')->get('import_with_redis')) {
|
||||||
|
$service->setProducer($this->get('wallabag_import.producer.redis.wallabag_v1'));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $service;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function getImportTemplate()
|
||||||
|
{
|
||||||
|
return 'WallabagImportBundle:Chrome:index.html.twig';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Route("/chrome", name="import_chrome")
|
||||||
|
*/
|
||||||
|
public function indexAction(Request $request)
|
||||||
|
{
|
||||||
|
return parent::indexAction($request);
|
||||||
|
}
|
||||||
|
}
|
41
src/Wallabag/ImportBundle/Controller/FirefoxController.php
Normal file
41
src/Wallabag/ImportBundle/Controller/FirefoxController.php
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Wallabag\ImportBundle\Controller;
|
||||||
|
|
||||||
|
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
|
||||||
|
class FirefoxController extends BrowserController
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function getImportService()
|
||||||
|
{
|
||||||
|
$service = $this->get('wallabag_import.firefox.import');
|
||||||
|
|
||||||
|
if ($this->get('craue_config')->get('import_with_rabbitmq')) {
|
||||||
|
$service->setProducer($this->get('old_sound_rabbit_mq.import_wallabag_v1_producer'));
|
||||||
|
} elseif ($this->get('craue_config')->get('import_with_redis')) {
|
||||||
|
$service->setProducer($this->get('wallabag_import.producer.redis.wallabag_v1'));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $service;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function getImportTemplate()
|
||||||
|
{
|
||||||
|
return 'WallabagImportBundle:Firefox:index.html.twig';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Route("/firefox", name="import_firefox")
|
||||||
|
*/
|
||||||
|
public function indexAction(Request $request)
|
||||||
|
{
|
||||||
|
return parent::indexAction($request);
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,69 +9,24 @@ use Wallabag\CoreBundle\Entity\Entry;
|
||||||
use Wallabag\UserBundle\Entity\User;
|
use Wallabag\UserBundle\Entity\User;
|
||||||
use Wallabag\CoreBundle\Helper\ContentProxy;
|
use Wallabag\CoreBundle\Helper\ContentProxy;
|
||||||
|
|
||||||
class BrowserImport implements ImportInterface
|
abstract class BrowserImport extends AbstractImport
|
||||||
{
|
{
|
||||||
protected $user;
|
|
||||||
protected $em;
|
|
||||||
protected $logger;
|
|
||||||
protected $contentProxy;
|
|
||||||
protected $skippedEntries = 0;
|
|
||||||
protected $importedEntries = 0;
|
|
||||||
protected $totalEntries = 0;
|
|
||||||
protected $filepath;
|
protected $filepath;
|
||||||
protected $markAsRead;
|
|
||||||
private $nbEntries;
|
|
||||||
|
|
||||||
public function __construct(EntityManager $em, ContentProxy $contentProxy)
|
|
||||||
{
|
|
||||||
$this->em = $em;
|
|
||||||
$this->logger = new NullLogger();
|
|
||||||
$this->contentProxy = $contentProxy;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setLogger(LoggerInterface $logger)
|
|
||||||
{
|
|
||||||
$this->logger = $logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* We define the user in a custom call because on the import command there is no logged in user.
|
|
||||||
* So we can't retrieve user from the `security.token_storage` service.
|
|
||||||
*
|
|
||||||
* @param User $user
|
|
||||||
*
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function setUser(User $user)
|
|
||||||
{
|
|
||||||
$this->user = $user;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
public function getName()
|
abstract public function getName();
|
||||||
{
|
|
||||||
return 'Firefox & Google Chrome';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
public function getUrl()
|
abstract public function getUrl();
|
||||||
{
|
|
||||||
return 'import_browser';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
public function getDescription()
|
abstract public function getDescription();
|
||||||
{
|
|
||||||
return 'import.browser.description';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
|
@ -96,42 +51,113 @@ class BrowserImport implements ImportInterface
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->nbEntries = 1;
|
if ($this->producer) {
|
||||||
$this->parseEntries($data);
|
$this->parseEntriesForProducer($data);
|
||||||
$this->em->flush();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function parseEntries($data)
|
$this->parseEntries($data);
|
||||||
{
|
|
||||||
foreach ($data as $importedEntry) {
|
return true;
|
||||||
$this->parseEntry($importedEntry);
|
|
||||||
}
|
|
||||||
$this->totalEntries += count($data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function parseEntry($importedEntry)
|
/**
|
||||||
|
* Set file path to the json file.
|
||||||
|
*
|
||||||
|
* @param string $filepath
|
||||||
|
*/
|
||||||
|
public function setFilepath($filepath)
|
||||||
{
|
{
|
||||||
if (!is_array($importedEntry)) {
|
$this->filepath = $filepath;
|
||||||
return;
|
|
||||||
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Firefox uses guid while Chrome uses id */
|
/**
|
||||||
|
* Parse and insert all given entries.
|
||||||
|
*
|
||||||
|
* @param $entries
|
||||||
|
*/
|
||||||
|
protected function parseEntries($entries)
|
||||||
|
{
|
||||||
|
$i = 1;
|
||||||
|
|
||||||
|
foreach ($entries as $importedEntry) {
|
||||||
|
if ((array) $importedEntry !== $importedEntry) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$entry = $this->parseEntry($importedEntry);
|
||||||
|
|
||||||
|
if (null === $entry) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// flush every 20 entries
|
||||||
|
if (($i % 20) === 0) {
|
||||||
|
$this->em->flush();
|
||||||
|
|
||||||
|
// clear only affected entities
|
||||||
|
$this->em->clear(Entry::class);
|
||||||
|
$this->em->clear(Tag::class);
|
||||||
|
}
|
||||||
|
++$i;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->em->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse entries and send them to the queue.
|
||||||
|
* It should just be a simple loop on all item, no call to the database should be done
|
||||||
|
* to speedup queuing.
|
||||||
|
*
|
||||||
|
* Faster parse entries for Producer.
|
||||||
|
* We don't care to make check at this time. They'll be done by the consumer.
|
||||||
|
*
|
||||||
|
* @param array $entries
|
||||||
|
*/
|
||||||
|
protected function parseEntriesForProducer(array $entries)
|
||||||
|
{
|
||||||
|
foreach ($entries as $importedEntry) {
|
||||||
|
|
||||||
|
if ((array) $importedEntry !== $importedEntry) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set userId for the producer (it won't know which user is connected)
|
||||||
|
$importedEntry['userId'] = $this->user->getId();
|
||||||
|
|
||||||
|
if ($this->markAsRead) {
|
||||||
|
$importedEntry = $this->setEntryAsRead($importedEntry);
|
||||||
|
}
|
||||||
|
|
||||||
|
++$this->queuedEntries;
|
||||||
|
|
||||||
|
$this->producer->publish(json_encode($importedEntry));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function parseEntry(array $importedEntry)
|
||||||
|
{
|
||||||
|
|
||||||
if ((!key_exists('guid', $importedEntry) || (!key_exists('id', $importedEntry))) && is_array(reset($importedEntry))) {
|
if ((!key_exists('guid', $importedEntry) || (!key_exists('id', $importedEntry))) && is_array(reset($importedEntry))) {
|
||||||
$this->parseEntries($importedEntry);
|
$this->parseEntries($importedEntry);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key_exists('children', $importedEntry)) {
|
if (key_exists('children', $importedEntry)) {
|
||||||
$this->parseEntries($importedEntry['children']);
|
$this->parseEntries($importedEntry['children']);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (key_exists('uri', $importedEntry) || key_exists('url', $importedEntry)) {
|
|
||||||
|
|
||||||
/* Firefox uses uri while Chrome uses url */
|
if (!key_exists('uri', $importedEntry) && !key_exists('url', $importedEntry)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$firefox = key_exists('uri', $importedEntry);
|
$firefox = key_exists('uri', $importedEntry);
|
||||||
|
|
||||||
|
@ -145,75 +171,42 @@ class BrowserImport implements ImportInterface
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (false === parse_url(($firefox) ? $importedEntry['uri'] : $importedEntry['url']) || false === filter_var(($firefox) ? $importedEntry['uri'] : $importedEntry['url'], FILTER_VALIDATE_URL)) {
|
$data = $this->prepareEntry($importedEntry);
|
||||||
$this->logger->warning('Imported URL '.($firefox) ? $importedEntry['uri'] : $importedEntry['url'].' is not valid');
|
|
||||||
++$this->skippedEntries;
|
|
||||||
|
|
||||||
return;
|
$entry = new Entry($this->user);
|
||||||
}
|
$entry->setUrl($data['url']);
|
||||||
|
$entry->setTitle($data['title']);
|
||||||
|
|
||||||
try {
|
// update entry with content (in case fetching failed, the given entry will be return)
|
||||||
$entry = $this->contentProxy->updateEntry(
|
$entry = $this->fetchContent($entry, $data['url'], $data);
|
||||||
new Entry($this->user),
|
|
||||||
($firefox) ? $importedEntry['uri'] : $importedEntry['url']
|
if (array_key_exists('tags', $data)) {
|
||||||
|
$this->contentProxy->assignTagsToEntry(
|
||||||
|
$entry,
|
||||||
|
$data['tags']
|
||||||
);
|
);
|
||||||
} catch (\Exception $e) {
|
|
||||||
$this->logger->warning('Error while saving '.($firefox) ? $importedEntry['uri'] : $importedEntry['url']);
|
|
||||||
++$this->skippedEntries;
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$entry->setArchived($this->markAsRead);
|
$entry->setArchived($data['is_archived']);
|
||||||
|
|
||||||
|
if (!empty($data['created_at'])) {
|
||||||
|
$dt = new \DateTime();
|
||||||
|
$entry->setCreatedAt($dt->setTimestamp($data['created_at']/1000));
|
||||||
|
}
|
||||||
|
|
||||||
$this->em->persist($entry);
|
$this->em->persist($entry);
|
||||||
++$this->importedEntries;
|
++$this->importedEntries;
|
||||||
|
|
||||||
// flush every 20 entries
|
return $entry;
|
||||||
if (($this->nbEntries % 20) === 0) {
|
|
||||||
$this->em->flush();
|
|
||||||
$this->em->clear($entry);
|
|
||||||
}
|
|
||||||
++$this->nbEntries;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set whether articles must be all marked as read.
|
|
||||||
*
|
|
||||||
* @param bool $markAsRead
|
|
||||||
*
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function setMarkAsRead($markAsRead)
|
|
||||||
{
|
|
||||||
$this->markAsRead = $markAsRead;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set file path to the json file.
|
|
||||||
*
|
|
||||||
* @param string $filepath
|
|
||||||
*
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function setFilepath($filepath)
|
|
||||||
{
|
|
||||||
$this->filepath = $filepath;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
public function getSummary()
|
protected function setEntryAsRead(array $importedEntry)
|
||||||
{
|
{
|
||||||
return [
|
$importedEntry['is_archived'] = 1;
|
||||||
'skipped' => $this->skippedEntries,
|
|
||||||
'imported' => $this->importedEntries,
|
return $importedEntry;
|
||||||
];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
71
src/Wallabag/ImportBundle/Import/ChromeImport.php
Normal file
71
src/Wallabag/ImportBundle/Import/ChromeImport.php
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Wallabag\ImportBundle\Import;
|
||||||
|
|
||||||
|
use Psr\Log\LoggerInterface;
|
||||||
|
use Psr\Log\NullLogger;
|
||||||
|
use Doctrine\ORM\EntityManager;
|
||||||
|
use Wallabag\CoreBundle\Entity\Entry;
|
||||||
|
use Wallabag\UserBundle\Entity\User;
|
||||||
|
use Wallabag\CoreBundle\Helper\ContentProxy;
|
||||||
|
|
||||||
|
class ChromeImport extends BrowserImport
|
||||||
|
{
|
||||||
|
protected $filepath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getName()
|
||||||
|
{
|
||||||
|
return 'Chrome';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getUrl()
|
||||||
|
{
|
||||||
|
return 'import_chrome';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getDescription()
|
||||||
|
{
|
||||||
|
return 'import.chrome.description';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function prepareEntry($entry = [])
|
||||||
|
{
|
||||||
|
$data = [
|
||||||
|
'title' => $entry['name'],
|
||||||
|
'html' => '',
|
||||||
|
'url' => $entry['url'],
|
||||||
|
'is_archived' => $this->markAsRead,
|
||||||
|
'tags' => '',
|
||||||
|
'created_at' => $entry['date_added'],
|
||||||
|
];
|
||||||
|
|
||||||
|
if (array_key_exists('tags', $entry) && $entry['tags'] != '') {
|
||||||
|
$data['tags'] = $entry['tags'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function setEntryAsRead(array $importedEntry)
|
||||||
|
{
|
||||||
|
$importedEntry['is_archived'] = 1;
|
||||||
|
|
||||||
|
return $importedEntry;
|
||||||
|
}
|
||||||
|
}
|
71
src/Wallabag/ImportBundle/Import/FirefoxImport.php
Normal file
71
src/Wallabag/ImportBundle/Import/FirefoxImport.php
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Wallabag\ImportBundle\Import;
|
||||||
|
|
||||||
|
use Psr\Log\LoggerInterface;
|
||||||
|
use Psr\Log\NullLogger;
|
||||||
|
use Doctrine\ORM\EntityManager;
|
||||||
|
use Wallabag\CoreBundle\Entity\Entry;
|
||||||
|
use Wallabag\UserBundle\Entity\User;
|
||||||
|
use Wallabag\CoreBundle\Helper\ContentProxy;
|
||||||
|
|
||||||
|
class FirefoxImport extends BrowserImport
|
||||||
|
{
|
||||||
|
protected $filepath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getName()
|
||||||
|
{
|
||||||
|
return 'Firefox';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getUrl()
|
||||||
|
{
|
||||||
|
return 'import_firefox';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getDescription()
|
||||||
|
{
|
||||||
|
return 'import.firefox.description';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function prepareEntry($entry = [])
|
||||||
|
{
|
||||||
|
$data = [
|
||||||
|
'title' => $entry['name'],
|
||||||
|
'html' => '',
|
||||||
|
'url' => $entry['url'],
|
||||||
|
'is_archived' => $this->markAsRead,
|
||||||
|
'tags' => '',
|
||||||
|
'created_at' => $entry['date_added'],
|
||||||
|
];
|
||||||
|
|
||||||
|
if (array_key_exists('tags', $entry) && $entry['tags'] != '') {
|
||||||
|
$data['tags'] = $entry['tags'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function setEntryAsRead(array $importedEntry)
|
||||||
|
{
|
||||||
|
$importedEntry['is_archived'] = 1;
|
||||||
|
|
||||||
|
return $importedEntry;
|
||||||
|
}
|
||||||
|
}
|
|
@ -28,3 +28,17 @@ services:
|
||||||
- "@wallabag_user.user_repository"
|
- "@wallabag_user.user_repository"
|
||||||
- "@wallabag_import.wallabag_v2.import"
|
- "@wallabag_import.wallabag_v2.import"
|
||||||
- "@logger"
|
- "@logger"
|
||||||
|
wallabag_import.consumer.amqp.firefox:
|
||||||
|
class: Wallabag\ImportBundle\Consumer\AMQPEntryConsumer
|
||||||
|
arguments:
|
||||||
|
- "@doctrine.orm.entity_manager"
|
||||||
|
- "@wallabag_user.user_repository"
|
||||||
|
- "@wallabag_import.firefox.import"
|
||||||
|
- "@logger"
|
||||||
|
wallabag_import.consumer.amqp.chrome:
|
||||||
|
class: Wallabag\ImportBundle\Consumer\AMQPEntryConsumer
|
||||||
|
arguments:
|
||||||
|
- "@doctrine.orm.entity_manager"
|
||||||
|
- "@wallabag_user.user_repository"
|
||||||
|
- "@wallabag_import.chrome.import"
|
||||||
|
- "@logger"
|
||||||
|
|
|
@ -79,3 +79,43 @@ services:
|
||||||
- "@wallabag_user.user_repository"
|
- "@wallabag_user.user_repository"
|
||||||
- "@wallabag_import.wallabag_v2.import"
|
- "@wallabag_import.wallabag_v2.import"
|
||||||
- "@logger"
|
- "@logger"
|
||||||
|
|
||||||
|
# firefox
|
||||||
|
wallabag_import.queue.redis.firefox:
|
||||||
|
class: Simpleue\Queue\RedisQueue
|
||||||
|
arguments:
|
||||||
|
- "@wallabag_core.redis.client"
|
||||||
|
- "wallabag.import.firefox"
|
||||||
|
|
||||||
|
wallabag_import.producer.redis.firefox:
|
||||||
|
class: Wallabag\ImportBundle\Redis\Producer
|
||||||
|
arguments:
|
||||||
|
- "@wallabag_import.queue.redis.firefox"
|
||||||
|
|
||||||
|
wallabag_import.consumer.redis.firefox:
|
||||||
|
class: Wallabag\ImportBundle\Consumer\RedisEntryConsumer
|
||||||
|
arguments:
|
||||||
|
- "@doctrine.orm.entity_manager"
|
||||||
|
- "@wallabag_user.user_repository"
|
||||||
|
- "@wallabag_import.firefox.import"
|
||||||
|
- "@logger"
|
||||||
|
|
||||||
|
# chrome
|
||||||
|
wallabag_import.queue.redis.chrome:
|
||||||
|
class: Simpleue\Queue\RedisQueue
|
||||||
|
arguments:
|
||||||
|
- "@wallabag_core.redis.client"
|
||||||
|
- "wallabag.import.chrome"
|
||||||
|
|
||||||
|
wallabag_import.producer.redis.firefox:
|
||||||
|
class: Wallabag\ImportBundle\Redis\Producer
|
||||||
|
arguments:
|
||||||
|
- "@wallabag_import.queue.redis.chrome"
|
||||||
|
|
||||||
|
wallabag_import.consumer.redis.firefox:
|
||||||
|
class: Wallabag\ImportBundle\Consumer\RedisEntryConsumer
|
||||||
|
arguments:
|
||||||
|
- "@doctrine.orm.entity_manager"
|
||||||
|
- "@wallabag_user.user_repository"
|
||||||
|
- "@wallabag_import.chrome.import"
|
||||||
|
- "@logger"
|
||||||
|
|
|
@ -57,12 +57,21 @@ services:
|
||||||
tags:
|
tags:
|
||||||
- { name: wallabag_import.import, alias: readability }
|
- { name: wallabag_import.import, alias: readability }
|
||||||
|
|
||||||
wallabag_import.browser.import:
|
wallabag_import.firefox.import:
|
||||||
class: Wallabag\ImportBundle\Import\BrowserImport
|
class: Wallabag\ImportBundle\Import\FirefoxImport
|
||||||
arguments:
|
arguments:
|
||||||
- "@doctrine.orm.entity_manager"
|
- "@doctrine.orm.entity_manager"
|
||||||
- "@wallabag_core.content_proxy"
|
- "@wallabag_core.content_proxy"
|
||||||
calls:
|
calls:
|
||||||
- [ setLogger, [ "@logger" ]]
|
- [ setLogger, [ "@logger" ]]
|
||||||
tags:
|
tags:
|
||||||
- { name: wallabag_import.import, alias: browser }
|
- { name: wallabag_import.import, alias: firefox }
|
||||||
|
wallabag_import.chrome.import:
|
||||||
|
class: Wallabag\ImportBundle\Import\ChromeImport
|
||||||
|
arguments:
|
||||||
|
- "@doctrine.orm.entity_manager"
|
||||||
|
- "@wallabag_core.content_proxy"
|
||||||
|
calls:
|
||||||
|
- [ setLogger, [ "@logger" ]]
|
||||||
|
tags:
|
||||||
|
- { name: wallabag_import.import, alias: chrome }
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
{% extends "WallabagCoreBundle::layout.html.twig" %}
|
||||||
|
|
||||||
|
{% block title %}{{ 'import.chrome.page_title'|trans }}{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col s12">
|
||||||
|
<div class="card-panel settings">
|
||||||
|
<div class="row">
|
||||||
|
<blockquote>{{ import.description|trans|raw }}</blockquote>
|
||||||
|
<p>{{ 'import.chrome.how_to'|trans }}</p>
|
||||||
|
|
||||||
|
<div class="col s12">
|
||||||
|
{{ form_start(form, {'method': 'POST'}) }}
|
||||||
|
{{ form_errors(form) }}
|
||||||
|
<div class="row">
|
||||||
|
<div class="file-field input-field col s12">
|
||||||
|
{{ form_errors(form.file) }}
|
||||||
|
<div class="btn">
|
||||||
|
<span>{{ form.file.vars.label|trans }}</span>
|
||||||
|
{{ form_widget(form.file) }}
|
||||||
|
</div>
|
||||||
|
<div class="file-path-wrapper">
|
||||||
|
<input class="file-path validate" type="text">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="input-field col s6 with-checkbox">
|
||||||
|
<h6>{{ 'import.form.mark_as_read_title'|trans }}</h6>
|
||||||
|
{{ form_widget(form.mark_as_read) }}
|
||||||
|
{{ form_label(form.mark_as_read) }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{ form_widget(form.save, { 'attr': {'class': 'btn waves-effect waves-light'} }) }}
|
||||||
|
|
||||||
|
{{ form_rest(form) }}
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -1,6 +1,6 @@
|
||||||
{% extends "WallabagCoreBundle::layout.html.twig" %}
|
{% extends "WallabagCoreBundle::layout.html.twig" %}
|
||||||
|
|
||||||
{% block title %}{{ 'import.browser.page_title'|trans }}{% endblock %}
|
{% block title %}{{ 'import.firefox.page_title'|trans }}{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -8,7 +8,7 @@
|
||||||
<div class="card-panel settings">
|
<div class="card-panel settings">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<blockquote>{{ import.description|trans|raw }}</blockquote>
|
<blockquote>{{ import.description|trans|raw }}</blockquote>
|
||||||
<p>{{ 'import.browser.how_to'|trans }}</p>
|
<p>{{ 'import.firefox.how_to'|trans }}</p>
|
||||||
|
|
||||||
<div class="col s12">
|
<div class="col s12">
|
||||||
{{ form_start(form, {'method': 'POST'}) }}
|
{{ form_start(form, {'method': 'POST'}) }}
|
149
tests/Wallabag/ImportBundle/Controller/ChromeControllerTest.php
Normal file
149
tests/Wallabag/ImportBundle/Controller/ChromeControllerTest.php
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Wallabag\ImportBundle\Controller;
|
||||||
|
|
||||||
|
use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
|
||||||
|
use Symfony\Component\HttpFoundation\File\UploadedFile;
|
||||||
|
|
||||||
|
class ChromeControllerTest extends WallabagCoreTestCase
|
||||||
|
{
|
||||||
|
public function testImportChrome()
|
||||||
|
{
|
||||||
|
$this->logInAs('admin');
|
||||||
|
$client = $this->getClient();
|
||||||
|
|
||||||
|
$crawler = $client->request('GET', '/import/chrome');
|
||||||
|
|
||||||
|
$this->assertEquals(200, $client->getResponse()->getStatusCode());
|
||||||
|
$this->assertEquals(1, $crawler->filter('form[name=upload_import_file] > button[type=submit]')->count());
|
||||||
|
$this->assertEquals(1, $crawler->filter('input[type=file]')->count());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportChromeWithRabbitEnabled()
|
||||||
|
{
|
||||||
|
$this->logInAs('admin');
|
||||||
|
$client = $this->getClient();
|
||||||
|
|
||||||
|
$client->getContainer()->get('craue_config')->set('import_with_rabbitmq', 1);
|
||||||
|
|
||||||
|
$crawler = $client->request('GET', '/import/chrome');
|
||||||
|
|
||||||
|
$this->assertEquals(200, $client->getResponse()->getStatusCode());
|
||||||
|
$this->assertEquals(1, $crawler->filter('form[name=upload_import_file] > button[type=submit]')->count());
|
||||||
|
$this->assertEquals(1, $crawler->filter('input[type=file]')->count());
|
||||||
|
|
||||||
|
$client->getContainer()->get('craue_config')->set('import_with_rabbitmq', 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportChromeBadFile()
|
||||||
|
{
|
||||||
|
$this->logInAs('admin');
|
||||||
|
$client = $this->getClient();
|
||||||
|
|
||||||
|
$crawler = $client->request('GET', '/import/chrome');
|
||||||
|
$form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form();
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'upload_import_file[file]' => '',
|
||||||
|
];
|
||||||
|
|
||||||
|
$client->submit($form, $data);
|
||||||
|
|
||||||
|
$this->assertEquals(200, $client->getResponse()->getStatusCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportChromeWithRedisEnabled()
|
||||||
|
{
|
||||||
|
$this->logInAs('admin');
|
||||||
|
$client = $this->getClient();
|
||||||
|
$client->getContainer()->get('craue_config')->set('import_with_redis', 1);
|
||||||
|
|
||||||
|
$crawler = $client->request('GET', '/import/chrome');
|
||||||
|
|
||||||
|
$this->assertEquals(200, $client->getResponse()->getStatusCode());
|
||||||
|
$this->assertEquals(1, $crawler->filter('form[name=upload_import_file] > button[type=submit]')->count());
|
||||||
|
$this->assertEquals(1, $crawler->filter('input[type=file]')->count());
|
||||||
|
|
||||||
|
$form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form();
|
||||||
|
|
||||||
|
$file = new UploadedFile(__DIR__.'/../fixtures/chrome-bookmarks', 'Bookmarks');
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'upload_import_file[file]' => $file,
|
||||||
|
];
|
||||||
|
|
||||||
|
$client->submit($form, $data);
|
||||||
|
|
||||||
|
$this->assertEquals(302, $client->getResponse()->getStatusCode());
|
||||||
|
|
||||||
|
$crawler = $client->followRedirect();
|
||||||
|
|
||||||
|
$this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
|
||||||
|
$this->assertContains('flashes.import.notice.summary', $body[0]);
|
||||||
|
|
||||||
|
$this->assertNotEmpty($client->getContainer()->get('wallabag_core.redis.client')->lpop('wallabag.import.chrome'));
|
||||||
|
|
||||||
|
$client->getContainer()->get('craue_config')->set('import_with_redis', 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportWallabagWithChromeFile()
|
||||||
|
{
|
||||||
|
$this->logInAs('admin');
|
||||||
|
$client = $this->getClient();
|
||||||
|
|
||||||
|
$crawler = $client->request('GET', '/import/chrome');
|
||||||
|
$form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form();
|
||||||
|
|
||||||
|
$file = new UploadedFile(__DIR__.'/../fixtures/chrome-bookmarks', 'Bookmarks');
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'upload_import_file[file]' => $file,
|
||||||
|
];
|
||||||
|
|
||||||
|
$client->submit($form, $data);
|
||||||
|
|
||||||
|
$this->assertEquals(302, $client->getResponse()->getStatusCode());
|
||||||
|
|
||||||
|
$crawler = $client->followRedirect();
|
||||||
|
|
||||||
|
$this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
|
||||||
|
$this->assertContains('flashes.import.notice.summary', $body[0]);
|
||||||
|
|
||||||
|
$content = $client->getContainer()
|
||||||
|
->get('doctrine.orm.entity_manager')
|
||||||
|
->getRepository('WallabagCoreBundle:Entry')
|
||||||
|
->findByUrlAndUserId(
|
||||||
|
'http://www.usinenouvelle.com/article/la-multiplication-des-chefs-de-projet-est-une-catastrophe-manageriale-majeure-affirme-le-sociologue-francois-dupuy.N307730',
|
||||||
|
$this->getLoggedInUserId()
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEmpty($content->getMimetype());
|
||||||
|
$this->assertNotEmpty($content->getPreviewPicture());
|
||||||
|
$this->assertNotEmpty($content->getLanguage());
|
||||||
|
$this->assertEquals(0, count($content->getTags()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportWallabagWithEmptyFile()
|
||||||
|
{
|
||||||
|
$this->logInAs('admin');
|
||||||
|
$client = $this->getClient();
|
||||||
|
|
||||||
|
$crawler = $client->request('GET', '/import/chrome');
|
||||||
|
$form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form();
|
||||||
|
|
||||||
|
$file = new UploadedFile(__DIR__.'/../fixtures/test.txt', 'test.txt');
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'upload_import_file[file]' => $file,
|
||||||
|
];
|
||||||
|
|
||||||
|
$client->submit($form, $data);
|
||||||
|
|
||||||
|
$this->assertEquals(302, $client->getResponse()->getStatusCode());
|
||||||
|
|
||||||
|
$crawler = $client->followRedirect();
|
||||||
|
|
||||||
|
$this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
|
||||||
|
$this->assertContains('flashes.import.notice.failed', $body[0]);
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,26 +5,93 @@ namespace Tests\Wallabag\ImportBundle\Controller;
|
||||||
use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
|
use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
|
||||||
use Symfony\Component\HttpFoundation\File\UploadedFile;
|
use Symfony\Component\HttpFoundation\File\UploadedFile;
|
||||||
|
|
||||||
class BrowserControllerTest extends WallabagCoreTestCase
|
class FirefoxControllerTest extends WallabagCoreTestCase
|
||||||
{
|
{
|
||||||
public function testImportWallabag()
|
public function testImportFirefox()
|
||||||
{
|
{
|
||||||
$this->logInAs('admin');
|
$this->logInAs('admin');
|
||||||
$client = $this->getClient();
|
$client = $this->getClient();
|
||||||
|
|
||||||
$crawler = $client->request('GET', '/import/browser');
|
$crawler = $client->request('GET', '/import/firefox');
|
||||||
|
|
||||||
$this->assertEquals(200, $client->getResponse()->getStatusCode());
|
$this->assertEquals(200, $client->getResponse()->getStatusCode());
|
||||||
$this->assertEquals(1, $crawler->filter('form[name=upload_import_file] > button[type=submit]')->count());
|
$this->assertEquals(1, $crawler->filter('form[name=upload_import_file] > button[type=submit]')->count());
|
||||||
$this->assertEquals(1, $crawler->filter('input[type=file]')->count());
|
$this->assertEquals(1, $crawler->filter('input[type=file]')->count());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testImportFirefoxWithRabbitEnabled()
|
||||||
|
{
|
||||||
|
$this->logInAs('admin');
|
||||||
|
$client = $this->getClient();
|
||||||
|
|
||||||
|
$client->getContainer()->get('craue_config')->set('import_with_rabbitmq', 1);
|
||||||
|
|
||||||
|
$crawler = $client->request('GET', '/import/firefox');
|
||||||
|
|
||||||
|
$this->assertEquals(200, $client->getResponse()->getStatusCode());
|
||||||
|
$this->assertEquals(1, $crawler->filter('form[name=upload_import_file] > button[type=submit]')->count());
|
||||||
|
$this->assertEquals(1, $crawler->filter('input[type=file]')->count());
|
||||||
|
|
||||||
|
$client->getContainer()->get('craue_config')->set('import_with_rabbitmq', 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportFirefoxBadFile()
|
||||||
|
{
|
||||||
|
$this->logInAs('admin');
|
||||||
|
$client = $this->getClient();
|
||||||
|
|
||||||
|
$crawler = $client->request('GET', '/import/firefox');
|
||||||
|
$form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form();
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'upload_import_file[file]' => '',
|
||||||
|
];
|
||||||
|
|
||||||
|
$client->submit($form, $data);
|
||||||
|
|
||||||
|
$this->assertEquals(200, $client->getResponse()->getStatusCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportFirefoxWithRedisEnabled()
|
||||||
|
{
|
||||||
|
$this->logInAs('admin');
|
||||||
|
$client = $this->getClient();
|
||||||
|
$client->getContainer()->get('craue_config')->set('import_with_redis', 1);
|
||||||
|
|
||||||
|
$crawler = $client->request('GET', '/import/firefox');
|
||||||
|
|
||||||
|
$this->assertEquals(200, $client->getResponse()->getStatusCode());
|
||||||
|
$this->assertEquals(1, $crawler->filter('form[name=upload_import_file] > button[type=submit]')->count());
|
||||||
|
$this->assertEquals(1, $crawler->filter('input[type=file]')->count());
|
||||||
|
|
||||||
|
$form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form();
|
||||||
|
|
||||||
|
$file = new UploadedFile(__DIR__.'/../fixtures/firefox-bookmarks.json', 'Bookmarks');
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'upload_import_file[file]' => $file,
|
||||||
|
];
|
||||||
|
|
||||||
|
$client->submit($form, $data);
|
||||||
|
|
||||||
|
$this->assertEquals(302, $client->getResponse()->getStatusCode());
|
||||||
|
|
||||||
|
$crawler = $client->followRedirect();
|
||||||
|
|
||||||
|
$this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
|
||||||
|
$this->assertContains('flashes.import.notice.summary', $body[0]);
|
||||||
|
|
||||||
|
$this->assertNotEmpty($client->getContainer()->get('wallabag_core.redis.client')->lpop('wallabag.import.firefox'));
|
||||||
|
|
||||||
|
$client->getContainer()->get('craue_config')->set('import_with_redis', 0);
|
||||||
|
}
|
||||||
|
|
||||||
public function testImportWallabagWithFirefoxFile()
|
public function testImportWallabagWithFirefoxFile()
|
||||||
{
|
{
|
||||||
$this->logInAs('admin');
|
$this->logInAs('admin');
|
||||||
$client = $this->getClient();
|
$client = $this->getClient();
|
||||||
|
|
||||||
$crawler = $client->request('GET', '/import/browser');
|
$crawler = $client->request('GET', '/import/firefox');
|
||||||
$form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form();
|
$form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form();
|
||||||
|
|
||||||
$file = new UploadedFile(__DIR__.'/../fixtures/firefox-bookmarks.json', 'Bookmarks');
|
$file = new UploadedFile(__DIR__.'/../fixtures/firefox-bookmarks.json', 'Bookmarks');
|
||||||
|
@ -68,49 +135,12 @@ class BrowserControllerTest extends WallabagCoreTestCase
|
||||||
$this->assertEmpty($content->getLanguage());
|
$this->assertEmpty($content->getLanguage());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testImportWallabagWithChromeFile()
|
|
||||||
{
|
|
||||||
$this->logInAs('admin');
|
|
||||||
$client = $this->getClient();
|
|
||||||
|
|
||||||
$crawler = $client->request('GET', '/import/browser');
|
|
||||||
$form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form();
|
|
||||||
|
|
||||||
$file = new UploadedFile(__DIR__.'/../fixtures/chrome-bookmarks', 'Bookmarks');
|
|
||||||
|
|
||||||
$data = [
|
|
||||||
'upload_import_file[file]' => $file,
|
|
||||||
];
|
|
||||||
|
|
||||||
$client->submit($form, $data);
|
|
||||||
|
|
||||||
$this->assertEquals(302, $client->getResponse()->getStatusCode());
|
|
||||||
|
|
||||||
$crawler = $client->followRedirect();
|
|
||||||
|
|
||||||
$this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
|
|
||||||
$this->assertContains('flashes.import.notice.summary', $body[0]);
|
|
||||||
|
|
||||||
$content = $client->getContainer()
|
|
||||||
->get('doctrine.orm.entity_manager')
|
|
||||||
->getRepository('WallabagCoreBundle:Entry')
|
|
||||||
->findByUrlAndUserId(
|
|
||||||
'http://www.usinenouvelle.com/article/la-multiplication-des-chefs-de-projet-est-une-catastrophe-manageriale-majeure-affirme-le-sociologue-francois-dupuy.N307730',
|
|
||||||
$this->getLoggedInUserId()
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->assertNotEmpty($content->getMimetype());
|
|
||||||
$this->assertNotEmpty($content->getPreviewPicture());
|
|
||||||
$this->assertNotEmpty($content->getLanguage());
|
|
||||||
$this->assertEquals(0, count($content->getTags()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testImportWallabagWithEmptyFile()
|
public function testImportWallabagWithEmptyFile()
|
||||||
{
|
{
|
||||||
$this->logInAs('admin');
|
$this->logInAs('admin');
|
||||||
$client = $this->getClient();
|
$client = $this->getClient();
|
||||||
|
|
||||||
$crawler = $client->request('GET', '/import/browser');
|
$crawler = $client->request('GET', '/import/firefox');
|
||||||
$form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form();
|
$form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form();
|
||||||
|
|
||||||
$file = new UploadedFile(__DIR__.'/../fixtures/test.txt', 'test.txt');
|
$file = new UploadedFile(__DIR__.'/../fixtures/test.txt', 'test.txt');
|
|
@ -24,6 +24,6 @@ class ImportControllerTest extends WallabagCoreTestCase
|
||||||
$crawler = $client->request('GET', '/import/');
|
$crawler = $client->request('GET', '/import/');
|
||||||
|
|
||||||
$this->assertEquals(200, $client->getResponse()->getStatusCode());
|
$this->assertEquals(200, $client->getResponse()->getStatusCode());
|
||||||
$this->assertEquals(5, $crawler->filter('blockquote')->count());
|
$this->assertEquals(6, $crawler->filter('blockquote')->count());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,6 @@ class ReadabilityControllerTest extends WallabagCoreTestCase
|
||||||
$this->checkRedis();
|
$this->checkRedis();
|
||||||
$this->logInAs('admin');
|
$this->logInAs('admin');
|
||||||
$client = $this->getClient();
|
$client = $this->getClient();
|
||||||
|
|
||||||
$client->getContainer()->get('craue_config')->set('import_with_redis', 1);
|
$client->getContainer()->get('craue_config')->set('import_with_redis', 1);
|
||||||
|
|
||||||
$crawler = $client->request('GET', '/import/readability');
|
$crawler = $client->request('GET', '/import/readability');
|
||||||
|
|
233
tests/Wallabag/ImportBundle/Import/ChromeImportTest.php
Normal file
233
tests/Wallabag/ImportBundle/Import/ChromeImportTest.php
Normal file
|
@ -0,0 +1,233 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Wallabag\ImportBundle\Import;
|
||||||
|
|
||||||
|
use Wallabag\ImportBundle\Import\ChromeImport;
|
||||||
|
use Wallabag\UserBundle\Entity\User;
|
||||||
|
use Wallabag\CoreBundle\Entity\Entry;
|
||||||
|
use Wallabag\ImportBundle\Redis\Producer;
|
||||||
|
use Monolog\Logger;
|
||||||
|
use Monolog\Handler\TestHandler;
|
||||||
|
use Simpleue\Queue\RedisQueue;
|
||||||
|
use M6Web\Component\RedisMock\RedisMockFactory;
|
||||||
|
|
||||||
|
class ChromeImportTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
protected $user;
|
||||||
|
protected $em;
|
||||||
|
protected $logHandler;
|
||||||
|
protected $contentProxy;
|
||||||
|
|
||||||
|
private function getChromeImport($unsetUser = false)
|
||||||
|
{
|
||||||
|
$this->user = new User();
|
||||||
|
|
||||||
|
$this->em = $this->getMockBuilder('Doctrine\ORM\EntityManager')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->contentProxy = $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$wallabag = new ChromeImport($this->em, $this->contentProxy);
|
||||||
|
|
||||||
|
$this->logHandler = new TestHandler();
|
||||||
|
$logger = new Logger('test', [$this->logHandler]);
|
||||||
|
$wallabag->setLogger($logger);
|
||||||
|
|
||||||
|
if (false === $unsetUser) {
|
||||||
|
$wallabag->setUser($this->user);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $wallabag;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testInit()
|
||||||
|
{
|
||||||
|
$chromeImport = $this->getChromeImport();
|
||||||
|
|
||||||
|
$this->assertEquals('Chrome', $chromeImport->getName());
|
||||||
|
$this->assertNotEmpty($chromeImport->getUrl());
|
||||||
|
$this->assertEquals('import.chrome.description', $chromeImport->getDescription());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImport()
|
||||||
|
{
|
||||||
|
$chromeImport = $this->getChromeImport();
|
||||||
|
$chromeImport->setFilepath(__DIR__.'/../fixtures/chrome-bookmarks');
|
||||||
|
|
||||||
|
$entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$entryRepo->expects($this->exactly(4))
|
||||||
|
->method('findByUrlAndUserId')
|
||||||
|
->willReturn(false);
|
||||||
|
|
||||||
|
$this->em
|
||||||
|
->expects($this->any())
|
||||||
|
->method('getRepository')
|
||||||
|
->willReturn($entryRepo);
|
||||||
|
|
||||||
|
$entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->contentProxy
|
||||||
|
->expects($this->exactly(4))
|
||||||
|
->method('updateEntry')
|
||||||
|
->willReturn($entry);
|
||||||
|
|
||||||
|
$res = $chromeImport->import();
|
||||||
|
|
||||||
|
$this->assertTrue($res);
|
||||||
|
$this->assertEquals(['skipped' => 0, 'imported' => 4, 'queued' => 0], $chromeImport->getSummary());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportAndMarkAllAsRead()
|
||||||
|
{
|
||||||
|
$chromeImport = $this->getChromeImport();
|
||||||
|
$chromeImport->setFilepath(__DIR__.'/../fixtures/readability-read.json');
|
||||||
|
|
||||||
|
$entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$entryRepo->expects($this->exactly(2))
|
||||||
|
->method('findByUrlAndUserId')
|
||||||
|
->will($this->onConsecutiveCalls(false, true));
|
||||||
|
|
||||||
|
$this->em
|
||||||
|
->expects($this->any())
|
||||||
|
->method('getRepository')
|
||||||
|
->willReturn($entryRepo);
|
||||||
|
|
||||||
|
$this->contentProxy
|
||||||
|
->expects($this->exactly(1))
|
||||||
|
->method('updateEntry')
|
||||||
|
->willReturn(new Entry($this->user));
|
||||||
|
|
||||||
|
// check that every entry persisted are archived
|
||||||
|
$this->em
|
||||||
|
->expects($this->any())
|
||||||
|
->method('persist')
|
||||||
|
->with($this->callback(function ($persistedEntry) {
|
||||||
|
return $persistedEntry->isArchived();
|
||||||
|
}));
|
||||||
|
|
||||||
|
$res = $chromeImport->setMarkAsRead(true)->import();
|
||||||
|
|
||||||
|
$this->assertTrue($res);
|
||||||
|
|
||||||
|
$this->assertEquals(['skipped' => 1, 'imported' => 1, 'queued' => 0], $chromeImport->getSummary());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportWithRabbit()
|
||||||
|
{
|
||||||
|
$chromeImport = $this->getChromeImport();
|
||||||
|
$chromeImport->setFilepath(__DIR__.'/../fixtures/readability.json');
|
||||||
|
|
||||||
|
$entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$entryRepo->expects($this->never())
|
||||||
|
->method('findByUrlAndUserId');
|
||||||
|
|
||||||
|
$this->em
|
||||||
|
->expects($this->never())
|
||||||
|
->method('getRepository');
|
||||||
|
|
||||||
|
$entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->contentProxy
|
||||||
|
->expects($this->never())
|
||||||
|
->method('updateEntry');
|
||||||
|
|
||||||
|
$producer = $this->getMockBuilder('OldSound\RabbitMqBundle\RabbitMq\Producer')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$producer
|
||||||
|
->expects($this->exactly(4))
|
||||||
|
->method('publish');
|
||||||
|
|
||||||
|
$chromeImport->setProducer($producer);
|
||||||
|
|
||||||
|
$res = $readabilityImport->setMarkAsRead(true)->import();
|
||||||
|
|
||||||
|
$this->assertTrue($res);
|
||||||
|
$this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 4], $chromeImport->getSummary());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportWithRedis()
|
||||||
|
{
|
||||||
|
$chromeImport = $this->getReadabilityImport();
|
||||||
|
$chromeImport->setFilepath(__DIR__.'/../fixtures/chrome-bookmarks');
|
||||||
|
|
||||||
|
$entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$entryRepo->expects($this->never())
|
||||||
|
->method('findByUrlAndUserId');
|
||||||
|
|
||||||
|
$this->em
|
||||||
|
->expects($this->never())
|
||||||
|
->method('getRepository');
|
||||||
|
|
||||||
|
$entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->contentProxy
|
||||||
|
->expects($this->never())
|
||||||
|
->method('updateEntry');
|
||||||
|
|
||||||
|
$factory = new RedisMockFactory();
|
||||||
|
$redisMock = $factory->getAdapter('Predis\Client', true);
|
||||||
|
|
||||||
|
$queue = new RedisQueue($redisMock, 'chrome');
|
||||||
|
$producer = new Producer($queue);
|
||||||
|
|
||||||
|
$chromeImport->setProducer($producer);
|
||||||
|
|
||||||
|
$res = $chromeImport->setMarkAsRead(true)->import();
|
||||||
|
|
||||||
|
$this->assertTrue($res);
|
||||||
|
$this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 4], $chromeImport->getSummary());
|
||||||
|
|
||||||
|
$this->assertNotEmpty($redisMock->lpop('chrome'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportBadFile()
|
||||||
|
{
|
||||||
|
$chromeImport = $this->getChromeImport();
|
||||||
|
$chromeImport->setFilepath(__DIR__.'/../fixtures/wallabag-v1.jsonx');
|
||||||
|
|
||||||
|
$res = $chromeImport->import();
|
||||||
|
|
||||||
|
$this->assertFalse($res);
|
||||||
|
|
||||||
|
$records = $this->logHandler->getRecords();
|
||||||
|
$this->assertContains('ChromeImport: unable to read file', $records[0]['message']);
|
||||||
|
$this->assertEquals('ERROR', $records[0]['level_name']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportUserNotDefined()
|
||||||
|
{
|
||||||
|
$chromeImport = $this->getChromeImport(true);
|
||||||
|
$chromeImport->setFilepath(__DIR__.'/../fixtures/readability.json');
|
||||||
|
|
||||||
|
$res = $chromeImport->import();
|
||||||
|
|
||||||
|
$this->assertFalse($res);
|
||||||
|
|
||||||
|
$records = $this->logHandler->getRecords();
|
||||||
|
$this->assertContains('ChromeImport: user is not defined', $records[0]['message']);
|
||||||
|
$this->assertEquals('ERROR', $records[0]['level_name']);
|
||||||
|
}
|
||||||
|
}
|
233
tests/Wallabag/ImportBundle/Import/FirefoxImportTest.php
Normal file
233
tests/Wallabag/ImportBundle/Import/FirefoxImportTest.php
Normal file
|
@ -0,0 +1,233 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Wallabag\ImportBundle\Import;
|
||||||
|
|
||||||
|
use Wallabag\ImportBundle\Import\FirefoxImport;
|
||||||
|
use Wallabag\UserBundle\Entity\User;
|
||||||
|
use Wallabag\CoreBundle\Entity\Entry;
|
||||||
|
use Wallabag\ImportBundle\Redis\Producer;
|
||||||
|
use Monolog\Logger;
|
||||||
|
use Monolog\Handler\TestHandler;
|
||||||
|
use Simpleue\Queue\RedisQueue;
|
||||||
|
use M6Web\Component\RedisMock\RedisMockFactory;
|
||||||
|
|
||||||
|
class FirefoxImportTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
protected $user;
|
||||||
|
protected $em;
|
||||||
|
protected $logHandler;
|
||||||
|
protected $contentProxy;
|
||||||
|
|
||||||
|
private function getFirefoxImport($unsetUser = false)
|
||||||
|
{
|
||||||
|
$this->user = new User();
|
||||||
|
|
||||||
|
$this->em = $this->getMockBuilder('Doctrine\ORM\EntityManager')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->contentProxy = $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$wallabag = new FirefoxImport($this->em, $this->contentProxy);
|
||||||
|
|
||||||
|
$this->logHandler = new TestHandler();
|
||||||
|
$logger = new Logger('test', [$this->logHandler]);
|
||||||
|
$wallabag->setLogger($logger);
|
||||||
|
|
||||||
|
if (false === $unsetUser) {
|
||||||
|
$wallabag->setUser($this->user);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $wallabag;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testInit()
|
||||||
|
{
|
||||||
|
$firefoxImport = $this->getFirefoxImport();
|
||||||
|
|
||||||
|
$this->assertEquals('Firefox', $firefoxImport->getName());
|
||||||
|
$this->assertNotEmpty($firefoxImport->getUrl());
|
||||||
|
$this->assertEquals('import.firefox.description', $firefoxImport->getDescription());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImport()
|
||||||
|
{
|
||||||
|
$firefoxImport = $this->getFirefoxImport();
|
||||||
|
$firefoxImport->setFilepath(__DIR__.'/../fixtures/firefox-bookmarks.json');
|
||||||
|
|
||||||
|
$entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$entryRepo->expects($this->exactly(4))
|
||||||
|
->method('findByUrlAndUserId')
|
||||||
|
->willReturn(false);
|
||||||
|
|
||||||
|
$this->em
|
||||||
|
->expects($this->any())
|
||||||
|
->method('getRepository')
|
||||||
|
->willReturn($entryRepo);
|
||||||
|
|
||||||
|
$entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->contentProxy
|
||||||
|
->expects($this->exactly(4))
|
||||||
|
->method('updateEntry')
|
||||||
|
->willReturn($entry);
|
||||||
|
|
||||||
|
$res = $firefoxImport->import();
|
||||||
|
|
||||||
|
$this->assertTrue($res);
|
||||||
|
$this->assertEquals(['skipped' => 0, 'imported' => 4, 'queued' => 0], $firefoxImport->getSummary());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportAndMarkAllAsRead()
|
||||||
|
{
|
||||||
|
$firefoxImport = $this->getFirefoxImport();
|
||||||
|
$firefoxImport->setFilepath(__DIR__.'/../fixtures/readability-read.json');
|
||||||
|
|
||||||
|
$entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$entryRepo->expects($this->exactly(2))
|
||||||
|
->method('findByUrlAndUserId')
|
||||||
|
->will($this->onConsecutiveCalls(false, true));
|
||||||
|
|
||||||
|
$this->em
|
||||||
|
->expects($this->any())
|
||||||
|
->method('getRepository')
|
||||||
|
->willReturn($entryRepo);
|
||||||
|
|
||||||
|
$this->contentProxy
|
||||||
|
->expects($this->exactly(1))
|
||||||
|
->method('updateEntry')
|
||||||
|
->willReturn(new Entry($this->user));
|
||||||
|
|
||||||
|
// check that every entry persisted are archived
|
||||||
|
$this->em
|
||||||
|
->expects($this->any())
|
||||||
|
->method('persist')
|
||||||
|
->with($this->callback(function ($persistedEntry) {
|
||||||
|
return $persistedEntry->isArchived();
|
||||||
|
}));
|
||||||
|
|
||||||
|
$res = $firefoxImport->setMarkAsRead(true)->import();
|
||||||
|
|
||||||
|
$this->assertTrue($res);
|
||||||
|
|
||||||
|
$this->assertEquals(['skipped' => 1, 'imported' => 1, 'queued' => 0], $firefoxImport->getSummary());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportWithRabbit()
|
||||||
|
{
|
||||||
|
$firefoxImport = $this->getFirefoxImport();
|
||||||
|
$firefoxImport->setFilepath(__DIR__.'/../fixtures/readability.json');
|
||||||
|
|
||||||
|
$entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$entryRepo->expects($this->never())
|
||||||
|
->method('findByUrlAndUserId');
|
||||||
|
|
||||||
|
$this->em
|
||||||
|
->expects($this->never())
|
||||||
|
->method('getRepository');
|
||||||
|
|
||||||
|
$entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->contentProxy
|
||||||
|
->expects($this->never())
|
||||||
|
->method('updateEntry');
|
||||||
|
|
||||||
|
$producer = $this->getMockBuilder('OldSound\RabbitMqBundle\RabbitMq\Producer')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$producer
|
||||||
|
->expects($this->exactly(4))
|
||||||
|
->method('publish');
|
||||||
|
|
||||||
|
$firefoxImport->setProducer($producer);
|
||||||
|
|
||||||
|
$res = $readabilityImport->setMarkAsRead(true)->import();
|
||||||
|
|
||||||
|
$this->assertTrue($res);
|
||||||
|
$this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 4], $firefoxImport->getSummary());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportWithRedis()
|
||||||
|
{
|
||||||
|
$firefoxImport = $this->getReadabilityImport();
|
||||||
|
$firefoxImport->setFilepath(__DIR__.'/../fixtures/firefox-bookmarks.json');
|
||||||
|
|
||||||
|
$entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$entryRepo->expects($this->never())
|
||||||
|
->method('findByUrlAndUserId');
|
||||||
|
|
||||||
|
$this->em
|
||||||
|
->expects($this->never())
|
||||||
|
->method('getRepository');
|
||||||
|
|
||||||
|
$entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$this->contentProxy
|
||||||
|
->expects($this->never())
|
||||||
|
->method('updateEntry');
|
||||||
|
|
||||||
|
$factory = new RedisMockFactory();
|
||||||
|
$redisMock = $factory->getAdapter('Predis\Client', true);
|
||||||
|
|
||||||
|
$queue = new RedisQueue($redisMock, 'firefox');
|
||||||
|
$producer = new Producer($queue);
|
||||||
|
|
||||||
|
$firefoxImport->setProducer($producer);
|
||||||
|
|
||||||
|
$res = $firefoxImport->setMarkAsRead(true)->import();
|
||||||
|
|
||||||
|
$this->assertTrue($res);
|
||||||
|
$this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 4], $firefoxImport->getSummary());
|
||||||
|
|
||||||
|
$this->assertNotEmpty($redisMock->lpop('firefox'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportBadFile()
|
||||||
|
{
|
||||||
|
$firefoxImport = $this->getFirefoxImport();
|
||||||
|
$firefoxImport->setFilepath(__DIR__.'/../fixtures/wallabag-v1.jsonx');
|
||||||
|
|
||||||
|
$res = $firefoxImport->import();
|
||||||
|
|
||||||
|
$this->assertFalse($res);
|
||||||
|
|
||||||
|
$records = $this->logHandler->getRecords();
|
||||||
|
$this->assertContains('FirefoxImport: unable to read file', $records[0]['message']);
|
||||||
|
$this->assertEquals('ERROR', $records[0]['level_name']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testImportUserNotDefined()
|
||||||
|
{
|
||||||
|
$firefoxImport = $this->getFirefoxImport(true);
|
||||||
|
$firefoxImport->setFilepath(__DIR__.'/../fixtures/readability.json');
|
||||||
|
|
||||||
|
$res = $firefoxImport->import();
|
||||||
|
|
||||||
|
$this->assertFalse($res);
|
||||||
|
|
||||||
|
$records = $this->logHandler->getRecords();
|
||||||
|
$this->assertContains('FirefoxImport: user is not defined', $records[0]['message']);
|
||||||
|
$this->assertEquals('ERROR', $records[0]['level_name']);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue