Compare commits
7 commits
Author | SHA1 | Date | |
---|---|---|---|
3424b6ed97 | |||
fa323a0a87 | |||
a23799b6b1 | |||
4c0883f694 | |||
851c2306b4 | |||
567afb1866 | |||
6e7948e579 |
6 changed files with 49 additions and 23 deletions
|
@ -6,10 +6,13 @@ Currently, it just has really basic features but many more things are planned.
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
| Feature | Description | State |
|
| Feature | Description | State |
|
||||||
|------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------|
|
|---------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------|
|
||||||
| Playlists | You can create and load `.m3u` playlists, edit them and they will get stored on the disk automatically. | <input type="checkbox" disabled checked /> Implemented |
|
| Playlists | You can create and load `.m3u` playlists, edit them and they will get stored on the disk automatically. | <input type="checkbox" disabled checked /> Implemented |
|
||||||
| Background Job Monitor | A QDockWidget where background processes are listed. | <input type="checkbox" disabled checked /> Implemented |
|
| Background Job Monitor | A QDockWidget where background processes are listed. | <input type="checkbox" disabled checked /> Implemented |
|
||||||
| Audio effects | Audio effects like normalizing and an equalizer. This can be implemented pretty easily because Wobuzz uses [Pydub](https://pydub.com/), which has these effects built in. | <input type="checkbox" disabled /> Not Implemented |
|
| Audio effects | Audio effects like normalizing and an equalizer. This can be implemented pretty easily because Wobuzz uses [Pydub](https://pydub.com/), which has these effects built in. | <input type="checkbox" disabled /> Not Implemented |
|
||||||
|
| Soundcloud downloader | A simple Soundcloud-downloader like maybe integrating [SCDL](https://pypi.org/project/scdl/) would be really cool. | <input type="checkbox" disabled /> Not Implemented |
|
||||||
|
| Synchronisation between devices | This should be pretty hard to implement and idk. if i will ever make it, but synchronisation could be pretty practical e.g. if you have multiple audio systems in different rooms. | <input type="checkbox" disabled /> Not Implemented |
|
||||||
|
| Audio visualization | Firstly, rather simple audio visualization like an oscilloscope would be cool, also something more complicated like [ProjectM](https://github.com/projectM-visualizer/projectm) could be integrated. | <input type="checkbox" disabled /> Not Implemented |
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
@ -23,7 +26,7 @@ there you can find the commands that you need for the installation.
|
||||||
You firstly have to install the newest dependencies:
|
You firstly have to install the newest dependencies:
|
||||||
|
|
||||||
``` bash
|
``` bash
|
||||||
sudo apt install xcb libxcb-cursor0 ffmpeg
|
sudo apt install xcb libxcb-cursor0 ffmpeg python3-pip git
|
||||||
```
|
```
|
||||||
|
|
||||||
Now, you can install the newest unstable version using just one more command:
|
Now, you can install the newest unstable version using just one more command:
|
||||||
|
|
1
setup.py
1
setup.py
|
@ -26,6 +26,7 @@ setuptools.setup(
|
||||||
url="https://teapot.informationsanarchistik.de/Wobbl/Wobuzz",
|
url="https://teapot.informationsanarchistik.de/Wobbl/Wobuzz",
|
||||||
author="The Wobbler",
|
author="The Wobbler",
|
||||||
author_email="emil@i21k.de",
|
author_email="emil@i21k.de",
|
||||||
|
license="GNU GPLv3",
|
||||||
packages=setuptools.find_packages(include=["wobuzz", "wobuzz.*"]),
|
packages=setuptools.find_packages(include=["wobuzz", "wobuzz.*"]),
|
||||||
package_data={"": ["*.txt", "*.svg"]},
|
package_data={"": ["*.txt", "*.svg"]},
|
||||||
install_requires=[
|
install_requires=[
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
from PyQt6.QtCore import pyqtSignal
|
from PyQt6.QtCore import pyqtSignal
|
||||||
from PyQt6.QtGui import QDropEvent, QIcon, QFont
|
from PyQt6.QtGui import QDropEvent, QIcon, QFont
|
||||||
from PyQt6.QtWidgets import QTreeWidget, QAbstractItemView, QFrame
|
from PyQt6.QtWidgets import QTreeWidget, QAbstractItemView
|
||||||
|
|
||||||
from .track import TrackItem
|
from .track import TrackItem
|
||||||
|
|
||||||
|
@ -10,9 +10,7 @@ from .track import TrackItem
|
||||||
class PlaylistView(QTreeWidget):
|
class PlaylistView(QTreeWidget):
|
||||||
itemDropped = pyqtSignal(QTreeWidget, list)
|
itemDropped = pyqtSignal(QTreeWidget, list)
|
||||||
|
|
||||||
normal_font = QFont()
|
playing_mark = QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart)
|
||||||
bold_font = QFont()
|
|
||||||
bold_font.setBold(True)
|
|
||||||
|
|
||||||
def __init__(self, playlist, dock, parent=None):
|
def __init__(self, playlist, dock, parent=None):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
|
@ -28,8 +26,6 @@ class PlaylistView(QTreeWidget):
|
||||||
|
|
||||||
self.setColumnCount(4)
|
self.setColumnCount(4)
|
||||||
|
|
||||||
self.playing_mark = QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart)
|
|
||||||
|
|
||||||
headers = [
|
headers = [
|
||||||
"#",
|
"#",
|
||||||
"Title",
|
"Title",
|
||||||
|
@ -133,20 +129,14 @@ class PlaylistView(QTreeWidget):
|
||||||
|
|
||||||
# unmark the previous track in all playlists
|
# unmark the previous track in all playlists
|
||||||
for item in previous_track.items:
|
for item in previous_track.items:
|
||||||
item.setIcon(0, QIcon(None))
|
item.unmark()
|
||||||
item.setFont(1, self.normal_font)
|
|
||||||
item.setFont(2, self.normal_font)
|
|
||||||
item.setFont(3, self.normal_font)
|
|
||||||
|
|
||||||
if track:
|
if track:
|
||||||
playlist_tabs.setTabIcon(index, self.playing_mark) # mark this playlist
|
playlist_tabs.setTabIcon(index, self.playing_mark) # mark this playlist
|
||||||
|
|
||||||
# mark the current track in this playlist
|
# mark the current track in this playlist
|
||||||
item = self.topLevelItem(self.app.player.current_playlist.current_track_index)
|
item = self.topLevelItem(self.app.player.current_playlist.current_track_index)
|
||||||
item.setIcon(0, self.playing_mark)
|
item.mark()
|
||||||
item.setFont(1, self.bold_font)
|
|
||||||
item.setFont(2, self.bold_font)
|
|
||||||
item.setFont(3, self.normal_font)
|
|
||||||
|
|
||||||
def append_track(self, track):
|
def append_track(self, track):
|
||||||
TrackItem(track, self.topLevelItemCount() - 1, self)
|
TrackItem(track, self.topLevelItemCount() - 1, self)
|
||||||
|
|
|
@ -1,20 +1,31 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
from PyQt6.QtCore import Qt
|
from PyQt6.QtCore import Qt
|
||||||
|
from PyQt6.QtGui import QFont, QIcon, QPalette
|
||||||
from PyQt6.QtWidgets import QTreeWidgetItem
|
from PyQt6.QtWidgets import QTreeWidgetItem
|
||||||
|
|
||||||
|
|
||||||
class TrackItem(QTreeWidgetItem):
|
class TrackItem(QTreeWidgetItem):
|
||||||
|
normal_font = QFont()
|
||||||
|
bold_font = QFont()
|
||||||
|
bold_font.setBold(True)
|
||||||
|
|
||||||
|
playing_mark = QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart)
|
||||||
|
|
||||||
def __init__(self, track, index, parent=None):
|
def __init__(self, track, index, parent=None):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
|
|
||||||
self.track = track
|
self.track = track
|
||||||
self.index_user_sort = index
|
self.index_user_sort = index
|
||||||
|
|
||||||
self.index = index
|
self.index = index
|
||||||
|
|
||||||
self.playlist = parent.playlist
|
self.playlist = parent.playlist
|
||||||
|
|
||||||
|
palette = parent.palette()
|
||||||
|
|
||||||
|
self.highlight_color = palette.color(QPalette.ColorRole.Highlight)
|
||||||
|
self.base_color = palette.color(QPalette.ColorRole.Base)
|
||||||
|
|
||||||
track.items.append(self)
|
track.items.append(self)
|
||||||
|
|
||||||
track.set_occurrences()
|
track.set_occurrences()
|
||||||
|
@ -31,3 +42,16 @@ class TrackItem(QTreeWidgetItem):
|
||||||
self.setText(3, track.tags.album)
|
self.setText(3, track.tags.album)
|
||||||
self.setText(4, str(self.index_user_sort + 1))
|
self.setText(4, str(self.index_user_sort + 1))
|
||||||
|
|
||||||
|
def mark(self):
|
||||||
|
self.setIcon(0, self.playing_mark)
|
||||||
|
self.setFont(1, self.bold_font)
|
||||||
|
self.setFont(2, self.bold_font)
|
||||||
|
self.setFont(3, self.normal_font)
|
||||||
|
|
||||||
|
|
||||||
|
def unmark(self):
|
||||||
|
self.setIcon(0, QIcon(None))
|
||||||
|
self.setFont(1, self.normal_font)
|
||||||
|
self.setFont(2, self.normal_font)
|
||||||
|
self.setFont(3, self.normal_font)
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,6 @@ class TrackInfo(QToolBar):
|
||||||
title = current_track.tags.title
|
title = current_track.tags.title
|
||||||
artist = current_track.tags.artist
|
artist = current_track.tags.artist
|
||||||
album = current_track.tags.album
|
album = current_track.tags.album
|
||||||
cover_data = current_track.tags.images.any.data
|
|
||||||
|
|
||||||
self.title.setText(title)
|
self.title.setText(title)
|
||||||
|
|
||||||
|
@ -71,6 +70,15 @@ class TrackInfo(QToolBar):
|
||||||
else:
|
else:
|
||||||
self.album.setText("No Album")
|
self.album.setText("No Album")
|
||||||
|
|
||||||
|
cover = current_track.tags.images.any
|
||||||
|
|
||||||
|
if cover is None:
|
||||||
|
self.track_cover.setPixmap(self.wobuzz_logo)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
cover_data = cover.data
|
||||||
|
|
||||||
if isinstance(cover_data, bytes):
|
if isinstance(cover_data, bytes):
|
||||||
cover_pixmap = QPixmap()
|
cover_pixmap = QPixmap()
|
||||||
cover_pixmap.loadFromData(cover_data)
|
cover_pixmap.loadFromData(cover_data)
|
||||||
|
|
|
@ -57,7 +57,7 @@ class TrackProgressSlider(QSlider):
|
||||||
def on_release(self):
|
def on_release(self):
|
||||||
self.dragged = False
|
self.dragged = False
|
||||||
|
|
||||||
if self.app.player.current_playlist.has_tracks():
|
if self.app.player.current_playlist is not None and self.app.player.current_playlist.has_tracks():
|
||||||
self.app.player.seek(self.value())
|
self.app.player.seek(self.value())
|
||||||
|
|
||||||
def update_progress(self):
|
def update_progress(self):
|
||||||
|
|
Loading…
Add table
Reference in a new issue