Skip to content

Commit c91d0a0

Browse files
committed
fix memory leak + library status
1 parent b05001d commit c91d0a0

6 files changed

Lines changed: 611 additions & 491 deletions

File tree

src/domain/library.rs

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
use rusqlite::{types::{FromSql, FromSqlError, FromSqlResult, ToSqlOutput, ValueRef}, ToSql};
1+
use rusqlite::{
2+
types::{FromSql, FromSqlError, FromSqlResult, ToSqlOutput, ValueRef},
3+
ToSql,
4+
};
25
use serde::{Deserialize, Serialize};
36
use strum_macros::{Display, EnumString};
47

58
use super::ElementAction;
69

7-
810
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
911
pub struct ServerLibrary {
1012
pub id: String,
11-
pub name: String,
12-
pub source: String,
13+
pub name: String,
14+
pub source: String,
1315
pub root: Option<String>,
1416
#[serde(rename = "type")]
1517
pub kind: LibraryType,
@@ -22,19 +24,17 @@ pub struct ServerLibrary {
2224
pub hidden: bool,
2325
}
2426

25-
2627
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, EnumString, Default)]
27-
#[serde(rename_all = "camelCase")]
28+
#[serde(rename_all = "camelCase")]
2829
#[strum(serialize_all = "camelCase")]
2930
pub enum LibraryRole {
30-
Admin,
31-
Read,
32-
Write,
31+
Admin,
32+
Read,
33+
Write,
3334
#[default]
34-
None,
35+
None,
3536
}
3637

37-
3838
#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq)]
3939
pub struct LibraryLimits {
4040
#[serde(default)]
@@ -47,7 +47,6 @@ pub struct LibraryLimits {
4747
pub delay: Option<i64>,
4848
#[serde(default)]
4949
pub user_id: Option<String>,
50-
5150
}
5251

5352
impl LibraryLimits {
@@ -74,32 +73,27 @@ impl ToSql for LibraryLimits {
7473
}
7574
}
7675

77-
78-
79-
80-
8176
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, EnumString, Display)]
82-
#[serde(rename_all = "camelCase")]
77+
#[serde(rename_all = "camelCase")]
8378
#[strum(serialize_all = "camelCase")]
8479
pub enum LibraryType {
85-
Photos,
86-
Shows,
87-
Movies,
88-
Iptv,
80+
Photos,
81+
Shows,
82+
Movies,
83+
Iptv,
8984
#[default]
9085
Other,
9186
}
9287

93-
9488
#[derive(Debug, Serialize, Deserialize, Clone)]
95-
#[serde(rename_all = "camelCase")]
89+
#[serde(rename_all = "camelCase")]
9690
pub struct UserMapping {
9791
pub from: String,
98-
pub to: String
92+
pub to: String,
9993
}
10094

10195
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
102-
#[serde(rename_all = "camelCase")]
96+
#[serde(rename_all = "camelCase")]
10397
pub struct ServerLibrarySettings {
10498
#[serde(skip_serializing_if = "Option::is_none")]
10599
pub face_threshold: Option<f32>,
@@ -111,21 +105,16 @@ pub struct ServerLibrarySettings {
111105
pub map_progress: Option<Vec<UserMapping>>,
112106
}
113107

114-
115-
116-
117-
118-
119108
#[derive(Debug, Serialize, Deserialize, Clone)]
120-
#[serde(rename_all = "camelCase")]
109+
#[serde(rename_all = "camelCase")]
121110
pub struct LibraryMessage {
122111
pub action: ElementAction,
123-
pub library: ServerLibrary
112+
pub library: ServerLibrary,
124113
}
125114

126115
#[derive(Debug, Serialize, Deserialize, Clone)]
127-
#[serde(rename_all = "camelCase")]
116+
#[serde(rename_all = "camelCase")]
128117
pub struct LibraryStatusMessage {
129118
pub message: String,
130-
pub library: String
131-
}
119+
pub library: String,
120+
}

