MacroSignage 0.2.0__tar.gz → 0.2.2__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.
Files changed (156) hide show
  1. macrosignage-0.2.2/PKG-INFO +166 -0
  2. macrosignage-0.2.2/README.md +126 -0
  3. macrosignage-0.2.2/pyproject.toml +95 -0
  4. macrosignage-0.2.2/setup.cfg +4 -0
  5. macrosignage-0.2.2/src/MacroSignage.egg-info/PKG-INFO +166 -0
  6. macrosignage-0.2.2/src/MacroSignage.egg-info/SOURCES.txt +122 -0
  7. macrosignage-0.2.2/src/MacroSignage.egg-info/dependency_links.txt +1 -0
  8. macrosignage-0.2.2/src/MacroSignage.egg-info/entry_points.txt +3 -0
  9. macrosignage-0.2.2/src/MacroSignage.egg-info/requires.txt +10 -0
  10. macrosignage-0.2.2/src/MacroSignage.egg-info/top_level.txt +1 -0
  11. macrosignage-0.2.2/src/macrosignage/__init__.py +4 -0
  12. macrosignage-0.2.2/src/macrosignage/app.py +265 -0
  13. macrosignage-0.2.2/src/macrosignage/cli.py +83 -0
  14. macrosignage-0.2.2/src/macrosignage/config.py +178 -0
  15. macrosignage-0.2.2/src/macrosignage/diagnostics.py +101 -0
  16. macrosignage-0.2.2/src/macrosignage/extensions.py +9 -0
  17. macrosignage-0.2.2/src/macrosignage/features/__init__.py +10 -0
  18. macrosignage-0.2.2/src/macrosignage/features/admin/__init__.py +0 -0
  19. macrosignage-0.2.2/src/macrosignage/features/admin/forms.py +98 -0
  20. macrosignage-0.2.2/src/macrosignage/features/admin/models.py +41 -0
  21. macrosignage-0.2.2/src/macrosignage/features/admin/routes.py +246 -0
  22. macrosignage-0.2.2/src/macrosignage/features/admin/services.py +177 -0
  23. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/api_tokens/list.html +117 -0
  24. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/dashboard.html +94 -0
  25. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/database.html +174 -0
  26. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/displays/detail.html +201 -0
  27. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/displays/form.html +126 -0
  28. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/displays/list.html +100 -0
  29. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/fonts/form.html +87 -0
  30. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/fonts/list.html +75 -0
  31. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/logo.html +95 -0
  32. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/media/detail.html +182 -0
  33. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/media/form.html +369 -0
  34. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/media/list.html +106 -0
  35. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/schedules/detail.html +150 -0
  36. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/schedules/form.html +178 -0
  37. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/schedules/list.html +108 -0
  38. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/settings.html +145 -0
  39. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/users/detail.html +55 -0
  40. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/users/form.html +112 -0
  41. macrosignage-0.2.2/src/macrosignage/features/admin/templates/admin/users/list.html +83 -0
  42. macrosignage-0.2.2/src/macrosignage/features/api/__init__.py +3 -0
  43. macrosignage-0.2.2/src/macrosignage/features/api/routes.py +498 -0
  44. macrosignage-0.2.2/src/macrosignage/features/api/serializers.py +129 -0
  45. macrosignage-0.2.2/src/macrosignage/features/associations.py +26 -0
  46. macrosignage-0.2.2/src/macrosignage/features/auth/__init__.py +0 -0
  47. macrosignage-0.2.2/src/macrosignage/features/auth/api_token_forms.py +26 -0
  48. macrosignage-0.2.2/src/macrosignage/features/auth/forms.py +110 -0
  49. macrosignage-0.2.2/src/macrosignage/features/auth/models.py +55 -0
  50. macrosignage-0.2.2/src/macrosignage/features/auth/permissions.py +78 -0
  51. macrosignage-0.2.2/src/macrosignage/features/auth/routes.py +282 -0
  52. macrosignage-0.2.2/src/macrosignage/features/auth/services.py +201 -0
  53. macrosignage-0.2.2/src/macrosignage/features/auth/templates/auth/login.html +50 -0
  54. macrosignage-0.2.2/src/macrosignage/features/auth/templates/auth/password_reset_form.html +40 -0
  55. macrosignage-0.2.2/src/macrosignage/features/auth/templates/auth/password_reset_request.html +38 -0
  56. macrosignage-0.2.2/src/macrosignage/features/auth/templates/auth/setup.html +68 -0
  57. macrosignage-0.2.2/src/macrosignage/features/auth/token_routes.py +88 -0
  58. macrosignage-0.2.2/src/macrosignage/features/displays/__init__.py +3 -0
  59. macrosignage-0.2.2/src/macrosignage/features/displays/forms.py +58 -0
  60. macrosignage-0.2.2/src/macrosignage/features/displays/models.py +48 -0
  61. macrosignage-0.2.2/src/macrosignage/features/displays/routes.py +311 -0
  62. macrosignage-0.2.2/src/macrosignage/features/displays/services.py +197 -0
  63. macrosignage-0.2.2/src/macrosignage/features/displays/templates/displays/maintenance.html +12 -0
  64. macrosignage-0.2.2/src/macrosignage/features/displays/templates/displays/offline.html +12 -0
  65. macrosignage-0.2.2/src/macrosignage/features/displays/templates/displays/pair_failed.html +11 -0
  66. macrosignage-0.2.2/src/macrosignage/features/displays/templates/displays/player.html +103 -0
  67. macrosignage-0.2.2/src/macrosignage/features/displays/templates/displays/unauthorized.html +24 -0
  68. macrosignage-0.2.2/src/macrosignage/features/media/__init__.py +3 -0
  69. macrosignage-0.2.2/src/macrosignage/features/media/forms.py +308 -0
  70. macrosignage-0.2.2/src/macrosignage/features/media/models.py +115 -0
  71. macrosignage-0.2.2/src/macrosignage/features/media/routes.py +208 -0
  72. macrosignage-0.2.2/src/macrosignage/features/media/services.py +190 -0
  73. macrosignage-0.2.2/src/macrosignage/features/schedules/__init__.py +3 -0
  74. macrosignage-0.2.2/src/macrosignage/features/schedules/forms.py +97 -0
  75. macrosignage-0.2.2/src/macrosignage/features/schedules/models.py +46 -0
  76. macrosignage-0.2.2/src/macrosignage/features/schedules/routes.py +113 -0
  77. macrosignage-0.2.2/src/macrosignage/features/schedules/services.py +31 -0
  78. macrosignage-0.2.2/src/macrosignage/static/css/main.css +1683 -0
  79. macrosignage-0.2.2/src/macrosignage/static/css/theme.css +40 -0
  80. macrosignage-0.2.2/src/macrosignage/static/img/bg/bg-dust-corner-bl.png +0 -0
  81. macrosignage-0.2.2/src/macrosignage/static/img/bg/bg-dust-corner-br.png +0 -0
  82. macrosignage-0.2.2/src/macrosignage/static/img/bg/bg-dust-corner-tl.png +0 -0
  83. macrosignage-0.2.2/src/macrosignage/static/img/bg/bg-dust-corner-tr.png +0 -0
  84. macrosignage-0.2.2/src/macrosignage/static/img/bg/bg-dust-overlay.png +0 -0
  85. macrosignage-0.2.2/src/macrosignage/static/img/bg/bg-dust-overlay.webp +0 -0
  86. macrosignage-0.2.2/src/macrosignage/static/img/bg/bg-mask.png +0 -0
  87. macrosignage-0.2.2/src/macrosignage/static/img/bg/bg-pattern-embedded.svg +8 -0
  88. macrosignage-0.2.2/src/macrosignage/static/img/bg/bg-pattern.svg +9 -0
  89. macrosignage-0.2.2/src/macrosignage/static/img/bg/bg-tile-1024.png +0 -0
  90. macrosignage-0.2.2/src/macrosignage/static/img/bg/bg-tile-1024.webp +0 -0
  91. macrosignage-0.2.2/src/macrosignage/static/js/display-player.js +181 -0
  92. macrosignage-0.2.2/src/macrosignage/static/js/main.js +130 -0
  93. macrosignage-0.2.2/src/macrosignage/static/vendor/animate/LICENSE +21 -0
  94. macrosignage-0.2.2/src/macrosignage/static/vendor/animate/animate.css +4072 -0
  95. macrosignage-0.2.2/src/macrosignage/static/vendor/animate/animate.min.css +7 -0
  96. macrosignage-0.2.2/src/macrosignage/static/vendor/bootstrap/LICENSE +21 -0
  97. macrosignage-0.2.2/src/macrosignage/static/vendor/bootstrap/css/bootstrap.min.css +6 -0
  98. macrosignage-0.2.2/src/macrosignage/static/vendor/bootstrap/css/bootstrap.min.css.map +1 -0
  99. macrosignage-0.2.2/src/macrosignage/static/vendor/bootstrap/js/bootstrap.bundle.min.js +7 -0
  100. macrosignage-0.2.2/src/macrosignage/static/vendor/bootstrap/js/bootstrap.bundle.min.js.map +1 -0
  101. macrosignage-0.2.2/src/macrosignage/templates/errors/500.html +12 -0
  102. macrosignage-0.2.2/src/macrosignage/templates/layouts/_base.html +23 -0
  103. macrosignage-0.2.2/src/macrosignage/templates/layouts/admin.html +139 -0
  104. macrosignage-0.2.2/src/macrosignage/templates/layouts/auth.html +26 -0
  105. macrosignage-0.2.2/src/macrosignage/templates/pages/index.html +76 -0
  106. macrosignage-0.2.2/src/macrosignage/time_utils.py +47 -0
  107. macrosignage-0.2.2/src/macrosignage/web/__init__.py +0 -0
  108. macrosignage-0.2.2/src/macrosignage/web/routes.py +8 -0
  109. macrosignage-0.2.2/src/macrosignage/web/templates/web/index.html +462 -0
  110. macrosignage-0.2.2/tests/test_admin_crud.py +299 -0
  111. macrosignage-0.2.2/tests/test_admin_dashboard.py +113 -0
  112. macrosignage-0.2.2/tests/test_api.py +254 -0
  113. macrosignage-0.2.2/tests/test_auth.py +223 -0
  114. macrosignage-0.2.2/tests/test_cli.py +82 -0
  115. macrosignage-0.2.2/tests/test_client_app.py +50 -0
  116. macrosignage-0.2.2/tests/test_config.py +485 -0
  117. macrosignage-0.2.2/tests/test_display_player.py +435 -0
  118. macrosignage-0.2.2/tests/test_docs.py +103 -0
  119. macrosignage-0.2.2/tests/test_operational_readiness.py +44 -0
  120. macrosignage-0.2.2/tests/test_production_hardening.py +184 -0
  121. macrosignage-0.2.2/tests/test_release_workflows.py +56 -0
  122. macrosignage-0.2.2/tests/test_slider_media.py +214 -0
  123. macrosignage-0.2.2/tests/test_v05_polish_scale.py +233 -0
  124. macrosignage-0.2.0/.gitignore +0 -248
  125. macrosignage-0.2.0/PKG-INFO +0 -86
  126. macrosignage-0.2.0/README.md +0 -57
  127. macrosignage-0.2.0/pyproject.toml +0 -57
  128. macrosignage-0.2.0/src/macrosignage/__init__.py +0 -80
  129. macrosignage-0.2.0/src/macrosignage/blueprints/__init__.py +0 -3
  130. macrosignage-0.2.0/src/macrosignage/blueprints/core/__init__.py +0 -130
  131. macrosignage-0.2.0/src/macrosignage/blueprints/core/forms.py +0 -11
  132. macrosignage-0.2.0/src/macrosignage/blueprints/core/models.py +0 -98
  133. macrosignage-0.2.0/src/macrosignage/blueprints/core/templates/core/display.html +0 -33
  134. macrosignage-0.2.0/src/macrosignage/blueprints/core/templates/core/display_list.html +0 -57
  135. macrosignage-0.2.0/src/macrosignage/blueprints/core/templates/core/display_slides.html +0 -149
  136. macrosignage-0.2.0/src/macrosignage/blueprints/core/templates/core/index.html +0 -21
  137. macrosignage-0.2.0/src/macrosignage/blueprints/core/templates/core/slides.html +0 -40
  138. macrosignage-0.2.0/src/macrosignage/cli.py +0 -21
  139. macrosignage-0.2.0/src/macrosignage/config.py +0 -32
  140. macrosignage-0.2.0/src/macrosignage/extensions.py +0 -41
  141. macrosignage-0.2.0/src/macrosignage/ui/static/css/animate.css +0 -4367
  142. macrosignage-0.2.0/src/macrosignage/ui/static/css/animate.min.css +0 -9
  143. macrosignage-0.2.0/src/macrosignage/ui/static/css/icons.css +0 -23
  144. macrosignage-0.2.0/src/macrosignage/ui/static/css/icons.min.css +0 -1
  145. macrosignage-0.2.0/src/macrosignage/ui/static/css/main.css +0 -194
  146. macrosignage-0.2.0/src/macrosignage/ui/static/css/main.min.css +0 -7
  147. macrosignage-0.2.0/src/macrosignage/ui/static/css/materialize.css +0 -9297
  148. macrosignage-0.2.0/src/macrosignage/ui/static/css/materialize.min.css +0 -16
  149. macrosignage-0.2.0/src/macrosignage/ui/static/js/main.js +0 -73
  150. macrosignage-0.2.0/src/macrosignage/ui/static/js/main.min.js +0 -1
  151. macrosignage-0.2.0/src/macrosignage/ui/static/js/materialize.js +0 -13094
  152. macrosignage-0.2.0/src/macrosignage/ui/static/js/materialize.min.js +0 -1
  153. macrosignage-0.2.0/src/macrosignage/ui/templates/layouts/base.html +0 -23
  154. macrosignage-0.2.0/src/macrosignage/utils/__init__.py +0 -201
  155. macrosignage-0.2.0/src/macrosignage/utils/sql.py +0 -44
  156. {macrosignage-0.2.0 → macrosignage-0.2.2}/LICENSE +0 -0
@@ -0,0 +1,166 @@
1
+ Metadata-Version: 2.4
2
+ Name: MacroSignage
3
+ Version: 0.2.2
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
+ [![PyPI version](https://img.shields.io/pypi/v/MacroSignage)](https://pypi.org/project/MacroSignage/)
44
+ [![Python versions](https://img.shields.io/pypi/pyversions/MacroSignage)](https://pypi.org/project/MacroSignage/)
45
+ [![License](https://img.shields.io/github/license/BaezFJ/MacroSignage)](LICENSE)
46
+ [![CI](https://github.com/BaezFJ/MacroSignage/actions/workflows/ci.yml/badge.svg)](https://github.com/BaezFJ/MacroSignage/actions/workflows/ci.yml)
47
+
48
+ MacroSignage is a Flask-based digital signage manager with an admin console, token-secured display players, scheduling, media playback, REST API access, and a standalone pywebview display client.
49
+
50
+ > **Status:** Pre-alpha v0.2.2. Data models and API contracts can change before v1.0.
51
+
52
+ ## Features
53
+
54
+ - Admin dashboard with recent activity, diagnostics, and settings pages.
55
+ - Display CRUD with online, offline, and maintenance states.
56
+ - Token-secured display player pairing with remote disable/rotation.
57
+ - Media CRUD for images, text, video, HTML, YouTube, and slider media.
58
+ - Slider media with backgrounds, foreground images, fonts, positions, durations, and Animate.css effects.
59
+ - Schedule CRUD with active windows, weekday rules, display targets, playlists, and no-active-schedule fallback.
60
+ - Auth, password reset flow, user CRUD, RBAC, and API token lifecycle management.
61
+ - REST API for displays, media, schedules, users, fonts, settings, health, and player playlists.
62
+ - Server-sent events for display player refresh.
63
+ - Global logo overlay settings and managed Google Fonts.
64
+ - SQLite by default with configurable Flask-SQLAlchemy database URI support.
65
+ - Waitress-backed production CLI plus systemd and Docker examples.
66
+ - Separate pywebview client package with GitHub Release executables.
67
+
68
+ ## Quick Start
69
+
70
+ Install from PyPI:
71
+
72
+ ```bash
73
+ pip install MacroSignage
74
+ macrosignage dev
75
+ ```
76
+
77
+ Or run from source:
78
+
79
+ ```bash
80
+ git clone https://github.com/BaezFJ/MacroSignage.git
81
+ cd MacroSignage
82
+ uv sync --all-groups
83
+ cp .env.example .env
84
+ uv run macrosignage dev
85
+ ```
86
+
87
+ Open `http://127.0.0.1:5000`, then create the first admin account at `/auth/setup`.
88
+
89
+ ## Production
90
+
91
+ Use the dedicated production script behind a reverse proxy:
92
+
93
+ ```bash
94
+ MACROSIGNAGE_SECRET_KEY='replace-with-a-long-random-secret' \
95
+ MACROSIGNAGE_DATABASE_URI='sqlite:////var/lib/macrosignage/macrosignage.sqlite3' \
96
+ MACROSIGNAGE_MEDIA_UPLOAD_FOLDER='/var/lib/macrosignage/media' \
97
+ MACROSIGNAGE_SESSION_COOKIE_SECURE=true \
98
+ macrosignage-prod --host 127.0.0.1 --port 8080 --threads 4
99
+ ```
100
+
101
+ See [Deployment](docs/deployment.md) for systemd, Docker, HTTPS, health checks, backups, restore, and rollback.
102
+
103
+ ## Client Executables
104
+
105
+ Prebuilt standalone display client executables are available on the GitHub Releases page:
106
+
107
+ ```text
108
+ https://github.com/BaezFJ/MacroSignage/releases
109
+ ```
110
+
111
+ The client source package lives in `client/`. See [Standalone Client](docs/client.md).
112
+
113
+ ## Documentation
114
+
115
+ Start with [docs/index.md](docs/index.md).
116
+
117
+ Core guides:
118
+
119
+ - [Installation](docs/installation.md)
120
+ - [Configuration](docs/configuration.md)
121
+ - [Auth and RBAC](docs/auth-rbac.md)
122
+ - [Display Management and Player Pairing](docs/displays.md)
123
+ - [Media Library](docs/media.md)
124
+ - [Scheduling and Playback](docs/scheduling.md)
125
+ - [REST API](docs/rest-api.md)
126
+ - [API Tokens](docs/api-tokens.md)
127
+ - [Deployment](docs/deployment.md)
128
+ - [Troubleshooting](docs/troubleshooting.md)
129
+ - [Development](docs/development.md)
130
+ - [Architecture](docs/architecture.md)
131
+
132
+ ## Development Commands
133
+
134
+ ```bash
135
+ uv lock --check
136
+ uv run python -m pytest
137
+ uv run python -m unittest discover -s tests
138
+ uv run python -m compileall src/macrosignage tests
139
+ uv build
140
+ uv run twine check dist/*
141
+ ```
142
+
143
+ ## Release Automation
144
+
145
+ - CI runs on pull requests and pushes to `main`.
146
+ - PyPI publishing runs when a `v*` tag is pushed.
147
+ - Client executable build and release workflows produce Windows, macOS, and Linux assets.
148
+ - Release documentation review is tracked in [the checklist](docs/release-documentation-checklist.md).
149
+
150
+ ## v1.0 Remaining Work
151
+
152
+ - [ ] Production-hardened and fully tested ([roadmap](docs/production-hardening-roadmap.md))
153
+ - [x] Complete documentation ([roadmap](docs/documentation-roadmap.md))
154
+ - [x] Deployment guides for Docker, systemd, health checks, backups, and rollback
155
+
156
+ ## License
157
+
158
+ MacroSignage is licensed under the MIT License. See [LICENSE](LICENSE).
159
+
160
+ Copyright (c) 2022 Javier Baez
161
+
162
+ ## Links
163
+
164
+ [GitHub Repository](https://github.com/BaezFJ/MacroSignage) |
165
+ [PyPI Package](https://pypi.org/project/MacroSignage/) |
166
+ [Issue Tracker](https://github.com/BaezFJ/MacroSignage/issues)
@@ -0,0 +1,126 @@
1
+ # MacroSignage
2
+
3
+ [![PyPI version](https://img.shields.io/pypi/v/MacroSignage)](https://pypi.org/project/MacroSignage/)
4
+ [![Python versions](https://img.shields.io/pypi/pyversions/MacroSignage)](https://pypi.org/project/MacroSignage/)
5
+ [![License](https://img.shields.io/github/license/BaezFJ/MacroSignage)](LICENSE)
6
+ [![CI](https://github.com/BaezFJ/MacroSignage/actions/workflows/ci.yml/badge.svg)](https://github.com/BaezFJ/MacroSignage/actions/workflows/ci.yml)
7
+
8
+ MacroSignage is a Flask-based digital signage manager with an admin console, token-secured display players, scheduling, media playback, REST API access, and a standalone pywebview display client.
9
+
10
+ > **Status:** Pre-alpha v0.2.2. Data models and API contracts can change before v1.0.
11
+
12
+ ## Features
13
+
14
+ - Admin dashboard with recent activity, diagnostics, and settings pages.
15
+ - Display CRUD with online, offline, and maintenance states.
16
+ - Token-secured display player pairing with remote disable/rotation.
17
+ - Media CRUD for images, text, video, HTML, YouTube, and slider media.
18
+ - Slider media with backgrounds, foreground images, fonts, positions, durations, and Animate.css effects.
19
+ - Schedule CRUD with active windows, weekday rules, display targets, playlists, and no-active-schedule fallback.
20
+ - Auth, password reset flow, user CRUD, RBAC, and API token lifecycle management.
21
+ - REST API for displays, media, schedules, users, fonts, settings, health, and player playlists.
22
+ - Server-sent events for display player refresh.
23
+ - Global logo overlay settings and managed Google Fonts.
24
+ - SQLite by default with configurable Flask-SQLAlchemy database URI support.
25
+ - Waitress-backed production CLI plus systemd and Docker examples.
26
+ - Separate pywebview client package with GitHub Release executables.
27
+
28
+ ## Quick Start
29
+
30
+ Install from PyPI:
31
+
32
+ ```bash
33
+ pip install MacroSignage
34
+ macrosignage dev
35
+ ```
36
+
37
+ Or run from source:
38
+
39
+ ```bash
40
+ git clone https://github.com/BaezFJ/MacroSignage.git
41
+ cd MacroSignage
42
+ uv sync --all-groups
43
+ cp .env.example .env
44
+ uv run macrosignage dev
45
+ ```
46
+
47
+ Open `http://127.0.0.1:5000`, then create the first admin account at `/auth/setup`.
48
+
49
+ ## Production
50
+
51
+ Use the dedicated production script behind a reverse proxy:
52
+
53
+ ```bash
54
+ MACROSIGNAGE_SECRET_KEY='replace-with-a-long-random-secret' \
55
+ MACROSIGNAGE_DATABASE_URI='sqlite:////var/lib/macrosignage/macrosignage.sqlite3' \
56
+ MACROSIGNAGE_MEDIA_UPLOAD_FOLDER='/var/lib/macrosignage/media' \
57
+ MACROSIGNAGE_SESSION_COOKIE_SECURE=true \
58
+ macrosignage-prod --host 127.0.0.1 --port 8080 --threads 4
59
+ ```
60
+
61
+ See [Deployment](docs/deployment.md) for systemd, Docker, HTTPS, health checks, backups, restore, and rollback.
62
+
63
+ ## Client Executables
64
+
65
+ Prebuilt standalone display client executables are available on the GitHub Releases page:
66
+
67
+ ```text
68
+ https://github.com/BaezFJ/MacroSignage/releases
69
+ ```
70
+
71
+ The client source package lives in `client/`. See [Standalone Client](docs/client.md).
72
+
73
+ ## Documentation
74
+
75
+ Start with [docs/index.md](docs/index.md).
76
+
77
+ Core guides:
78
+
79
+ - [Installation](docs/installation.md)
80
+ - [Configuration](docs/configuration.md)
81
+ - [Auth and RBAC](docs/auth-rbac.md)
82
+ - [Display Management and Player Pairing](docs/displays.md)
83
+ - [Media Library](docs/media.md)
84
+ - [Scheduling and Playback](docs/scheduling.md)
85
+ - [REST API](docs/rest-api.md)
86
+ - [API Tokens](docs/api-tokens.md)
87
+ - [Deployment](docs/deployment.md)
88
+ - [Troubleshooting](docs/troubleshooting.md)
89
+ - [Development](docs/development.md)
90
+ - [Architecture](docs/architecture.md)
91
+
92
+ ## Development Commands
93
+
94
+ ```bash
95
+ uv lock --check
96
+ uv run python -m pytest
97
+ uv run python -m unittest discover -s tests
98
+ uv run python -m compileall src/macrosignage tests
99
+ uv build
100
+ uv run twine check dist/*
101
+ ```
102
+
103
+ ## Release Automation
104
+
105
+ - CI runs on pull requests and pushes to `main`.
106
+ - PyPI publishing runs when a `v*` tag is pushed.
107
+ - Client executable build and release workflows produce Windows, macOS, and Linux assets.
108
+ - Release documentation review is tracked in [the checklist](docs/release-documentation-checklist.md).
109
+
110
+ ## v1.0 Remaining Work
111
+
112
+ - [ ] Production-hardened and fully tested ([roadmap](docs/production-hardening-roadmap.md))
113
+ - [x] Complete documentation ([roadmap](docs/documentation-roadmap.md))
114
+ - [x] Deployment guides for Docker, systemd, health checks, backups, and rollback
115
+
116
+ ## License
117
+
118
+ MacroSignage is licensed under the MIT License. See [LICENSE](LICENSE).
119
+
120
+ Copyright (c) 2022 Javier Baez
121
+
122
+ ## Links
123
+
124
+ [GitHub Repository](https://github.com/BaezFJ/MacroSignage) |
125
+ [PyPI Package](https://pypi.org/project/MacroSignage/) |
126
+ [Issue Tracker](https://github.com/BaezFJ/MacroSignage/issues)
@@ -0,0 +1,95 @@
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.2"
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
+ macrosignage-prod = "macrosignage.cli:prod_main"
63
+
64
+ [dependency-groups]
65
+ dev = [
66
+ "build>=1.5.0",
67
+ "pytest>=8.4.2",
68
+ "twine>=6.2.0",
69
+ ]
70
+
71
+ [tool.pytest.ini_options]
72
+ testpaths = ["tests"]
73
+ pythonpath = ["src"]
74
+
75
+ [tool.setuptools]
76
+ include-package-data = false
77
+
78
+ [tool.setuptools.packages.find]
79
+ where = ["src"]
80
+ exclude = ["tests*"]
81
+ namespaces = false
82
+
83
+ [tool.setuptools.package-data]
84
+ macrosignage = [
85
+ "**/*.html",
86
+ "**/*.css",
87
+ "**/*.js",
88
+ "**/*.map",
89
+ "**/*.json",
90
+ "**/*.png",
91
+ "**/*.jpg",
92
+ "**/*.svg",
93
+ "**/*.webp",
94
+ "**/LICENSE*",
95
+ ]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,166 @@
1
+ Metadata-Version: 2.4
2
+ Name: MacroSignage
3
+ Version: 0.2.2
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
+ [![PyPI version](https://img.shields.io/pypi/v/MacroSignage)](https://pypi.org/project/MacroSignage/)
44
+ [![Python versions](https://img.shields.io/pypi/pyversions/MacroSignage)](https://pypi.org/project/MacroSignage/)
45
+ [![License](https://img.shields.io/github/license/BaezFJ/MacroSignage)](LICENSE)
46
+ [![CI](https://github.com/BaezFJ/MacroSignage/actions/workflows/ci.yml/badge.svg)](https://github.com/BaezFJ/MacroSignage/actions/workflows/ci.yml)
47
+
48
+ MacroSignage is a Flask-based digital signage manager with an admin console, token-secured display players, scheduling, media playback, REST API access, and a standalone pywebview display client.
49
+
50
+ > **Status:** Pre-alpha v0.2.2. Data models and API contracts can change before v1.0.
51
+
52
+ ## Features
53
+
54
+ - Admin dashboard with recent activity, diagnostics, and settings pages.
55
+ - Display CRUD with online, offline, and maintenance states.
56
+ - Token-secured display player pairing with remote disable/rotation.
57
+ - Media CRUD for images, text, video, HTML, YouTube, and slider media.
58
+ - Slider media with backgrounds, foreground images, fonts, positions, durations, and Animate.css effects.
59
+ - Schedule CRUD with active windows, weekday rules, display targets, playlists, and no-active-schedule fallback.
60
+ - Auth, password reset flow, user CRUD, RBAC, and API token lifecycle management.
61
+ - REST API for displays, media, schedules, users, fonts, settings, health, and player playlists.
62
+ - Server-sent events for display player refresh.
63
+ - Global logo overlay settings and managed Google Fonts.
64
+ - SQLite by default with configurable Flask-SQLAlchemy database URI support.
65
+ - Waitress-backed production CLI plus systemd and Docker examples.
66
+ - Separate pywebview client package with GitHub Release executables.
67
+
68
+ ## Quick Start
69
+
70
+ Install from PyPI:
71
+
72
+ ```bash
73
+ pip install MacroSignage
74
+ macrosignage dev
75
+ ```
76
+
77
+ Or run from source:
78
+
79
+ ```bash
80
+ git clone https://github.com/BaezFJ/MacroSignage.git
81
+ cd MacroSignage
82
+ uv sync --all-groups
83
+ cp .env.example .env
84
+ uv run macrosignage dev
85
+ ```
86
+
87
+ Open `http://127.0.0.1:5000`, then create the first admin account at `/auth/setup`.
88
+
89
+ ## Production
90
+
91
+ Use the dedicated production script behind a reverse proxy:
92
+
93
+ ```bash
94
+ MACROSIGNAGE_SECRET_KEY='replace-with-a-long-random-secret' \
95
+ MACROSIGNAGE_DATABASE_URI='sqlite:////var/lib/macrosignage/macrosignage.sqlite3' \
96
+ MACROSIGNAGE_MEDIA_UPLOAD_FOLDER='/var/lib/macrosignage/media' \
97
+ MACROSIGNAGE_SESSION_COOKIE_SECURE=true \
98
+ macrosignage-prod --host 127.0.0.1 --port 8080 --threads 4
99
+ ```
100
+
101
+ See [Deployment](docs/deployment.md) for systemd, Docker, HTTPS, health checks, backups, restore, and rollback.
102
+
103
+ ## Client Executables
104
+
105
+ Prebuilt standalone display client executables are available on the GitHub Releases page:
106
+
107
+ ```text
108
+ https://github.com/BaezFJ/MacroSignage/releases
109
+ ```
110
+
111
+ The client source package lives in `client/`. See [Standalone Client](docs/client.md).
112
+
113
+ ## Documentation
114
+
115
+ Start with [docs/index.md](docs/index.md).
116
+
117
+ Core guides:
118
+
119
+ - [Installation](docs/installation.md)
120
+ - [Configuration](docs/configuration.md)
121
+ - [Auth and RBAC](docs/auth-rbac.md)
122
+ - [Display Management and Player Pairing](docs/displays.md)
123
+ - [Media Library](docs/media.md)
124
+ - [Scheduling and Playback](docs/scheduling.md)
125
+ - [REST API](docs/rest-api.md)
126
+ - [API Tokens](docs/api-tokens.md)
127
+ - [Deployment](docs/deployment.md)
128
+ - [Troubleshooting](docs/troubleshooting.md)
129
+ - [Development](docs/development.md)
130
+ - [Architecture](docs/architecture.md)
131
+
132
+ ## Development Commands
133
+
134
+ ```bash
135
+ uv lock --check
136
+ uv run python -m pytest
137
+ uv run python -m unittest discover -s tests
138
+ uv run python -m compileall src/macrosignage tests
139
+ uv build
140
+ uv run twine check dist/*
141
+ ```
142
+
143
+ ## Release Automation
144
+
145
+ - CI runs on pull requests and pushes to `main`.
146
+ - PyPI publishing runs when a `v*` tag is pushed.
147
+ - Client executable build and release workflows produce Windows, macOS, and Linux assets.
148
+ - Release documentation review is tracked in [the checklist](docs/release-documentation-checklist.md).
149
+
150
+ ## v1.0 Remaining Work
151
+
152
+ - [ ] Production-hardened and fully tested ([roadmap](docs/production-hardening-roadmap.md))
153
+ - [x] Complete documentation ([roadmap](docs/documentation-roadmap.md))
154
+ - [x] Deployment guides for Docker, systemd, health checks, backups, and rollback
155
+
156
+ ## License
157
+
158
+ MacroSignage is licensed under the MIT License. See [LICENSE](LICENSE).
159
+
160
+ Copyright (c) 2022 Javier Baez
161
+
162
+ ## Links
163
+
164
+ [GitHub Repository](https://github.com/BaezFJ/MacroSignage) |
165
+ [PyPI Package](https://pypi.org/project/MacroSignage/) |
166
+ [Issue Tracker](https://github.com/BaezFJ/MacroSignage/issues)
@@ -0,0 +1,122 @@
1
+ LICENSE
2
+ README.md
3
+ pyproject.toml
4
+ src/MacroSignage.egg-info/PKG-INFO
5
+ src/MacroSignage.egg-info/SOURCES.txt
6
+ src/MacroSignage.egg-info/dependency_links.txt
7
+ src/MacroSignage.egg-info/entry_points.txt
8
+ src/MacroSignage.egg-info/requires.txt
9
+ src/MacroSignage.egg-info/top_level.txt
10
+ src/macrosignage/__init__.py
11
+ src/macrosignage/app.py
12
+ src/macrosignage/cli.py
13
+ src/macrosignage/config.py
14
+ src/macrosignage/diagnostics.py
15
+ src/macrosignage/extensions.py
16
+ src/macrosignage/time_utils.py
17
+ src/macrosignage/features/__init__.py
18
+ src/macrosignage/features/associations.py
19
+ src/macrosignage/features/admin/__init__.py
20
+ src/macrosignage/features/admin/forms.py
21
+ src/macrosignage/features/admin/models.py
22
+ src/macrosignage/features/admin/routes.py
23
+ src/macrosignage/features/admin/services.py
24
+ src/macrosignage/features/admin/templates/admin/dashboard.html
25
+ src/macrosignage/features/admin/templates/admin/database.html
26
+ src/macrosignage/features/admin/templates/admin/logo.html
27
+ src/macrosignage/features/admin/templates/admin/settings.html
28
+ src/macrosignage/features/admin/templates/admin/api_tokens/list.html
29
+ src/macrosignage/features/admin/templates/admin/displays/detail.html
30
+ src/macrosignage/features/admin/templates/admin/displays/form.html
31
+ src/macrosignage/features/admin/templates/admin/displays/list.html
32
+ src/macrosignage/features/admin/templates/admin/fonts/form.html
33
+ src/macrosignage/features/admin/templates/admin/fonts/list.html
34
+ src/macrosignage/features/admin/templates/admin/media/detail.html
35
+ src/macrosignage/features/admin/templates/admin/media/form.html
36
+ src/macrosignage/features/admin/templates/admin/media/list.html
37
+ src/macrosignage/features/admin/templates/admin/schedules/detail.html
38
+ src/macrosignage/features/admin/templates/admin/schedules/form.html
39
+ src/macrosignage/features/admin/templates/admin/schedules/list.html
40
+ src/macrosignage/features/admin/templates/admin/users/detail.html
41
+ src/macrosignage/features/admin/templates/admin/users/form.html
42
+ src/macrosignage/features/admin/templates/admin/users/list.html
43
+ src/macrosignage/features/api/__init__.py
44
+ src/macrosignage/features/api/routes.py
45
+ src/macrosignage/features/api/serializers.py
46
+ src/macrosignage/features/auth/__init__.py
47
+ src/macrosignage/features/auth/api_token_forms.py
48
+ src/macrosignage/features/auth/forms.py
49
+ src/macrosignage/features/auth/models.py
50
+ src/macrosignage/features/auth/permissions.py
51
+ src/macrosignage/features/auth/routes.py
52
+ src/macrosignage/features/auth/services.py
53
+ src/macrosignage/features/auth/token_routes.py
54
+ src/macrosignage/features/auth/templates/auth/login.html
55
+ src/macrosignage/features/auth/templates/auth/password_reset_form.html
56
+ src/macrosignage/features/auth/templates/auth/password_reset_request.html
57
+ src/macrosignage/features/auth/templates/auth/setup.html
58
+ src/macrosignage/features/displays/__init__.py
59
+ src/macrosignage/features/displays/forms.py
60
+ src/macrosignage/features/displays/models.py
61
+ src/macrosignage/features/displays/routes.py
62
+ src/macrosignage/features/displays/services.py
63
+ src/macrosignage/features/displays/templates/displays/maintenance.html
64
+ src/macrosignage/features/displays/templates/displays/offline.html
65
+ src/macrosignage/features/displays/templates/displays/pair_failed.html
66
+ src/macrosignage/features/displays/templates/displays/player.html
67
+ src/macrosignage/features/displays/templates/displays/unauthorized.html
68
+ src/macrosignage/features/media/__init__.py
69
+ src/macrosignage/features/media/forms.py
70
+ src/macrosignage/features/media/models.py
71
+ src/macrosignage/features/media/routes.py
72
+ src/macrosignage/features/media/services.py
73
+ src/macrosignage/features/schedules/__init__.py
74
+ src/macrosignage/features/schedules/forms.py
75
+ src/macrosignage/features/schedules/models.py
76
+ src/macrosignage/features/schedules/routes.py
77
+ src/macrosignage/features/schedules/services.py
78
+ src/macrosignage/static/css/main.css
79
+ src/macrosignage/static/css/theme.css
80
+ src/macrosignage/static/img/bg/bg-dust-corner-bl.png
81
+ src/macrosignage/static/img/bg/bg-dust-corner-br.png
82
+ src/macrosignage/static/img/bg/bg-dust-corner-tl.png
83
+ src/macrosignage/static/img/bg/bg-dust-corner-tr.png
84
+ src/macrosignage/static/img/bg/bg-dust-overlay.png
85
+ src/macrosignage/static/img/bg/bg-dust-overlay.webp
86
+ src/macrosignage/static/img/bg/bg-mask.png
87
+ src/macrosignage/static/img/bg/bg-pattern-embedded.svg
88
+ src/macrosignage/static/img/bg/bg-pattern.svg
89
+ src/macrosignage/static/img/bg/bg-tile-1024.png
90
+ src/macrosignage/static/img/bg/bg-tile-1024.webp
91
+ src/macrosignage/static/js/display-player.js
92
+ src/macrosignage/static/js/main.js
93
+ src/macrosignage/static/vendor/animate/LICENSE
94
+ src/macrosignage/static/vendor/animate/animate.css
95
+ src/macrosignage/static/vendor/animate/animate.min.css
96
+ src/macrosignage/static/vendor/bootstrap/LICENSE
97
+ src/macrosignage/static/vendor/bootstrap/css/bootstrap.min.css
98
+ src/macrosignage/static/vendor/bootstrap/css/bootstrap.min.css.map
99
+ src/macrosignage/static/vendor/bootstrap/js/bootstrap.bundle.min.js
100
+ src/macrosignage/static/vendor/bootstrap/js/bootstrap.bundle.min.js.map
101
+ src/macrosignage/templates/errors/500.html
102
+ src/macrosignage/templates/layouts/_base.html
103
+ src/macrosignage/templates/layouts/admin.html
104
+ src/macrosignage/templates/layouts/auth.html
105
+ src/macrosignage/templates/pages/index.html
106
+ src/macrosignage/web/__init__.py
107
+ src/macrosignage/web/routes.py
108
+ src/macrosignage/web/templates/web/index.html
109
+ tests/test_admin_crud.py
110
+ tests/test_admin_dashboard.py
111
+ tests/test_api.py
112
+ tests/test_auth.py
113
+ tests/test_cli.py
114
+ tests/test_client_app.py
115
+ tests/test_config.py
116
+ tests/test_display_player.py
117
+ tests/test_docs.py
118
+ tests/test_operational_readiness.py
119
+ tests/test_production_hardening.py
120
+ tests/test_release_workflows.py
121
+ tests/test_slider_media.py
122
+ tests/test_v05_polish_scale.py