metaview: add loc

pull/221/head
Varun Patil 2022-11-07 15:49:50 -08:00
parent eb656b8701
commit 134c95d35a
2 changed files with 52 additions and 1 deletions

View File

@ -95,6 +95,9 @@ class PageController extends Controller
$policy->addAllowedWorkerSrcDomain("'self'"); $policy->addAllowedWorkerSrcDomain("'self'");
$policy->addAllowedScriptDomain("'self'"); $policy->addAllowedScriptDomain("'self'");
// Allow nominatim for metadata
$policy->addAllowedConnectDomain('nominatim.openstreetmap.org');
$response = new TemplateResponse($this->appName, 'main'); $response = new TemplateResponse($this->appName, 'main');
$response->setContentSecurityPolicy($policy); $response->setContentSecurityPolicy($policy);

View File

@ -31,6 +31,7 @@ import { getCanonicalLocale } from "@nextcloud/l10n";
import CalendarIcon from "vue-material-design-icons/Calendar.vue"; import CalendarIcon from "vue-material-design-icons/Calendar.vue";
import CameraIrisIcon from "vue-material-design-icons/CameraIris.vue"; import CameraIrisIcon from "vue-material-design-icons/CameraIris.vue";
import ImageIcon from "vue-material-design-icons/Image.vue"; import ImageIcon from "vue-material-design-icons/Image.vue";
import LocationIcon from "vue-material-design-icons/MapMarker.vue";
@Component({ @Component({
components: {}, components: {},
@ -39,15 +40,25 @@ export default class Metadata extends Mixins(GlobalMixin) {
private fileInfo: IFileInfo = null; private fileInfo: IFileInfo = null;
private exif: { [prop: string]: any } = {}; private exif: { [prop: string]: any } = {};
private baseInfo: any = {}; private baseInfo: any = {};
private nominatim: any = null;
private state = 0;
public async update(fileInfo: IFileInfo) { public async update(fileInfo: IFileInfo) {
this.state = Math.random();
this.fileInfo = fileInfo; this.fileInfo = fileInfo;
this.exif = {}; this.exif = {};
let state = this.state;
const res = await axios.get<any>( const res = await axios.get<any>(
generateUrl("/apps/memories/api/info/{id}", { id: fileInfo.id }) generateUrl("/apps/memories/api/info/{id}", { id: fileInfo.id })
); );
if (state !== this.state) return;
this.baseInfo = res.data; this.baseInfo = res.data;
this.exif = res.data.exif || {}; this.exif = res.data.exif || {};
// Lazy loading
this.getNominatim().catch();
} }
get topFields() { get topFields() {
@ -81,6 +92,14 @@ export default class Metadata extends Mixins(GlobalMixin) {
}); });
} }
if (this.nominatim) {
list.push({
title: this.address,
subtitle: [],
icon: LocationIcon,
});
}
return list; return list;
} }
@ -148,7 +167,7 @@ export default class Metadata extends Mixins(GlobalMixin) {
if (speed < 1) { if (speed < 1) {
return `1/${Math.round(1 / speed)}`; return `1/${Math.round(1 / speed)}`;
} else { } else {
return `${Math.round(speed * 10) / 10}`; return `${Math.round(speed * 10) / 10}s`;
} }
} }
@ -175,6 +194,35 @@ export default class Metadata extends Mixins(GlobalMixin) {
return parts; return parts;
} }
get address() {
if (!this.nominatim) return null;
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;
}
}
async getNominatim() {
const lat = this.exif["GPSLatitude"];
const lon = this.exif["GPSLongitude"];
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`
);
if (state !== this.state) return;
this.nominatim = n.data;
}
} }
</script> </script>