TODO List
- Supress power save mode
- Trim silence on uploaded assets
- Reject files based on pre-processed file hash
- CSV export to client log entries
- Idiot mode, easy mode, advanced mode
-
Timeout on fetch?(websockets makes this unneeded, except for downloading files) - Attempt to prevent duplicate assets from playing within a certain time period
- Start/end time for assets in client are based on "is likely to play at" time
- Empty rotators are warned on (based on feature flag)
- Deal with non-playable assets (error state ones)
- Compression and selecting output device using a bridge to the web audio API.
- Any custom django admin pages can follow this guide
- Flash whole screen after configurable time with some messaging ("play the promos, station management has been notified")
- Button to get out of fullscreen (useful on Linux)
Changes for 2024 based on real world usage in 2023 and feedback
- Make rotators able to disabled (UI for assets / stopsets needs to show that too)
-
Implement soft delete for assets-- keep the file, but delete the DB entity- Behind the scenes track deleted files.
- Easier way to toggle, simple / standard / advanced view settings in client. Not in settings.
- Change advanced mode copy to "admin" mode
- Build out "switch back to simple mode" timer feature a little better, ie
comma separated times?
- Better datetime picker in admin
- Skip track in stopset when we get to it
-
Mark a bad asset? Interesting. Not sure how it would work.– too difficult to implement, too many opinions, person wishing to flag talks to manager-of-the-moment - Refresh playlist from backend.
Connected client status from backend? Communicate what's in the playlist?- Minimally completed via
RELOAD_PLAYLIST_AFTER_DATA_CHANGES
setting
- Minimally completed via
- Backend client playlist editor
-
Status updates, ie news and traffic? Fullscreen thing?/Custom UI labels unused labels that play every N times (ie for telling the DJ to do something)-- Probably not - Round-robin (or "cycle evenly") rotator scheduling, ignoring weight as an option for a rotator
- Check / validate randomization algorithm
- Validated! Review of algorithm provided by Andy
- Mini-player column in asset list view
- Asset alternates (single asset has 4-5 underlying audio files that are cycled through)
- Backend done
- A large clock in the UI
- Make weights for previous 24 hours... AND reflect that in front-end (day-of
pill) and back-end (sortable)... will require change to
END_DATE_PRIORITY_WEIGHT_MULTIPLIER
- Added day-of-event pill
- Rudimentary stopset editor, in the form of "skip/queue", regenerate asset, and swap asset
- Ability to "audition" assets on a second audio output?
-
Stop playing at end of current asset. (Stop playing in 3s with fadeout as well?)(Covered by skip) - A way to send a custom text notification to all connected clients from backend UI
- Audio visualization with WaveSurfer
- Ability to do speech synthesis / pull asset from API? / weather
- Best cross-platform way to do this might be to use text2wav.node.js to generate WAV files with a timeout
- KLOS color scheme:
#D91E75
,#4B89BF
,#8CBF3F
,#F2D750
, and#D95525
- "Island Mode" with an embedded standalone Python distribution
- Login interstitial to populate with demo data
- Integrated Twilio call board
- Single app client lock (ie only ONE client per username/password)'
- Way to parse filename into rotator, start/end date
- Submit form built into Tomato?
- Silence detection REJECTs audio assets in backend (if there's more than 2 seconds?) (behind FEATURE flag)
- Export all audio assets as zip
- Import as well (have to be careful with different
protocol.json:protocol_version
)
- Import as well (have to be careful with different
- Add configurable silence between ads. Crossfade, with fade points? Fancy!
- Client "Demo mode", requiring no backend with demo assets.
- Button to play an asset from a specific rotator
- Backend done as
SINGLE_PLAY_ROTATORS
- Backend done as
- Cursor can be a fun thing?
- Clickable playbar that seeks?
August 2024 UX review with Miranda Kay
- Button box flashes between assets
-
Switch connected icons with feather wifi on/off - Danger button in settings
- Denser progress radials - decrease to 4rem
- First asset of next stop doesn't show log tooltip if current stop startedPlaying
- Assets queued for skipping should grey out
- Seed, leaf, flower icon for simple, intermediate, advanced
- Alternating grey/white rows in AssetPicker component
- Fix regenerate/swap not working button when wait intervals are disabled
- Seems to be a startup delay. Do profiling to figure it out.
- A
NO_REPEAT_ASSETS_TIME
override - De-dupe multiple uploads better (ie tasks) for the purposes of client reloading
via
RELOAD_PLAYLIST_AFTER_DATA_CHANGES
(batches cause many reloads)- Strip out
django-pgtrigger
(overly complicated), and just overrideModelAdmin
'sdelete_model()
,save_model()
, anddelete_queryset()
methods with hook. For quick actions where a model'supdate()
method is called we'll need to hookget_actions()
, redefining these action functions to call the hook. The hook can proably set a value on the request, that a middleware writes to. Bulk upload will need be marked dirty as well, after processing. Can usepg_notify()
to notify websocket API.
- Strip out
- Fades in controller get choppy after a certain amount of time, likely due to
time.monotonic()
- Always show scrollbars on macOS
- Ability to bulk download assets on asset list view
- Tagging system for all DB models (perhaps using django-taggit)
- Rename 'audio assets' to 'assets'
- Simplify permission system, removing groups and just having superusers + regular users + flags on user model?