commit
27d027cabd
|
@ -85,5 +85,6 @@
|
||||||
"**/l10n": true,
|
"**/l10n": true,
|
||||||
"**/.vscode": true,
|
"**/.vscode": true,
|
||||||
"**/patches": true
|
"**/patches": true
|
||||||
}
|
},
|
||||||
|
"git.alwaysSignOff": true
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,14 +50,14 @@ You may need to clear browser cache to use location search.
|
||||||
- **Feature**: Allow editing more EXIF fields ([#169](https://github.com/pulsejet/memories/issues/169))
|
- **Feature**: Allow editing more EXIF fields ([#169](https://github.com/pulsejet/memories/issues/169))
|
||||||
- **Feature**: Alpha integration with the face recognition app ([#146](https://github.com/pulsejet/memories/issues/146))
|
- **Feature**: Alpha integration with the face recognition app ([#146](https://github.com/pulsejet/memories/issues/146))
|
||||||
- Fix downloading from albums ([#259](https://github.com/pulsejet/memories/issues/259))
|
- Fix downloading from albums ([#259](https://github.com/pulsejet/memories/issues/259))
|
||||||
- Fix support for HEVC live photos ([#234](https://github.com/pulsejet/memories/issues/234))
|
- Fix support for HEVC Live Photos ([#234](https://github.com/pulsejet/memories/issues/234))
|
||||||
- Fix native photo sharing ([#254](https://github.com/pulsejet/memories/issues/254), [#263](https://github.com/pulsejet/memories/issues/263))
|
- Fix native photo sharing ([#254](https://github.com/pulsejet/memories/issues/254), [#263](https://github.com/pulsejet/memories/issues/263))
|
||||||
- Use larger previews in viewer (please see [these docs](https://github.com/pulsejet/memories/wiki/Configuration#preview-storage-considerations)) ([#226](https://github.com/pulsejet/memories/issues/226))
|
- Use larger previews in viewer (please see [these docs](https://github.com/pulsejet/memories/wiki/Configuration#preview-storage-considerations)) ([#226](https://github.com/pulsejet/memories/issues/226))
|
||||||
|
|
||||||
## v4.8.0, v3.8.0 (2022-11-22)
|
## v4.8.0, v3.8.0 (2022-11-22)
|
||||||
|
|
||||||
- **Feature**: Support for Live Photos ([#124](https://github.com/pulsejet/memories/issues/124))
|
- **Feature**: Support for Live Photos ([#124](https://github.com/pulsejet/memories/issues/124))
|
||||||
- You need to run `occ memories:index --clear` to reindex live photos
|
- You need to run `occ memories:index --clear` to reindex Live Photos
|
||||||
- Only JPEG (iOS with MOV, Google, Samsung) is supported. HEIC is not supported.
|
- Only JPEG (iOS with MOV, Google, Samsung) is supported. HEIC is not supported.
|
||||||
- **Feature**: Timeline path now scans recursively for mounted volumes / shares inside it
|
- **Feature**: Timeline path now scans recursively for mounted volumes / shares inside it
|
||||||
- **Feature**: Multiple timeline paths can be specified ([#178](https://github.com/pulsejet/memories/issues/178))
|
- **Feature**: Multiple timeline paths can be specified ([#178](https://github.com/pulsejet/memories/issues/178))
|
||||||
|
|
|
@ -107,7 +107,7 @@ class VideoController extends ApiBase
|
||||||
*
|
*
|
||||||
* @NoCSRFRequired
|
* @NoCSRFRequired
|
||||||
*
|
*
|
||||||
* Return the live video part of a live photo
|
* Return the live video part of a Live Photo
|
||||||
*/
|
*/
|
||||||
public function livephoto(
|
public function livephoto(
|
||||||
int $fileid,
|
int $fileid,
|
||||||
|
|
|
@ -18,7 +18,7 @@ class LivePhoto
|
||||||
$this->connection = $connection;
|
$this->connection = $connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Check if a given Exif data is the video part of a live photo */
|
/** Check if a given Exif data is the video part of a Live Photo */
|
||||||
public function isVideoPart(array &$exif)
|
public function isVideoPart(array &$exif)
|
||||||
{
|
{
|
||||||
return \array_key_exists('MIMEType', $exif)
|
return \array_key_exists('MIMEType', $exif)
|
||||||
|
|
|
@ -94,7 +94,7 @@ class TimelineWrite
|
||||||
$prevRow = $cursor->fetch();
|
$prevRow = $cursor->fetch();
|
||||||
$cursor->closeCursor();
|
$cursor->closeCursor();
|
||||||
|
|
||||||
// Check in live-photo table in case this is a video part of a live photo
|
// Check in live-photo table in case this is a video part of a Live Photo
|
||||||
if (!$prevRow) {
|
if (!$prevRow) {
|
||||||
$query = $this->connection->getQueryBuilder();
|
$query = $this->connection->getQueryBuilder();
|
||||||
$query->select('fileid', 'mtime')
|
$query->select('fileid', 'mtime')
|
||||||
|
@ -129,7 +129,7 @@ class TimelineWrite
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hand off if live photo video part
|
// Hand off if Live Photo video part
|
||||||
if ($isvideo && $this->livePhoto->isVideoPart($exif)) {
|
if ($isvideo && $this->livePhoto->isVideoPart($exif)) {
|
||||||
$this->livePhoto->processVideoPart($file, $exif);
|
$this->livePhoto->processVideoPart($file, $exif);
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ import PhotoSwipe from "photoswipe";
|
||||||
import * as utils from "../../services/Utils";
|
import * as utils from "../../services/Utils";
|
||||||
|
|
||||||
export function isLiveContent(content): boolean {
|
export function isLiveContent(content): boolean {
|
||||||
// Do not play live photo if the slideshow is
|
// Do not play Live Photo if the slideshow is
|
||||||
// playing in full screen mode.
|
// playing in full screen mode.
|
||||||
if (document.fullscreenElement) {
|
if (document.fullscreenElement) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -573,7 +573,7 @@ export default defineComponent({
|
||||||
preventDragOffset: 40,
|
preventDragOffset: 40,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Live photo support
|
// Live Photo support
|
||||||
new PsLivePhoto(<any>this.photoswipe, {});
|
new PsLivePhoto(<any>this.photoswipe, {});
|
||||||
|
|
||||||
// Image support
|
// Image support
|
||||||
|
@ -866,10 +866,10 @@ export default defineComponent({
|
||||||
// Only for JPEG for now
|
// Only for JPEG for now
|
||||||
if (!this.canEdit) return;
|
if (!this.canEdit) return;
|
||||||
|
|
||||||
// Prevent editing live photos
|
// Prevent editing Live Photos
|
||||||
if (this.currentPhoto.liveid) {
|
if (this.currentPhoto.liveid) {
|
||||||
alert(
|
alert(
|
||||||
this.t("memories", "Editing is currently disabled for live photos")
|
this.t("memories", "Editing is currently disabled for Live Photos")
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ body.has-viewer header {
|
||||||
margin: 0 10px; // was unset
|
margin: 0 10px; // was unset
|
||||||
}
|
}
|
||||||
|
|
||||||
// Live photo transitions
|
// Live Photo transitions
|
||||||
:root {
|
:root {
|
||||||
--livephoto-img-transition: opacity 0.4s linear, transform 0.3s ease-in-out;
|
--livephoto-img-transition: opacity 0.4s linear, transform 0.3s ease-in-out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -248,7 +248,7 @@ export function getFolderRoutePath(basePath: string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get URL to live photo video part
|
* Get URL to Live Photo video part
|
||||||
*/
|
*/
|
||||||
export function getLivePhotoVideoUrl(p: IPhoto, transcode: boolean) {
|
export function getLivePhotoVideoUrl(p: IPhoto, transcode: boolean) {
|
||||||
return API.Q(API.VIDEO_LIVEPHOTO(p.fileid), {
|
return API.Q(API.VIDEO_LIVEPHOTO(p.fileid), {
|
||||||
|
@ -259,7 +259,7 @@ export function getLivePhotoVideoUrl(p: IPhoto, transcode: boolean) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set up hooks to set classes on parent element for live photo
|
* Set up hooks to set classes on parent element for Live Photo
|
||||||
* @param video Video element
|
* @param video Video element
|
||||||
*/
|
*/
|
||||||
export function setupLivePhotoHooks(video: HTMLVideoElement) {
|
export function setupLivePhotoHooks(video: HTMLVideoElement) {
|
||||||
|
|
|
@ -190,10 +190,10 @@ export async function* runInParallel<T>(
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extend given list of Ids with extra files for live photos.
|
* Extend given list of Ids with extra files for Live Photos.
|
||||||
*
|
*
|
||||||
* @param photos list of photos to search for live photos
|
* @param photos list of photos to search for Live Photos
|
||||||
* @returns list of file ids that contains extra file Ids for live photos if any
|
* @returns list of file ids that contains extra file Ids for Live Photos if any
|
||||||
*/
|
*/
|
||||||
async function extendWithLivePhotos(photos: IPhoto[]) {
|
async function extendWithLivePhotos(photos: IPhoto[]) {
|
||||||
const livePhotos = (
|
const livePhotos = (
|
||||||
|
@ -230,7 +230,7 @@ export async function* deletePhotos(photos: IPhoto[]) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extend with live photos unless this is an album
|
// Extend with Live Photos unless this is an album
|
||||||
if (window.vueroute().name !== "albums") {
|
if (window.vueroute().name !== "albums") {
|
||||||
photos = await extendWithLivePhotos(photos);
|
photos = await extendWithLivePhotos(photos);
|
||||||
}
|
}
|
||||||
|
@ -292,7 +292,7 @@ export async function* movePhotos(
|
||||||
targetPath += "/";
|
targetPath += "/";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Also move the live photo videos
|
// Also move the Live Photo videos
|
||||||
photos = await extendWithLivePhotos(photos);
|
photos = await extendWithLivePhotos(photos);
|
||||||
const fileIdsSet = new Set(photos.map((p) => p.fileid));
|
const fileIdsSet = new Set(photos.map((p) => p.fileid));
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ export type IPhoto = {
|
||||||
w?: number;
|
w?: number;
|
||||||
/** Height of full image */
|
/** Height of full image */
|
||||||
h?: number;
|
h?: number;
|
||||||
/** Live photo identifier */
|
/** Live Photo identifier */
|
||||||
liveid?: string;
|
liveid?: string;
|
||||||
|
|
||||||
/** Grid display width px */
|
/** Grid display width px */
|
||||||
|
|
Loading…
Reference in New Issue