Реализуйте простой плейер с графическим интерфейсом. Предусмотрите следующий функционал:
- создание плейлиста;
- удаление плейлиста;
- добавление музыкальной композиции в плейлист;
- удаление музыкальной композиции из плейлиста;
- перемещение музыкальной композиции на другую позицию плейлисте (изменение порядка);
- проигрывание музыкальной композиции;
- запуск предыдущей музыкальной композиции;
- запуск последующей музыкальной композиции;
- после завершения проигрывания последней композиции в плейлисте он должен начинаться сначала.
Подсказка:
Используйте кольцевой двусвязный список
Реализуйте класс 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
):
next_item
previous_item
Через эти же свойства можно реализовать добавление элементов в список.
Предусмотрите следующие методы в классе 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 балла:
- реализовать все методы, указанные в описании к работе.