mirror of
https://github.com/spacedriveapp/spacedrive
synced 2024-07-02 07:43:27 +00:00
Compare commits
6 commits
944fad2115
...
73b8a58ae6
Author | SHA1 | Date | |
---|---|---|---|
|
73b8a58ae6 | ||
|
e2253bc5ba | ||
|
4735adcb66 | ||
|
aaf1f237cd | ||
|
2554cfab3c | ||
|
6cd3d76def |
18
Cargo.lock
generated
18
Cargo.lock
generated
|
@ -132,6 +132,12 @@ version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
|
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "android_log-sys"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "85965b6739a430150bdd138e2374a98af0c3ee0d030b3bb7fc3bddff58d0102e"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "android_system_properties"
|
name = "android_system_properties"
|
||||||
version = "0.1.5"
|
version = "0.1.5"
|
||||||
|
@ -9024,6 +9030,7 @@ dependencies = [
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
"tower-service",
|
"tower-service",
|
||||||
"tracing",
|
"tracing",
|
||||||
|
"tracing-android",
|
||||||
"tracing-appender",
|
"tracing-appender",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
"tracing-test",
|
"tracing-test",
|
||||||
|
@ -11239,6 +11246,17 @@ dependencies = [
|
||||||
"tracing-core",
|
"tracing-core",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tracing-android"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "12612be8f868a09c0ceae7113ff26afe79d81a24473a393cb9120ece162e86c0"
|
||||||
|
dependencies = [
|
||||||
|
"android_log-sys",
|
||||||
|
"tracing",
|
||||||
|
"tracing-subscriber",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing-appender"
|
name = "tracing-appender"
|
||||||
version = "0.2.3"
|
version = "0.2.3"
|
||||||
|
|
|
@ -159,6 +159,9 @@ icrate = { version = "0.1.2", features = [
|
||||||
"Foundation_NSNumber",
|
"Foundation_NSNumber",
|
||||||
] }
|
] }
|
||||||
|
|
||||||
|
[target.'cfg(target_os = "android")'.dependencies]
|
||||||
|
tracing-android = "0.2.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
# Workspace dependencies
|
# Workspace dependencies
|
||||||
globset = { workspace = true }
|
globset = { workspace = true }
|
||||||
|
|
|
@ -98,6 +98,20 @@ file_path::select!(file_path_to_isolate_with_id {
|
||||||
name
|
name
|
||||||
extension
|
extension
|
||||||
});
|
});
|
||||||
|
file_path::select!(file_path_sisters {
|
||||||
|
id
|
||||||
|
materialized_path
|
||||||
|
is_dir
|
||||||
|
name
|
||||||
|
extension
|
||||||
|
cas_id
|
||||||
|
integrity_checksum
|
||||||
|
location: select {
|
||||||
|
id
|
||||||
|
path
|
||||||
|
name
|
||||||
|
}
|
||||||
|
});
|
||||||
file_path::select!(file_path_walker {
|
file_path::select!(file_path_walker {
|
||||||
pub_id
|
pub_id
|
||||||
location_id
|
location_id
|
||||||
|
|
|
@ -17,7 +17,7 @@ use crate::{
|
||||||
use sd_core_file_path_helper::{FilePathError, IsolatedFilePathData};
|
use sd_core_file_path_helper::{FilePathError, IsolatedFilePathData};
|
||||||
use sd_core_heavy_lifting::media_processor::{exif_media_data, ffmpeg_media_data};
|
use sd_core_heavy_lifting::media_processor::{exif_media_data, ffmpeg_media_data};
|
||||||
use sd_core_prisma_helpers::{
|
use sd_core_prisma_helpers::{
|
||||||
file_path_to_isolate, file_path_to_isolate_with_id, object_with_file_paths,
|
file_path_sisters, file_path_to_isolate, file_path_to_isolate_with_id, object_with_file_paths,
|
||||||
object_with_media_data,
|
object_with_media_data,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ use sd_sync::OperationFactory;
|
||||||
use sd_utils::{db::maybe_missing, error::FileIOError, msgpack};
|
use sd_utils::{db::maybe_missing, error::FileIOError, msgpack};
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
|
collections::HashSet,
|
||||||
ffi::OsString,
|
ffi::OsString,
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
sync::Arc,
|
sync::Arc,
|
||||||
|
@ -171,6 +172,32 @@ pub(crate) fn mount() -> AlphaRouter<Ctx> {
|
||||||
.map(|str| str.to_string()))
|
.map(|str| str.to_string()))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
.procedure("getDuplicates", {
|
||||||
|
R.with2(library())
|
||||||
|
.query(|(_, library), object_id: i32| async move {
|
||||||
|
let file_paths = library
|
||||||
|
.db
|
||||||
|
.file_path()
|
||||||
|
.find_many(vec![file_path::object_id::equals(Some(object_id))])
|
||||||
|
.select(file_path_sisters::select())
|
||||||
|
.exec()
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let mut unique_location_ids = HashSet::new();
|
||||||
|
let locations: Vec<_> =
|
||||||
|
file_paths
|
||||||
|
.clone()
|
||||||
|
.into_iter()
|
||||||
|
.filter_map(|file_path| {
|
||||||
|
file_path.location.as_ref().cloned().filter(|location| {
|
||||||
|
unique_location_ids.insert(location.id.clone())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
Ok((locations, file_paths))
|
||||||
|
})
|
||||||
|
})
|
||||||
.procedure("setNote", {
|
.procedure("setNote", {
|
||||||
#[derive(Type, Deserialize)]
|
#[derive(Type, Deserialize)]
|
||||||
pub struct SetNoteArgs {
|
pub struct SetNoteArgs {
|
||||||
|
|
|
@ -31,7 +31,7 @@ use tracing_appender::{
|
||||||
non_blocking::{NonBlocking, WorkerGuard},
|
non_blocking::{NonBlocking, WorkerGuard},
|
||||||
rolling::{RollingFileAppender, Rotation},
|
rolling::{RollingFileAppender, Rotation},
|
||||||
};
|
};
|
||||||
use tracing_subscriber::{filter::FromEnvError, prelude::*, EnvFilter};
|
use tracing_subscriber::{filter::FromEnvError, prelude::*, registry, EnvFilter};
|
||||||
|
|
||||||
pub mod api;
|
pub mod api;
|
||||||
mod cloud;
|
mod cloud;
|
||||||
|
@ -254,12 +254,15 @@ impl Node {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
tracing_subscriber::registry()
|
let registry = registry();
|
||||||
|
|
||||||
|
let registry = registry
|
||||||
.with(
|
.with(
|
||||||
tracing_subscriber::fmt::layer()
|
tracing_subscriber::fmt::layer()
|
||||||
.with_file(true)
|
.with_file(true)
|
||||||
.with_line_number(true)
|
.with_line_number(true)
|
||||||
.with_ansi(false)
|
.with_ansi(false)
|
||||||
|
.with_target(true)
|
||||||
.with_writer(logfile)
|
.with_writer(logfile)
|
||||||
.with_filter(EnvFilter::from_default_env()),
|
.with_filter(EnvFilter::from_default_env()),
|
||||||
)
|
)
|
||||||
|
@ -269,8 +272,12 @@ impl Node {
|
||||||
.with_line_number(true)
|
.with_line_number(true)
|
||||||
.with_writer(std::io::stdout)
|
.with_writer(std::io::stdout)
|
||||||
.with_filter(EnvFilter::from_default_env()),
|
.with_filter(EnvFilter::from_default_env()),
|
||||||
)
|
);
|
||||||
.init();
|
|
||||||
|
#[cfg(target_os = "android")]
|
||||||
|
let registry = registry.with(tracing_android::layer("com.spacedrive.app").unwrap());
|
||||||
|
|
||||||
|
registry.init();
|
||||||
|
|
||||||
std::panic::set_hook(Box::new(move |panic| {
|
std::panic::set_hook(Box::new(move |panic| {
|
||||||
use std::backtrace::{Backtrace, BacktraceStatus};
|
use std::backtrace::{Backtrace, BacktraceStatus};
|
||||||
|
|
|
@ -154,7 +154,7 @@ export const ExplorerTagBar = () => {
|
||||||
// extract the list of tags from each object in the selected items
|
// extract the list of tags from each object in the selected items
|
||||||
const targetsTagList = Array.from(explorer.selectedItems.entries()).map(
|
const targetsTagList = Array.from(explorer.selectedItems.entries()).map(
|
||||||
// issues with type here. unsure as to why, and not causing any noticeable errors, so ignoring for now with as any
|
// issues with type here. unsure as to why, and not causing any noticeable errors, so ignoring for now with as any
|
||||||
(item) => (item[0] as any).object.item.tags
|
(item) => (item[0] as any).item.object.tags
|
||||||
);
|
);
|
||||||
|
|
||||||
// iterate through each tag in the selected items and check if the tag we want to assign is already assigned
|
// iterate through each tag in the selected items and check if the tag we want to assign is already assigned
|
||||||
|
|
|
@ -12,6 +12,20 @@ import {
|
||||||
Icon as PhosphorIcon,
|
Icon as PhosphorIcon,
|
||||||
Snowflake
|
Snowflake
|
||||||
} from '@phosphor-icons/react';
|
} from '@phosphor-icons/react';
|
||||||
|
import clsx from 'clsx';
|
||||||
|
import dayjs from 'dayjs';
|
||||||
|
import {
|
||||||
|
forwardRef,
|
||||||
|
useCallback,
|
||||||
|
useEffect,
|
||||||
|
useMemo,
|
||||||
|
useState,
|
||||||
|
type HTMLAttributes,
|
||||||
|
type ReactNode
|
||||||
|
} from 'react';
|
||||||
|
import { useLocation } from 'react-router';
|
||||||
|
import { Link as NavLink } from 'react-router-dom';
|
||||||
|
import Sticky from 'react-sticky-el';
|
||||||
import {
|
import {
|
||||||
FilePath,
|
FilePath,
|
||||||
FilePathForFrontend,
|
FilePathForFrontend,
|
||||||
|
@ -28,20 +42,6 @@ import {
|
||||||
type ExplorerItem
|
type ExplorerItem
|
||||||
} from '@sd/client';
|
} from '@sd/client';
|
||||||
import { Button, Divider, DropdownMenu, toast, Tooltip, tw } from '@sd/ui';
|
import { Button, Divider, DropdownMenu, toast, Tooltip, tw } from '@sd/ui';
|
||||||
import clsx from 'clsx';
|
|
||||||
import dayjs from 'dayjs';
|
|
||||||
import {
|
|
||||||
forwardRef,
|
|
||||||
useCallback,
|
|
||||||
useEffect,
|
|
||||||
useMemo,
|
|
||||||
useState,
|
|
||||||
type HTMLAttributes,
|
|
||||||
type ReactNode
|
|
||||||
} from 'react';
|
|
||||||
import { useLocation } from 'react-router';
|
|
||||||
import { Link as NavLink } from 'react-router-dom';
|
|
||||||
import Sticky from 'react-sticky-el';
|
|
||||||
import { LibraryIdParamsSchema } from '~/app/route-schemas';
|
import { LibraryIdParamsSchema } from '~/app/route-schemas';
|
||||||
import { Folder, Icon } from '~/components';
|
import { Folder, Icon } from '~/components';
|
||||||
import { useLocale, useZodRouteParams } from '~/hooks';
|
import { useLocale, useZodRouteParams } from '~/hooks';
|
||||||
|
@ -233,6 +233,10 @@ export const SingleItemMetadata = ({ item }: { item: ExplorerItem }) => {
|
||||||
enabled: filePathData != null && readyToFetch
|
enabled: filePathData != null && readyToFetch
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const duplicateFilePaths = useLibraryQuery(['files.getDuplicates', objectData?.id ?? -1], {
|
||||||
|
enabled: objectData != null && readyToFetch
|
||||||
|
});
|
||||||
|
|
||||||
const filesMediaData = useLibraryQuery(['files.getMediaData', objectData?.id ?? -1], {
|
const filesMediaData = useLibraryQuery(['files.getMediaData', objectData?.id ?? -1], {
|
||||||
enabled: objectData != null && readyToFetch
|
enabled: objectData != null && readyToFetch
|
||||||
});
|
});
|
||||||
|
@ -526,7 +530,6 @@ const MultiItemMetadata = ({ items }: { items: ExplorerItem[] }) => {
|
||||||
const onlyNonIndexed = metadata.types.has('NonIndexedPath') && metadata.types.size === 1;
|
const onlyNonIndexed = metadata.types.has('NonIndexedPath') && metadata.types.size === 1;
|
||||||
const filesSize = humanizeSize(metadata.size);
|
const filesSize = humanizeSize(metadata.size);
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<MetaContainer>
|
<MetaContainer>
|
||||||
|
|
|
@ -153,7 +153,7 @@ function usePlausible() {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const interval = setInterval(() => {
|
const interval = setInterval(() => {
|
||||||
plausibleEvent({ event: { type: 'ping' } });
|
plausibleEvent({ event: { type: 'ping' } });
|
||||||
}, 270 * 1000);
|
}, 600 * 1000); // 10 minutes
|
||||||
|
|
||||||
return () => clearInterval(interval);
|
return () => clearInterval(interval);
|
||||||
}, [plausibleEvent]);
|
}, [plausibleEvent]);
|
||||||
|
|
|
@ -13,6 +13,7 @@ export type Procedures = {
|
||||||
{ key: "ephemeralFiles.getMediaData", input: string, result: MediaData | null } |
|
{ key: "ephemeralFiles.getMediaData", input: string, result: MediaData | null } |
|
||||||
{ key: "files.get", input: LibraryArgs<number>, result: ObjectWithFilePaths2 | null } |
|
{ key: "files.get", input: LibraryArgs<number>, result: ObjectWithFilePaths2 | null } |
|
||||||
{ key: "files.getConvertibleImageExtensions", input: never, result: string[] } |
|
{ key: "files.getConvertibleImageExtensions", input: never, result: string[] } |
|
||||||
|
{ key: "files.getDuplicates", input: LibraryArgs<number>, result: [({ id: number; name: string | null; path: string | null })[], FilePathSisters[]] } |
|
||||||
{ key: "files.getMediaData", input: LibraryArgs<number>, result: MediaData } |
|
{ key: "files.getMediaData", input: LibraryArgs<number>, result: MediaData } |
|
||||||
{ key: "files.getPath", input: LibraryArgs<number>, result: string | null } |
|
{ key: "files.getPath", input: LibraryArgs<number>, result: string | null } |
|
||||||
{ key: "invalidation.test-invalidate", input: never, result: number } |
|
{ key: "invalidation.test-invalidate", input: never, result: number } |
|
||||||
|
@ -300,6 +301,8 @@ export type FilePathOrder = { field: "name"; value: SortOrder } | { field: "size
|
||||||
|
|
||||||
export type FilePathSearchArgs = { take?: number | null; orderAndPagination?: OrderAndPagination<number, FilePathOrder, FilePathCursor> | null; filters?: SearchFilterArgs[]; groupDirectories?: boolean }
|
export type FilePathSearchArgs = { take?: number | null; orderAndPagination?: OrderAndPagination<number, FilePathOrder, FilePathCursor> | null; filters?: SearchFilterArgs[]; groupDirectories?: boolean }
|
||||||
|
|
||||||
|
export type FilePathSisters = { id: number; is_dir: boolean | null; cas_id: string | null; integrity_checksum: string | null; location: { id: number; name: string | null; path: string | null } | null; materialized_path: string | null; name: string | null; extension: string | null }
|
||||||
|
|
||||||
export type Flash = {
|
export type Flash = {
|
||||||
/**
|
/**
|
||||||
* Specifies how flash was used (on, auto, off, forced, onvalid)
|
* Specifies how flash was used (on, auto, off, forced, onvalid)
|
||||||
|
|
Loading…
Reference in a new issue