src/model/mod.rs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ use std::{
5858
io::Read,
5959
path::PathBuf,
6060
pin::Pin,
61-
sync::Arc,
61+
sync::{Arc, RwLock as StdRwLock},
6262
thread::JoinHandle,
6363
};
6464
use strum::IntoEnumIterator;
@@ -120,7 +120,7 @@ impl VideoConvertQueueElement {
120120
#[derive(Clone)]
121121
pub struct ModelController {
122122
store: Arc<SqliteStore>,
123-
pub io: Arc<Option<SocketIo>>,
123+
pub io: Arc<StdRwLock<Option<SocketIo>>>,
124124
pub plugin_manager: Arc<PluginManager>,
125125
pub trakt: Arc<TraktContext>,
126126
pub tmdb: Arc<TmdbContext>,
@@ -148,7 +148,7 @@ impl ModelController {
148148

149149
let mc = Self {
150150
store: Arc::new(store),
151-
io: Arc::new(None),
151+
io: Arc::new(StdRwLock::new(None)),
152152
plugin_manager: Arc::new(plugin_manager),
153153
trakt: Arc::new(TraktContext::new(
154154
"455f81b3409a8dd140a941e9250ff22b2ed92d68003491c3976363fe752a9024".to_string(),
@@ -526,16 +526,20 @@ impl ModelController {
526526

527527
impl ModelController {
528528
pub fn set_socket(&mut self, io: SocketIo) {
529-
self.io = Arc::new(Some(io));
529+
let mut w = self.io.write().unwrap();
530+
*w = Some(io);
530531
}
531532

532533
fn for_connected_users<T: Clone>(
533534
&self,
534535
message: &T,
535536
action: fn(user: &ConnectedUser, socket: &SocketRef, message: T) -> (),
536537
) {
537-
let io = self.io.clone();
538-
if let Some(ref io) = *io {
538+
let io = {
539+
let guard = self.io.read().unwrap();
540+
guard.clone()
541+
};
542+
if let Some(ref io) = io {
539543
if let Ok(sockets) = io.sockets() {
540544
for socket in sockets {
541545
if let Some(user) = socket.extensions.get::<ConnectedUser>() {
@@ -556,18 +560,10 @@ impl ModelController {
556560

557561
pub fn send_library_status(&self, message: LibraryStatusMessage) {
558562
self.for_connected_users(&message, |user, socket, message| {
559-
// Check if user has Read access to the library
560-
561-
println!(
562-
"send_library_status, user: {:?}, message: {:?}",
563-
user.user_id(),
564-
message
565-
);
566563
if user
567564
.check_library_role(&message.library, LibraryRole::Admin)
568565
.is_ok()
569566
{
570-
println!("Sent status");
571567
let _ = socket.emit("library-status", message);
572568
}
573569
});

src/model/people.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -770,28 +770,27 @@ impl ModelController {
770770
let duration = media.duration.unwrap_or(0);
771771

772772
// Determine percentages to scan
773-
let percents = if duration < 1000 * 60 * 2 {
773+
let percents = if duration < 1000 * 60 {
774+
// < 1 min
775+
vec![20, 50, 80]
776+
} else if duration < 1000 * 60 * 2 {
774777
// < 2 min
775-
vec![10, 20, 30, 40, 50, 60, 70, 80, 90]
778+
vec![10, 30, 50, 66, 85]
776779
} else if duration < 1000 * 60 * 10 {
777780
// < 10 min
778-
vec![
779-
5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95,
780-
]
781+
vec![5, 12, 19, 26, 33, 40, 54, 68, 75, 89, 96]
781782
} else {
782-
vec![
783-
2, 5, 7, 10, 12, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80,
784-
85, 90, 92, 95, 97,
785-
]
783+
vec![2, 8, 20, 26, 38, 44, 50, 56, 68, 74, 86, 92, 98]
786784
};
787785

788786
for percent in percents {
789787
// Get thumb as byte buffer
788+
let seconds = (duration as f64 / 1000.0) * (percent as f64 / 100.0);
790789
let thumb = self
791790
.get_video_thumb(
792791
library_id,
793792
media_id,
794-
VideoTime::Percent(percent as u32),
793+
VideoTime::Seconds(seconds),
795794
image::ImageFormat::Png,
796795
Some(70),
797796
requesting_user,

0 commit comments

Comments
 (0)