Mopidy: بحاجة إلى وسيلة لإضافة وتشغيل المسارات

تم إنشاؤها على ٧ أبريل ٢٠٢٠  ·  6تعليقات  ·  مصدر: mopidy/mopidy

أنا أقوم بإنشاء Jukebox web UI التي سيستهلكها العديد من العملاء المتصلين في وقت واحد. لديهم فقط القدرة على ترتيب الأغاني في قائمة الانتظار. إذا كانت قائمة الأغاني فارغة وتم وضع الأغنية الأولى في قائمة الانتظار ، أود أن تبدأ هذه الأغنية في التشغيل.

في الوقت الحالي لا توجد طريقة للقيام بذلك. سيقطع PlaybackController.play() المسار قيد التشغيل حاليًا ولن يقوم PlaybackController.resume() بتشغيل قائمة المسار إذا لم يكن هناك شيء قيد التشغيل حتى الآن.

من الواضح أنني أستطيع تجهيز العميل للقيام بشيء مثل:

await mopidy.tracklist.add(...);
const playbackState = await mopidy.playback.getState();
if (playbackState === "PAUSED") {
  await mopidy.playback.resume();
} else if (playbackState === "STOPPED") {
  await mopidy.playback.play();
}

تكمن المشكلة في هذا في أنه إذا كان هناك شخصان يصطفان الأغاني في نفس الوقت ، فقد يستعيد كلاهما حالة "STOPPED" وسيدوس أحدهما على الآخر. أرغب في حل هذه المشكلة من خلال وجود شيء مدمج في واجهة برمجة التطبيقات يتيح لي إضافة مسار وإعلان أنه يجب تشغيله إذا كان هو المسار الوحيد في قائمة المسار وتم إيقاف التشغيل.

C-enhancement A-core

التعليق الأكثر فائدة

طريقة أخرى لتحقيق ما هو في الأساس مجموعة ذرية مخصصة لـ
ستكون العمليات الأساسية هي توفير الواجهة الأمامية لتنفيذ الأمر و
تأكد من أن جميع عملائك يستخدمونه. سيكون هذا أفضل إذا كان لدينا آلية
لتوسيع مقبس الويب بطريقة ما.

في الثلاثاء ، 7 أبريل 2020 ، الساعة 08:55 صباحًا ، Stein Magnus Jodal ، [email protected]
كتب:

لقد قمت بنقل المشكلة إلى mopidy repo الأساسي ، لأن هذا سيتطلب
يتغير هنا.

-
أنت تتلقى هذا لأنك مشترك في هذا الموضوع.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/mopidy/mopidy/issues/1897#issuecomment-610236208 ، أو
إلغاء الاشتراك
https://github.com/notifications/unsubscribe-auth/AAHEHKHXVX76W7636PBHZYLRLLMATANCNFSM4MC4SYFQ
.

ال 6 كومينتر

لقد قمت بنقل المشكلة إلى mopidy repo الأساسي ، لأن هذا سيتطلب تغييرات هنا.

طريقة أخرى لتحقيق ما هو في الأساس مجموعة ذرية مخصصة لـ
ستكون العمليات الأساسية هي توفير الواجهة الأمامية لتنفيذ الأمر و
تأكد من أن جميع عملائك يستخدمونه. سيكون هذا أفضل إذا كان لدينا آلية
لتوسيع مقبس الويب بطريقة ما.

في الثلاثاء ، 7 أبريل 2020 ، الساعة 08:55 صباحًا ، Stein Magnus Jodal ، [email protected]
كتب:

لقد قمت بنقل المشكلة إلى mopidy repo الأساسي ، لأن هذا سيتطلب
يتغير هنا.

-
أنت تتلقى هذا لأنك مشترك في هذا الموضوع.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/mopidy/mopidy/issues/1897#issuecomment-610236208 ، أو
إلغاء الاشتراك
https://github.com/notifications/unsubscribe-auth/AAHEHKHXVX76W7636PBHZYLRLLMATANCNFSM4MC4SYFQ
.

