Compare commits

..

No commits in common. "v1.2.2" and "v1.2.1" have entirely different histories.

7 changed files with 75 additions and 60 deletions

1
.gitignore vendored
View File

@ -30,7 +30,6 @@ env/
.config/
config*.yaml
!config.yaml.example
.archive/
# Logs
*.log

View File

@ -7,37 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [1.2.2] - 2025-02-25
### Added
- Improved stream reconnection verification with log entries
- Enhanced metadata endpoint discovery with multiple URL patterns
- Expanded error handling and logging for metadata fetching
### Changed
- Refactored stream monitoring for better stability
- Updated metadata parsing to handle varied source formats
- General project cleanup and housekeeping
## [1.2.1] - 2024-07-10
### Fixed
- Stream reconnection edge cases and timeout handling
- JSON metadata parsing reliability
- Various validations
- Removed redundant "(admin only)" text from help command output when admin commands are already grouped under the Admin section
- Improved help command to only show "(admin only)" when a specific admin command is queried
## [1.2.1] - 2025-02-25
### Added
- Improved stream reconnection logic with automatic retry
- Enhanced metadata fetching with better error handling
- Expanded logging for better troubleshooting
### Fixed
- Issue with metadata parsing for certain stream formats
- Stream monitoring stability improvements
- Connection timeout handling
## [1.2.0] - 2025-02-25
## [1.2.0] - 2024-07-01
### Added
- New admin commands:
@ -56,7 +32,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Improved the BotManager class to support the new terminal commands
- Updated configuration example to include the new quiet_on_start option
## [1.0.1] - 2025-02-24
## [1.0.1] - 2024-02-24
### Added
- Configurable logging levels via config.yaml
@ -94,7 +70,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Other
- Added version information
## [1.0.0] - 2025-02-23
## [1.0.0] - 2024-02-23
### Added
- Initial release
@ -105,8 +81,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Multi-bot support
- Configuration via YAML files
[Unreleased]: https://code.cottongin.xyz/cottongin/Icecast-metadata-IRC-announcer/compare/v1.2.2...HEAD
[1.2.2]: https://code.cottongin.xyz/cottongin/Icecast-metadata-IRC-announcer/compare/v1.2.1...v1.2.2
[Unreleased]: https://code.cottongin.xyz/cottongin/Icecast-metadata-IRC-announcer/compare/v1.2.1...HEAD
[1.2.1]: https://code.cottongin.xyz/cottongin/Icecast-metadata-IRC-announcer/compare/v1.2.0...v1.2.1
[1.2.0]: https://code.cottongin.xyz/cottongin/Icecast-metadata-IRC-announcer/compare/v1.0.1...v1.2.0
[1.0.1]: https://code.cottongin.xyz/cottongin/Icecast-metadata-IRC-announcer/compare/v1.0.0...v1.0.1

38
TODO.md
View File

@ -1,26 +1,16 @@
## TODO 🚧
## TODO
- ⭐️ Better, more clear, logging
- Notification system for stream admin (and bot admin)
- Send notification if unexpected change in metadata
- Loss of network/stream
- Live notifications (alt. for PodPing ish)
- Implement `quiet mode`
- ⭐️ Add whitelist feature
- Add commands:
- To check the status of the bot
- To check the status of the stream
- To check the status of the IRC connection
- Version command
- Better, more clear, logging
- Add a help command
- Add commands to control the stream connection from IRC
- Also to start/stop the service entirely
- Add a version command
- Add a list of commands to the README
- Enable joining multiple channels with a single bot instance
## Complete! 🎉
- ✅ Move this to a TODO.md file 😊
- 🟢 Added commands:
- ✅ Add `quiet mode` relevant commands
- ✅ Add a help command
- ✅ To control the stream connection from IRC
- ✅ To start/stop the service entirely
- ✅ To quiet/unquiet the metadata announcing
- ✅ Add a list of commands to the README
- Add a command to force the bot to reconnect to the stream
- Add a command to check the status of the bot
- Add a command to check the status of the stream
- Add a command to check the status of the IRC connection
- Add a command to check the status of the bot
- Add a command to check the status of the stream
- Move this to a TODO.md file :)

View File

@ -1 +1 @@
1.2.2
1.2.1

24
bot.sh Executable file
View File

@ -0,0 +1,24 @@
#!/bin/bash
# Check if any arguments were provided
if [ $# -eq 0 ]; then
echo "Usage: $0 <config.yaml> [additional configs...]"
exit 1
fi
while true; do
# Remove any existing restart flags before starting
rm -f .restart_flag_*
python main.py "$@"
# Check for any restart flags
if ls .restart_flag_* 1> /dev/null 2>&1; then
echo "Restart flag(s) found, restarting bot(s)..."
sleep 1
continue
else
echo "Bot(s) exited without restart flag, stopping..."
break
fi
done

12
launch.py Normal file
View File

@ -0,0 +1,12 @@
#!/usr/bin/env python3
import asyncio
from main import run_multiple_bots
CONFIG_FILES = [
'config_station1.yaml',
'config_station2.yaml',
'config_station3.yaml'
]
if __name__ == "__main__":
asyncio.run(run_multiple_bots(CONFIG_FILES))

19
main.py
View File

@ -11,6 +11,7 @@ import argparse
import yaml
from pathlib import Path
from typing import List, Optional
import sys
import inspect
import socket
import tempfile
@ -58,6 +59,17 @@ def silent_client_init(self, *args, bot_name: str = None, config: dict = None, *
original_init = Client.__init__
Client.__init__ = silent_client_init
import asyncio
import aiohttp
import time
import argparse
import yaml
from pathlib import Path
from typing import List, Optional
import sys
import inspect
import socket
import tempfile
class RestartManager:
"""Manages restart requests for the bot.
@ -478,8 +490,11 @@ class IcecastBot:
if handler and handler.__doc__:
# Get the first line of the docstring
first_line = handler.__doc__.strip().split('\n')[0]
# Format it using the template and add (admin only) if needed
# Extract the description part after the colon
desc = first_line.split(':', 1)[1].strip()
# Add (admin only) for specific command queries
if pattern in self.admin_commands:
desc = f"{desc} (admin only)"
help_text = self.help_specific_format.format(
prefix=self.cmd_prefix,
cmd=pattern,
@ -1187,7 +1202,7 @@ class IcecastBot:
if handler and handler.__doc__:
# Extract the first line of the docstring
first_line = handler.__doc__.strip().split('\n')[0]
# Remove the command prefix and colon
# Extract the description part after the colon
desc = first_line.split(':', 1)[1].strip()
commands.append(section_config['format'].format(