Реализуйте простой плейер с графическим интерфейсом. Предусмотрите следующий функционал:
- создание плейлиста;
- удаление плейлиста;
- добавление музыкальной композиции в плейлист;
- удаление музыкальной композиции из плейлиста;
- перемещение музыкальной композиции на другую позицию плейлисте (изменение порядка);
- проигрывание музыкальной композиции;
- запуск предыдущей музыкальной композиции;
- запуск последующей музыкальной композиции;
- после завершения проигрывания последней композиции в плейлисте он должен начинаться сначала.
Подсказка:
Используйте кольцевой двусвязный список
Требования к реализации
Реализуйте класс Composition, представляющий музыкальную композицию, и класс PlayList, реализующий логику работы плейлиста. Класс PlayList унаследуйте от базового класса LinkedList, реализующего операции над связным списком:
- append_left(self, item) - добавление элемента в начало списка;
- append_right(self, item) - добавление элемента в конец списка;
- append(self, item) - алиас для append_right;
- remove(self, item) - удаление элемента, при его отсутствии в списке должно возбуждать исключение ValueError;
- insert(self, previous, item) - вставка элемента item после элемента previous.
- last(self) - получение последнего элемента списка
Добавьте поддержку "магических" методов в классе LinkedList:
- __len__ - длина списка;
- __iter__ - получение итератора;
- __next__ - получение следующего элемента;
- __getitem__ - получение элемента по индексу;
- __contains__ - поддержка оператора in;
- __reversed__ - поддержка функции reversed.
Элементы связного списка реализуйте в виде класса LinkedListItem, который будет содержать ссылки на следующий и предыдущий элементы, а также данные в виде экземпляра Composition.
Реализуйте доступ к следующему и предыдущему элементу в LinkedListItem через свойства (getter и setter):
Через эти же свойства можно реализовать добавление элементов в список.
Предусмотрите следующие методы в классе PlayList:
- play_all(self, item) - начать проигрывать все треки, начиная с item;
- next_track(self) - перейти к следующему треку;
- previous_track(self) - перейти к предыдущему треку;
- current(self) - получить текущи трек, реализовать в виде свойства.
Реализовать пользовательский интерфейс можно на любой библиотеке (веб или десктоп), например PyQt или Flask. Использование QMediaPlaylist фреймворка PyQt для реализации плейлиста не допускается.
В файлах linked_list.py размещены упрощенные шаблоны классов и функций. В файле test_linked_list.py вы найдете тесты для проверки решения. Тесты можно запустить с помощью модуля unittest или pylint.
Подсказка:
Проигрывание музыкальных композиций можно реализовать с помощью pygame
Оценка выставляется в соответствии со следующими требованиями:
- Общие требования:
- код работы проходит проверку утилитой pylint с конфигурационным файлом .pylintrc.
- код работы успешно проходит тесты, если таковые имеются.
- наличие документации к модулям, функциям, классам и методам.
- наличие аннотации типов.
- На оценку 3 балла:
- программа поддерживает только один плейлист;
- реализовать пункты 3, 4, 6, 7 и 8.
- На оценку 4 балла:
- дополнительно реализовать пункты 5 и 9.
- На оценку 5 балла:
- реализовать все методы, указанные в описании к работе.