وبغض النظر عن ظروف السباق ، فإن جعل هذا يعمل بشكل موثوق به مع عميل واحد أمر مجهد أيضًا.

await mopidy.tracklist.add({ tracks: [track] });
await mopidy.playback.play({});

يفشل ذلك إذا بدأت قائمة الأغاني فارغة.

حالة استخدام صندوق الموسيقى الخاص بي بسيطة: يصطف الأشخاص الأغاني في قائمة الانتظار وأريد أن يتم تشغيل شيء ما دائمًا. إذا كانت قائمة الأغاني فارغة ولم يتم تشغيل أي شيء ، فيجب أن يبدأ تشغيل المسار الجديد. إذا توقفت الأمور بطريقة ما ، يجب أن تتوقف.

هل تدعم واجهة برمجة التطبيقات هذا دون الحاجة إلى القيام بذلك ، الأمر الذي يبدو معقدًا للغاية ؟:

const firstFewTracks = await mopidy.tracklist.slice({ start: 0, end: 3 });
...
const [tlTrack] = await mopidy.tracklist.add({ tracks: [track] });
if (firstFewTracks.length === 0) {
  await mopidy.playback.play({ tlid: tlTrack.tlid });
} else {
  const playbackState = await mopidy.playback.getState();
  if (playbackState === "stopped") {
    await mopidy.playback.play({});
  } else if (playbackState === "paused") {
    await mopidy.playback.resume();
  }
}

هل هي فلسفة API أن تكون كل طريقة دقيقة للغاية في ما تفعله بالضبط بحيث يمكنك استخدامها كوحدات بناء لبناء سلوك مثل حالتي؟ أو هل يجب أن تكون أكثر مرونة مع الحالات المختلفة ونية واضحة للمتصل (على سبيل المثال ، PlaybackController.resume() لتقدم قائمة التتبع إذا لم يتم تشغيل أي شيء)

يفشل ذلك إذا بدأت قائمة الأغاني فارغة.

يجب أن أسيء الفهم لأن هذا يعمل معي كما أتوقع. ما الخلفية التي تستخدمها؟

عند الإيقاف المؤقت ، يجب استئناف استدعاء play بدون وسيطات. بالنظر إلى أنه ، إلى جانب ما سبق ، ألا يفعل ما يلي نفس الشيء مثل المقتطف الخاص بك؟

await mopidy.tracklist.add({ tracks: [track] });
const playbackState = await mopidy.playback.getState();
if (playbackState != "playing") {
  await mopidy.playback.play({})
}

ضع في اعتبارك أن واجهة برمجة التطبيقات الأساسية (API) تستهلكها الواجهات الأمامية الأخرى ، وليس فقط عملاء الويب لجافا سكريبت ، وبالتالي فإن كتل البناء الصغيرة تكون منطقية. قد لا تكون نية المتصل واضحة دائمًا في سياقات أخرى ، لذلك لا نضع افتراضات بشكل عام. بالنسبة لي ، فإن فكرة "الاستئناف" عند التوقف لا معنى لها حيث لا يوجد شيء لاستئنافه.

altano ، هل لديك أي حظ في اقتراحي؟

مرحبًا kingosticks ، أدرك الآن أنني ربما اعتقدت أن هذا الرمز الأبسط لم يكن يعمل بسبب مشكلة غير ذات صلة حيث يفشل GStreamer بشكل متقطع في اللعب بعد تغيير المسار مع أيٍّ من:

ERROR 2020-04-20 03: 57: 04106 [1: MainThread] mopidy.audio.gst ،
خطأ GStreamer: تعذر الاتصال بالخادم ،

أو

خطأ GStreamer: تعذر الكتابة إلى المورد.

لقد نشرت عنه في منتدى Discourse (لم أرغب في إرسال رسائل غير مرغوب فيها إلى github) ولكن تم وضع علامة على منشوري على أنه بريد عشوائي وهو الآن في انتظار الموافقة.

بمجرد أن أعمل من خلال هذه المشكلة ، سأحاول هذا المنطق الأبسط مرة أخرى وأرى ما إذا كان يعمل.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات