meta: use places
parent
c3fa9f0d4c
commit
bae5f99b2b
|
@ -374,9 +374,9 @@ class ApiBase extends Controller
|
||||||
/**
|
/**
|
||||||
* Check if geolocation is enabled for this user.
|
* Check if geolocation is enabled for this user.
|
||||||
*/
|
*/
|
||||||
protected function geoPlacesIsEnabled(): bool
|
protected function placesIsEnabled(): bool
|
||||||
{
|
{
|
||||||
return true;
|
return \OCA\Memories\Util::placesGISType() !== 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -238,7 +238,7 @@ class DaysController extends ApiBase
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filter only for one place
|
// Filter only for one place
|
||||||
if ($this->geoPlacesIsEnabled()) {
|
if ($this->placesIsEnabled()) {
|
||||||
if ($locationId = $this->request->getParam('place')) {
|
if ($locationId = $this->request->getParam('place')) {
|
||||||
$transforms[] = [$this->timelineQuery, 'transformPlaceFilter', (int) $locationId];
|
$transforms[] = [$this->timelineQuery, 'transformPlaceFilter', (int) $locationId];
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,8 +114,7 @@ class PageController extends Controller
|
||||||
// Image editor
|
// Image editor
|
||||||
$policy->addAllowedConnectDomain('data:');
|
$policy->addAllowedConnectDomain('data:');
|
||||||
|
|
||||||
// Allow nominatim for metadata
|
// Allow OSM
|
||||||
$policy->addAllowedConnectDomain('nominatim.openstreetmap.org');
|
|
||||||
$policy->addAllowedFrameDomain('www.openstreetmap.org');
|
$policy->addAllowedFrameDomain('www.openstreetmap.org');
|
||||||
|
|
||||||
return $policy;
|
return $policy;
|
||||||
|
|
|
@ -43,7 +43,7 @@ class PlacesController extends ApiBase
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check tags enabled for this user
|
// Check tags enabled for this user
|
||||||
if (!$this->geoPlacesIsEnabled()) {
|
if (!$this->placesIsEnabled()) {
|
||||||
return new JSONResponse(['message' => 'Places not enabled'], Http::STATUS_PRECONDITION_FAILED);
|
return new JSONResponse(['message' => 'Places not enabled'], Http::STATUS_PRECONDITION_FAILED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ class PlacesController extends ApiBase
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check tags enabled for this user
|
// Check tags enabled for this user
|
||||||
if (!$this->geoPlacesIsEnabled()) {
|
if (!$this->placesIsEnabled()) {
|
||||||
return new JSONResponse(['message' => 'Places not enabled'], Http::STATUS_PRECONDITION_FAILED);
|
return new JSONResponse(['message' => 'Places not enabled'], Http::STATUS_PRECONDITION_FAILED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -92,12 +92,28 @@ class TimelineQuery
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$address = null;
|
||||||
|
if (!$basic && \OCA\Memories\Util::placesGISType() !== 0) {
|
||||||
|
$qb = $this->connection->getQueryBuilder();
|
||||||
|
$qb->select('e.name')
|
||||||
|
->from('memories_places', 'mp')
|
||||||
|
->innerJoin('mp', 'memories_planet', 'e', $qb->expr()->eq('mp.osm_id', 'e.osm_id'))
|
||||||
|
->where($qb->expr()->eq('mp.fileid', $qb->createNamedParameter($id, \PDO::PARAM_INT)))
|
||||||
|
->orderBy('e.admin_level', 'DESC')
|
||||||
|
;
|
||||||
|
$places = $qb->executeQuery()->fetchAll(\PDO::FETCH_COLUMN);
|
||||||
|
if (\count($places) > 0) {
|
||||||
|
$address = implode(', ', $places);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'fileid' => (int) $row['fileid'],
|
'fileid' => (int) $row['fileid'],
|
||||||
'dayid' => (int) $row['dayid'],
|
'dayid' => (int) $row['dayid'],
|
||||||
'datetaken' => $utcTs,
|
|
||||||
'w' => (int) $row['w'],
|
'w' => (int) $row['w'],
|
||||||
'h' => (int) $row['h'],
|
'h' => (int) $row['h'],
|
||||||
|
'datetaken' => $utcTs,
|
||||||
|
'address' => $address,
|
||||||
'exif' => $exif,
|
'exif' => $exif,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
@ -289,8 +289,7 @@ class TimelineWrite
|
||||||
public function updateGeoData(File &$file, float $lat, float $lon): void
|
public function updateGeoData(File &$file, float $lat, float $lon): void
|
||||||
{
|
{
|
||||||
// Get GIS type
|
// Get GIS type
|
||||||
$config = \OC::$server->get(\OCP\IConfig::class);
|
$gisType = \OCA\Memories\Util::placesGISType();
|
||||||
$gisType = $config->getSystemValue('memories.gis_type', 0);
|
|
||||||
|
|
||||||
// Construct WHERE clause depending on GIS type
|
// Construct WHERE clause depending on GIS type
|
||||||
$where = null;
|
$where = null;
|
||||||
|
|
|
@ -142,6 +142,15 @@ class Util
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if geolocation (places) is enabled and available.
|
||||||
|
* Returns the type of the GIS.
|
||||||
|
*/
|
||||||
|
public static function placesGISType(): int
|
||||||
|
{
|
||||||
|
return \OC::$server->get(\OCP\IConfig::class)->getSystemValue('memories.gis_type', 0);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Kill all instances of a process by name.
|
* Kill all instances of a process by name.
|
||||||
* Similar to pkill, which may not be available on all systems.
|
* Similar to pkill, which may not be available on all systems.
|
||||||
|
|
|
@ -87,7 +87,6 @@ export default defineComponent({
|
||||||
fileInfo: null as IFileInfo,
|
fileInfo: null as IFileInfo,
|
||||||
exif: {} as { [prop: string]: any },
|
exif: {} as { [prop: string]: any },
|
||||||
baseInfo: {} as any,
|
baseInfo: {} as any,
|
||||||
nominatim: null as any,
|
|
||||||
state: 0,
|
state: 0,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
@ -245,22 +244,7 @@ export default defineComponent({
|
||||||
},
|
},
|
||||||
|
|
||||||
address(): string | null {
|
address(): string | null {
|
||||||
if (!this.lat || !this.lon) return null;
|
return this.baseInfo.address;
|
||||||
|
|
||||||
if (!this.nominatim) return this.t("memories", "Loading …");
|
|
||||||
|
|
||||||
const n = this.nominatim;
|
|
||||||
const country = n.address.country_code?.toUpperCase();
|
|
||||||
|
|
||||||
if (n.address?.city && n.address.state) {
|
|
||||||
return `${n.address.city}, ${n.address.state}, ${country}`;
|
|
||||||
} else if (n.address?.state) {
|
|
||||||
return `${n.address.state}, ${country}`;
|
|
||||||
} else if (n.address?.country) {
|
|
||||||
return n.address.country;
|
|
||||||
} else {
|
|
||||||
return n.display_name;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
lat(): number {
|
lat(): number {
|
||||||
|
@ -293,7 +277,6 @@ export default defineComponent({
|
||||||
this.state = Math.random();
|
this.state = Math.random();
|
||||||
this.fileInfo = fileInfo;
|
this.fileInfo = fileInfo;
|
||||||
this.exif = {};
|
this.exif = {};
|
||||||
this.nominatim = null;
|
|
||||||
|
|
||||||
const state = this.state;
|
const state = this.state;
|
||||||
const url = API.IMAGE_INFO(fileInfo.id);
|
const url = API.IMAGE_INFO(fileInfo.id);
|
||||||
|
@ -302,9 +285,6 @@ export default defineComponent({
|
||||||
|
|
||||||
this.baseInfo = res.data;
|
this.baseInfo = res.data;
|
||||||
this.exif = res.data.exif || {};
|
this.exif = res.data.exif || {};
|
||||||
|
|
||||||
// Lazy loading
|
|
||||||
this.getNominatim().catch();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
handleFileUpdated({ fileid }) {
|
handleFileUpdated({ fileid }) {
|
||||||
|
@ -312,19 +292,6 @@ export default defineComponent({
|
||||||
this.update(this.fileInfo);
|
this.update(this.fileInfo);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
async getNominatim() {
|
|
||||||
const lat = this.lat;
|
|
||||||
const lon = this.lon;
|
|
||||||
if (!lat || !lon) return null;
|
|
||||||
|
|
||||||
const state = this.state;
|
|
||||||
const n = await axios.get(
|
|
||||||
`https://nominatim.openstreetmap.org/reverse?lat=${lat}&lon=${lon}&format=json&zoom=18`
|
|
||||||
);
|
|
||||||
if (state !== this.state) return;
|
|
||||||
this.nominatim = n.data;
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -368,4 +335,4 @@ export default defineComponent({
|
||||||
min-height: 200px;
|
min-height: 200px;
|
||||||
max-height: 250px;
|
max-height: 250px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -76,6 +76,7 @@ export type IPhoto = {
|
||||||
h: number;
|
h: number;
|
||||||
w: number;
|
w: number;
|
||||||
datetaken: number;
|
datetaken: number;
|
||||||
|
address?: string;
|
||||||
exif?: {
|
exif?: {
|
||||||
Rotation?: number;
|
Rotation?: number;
|
||||||
Orientation?: number;
|
Orientation?: number;
|
||||||
|
|
Loading…
Reference in New Issue