MacroSignage 0.1.dev36__tar.gz → 0.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- macrosignage-0.2.1/PKG-INFO +306 -0
- macrosignage-0.2.1/README.md +266 -0
- macrosignage-0.2.1/pyproject.toml +94 -0
- macrosignage-0.2.1/setup.cfg +4 -0
- macrosignage-0.2.1/src/MacroSignage.egg-info/PKG-INFO +306 -0
- macrosignage-0.2.1/src/MacroSignage.egg-info/SOURCES.txt +112 -0
- macrosignage-0.2.1/src/MacroSignage.egg-info/entry_points.txt +2 -0
- macrosignage-0.2.1/src/MacroSignage.egg-info/requires.txt +10 -0
- macrosignage-0.2.1/src/macrosignage/__init__.py +4 -0
- macrosignage-0.2.1/src/macrosignage/app.py +156 -0
- macrosignage-0.2.1/src/macrosignage/cli.py +66 -0
- macrosignage-0.2.1/src/macrosignage/config.py +178 -0
- macrosignage-0.2.1/src/macrosignage/extensions.py +9 -0
- macrosignage-0.2.1/src/macrosignage/features/__init__.py +10 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/__init__.py +0 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/forms.py +98 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/models.py +41 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/routes.py +260 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/services.py +177 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/api_tokens/list.html +117 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/dashboard.html +94 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/database.html +174 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/displays/detail.html +201 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/displays/form.html +126 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/displays/list.html +100 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/fonts/form.html +87 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/fonts/list.html +75 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/logo.html +95 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/media/detail.html +182 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/media/form.html +369 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/media/list.html +106 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/schedules/detail.html +150 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/schedules/form.html +178 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/schedules/list.html +108 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/settings.html +118 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/users/detail.html +55 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/users/form.html +112 -0
- macrosignage-0.2.1/src/macrosignage/features/admin/templates/admin/users/list.html +83 -0
- macrosignage-0.2.1/src/macrosignage/features/api/__init__.py +3 -0
- macrosignage-0.2.1/src/macrosignage/features/api/routes.py +491 -0
- macrosignage-0.2.1/src/macrosignage/features/api/serializers.py +129 -0
- macrosignage-0.2.1/src/macrosignage/features/associations.py +26 -0
- macrosignage-0.2.1/src/macrosignage/features/auth/__init__.py +0 -0
- macrosignage-0.2.1/src/macrosignage/features/auth/api_token_forms.py +26 -0
- macrosignage-0.2.1/src/macrosignage/features/auth/forms.py +110 -0
- macrosignage-0.2.1/src/macrosignage/features/auth/models.py +55 -0
- macrosignage-0.2.1/src/macrosignage/features/auth/permissions.py +78 -0
- macrosignage-0.2.1/src/macrosignage/features/auth/routes.py +282 -0
- macrosignage-0.2.1/src/macrosignage/features/auth/services.py +201 -0
- macrosignage-0.2.1/src/macrosignage/features/auth/templates/auth/login.html +50 -0
- macrosignage-0.2.1/src/macrosignage/features/auth/templates/auth/password_reset_form.html +40 -0
- macrosignage-0.2.1/src/macrosignage/features/auth/templates/auth/password_reset_request.html +38 -0
- macrosignage-0.2.1/src/macrosignage/features/auth/templates/auth/setup.html +68 -0
- macrosignage-0.2.1/src/macrosignage/features/auth/token_routes.py +88 -0
- macrosignage-0.2.1/src/macrosignage/features/displays/__init__.py +3 -0
- macrosignage-0.2.1/src/macrosignage/features/displays/forms.py +58 -0
- macrosignage-0.2.1/src/macrosignage/features/displays/models.py +48 -0
- macrosignage-0.2.1/src/macrosignage/features/displays/routes.py +308 -0
- macrosignage-0.2.1/src/macrosignage/features/displays/services.py +176 -0
- macrosignage-0.2.1/src/macrosignage/features/displays/templates/displays/maintenance.html +12 -0
- macrosignage-0.2.1/src/macrosignage/features/displays/templates/displays/offline.html +12 -0
- macrosignage-0.2.1/src/macrosignage/features/displays/templates/displays/pair_failed.html +11 -0
- macrosignage-0.2.1/src/macrosignage/features/displays/templates/displays/player.html +102 -0
- macrosignage-0.2.1/src/macrosignage/features/displays/templates/displays/unauthorized.html +24 -0
- macrosignage-0.2.1/src/macrosignage/features/media/__init__.py +3 -0
- macrosignage-0.2.1/src/macrosignage/features/media/forms.py +308 -0
- macrosignage-0.2.1/src/macrosignage/features/media/models.py +115 -0
- macrosignage-0.2.1/src/macrosignage/features/media/routes.py +207 -0
- macrosignage-0.2.1/src/macrosignage/features/media/services.py +185 -0
- macrosignage-0.2.1/src/macrosignage/features/schedules/__init__.py +3 -0
- macrosignage-0.2.1/src/macrosignage/features/schedules/forms.py +78 -0
- macrosignage-0.2.1/src/macrosignage/features/schedules/models.py +45 -0
- macrosignage-0.2.1/src/macrosignage/features/schedules/routes.py +111 -0
- macrosignage-0.2.1/src/macrosignage/features/schedules/services.py +31 -0
- macrosignage-0.2.1/src/macrosignage/static/css/main.css +1683 -0
- macrosignage-0.2.1/src/macrosignage/static/css/theme.css +40 -0
- macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-dust-corner-bl.png +0 -0
- macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-dust-corner-br.png +0 -0
- macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-dust-corner-tl.png +0 -0
- macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-dust-corner-tr.png +0 -0
- macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-dust-overlay.png +0 -0
- macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-dust-overlay.webp +0 -0
- macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-mask.png +0 -0
- macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-pattern-embedded.svg +8 -0
- macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-pattern.svg +9 -0
- macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-tile-1024.png +0 -0
- macrosignage-0.2.1/src/macrosignage/static/img/bg/bg-tile-1024.webp +0 -0
- macrosignage-0.2.1/src/macrosignage/static/js/display-player.js +171 -0
- macrosignage-0.2.1/src/macrosignage/static/js/main.js +74 -0
- macrosignage-0.2.1/src/macrosignage/static/vendor/animate/LICENSE +21 -0
- macrosignage-0.2.1/src/macrosignage/static/vendor/animate/animate.css +4072 -0
- macrosignage-0.2.1/src/macrosignage/static/vendor/animate/animate.min.css +7 -0
- macrosignage-0.2.1/src/macrosignage/static/vendor/bootstrap/LICENSE +21 -0
- macrosignage-0.2.1/src/macrosignage/static/vendor/bootstrap/css/bootstrap.min.css +6 -0
- macrosignage-0.2.1/src/macrosignage/static/vendor/bootstrap/css/bootstrap.min.css.map +1 -0
- macrosignage-0.2.1/src/macrosignage/static/vendor/bootstrap/js/bootstrap.bundle.min.js +7 -0
- macrosignage-0.2.1/src/macrosignage/static/vendor/bootstrap/js/bootstrap.bundle.min.js.map +1 -0
- macrosignage-0.2.1/src/macrosignage/templates/layouts/_base.html +23 -0
- macrosignage-0.2.1/src/macrosignage/templates/layouts/admin.html +137 -0
- macrosignage-0.2.1/src/macrosignage/templates/layouts/auth.html +21 -0
- macrosignage-0.2.1/src/macrosignage/templates/pages/index.html +76 -0
- macrosignage-0.2.1/src/macrosignage/web/__init__.py +0 -0
- macrosignage-0.2.1/src/macrosignage/web/routes.py +8 -0
- macrosignage-0.2.1/src/macrosignage/web/templates/web/index.html +458 -0
- macrosignage-0.2.1/tests/test_admin_dashboard.py +113 -0
- macrosignage-0.2.1/tests/test_auth.py +180 -0
- macrosignage-0.2.1/tests/test_client_app.py +50 -0
- macrosignage-0.2.1/tests/test_config.py +215 -0
- macrosignage-0.2.1/tests/test_display_player.py +334 -0
- macrosignage-0.2.1/tests/test_slider_media.py +196 -0
- macrosignage-0.2.1/tests/test_v05_polish_scale.py +233 -0
- MacroSignage-0.1.dev36/.gitignore +0 -248
- MacroSignage-0.1.dev36/MANIFEST.in +0 -6
- MacroSignage-0.1.dev36/PKG-INFO +0 -18
- MacroSignage-0.1.dev36/README.md +0 -1
- MacroSignage-0.1.dev36/pyproject.toml +0 -13
- MacroSignage-0.1.dev36/requirements.txt +0 -29
- MacroSignage-0.1.dev36/setup.cfg +0 -46
- MacroSignage-0.1.dev36/src/MacroSignage.egg-info/PKG-INFO +0 -18
- MacroSignage-0.1.dev36/src/MacroSignage.egg-info/SOURCES.txt +0 -40
- MacroSignage-0.1.dev36/src/MacroSignage.egg-info/requires.txt +0 -8
- MacroSignage-0.1.dev36/src/macrosignage/__init__.py +0 -84
- MacroSignage-0.1.dev36/src/macrosignage/blueprints/__init__.py +0 -3
- MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/__init__.py +0 -123
- MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/forms.py +0 -11
- MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/models.py +0 -98
- MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/templates/core/display.html +0 -33
- MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/templates/core/display_list.html +0 -57
- MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/templates/core/display_slides.html +0 -149
- MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/templates/core/index.html +0 -21
- MacroSignage-0.1.dev36/src/macrosignage/blueprints/core/templates/core/slides.html +0 -40
- MacroSignage-0.1.dev36/src/macrosignage/config.py +0 -32
- MacroSignage-0.1.dev36/src/macrosignage/extensions.py +0 -82
- MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/animate.css +0 -4367
- MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/animate.min.css +0 -9
- MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/icons.css +0 -23
- MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/icons.min.css +0 -1
- MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/main.css +0 -194
- MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/main.min.css +0 -7
- MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/materialize.css +0 -9297
- MacroSignage-0.1.dev36/src/macrosignage/ui/static/css/materialize.min.css +0 -16
- MacroSignage-0.1.dev36/src/macrosignage/ui/static/js/main.js +0 -73
- MacroSignage-0.1.dev36/src/macrosignage/ui/static/js/main.min.js +0 -1
- MacroSignage-0.1.dev36/src/macrosignage/ui/static/js/materialize.js +0 -13094
- MacroSignage-0.1.dev36/src/macrosignage/ui/static/js/materialize.min.js +0 -1
- MacroSignage-0.1.dev36/src/macrosignage/ui/templates/layouts/base.html +0 -23
- MacroSignage-0.1.dev36/src/macrosignage/utils/__init__.py +0 -201
- MacroSignage-0.1.dev36/src/macrosignage/utils/sql.py +0 -44
- MacroSignage-0.1.dev36/src/wsgi.py +0 -6
- {MacroSignage-0.1.dev36 → macrosignage-0.2.1}/LICENSE +0 -0
- {MacroSignage-0.1.dev36 → macrosignage-0.2.1}/src/MacroSignage.egg-info/dependency_links.txt +0 -0
- {MacroSignage-0.1.dev36 → macrosignage-0.2.1}/src/MacroSignage.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: MacroSignage
|
|
3
|
+
Version: 0.2.1
|
|
4
|
+
Summary: Web-based Digital Signage System
|
|
5
|
+
Author-email: Javier Baez <baezdevs@gmail.com>
|
|
6
|
+
Maintainer-email: Javier Baez <baezdevs@gmail.com>
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
Project-URL: Homepage, https://github.com/BaezFJ/MacroSignage
|
|
9
|
+
Project-URL: Repository, https://github.com/BaezFJ/MacroSignage
|
|
10
|
+
Project-URL: Issues, https://github.com/BaezFJ/MacroSignage/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/BaezFJ/MacroSignage/releases
|
|
12
|
+
Keywords: dashboard,digital-signage,display-management,flask,signage
|
|
13
|
+
Classifier: Development Status :: 2 - Pre-Alpha
|
|
14
|
+
Classifier: Environment :: Web Environment
|
|
15
|
+
Classifier: Framework :: Flask
|
|
16
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
17
|
+
Classifier: Intended Audience :: System Administrators
|
|
18
|
+
Classifier: Operating System :: OS Independent
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
25
|
+
Classifier: Topic :: Multimedia :: Video :: Display
|
|
26
|
+
Requires-Python: >=3.10
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
License-File: LICENSE
|
|
29
|
+
Requires-Dist: flask>=3.1.3
|
|
30
|
+
Requires-Dist: flask-login>=0.6.3
|
|
31
|
+
Requires-Dist: flask-wtf>=1.3.0
|
|
32
|
+
Requires-Dist: flask-sqlalchemy>=3.1.1
|
|
33
|
+
Requires-Dist: python-dotenv>=1.2.2
|
|
34
|
+
Requires-Dist: python-slugify>=8.0.4
|
|
35
|
+
Requires-Dist: email-validator>=2.3.0
|
|
36
|
+
Requires-Dist: python-usernames>=1.1.0
|
|
37
|
+
Requires-Dist: flask-migrate>=4.1.0
|
|
38
|
+
Requires-Dist: waitress>=3.0.2
|
|
39
|
+
Dynamic: license-file
|
|
40
|
+
|
|
41
|
+
# MacroSignage
|
|
42
|
+
|
|
43
|
+
[](https://pypi.org/project/MacroSignage/)
|
|
44
|
+
[](https://pypi.org/project/MacroSignage/)
|
|
45
|
+
[](LICENSE)
|
|
46
|
+
<!-- Replace with GitHub Actions badge URL once CI is configured -->
|
|
47
|
+
[]()
|
|
48
|
+
|
|
49
|
+
**A web-based digital signage system built with Flask and Bootstrap.**
|
|
50
|
+
|
|
51
|
+
MacroSignage lets you manage and display digital signage content through a modern browser-based interface. It uses Bootstrap v5.3.8 for responsive styling and Animate.css for smooth transitions.
|
|
52
|
+
|
|
53
|
+
> **Note:** This project is in Pre-Alpha (v0.2.1). APIs and features are subject to change.
|
|
54
|
+
|
|
55
|
+
<!-- TODO: Add screenshot once the dashboard UI is implemented -->
|
|
56
|
+
<!--  -->
|
|
57
|
+
|
|
58
|
+
## Features
|
|
59
|
+
|
|
60
|
+
### Current
|
|
61
|
+
|
|
62
|
+
- Flask application factory pattern (`create_app`)
|
|
63
|
+
- Bootstrap v5.3.8 CSS and JavaScript integration (vendored)
|
|
64
|
+
- Bootstrap theme overrides with light and dark mode support via CSS custom properties
|
|
65
|
+
- Animate.css for UI transitions (vendored)
|
|
66
|
+
- Jinja2 template inheritance (base + page templates)
|
|
67
|
+
- Admin dashboard with display management CRUD
|
|
68
|
+
- Media library CRUD for images, text, video, HTML, and YouTube media
|
|
69
|
+
- Many-to-many media assignment between displays and media assets
|
|
70
|
+
- Schedule CRUD with active windows, weekday rules, display targets, and media playlists
|
|
71
|
+
- SQLite-backed display persistence with Flask-SQLAlchemy
|
|
72
|
+
- CSRF protection for admin state-changing forms
|
|
73
|
+
- WSGI-ready entry point for production deployment
|
|
74
|
+
- Installable via PyPI (`pip install MacroSignage`)
|
|
75
|
+
|
|
76
|
+
### Planned
|
|
77
|
+
|
|
78
|
+
- User authentication and session management (Flask-Login)
|
|
79
|
+
- Database migrations (Flask-Migrate)
|
|
80
|
+
- Form handling with CSRF protection (Flask-WTF)
|
|
81
|
+
- Admin dashboard for managing signage content
|
|
82
|
+
- Schedule playback execution
|
|
83
|
+
- Media upload and content rotation
|
|
84
|
+
- REST API for programmatic control
|
|
85
|
+
- Real-time display updates via WebSocket or SSE
|
|
86
|
+
|
|
87
|
+
## Tech Stack
|
|
88
|
+
|
|
89
|
+
| Layer | Technology | Version |
|
|
90
|
+
|-----------|----------------------------|----------|
|
|
91
|
+
| Backend | Flask | >= 3.1.3 |
|
|
92
|
+
| Auth | Flask-Login | >= 0.6.3 |
|
|
93
|
+
| Forms | Flask-WTF | >= 1.3.0 |
|
|
94
|
+
| ORM | Flask-SQLAlchemy | >= 3.1.1 |
|
|
95
|
+
| WSGI | Waitress | >= 3.0.2 |
|
|
96
|
+
| Frontend | Bootstrap | 5.3.8 |
|
|
97
|
+
| Animation | Animate.css | 4.1.1 |
|
|
98
|
+
| Theme | Bootstrap CSS variables | -- |
|
|
99
|
+
| Language | Python | >= 3.10 |
|
|
100
|
+
| Packaging | setuptools + uv | -- |
|
|
101
|
+
|
|
102
|
+
## Prerequisites
|
|
103
|
+
|
|
104
|
+
- **Python 3.10 or higher** (3.10, 3.11, 3.12, or 3.13)
|
|
105
|
+
- **uv** (recommended) -- a fast Python package manager. [Install uv](https://docs.astral.sh/uv/getting-started/installation/)
|
|
106
|
+
- Alternatively, **pip** >= 21.0 works for basic installation
|
|
107
|
+
- **Git** (for development from source)
|
|
108
|
+
|
|
109
|
+
## Installation
|
|
110
|
+
|
|
111
|
+
### From PyPI
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
pip install MacroSignage
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### From Source
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# Clone the repository
|
|
121
|
+
git clone https://github.com/BaezFJ/MacroSignage.git
|
|
122
|
+
cd MacroSignage
|
|
123
|
+
|
|
124
|
+
# Create virtual environment and install with uv
|
|
125
|
+
uv venv
|
|
126
|
+
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
|
127
|
+
uv sync --all-groups
|
|
128
|
+
|
|
129
|
+
# Or with pip
|
|
130
|
+
python -m venv .venv
|
|
131
|
+
source .venv/bin/activate
|
|
132
|
+
pip install -e .
|
|
133
|
+
pip install build twine
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Quick Start
|
|
137
|
+
|
|
138
|
+
1. **Run the development server:**
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
# Using the MacroSignage CLI
|
|
142
|
+
macrosignage dev
|
|
143
|
+
|
|
144
|
+
# Or using the WSGI entry point
|
|
145
|
+
python wsgi.py
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
2. **Open your browser** and navigate to `http://127.0.0.1:5000`
|
|
149
|
+
|
|
150
|
+
### Production Deployment
|
|
151
|
+
|
|
152
|
+
For production, use the packaged Waitress-backed command:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
macrosignage prod --host 0.0.0.0 --port 8080
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Project Structure
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
MacroSignage/
|
|
162
|
+
├── src/
|
|
163
|
+
│ └── macrosignage/ # Main application package
|
|
164
|
+
│ ├── __init__.py # App factory (create_app)
|
|
165
|
+
│ ├── static/
|
|
166
|
+
│ │ ├── css/
|
|
167
|
+
│ │ │ └── theme.css # Bootstrap theme overrides
|
|
168
|
+
│ │ ├── js/ # Application JavaScript
|
|
169
|
+
│ │ └── vendor/ # Vendored frontend libraries
|
|
170
|
+
│ │ ├── bootstrap/ # Bootstrap v5.3.8
|
|
171
|
+
│ │ └── animate/ # Animate.css v4.1.1
|
|
172
|
+
│ └── templates/
|
|
173
|
+
│ ├── base.html # Base template (shared layout)
|
|
174
|
+
│ └── pages/
|
|
175
|
+
│ └── index.html # Home page
|
|
176
|
+
├── wsgi.py # WSGI entry point
|
|
177
|
+
├── pyproject.toml # Project metadata and dependencies
|
|
178
|
+
├── uv.lock # Dependency lock file
|
|
179
|
+
├── LICENSE # MIT License
|
|
180
|
+
└── .gitignore
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Development
|
|
184
|
+
|
|
185
|
+
### Running in Development Mode
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
macrosignage dev
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
The development command enables Flask debug mode by default.
|
|
192
|
+
|
|
193
|
+
### Building for Distribution
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
python -m build
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
This creates source and wheel distributions in `dist/`.
|
|
200
|
+
|
|
201
|
+
### Publishing to PyPI
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
twine upload dist/*
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Adding Dependencies
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
# Add a runtime dependency
|
|
211
|
+
uv add <package-name>
|
|
212
|
+
|
|
213
|
+
# Add a dev dependency
|
|
214
|
+
uv add --group dev <package-name>
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## Contributing
|
|
218
|
+
|
|
219
|
+
Contributions are welcome! MacroSignage is in early development and there are many areas where help is needed.
|
|
220
|
+
|
|
221
|
+
### How to Contribute
|
|
222
|
+
|
|
223
|
+
1. **Fork** the repository
|
|
224
|
+
2. **Create a feature branch:** `git checkout -b feature/your-feature-name`
|
|
225
|
+
3. **Make your changes** and ensure the app runs without errors
|
|
226
|
+
4. **Commit** with a descriptive message
|
|
227
|
+
5. **Push** to your fork and open a **Pull Request**
|
|
228
|
+
|
|
229
|
+
### Guidelines
|
|
230
|
+
|
|
231
|
+
- Follow PEP 8 for Python code style
|
|
232
|
+
- Use the Flask application factory pattern when adding new functionality
|
|
233
|
+
- Keep vendored frontend libraries in `src/macrosignage/static/vendor/`
|
|
234
|
+
- Place new templates under appropriate subdirectories in `templates/`
|
|
235
|
+
- Use CSS custom properties from `theme.css` for consistent theming
|
|
236
|
+
- Write descriptive commit messages
|
|
237
|
+
|
|
238
|
+
## Documentation
|
|
239
|
+
|
|
240
|
+
Expanded documentation is available in [docs/index.md](docs/index.md).
|
|
241
|
+
|
|
242
|
+
### Areas Looking for Contributions
|
|
243
|
+
|
|
244
|
+
- User authentication system
|
|
245
|
+
- Database models and migrations
|
|
246
|
+
- Admin dashboard UI
|
|
247
|
+
- Test coverage expansion
|
|
248
|
+
- CI/CD pipeline (GitHub Actions)
|
|
249
|
+
- Documentation improvements
|
|
250
|
+
|
|
251
|
+
## Roadmap
|
|
252
|
+
|
|
253
|
+
### v0.2.0 -- Foundation
|
|
254
|
+
|
|
255
|
+
- [x] Application configuration system (python-dotenv integration)
|
|
256
|
+
- [x] Database setup with Flask-SQLAlchemy
|
|
257
|
+
- [x] User model and authentication with Flask-Login
|
|
258
|
+
- [x] Form infrastructure with Flask-WTF
|
|
259
|
+
- [x] Basic test suite with pytest
|
|
260
|
+
|
|
261
|
+
### v0.3.0 -- Core Features
|
|
262
|
+
|
|
263
|
+
- [ ] Admin dashboard layout
|
|
264
|
+
- [ ] Content/media management (upload, organize, delete)
|
|
265
|
+
- [ ] Display/screen registration and management
|
|
266
|
+
- [ ] Content-to-display assignment
|
|
267
|
+
|
|
268
|
+
### v0.4.0 -- Scheduling and Playback
|
|
269
|
+
|
|
270
|
+
- [ ] Content scheduling (time-based rotation)
|
|
271
|
+
- [ ] Signage display player view (fullscreen, auto-rotation)
|
|
272
|
+
- [ ] Playlist management
|
|
273
|
+
|
|
274
|
+
### v0.5.0 -- Polish and Scale
|
|
275
|
+
|
|
276
|
+
- [x] REST API
|
|
277
|
+
- [x] Real-time updates (WebSocket or SSE)
|
|
278
|
+
- [x] Multi-user role support (admin, editor, viewer)
|
|
279
|
+
- [x] CI/CD pipeline with GitHub Actions
|
|
280
|
+
- [x] Comprehensive documentation
|
|
281
|
+
|
|
282
|
+
### v1.0.0 -- Stable Release
|
|
283
|
+
|
|
284
|
+
- [ ] Production-hardened and fully tested
|
|
285
|
+
- [ ] Complete documentation
|
|
286
|
+
- [ ] Deployment guides (Docker, systemd, cloud)
|
|
287
|
+
|
|
288
|
+
## License
|
|
289
|
+
|
|
290
|
+
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
|
|
291
|
+
|
|
292
|
+
Copyright (c) 2022 Javier Baez
|
|
293
|
+
|
|
294
|
+
## Author
|
|
295
|
+
|
|
296
|
+
**Javier Baez**
|
|
297
|
+
|
|
298
|
+
- Email: baezdevs@gmail.com
|
|
299
|
+
- GitHub: [@BaezFJ](https://github.com/BaezFJ)
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
**Project Links:**
|
|
304
|
+
[GitHub Repository](https://github.com/BaezFJ/MacroSignage) |
|
|
305
|
+
[PyPI Package](https://pypi.org/project/MacroSignage/) |
|
|
306
|
+
[Issue Tracker](https://github.com/BaezFJ/MacroSignage/issues)
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# MacroSignage
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/MacroSignage/)
|
|
4
|
+
[](https://pypi.org/project/MacroSignage/)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
<!-- Replace with GitHub Actions badge URL once CI is configured -->
|
|
7
|
+
[]()
|
|
8
|
+
|
|
9
|
+
**A web-based digital signage system built with Flask and Bootstrap.**
|
|
10
|
+
|
|
11
|
+
MacroSignage lets you manage and display digital signage content through a modern browser-based interface. It uses Bootstrap v5.3.8 for responsive styling and Animate.css for smooth transitions.
|
|
12
|
+
|
|
13
|
+
> **Note:** This project is in Pre-Alpha (v0.2.1). APIs and features are subject to change.
|
|
14
|
+
|
|
15
|
+
<!-- TODO: Add screenshot once the dashboard UI is implemented -->
|
|
16
|
+
<!--  -->
|
|
17
|
+
|
|
18
|
+
## Features
|
|
19
|
+
|
|
20
|
+
### Current
|
|
21
|
+
|
|
22
|
+
- Flask application factory pattern (`create_app`)
|
|
23
|
+
- Bootstrap v5.3.8 CSS and JavaScript integration (vendored)
|
|
24
|
+
- Bootstrap theme overrides with light and dark mode support via CSS custom properties
|
|
25
|
+
- Animate.css for UI transitions (vendored)
|
|
26
|
+
- Jinja2 template inheritance (base + page templates)
|
|
27
|
+
- Admin dashboard with display management CRUD
|
|
28
|
+
- Media library CRUD for images, text, video, HTML, and YouTube media
|
|
29
|
+
- Many-to-many media assignment between displays and media assets
|
|
30
|
+
- Schedule CRUD with active windows, weekday rules, display targets, and media playlists
|
|
31
|
+
- SQLite-backed display persistence with Flask-SQLAlchemy
|
|
32
|
+
- CSRF protection for admin state-changing forms
|
|
33
|
+
- WSGI-ready entry point for production deployment
|
|
34
|
+
- Installable via PyPI (`pip install MacroSignage`)
|
|
35
|
+
|
|
36
|
+
### Planned
|
|
37
|
+
|
|
38
|
+
- User authentication and session management (Flask-Login)
|
|
39
|
+
- Database migrations (Flask-Migrate)
|
|
40
|
+
- Form handling with CSRF protection (Flask-WTF)
|
|
41
|
+
- Admin dashboard for managing signage content
|
|
42
|
+
- Schedule playback execution
|
|
43
|
+
- Media upload and content rotation
|
|
44
|
+
- REST API for programmatic control
|
|
45
|
+
- Real-time display updates via WebSocket or SSE
|
|
46
|
+
|
|
47
|
+
## Tech Stack
|
|
48
|
+
|
|
49
|
+
| Layer | Technology | Version |
|
|
50
|
+
|-----------|----------------------------|----------|
|
|
51
|
+
| Backend | Flask | >= 3.1.3 |
|
|
52
|
+
| Auth | Flask-Login | >= 0.6.3 |
|
|
53
|
+
| Forms | Flask-WTF | >= 1.3.0 |
|
|
54
|
+
| ORM | Flask-SQLAlchemy | >= 3.1.1 |
|
|
55
|
+
| WSGI | Waitress | >= 3.0.2 |
|
|
56
|
+
| Frontend | Bootstrap | 5.3.8 |
|
|
57
|
+
| Animation | Animate.css | 4.1.1 |
|
|
58
|
+
| Theme | Bootstrap CSS variables | -- |
|
|
59
|
+
| Language | Python | >= 3.10 |
|
|
60
|
+
| Packaging | setuptools + uv | -- |
|
|
61
|
+
|
|
62
|
+
## Prerequisites
|
|
63
|
+
|
|
64
|
+
- **Python 3.10 or higher** (3.10, 3.11, 3.12, or 3.13)
|
|
65
|
+
- **uv** (recommended) -- a fast Python package manager. [Install uv](https://docs.astral.sh/uv/getting-started/installation/)
|
|
66
|
+
- Alternatively, **pip** >= 21.0 works for basic installation
|
|
67
|
+
- **Git** (for development from source)
|
|
68
|
+
|
|
69
|
+
## Installation
|
|
70
|
+
|
|
71
|
+
### From PyPI
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pip install MacroSignage
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### From Source
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Clone the repository
|
|
81
|
+
git clone https://github.com/BaezFJ/MacroSignage.git
|
|
82
|
+
cd MacroSignage
|
|
83
|
+
|
|
84
|
+
# Create virtual environment and install with uv
|
|
85
|
+
uv venv
|
|
86
|
+
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
|
87
|
+
uv sync --all-groups
|
|
88
|
+
|
|
89
|
+
# Or with pip
|
|
90
|
+
python -m venv .venv
|
|
91
|
+
source .venv/bin/activate
|
|
92
|
+
pip install -e .
|
|
93
|
+
pip install build twine
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Quick Start
|
|
97
|
+
|
|
98
|
+
1. **Run the development server:**
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# Using the MacroSignage CLI
|
|
102
|
+
macrosignage dev
|
|
103
|
+
|
|
104
|
+
# Or using the WSGI entry point
|
|
105
|
+
python wsgi.py
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
2. **Open your browser** and navigate to `http://127.0.0.1:5000`
|
|
109
|
+
|
|
110
|
+
### Production Deployment
|
|
111
|
+
|
|
112
|
+
For production, use the packaged Waitress-backed command:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
macrosignage prod --host 0.0.0.0 --port 8080
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Project Structure
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
MacroSignage/
|
|
122
|
+
├── src/
|
|
123
|
+
│ └── macrosignage/ # Main application package
|
|
124
|
+
│ ├── __init__.py # App factory (create_app)
|
|
125
|
+
│ ├── static/
|
|
126
|
+
│ │ ├── css/
|
|
127
|
+
│ │ │ └── theme.css # Bootstrap theme overrides
|
|
128
|
+
│ │ ├── js/ # Application JavaScript
|
|
129
|
+
│ │ └── vendor/ # Vendored frontend libraries
|
|
130
|
+
│ │ ├── bootstrap/ # Bootstrap v5.3.8
|
|
131
|
+
│ │ └── animate/ # Animate.css v4.1.1
|
|
132
|
+
│ └── templates/
|
|
133
|
+
│ ├── base.html # Base template (shared layout)
|
|
134
|
+
│ └── pages/
|
|
135
|
+
│ └── index.html # Home page
|
|
136
|
+
├── wsgi.py # WSGI entry point
|
|
137
|
+
├── pyproject.toml # Project metadata and dependencies
|
|
138
|
+
├── uv.lock # Dependency lock file
|
|
139
|
+
├── LICENSE # MIT License
|
|
140
|
+
└── .gitignore
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Development
|
|
144
|
+
|
|
145
|
+
### Running in Development Mode
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
macrosignage dev
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
The development command enables Flask debug mode by default.
|
|
152
|
+
|
|
153
|
+
### Building for Distribution
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
python -m build
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
This creates source and wheel distributions in `dist/`.
|
|
160
|
+
|
|
161
|
+
### Publishing to PyPI
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
twine upload dist/*
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Adding Dependencies
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# Add a runtime dependency
|
|
171
|
+
uv add <package-name>
|
|
172
|
+
|
|
173
|
+
# Add a dev dependency
|
|
174
|
+
uv add --group dev <package-name>
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Contributing
|
|
178
|
+
|
|
179
|
+
Contributions are welcome! MacroSignage is in early development and there are many areas where help is needed.
|
|
180
|
+
|
|
181
|
+
### How to Contribute
|
|
182
|
+
|
|
183
|
+
1. **Fork** the repository
|
|
184
|
+
2. **Create a feature branch:** `git checkout -b feature/your-feature-name`
|
|
185
|
+
3. **Make your changes** and ensure the app runs without errors
|
|
186
|
+
4. **Commit** with a descriptive message
|
|
187
|
+
5. **Push** to your fork and open a **Pull Request**
|
|
188
|
+
|
|
189
|
+
### Guidelines
|
|
190
|
+
|
|
191
|
+
- Follow PEP 8 for Python code style
|
|
192
|
+
- Use the Flask application factory pattern when adding new functionality
|
|
193
|
+
- Keep vendored frontend libraries in `src/macrosignage/static/vendor/`
|
|
194
|
+
- Place new templates under appropriate subdirectories in `templates/`
|
|
195
|
+
- Use CSS custom properties from `theme.css` for consistent theming
|
|
196
|
+
- Write descriptive commit messages
|
|
197
|
+
|
|
198
|
+
## Documentation
|
|
199
|
+
|
|
200
|
+
Expanded documentation is available in [docs/index.md](docs/index.md).
|
|
201
|
+
|
|
202
|
+
### Areas Looking for Contributions
|
|
203
|
+
|
|
204
|
+
- User authentication system
|
|
205
|
+
- Database models and migrations
|
|
206
|
+
- Admin dashboard UI
|
|
207
|
+
- Test coverage expansion
|
|
208
|
+
- CI/CD pipeline (GitHub Actions)
|
|
209
|
+
- Documentation improvements
|
|
210
|
+
|
|
211
|
+
## Roadmap
|
|
212
|
+
|
|
213
|
+
### v0.2.0 -- Foundation
|
|
214
|
+
|
|
215
|
+
- [x] Application configuration system (python-dotenv integration)
|
|
216
|
+
- [x] Database setup with Flask-SQLAlchemy
|
|
217
|
+
- [x] User model and authentication with Flask-Login
|
|
218
|
+
- [x] Form infrastructure with Flask-WTF
|
|
219
|
+
- [x] Basic test suite with pytest
|
|
220
|
+
|
|
221
|
+
### v0.3.0 -- Core Features
|
|
222
|
+
|
|
223
|
+
- [ ] Admin dashboard layout
|
|
224
|
+
- [ ] Content/media management (upload, organize, delete)
|
|
225
|
+
- [ ] Display/screen registration and management
|
|
226
|
+
- [ ] Content-to-display assignment
|
|
227
|
+
|
|
228
|
+
### v0.4.0 -- Scheduling and Playback
|
|
229
|
+
|
|
230
|
+
- [ ] Content scheduling (time-based rotation)
|
|
231
|
+
- [ ] Signage display player view (fullscreen, auto-rotation)
|
|
232
|
+
- [ ] Playlist management
|
|
233
|
+
|
|
234
|
+
### v0.5.0 -- Polish and Scale
|
|
235
|
+
|
|
236
|
+
- [x] REST API
|
|
237
|
+
- [x] Real-time updates (WebSocket or SSE)
|
|
238
|
+
- [x] Multi-user role support (admin, editor, viewer)
|
|
239
|
+
- [x] CI/CD pipeline with GitHub Actions
|
|
240
|
+
- [x] Comprehensive documentation
|
|
241
|
+
|
|
242
|
+
### v1.0.0 -- Stable Release
|
|
243
|
+
|
|
244
|
+
- [ ] Production-hardened and fully tested
|
|
245
|
+
- [ ] Complete documentation
|
|
246
|
+
- [ ] Deployment guides (Docker, systemd, cloud)
|
|
247
|
+
|
|
248
|
+
## License
|
|
249
|
+
|
|
250
|
+
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
|
|
251
|
+
|
|
252
|
+
Copyright (c) 2022 Javier Baez
|
|
253
|
+
|
|
254
|
+
## Author
|
|
255
|
+
|
|
256
|
+
**Javier Baez**
|
|
257
|
+
|
|
258
|
+
- Email: baezdevs@gmail.com
|
|
259
|
+
- GitHub: [@BaezFJ](https://github.com/BaezFJ)
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
**Project Links:**
|
|
264
|
+
[GitHub Repository](https://github.com/BaezFJ/MacroSignage) |
|
|
265
|
+
[PyPI Package](https://pypi.org/project/MacroSignage/) |
|
|
266
|
+
[Issue Tracker](https://github.com/BaezFJ/MacroSignage/issues)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77.0.3"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "MacroSignage"
|
|
7
|
+
version = "0.2.1"
|
|
8
|
+
description = "Web-based Digital Signage System"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
license-files = ["LICENSE"]
|
|
12
|
+
requires-python = ">=3.10"
|
|
13
|
+
keywords = [
|
|
14
|
+
"dashboard",
|
|
15
|
+
"digital-signage",
|
|
16
|
+
"display-management",
|
|
17
|
+
"flask",
|
|
18
|
+
"signage",
|
|
19
|
+
]
|
|
20
|
+
authors = [
|
|
21
|
+
{ name = "Javier Baez", email = "baezdevs@gmail.com" },
|
|
22
|
+
]
|
|
23
|
+
maintainers = [
|
|
24
|
+
{ name = "Javier Baez", email = "baezdevs@gmail.com" },
|
|
25
|
+
]
|
|
26
|
+
classifiers = [
|
|
27
|
+
"Development Status :: 2 - Pre-Alpha",
|
|
28
|
+
"Environment :: Web Environment",
|
|
29
|
+
"Framework :: Flask",
|
|
30
|
+
"Intended Audience :: End Users/Desktop",
|
|
31
|
+
"Intended Audience :: System Administrators",
|
|
32
|
+
"Operating System :: OS Independent",
|
|
33
|
+
"Programming Language :: Python :: 3",
|
|
34
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
35
|
+
"Programming Language :: Python :: 3.10",
|
|
36
|
+
"Programming Language :: Python :: 3.11",
|
|
37
|
+
"Programming Language :: Python :: 3.12",
|
|
38
|
+
"Programming Language :: Python :: 3.13",
|
|
39
|
+
"Topic :: Multimedia :: Video :: Display",
|
|
40
|
+
]
|
|
41
|
+
dependencies = [
|
|
42
|
+
"flask>=3.1.3",
|
|
43
|
+
"flask-login>=0.6.3",
|
|
44
|
+
"flask-wtf>=1.3.0",
|
|
45
|
+
"flask-sqlalchemy>=3.1.1",
|
|
46
|
+
"python-dotenv>=1.2.2",
|
|
47
|
+
"python-slugify>=8.0.4",
|
|
48
|
+
"email-validator>=2.3.0",
|
|
49
|
+
"python-usernames>=1.1.0",
|
|
50
|
+
"flask-migrate>=4.1.0",
|
|
51
|
+
"waitress>=3.0.2",
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
[project.urls]
|
|
55
|
+
Homepage = "https://github.com/BaezFJ/MacroSignage"
|
|
56
|
+
Repository = "https://github.com/BaezFJ/MacroSignage"
|
|
57
|
+
Issues = "https://github.com/BaezFJ/MacroSignage/issues"
|
|
58
|
+
Changelog = "https://github.com/BaezFJ/MacroSignage/releases"
|
|
59
|
+
|
|
60
|
+
[project.scripts]
|
|
61
|
+
macrosignage = "macrosignage.cli:main"
|
|
62
|
+
|
|
63
|
+
[dependency-groups]
|
|
64
|
+
dev = [
|
|
65
|
+
"build>=1.5.0",
|
|
66
|
+
"pytest>=8.4.2",
|
|
67
|
+
"twine>=6.2.0",
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
[tool.pytest.ini_options]
|
|
71
|
+
testpaths = ["tests"]
|
|
72
|
+
pythonpath = ["src"]
|
|
73
|
+
|
|
74
|
+
[tool.setuptools]
|
|
75
|
+
include-package-data = false
|
|
76
|
+
|
|
77
|
+
[tool.setuptools.packages.find]
|
|
78
|
+
where = ["src"]
|
|
79
|
+
exclude = ["tests*"]
|
|
80
|
+
namespaces = false
|
|
81
|
+
|
|
82
|
+
[tool.setuptools.package-data]
|
|
83
|
+
macrosignage = [
|
|
84
|
+
"**/*.html",
|
|
85
|
+
"**/*.css",
|
|
86
|
+
"**/*.js",
|
|
87
|
+
"**/*.map",
|
|
88
|
+
"**/*.json",
|
|
89
|
+
"**/*.png",
|
|
90
|
+
"**/*.jpg",
|
|
91
|
+
"**/*.svg",
|
|
92
|
+
"**/*.webp",
|
|
93
|
+
"**/LICENSE*",
|
|
94
|
+
]
|