diff --git a/appinfo/info.xml b/appinfo/info.xml
index 0ae2e536..9671abbd 100644
--- a/appinfo/info.xml
+++ b/appinfo/info.xml
@@ -48,7 +48,7 @@ Memories is a *batteries-included* photo management solution for Nextcloud with
OCA\Memories\Command\Index
OCA\Memories\Command\VideoSetup
- OCA\Memories\Command\GeoSetup
+ OCA\Memories\Command\PlacesSetup
diff --git a/lib/Command/GeoSetup.php b/lib/Command/PlacesSetup.php
similarity index 75%
rename from lib/Command/GeoSetup.php
rename to lib/Command/PlacesSetup.php
index 630da54c..50f20d7c 100644
--- a/lib/Command/GeoSetup.php
+++ b/lib/Command/PlacesSetup.php
@@ -34,7 +34,9 @@ const GIS_TYPE_MYSQL = 1;
const GIS_TYPE_POSTGRES = 2;
const APPROX_PLACES = 600000;
-class GeoSetup extends Command
+const PLANET_URL = 'https://github.com/pulsejet/memories-assets/releases/download/geo-0.0.1/planet_coarse_boundaries.zip';
+
+class PlacesSetup extends Command
{
protected IConfig $config;
protected OutputInterface $output;
@@ -54,7 +56,7 @@ class GeoSetup extends Command
protected function configure(): void
{
$this
- ->setName('memories:geo-setup')
+ ->setName('memories:places-setup')
->setDescription('Setup reverse geocoding')
;
}
@@ -78,23 +80,46 @@ class GeoSetup extends Command
// Check if the database is already set up
try {
+ $this->output->writeln('');
$this->connection->executeQuery('SELECT osm_id FROM memories_planet_geometry LIMIT 1')->fetch();
- $this->output->writeln('Database already set up ... skipping');
+ $this->output->writeln('Database is already set up');
+ $this->output->writeln('This will clear and re-download the planet database');
+ $this->output->writeln('This is generally not necessary to do frequently ');
} catch (\Exception $e) {
- $this->output->writeln('Setting up database ...');
+ $this->output->write('Setting up database ... ');
$this->setupDatabase();
- $this->output->writeln('Database set up');
+ $this->output->writeln('OK');
}
- // TODO: Download the data
- // TODO: Warn user and truncate all tables
- $datafile = '/tmp/planet_coarse_boundaries.txt';
+ // Ask confirmation
+ $tempdir = sys_get_temp_dir();
+ $this->output->writeln('');
+ $this->output->writeln('Are you sure you want to download the planet database?');
+ $this->output->writeln("This will take a very long time and use some disk space in {$tempdir}");
+ $this->output->write('Proceed? [y/N] ');
+ $handle = fopen('php://stdin', 'r');
+ $line = fgets($handle);
+ if ('y' !== trim($line)) {
+ $this->output->writeln('Aborting');
+
+ return 1;
+ }
+
+ // Download the data
+ $this->output->write('Downloading data ... ');
+ $datafile = $this->downloadPlanet();
+ $this->output->writeln('OK');
// Truncate tables
- $this->output->writeln('Truncating tables ...');
+ $this->output->write('Truncating tables ... ');
$p = $this->connection->getDatabasePlatform();
$this->connection->executeStatement($p->getTruncateTableSQL('*PREFIX*memories_planet', false));
$this->connection->executeStatement($p->getTruncateTableSQL('memories_planet_geometry', false));
+ $this->output->writeln('OK');
+
+ // Start importing
+ $this->output->writeln('');
+ $this->output->writeln('Importing data (this will take a while) ...');
// Start time
$start = time();
@@ -200,6 +225,18 @@ class GeoSetup extends Command
fclose($handle);
}
+ // Delete file
+ unlink($datafile);
+
+ // Done
+ $this->output->writeln('');
+ $this->output->writeln('Planet database imported successfully!');
+ $this->output->writeln('If this is the first time you did this, you should now run:');
+ $this->output->writeln('occ memories:index -f');
+
+ // Mark success
+ $this->config->setSystemValue('memories.gis_type', $this->gisType);
+
return 0;
}
@@ -269,13 +306,47 @@ class GeoSetup extends Command
}
}
- protected function runSQL(string &$line)
+ protected function downloadPlanet(): string
{
- try {
- $this->connection->executeStatement($line);
- } catch (\Exception $e) {
- $this->output->writeln(substr($line, 0, 100));
- $this->output->writeln($e->getMessage());
+ $txtfile = sys_get_temp_dir().'/planet_coarse_boundaries.txt';
+ unlink($txtfile);
+
+ $filename = sys_get_temp_dir().'/planet_coarse_boundaries.zip';
+
+ $fp = fopen($filename, 'w+');
+
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, PLANET_URL);
+ curl_setopt($ch, CURLOPT_FILE, $fp);
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
+ curl_setopt($ch, CURLOPT_TIMEOUT, 60000);
+ curl_exec($ch);
+ curl_close($ch);
+
+ fclose($fp);
+
+ // Unzip
+ $zip = new \ZipArchive();
+ $res = $zip->open($filename);
+ if (true === $res) {
+ $zip->extractTo(sys_get_temp_dir());
+ $zip->close();
+ } else {
+ $this->output->writeln('Failed to unzip planet file');
+
+ exit;
}
+
+ // Check if file exists
+ if (!file_exists($txtfile)) {
+ $this->output->writeln('Failed to find planet data file after unzip');
+
+ exit;
+ }
+
+ // Delete zip file
+ unlink($filename);
+
+ return $txtfile;
}
}