إرسال ضغطه “p” إلى MPV عبر سطر الأوامر بلغة Rust
في عالم تطوير البرمجيات، تكتسب لغة Rust شعبية متزايدة بفضل أمانها وكفاءتها. ومن بين الاستخدامات العديدة لهذه اللغة، يأتي التفاعل مع التطبيقات من خلال سطر الأوامر. في هذه المقالة، سنستعرض كيفية إرسال ضغطة "p" على لوحة المفاتيح إلى مشغل MPV من خلال سطر الأوامر باستخدام مكتبة std::process
في Rust.
التفاعل مع MPV باستخدام Rust
يعتبر MPV واحدًا من مشغلات الوسائط القوية التي تدعم العديد من الميزات، بما في ذلك التحكم عن بُعد عبر بروتوكولات متعددة. إن إرسال أمر للتفاعل مع MPV يجعل من السهل التحكم في تشغيل وسائط معينة، مثل الإيقاف المؤقت والتشغيل. في مثالنا، سنستخدم مكتبة std::process
لتشغيل MPV وإرسال الأوامر إليه عبر مقبس IPC.
تشغيل عملية MPV
لبدء عملية MPV من خلال Rust، نحتاج إلى إعداد الأمر والوسائط اللازمة. من خلال استخدام Command::new()
، يمكننا تحديد الأمر الذي نريد تشغيله، وفي حالتنا هذه هو تشغيل MPV مع تحديد الأغنية المراد تشغيلها.
let mut output = Command::new("mpv")
.arg(selected_song.unwrap())
.arg("--no-video")
.arg("--vo=null")
.arg("--video=no")
.arg(r"--input-ipc-server=\\.\pipe\mpvsocket")
.stdin(Stdio::piped())
.spawn()
.expect("فشل التنفيذ بأمر");
هنا، يتم تحديد الأغنية التي سيتم تشغيلها في التطبيق، إلى جانب عدد من الخيارات لتعيين كيفية عرض الفيديو.
التواصل مع MPV عبر IPC
بعد إعداد عملية MPV، نريد الآن التفاعل معها. يتيح لنا بروتوكول الـ IPC (Inter-Process Communication) التواصل مع عملية MPV بطريقة فعالة. في نظام Windows، نستخدم مقبس نصي للاتصال بـ MPV، مما يتيح لنا إرسال أوامر مثل الإيقاف المؤقت.
fn spawn_command(cmd: &str, args: &Vec<&str>) -> Result<Child, RustyError> {
let mut command = Command::new(cmd);
for arg in args.iter() {
command.arg(arg);
}
let cmd_result = command.spawn();
if cmd_result.is_ok() {
Ok(cmd_result.unwrap())
} else {
Err(RustyError)
}
}
هنا، نقوم بتعريف دالة spawn_command
التي تأخذ اسم الأمر والوسائط المستخدمة، ثم تقوم بتشغيل الأمر وتعيد عملية التنفيذ.
استقبال الأحداث من المستخدم
عند استقبال الأحداث من المستخدم، يمكننا التحقق من ضغطات المفاتيح. باستخدام دالة get_pressed_key()
، يمكننا التعرف على الأزرار التي قام المستخدم بالضغط عليها. إذا تم الضغط على زر "pause"، نقوم بإرسال الأمر المناسب إلى MPV عبر IPC:
loop {
match get_pressed_key().unwrap().as_str() {
"exit" => {
break;
},
"pause" => {
spawn_command("cmd", &vec![
"/C",
"echo", "cycle", "pause", ">",
r"\\.\pipe\mpvsocket"
])
.expect("فشل في إرسال الأمر إلى MPV");
},
_ => {}
}
}
خاتمة
في الختام، لقد استعرضنا كيفية إرسال ضغطة "p" إلى MPV باستخدام Rust ومكتبة std::process
. إن استخدام IPC يجعل من السهل التفاعل مع التطبيقات وتشغيل الوسائط بشكل ديناميكي. هذه الطريقة تعزز تجربة المستخدم وتمنح المطورين إمكانية التحكم الدقيق في مشغل الوسائط. إذا كنت ترغب في بناء تطبيقات تستخدم MPV، فإن Rust توفر لك الأساس المثالي للبدء.
بذلك، تتضح أهمية تراكيب البرمجيات والتفاعل بين العمليات المختلفة. يمكنك استكشاف هذه التقنيات في مشاريعك الخاصة وفتح آفاق جديدة في عالم تطوير البرمجيات.