64 lines
2.0 KiB
Python
64 lines
2.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Self-hosted IPTV: serves M3U playlists that schedule video files from /movies and /series
|
|
with randomized order so the same show never appears twice in a row.
|
|
"""
|
|
|
|
import logging
|
|
import os
|
|
|
|
from iptv.config import CHANNELS_FILE, EPG_TIMESPAN_DAYS, SCHEDULE_CACHE_TTL_SEC, init_epg_timespan
|
|
from iptv.cache import CacheManager
|
|
from iptv.channel import ChannelRepository
|
|
from iptv.schedule import ScheduleBuilder
|
|
from iptv.tmdb_client import TMDBClient
|
|
from iptv.metadata_prefetcher import MetadataPrefetcher
|
|
from iptv.epg_builder import EPGBuilder
|
|
from iptv.server import create_server
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def main():
|
|
init_epg_timespan()
|
|
log_level = getattr(logging, os.environ.get("LOG_LEVEL", "INFO").upper(), logging.INFO)
|
|
logging.basicConfig(
|
|
level=log_level,
|
|
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
|
|
datefmt="%Y-%m-%d %H:%M:%S",
|
|
)
|
|
if not CHANNELS_FILE.exists():
|
|
print(f"Warning: {CHANNELS_FILE} not found. Create it from data/channels.json.example")
|
|
logger.info(
|
|
"EPG timespan: %s days, schedule refresh after: %.1f h",
|
|
EPG_TIMESPAN_DAYS,
|
|
SCHEDULE_CACHE_TTL_SEC / 3600,
|
|
)
|
|
|
|
channel_repo = ChannelRepository()
|
|
schedule_builder = ScheduleBuilder()
|
|
schedule_builder.set_channel_repo(channel_repo)
|
|
tmdb_client = TMDBClient()
|
|
cache_manager = CacheManager(schedule_builder=schedule_builder)
|
|
prefetcher = MetadataPrefetcher(schedule_builder, tmdb_client, channel_repo)
|
|
prefetcher.start()
|
|
epg_builder = EPGBuilder(
|
|
schedule_builder, tmdb_client, channel_repo, cache_manager, prefetcher
|
|
)
|
|
|
|
port = 8080
|
|
server = create_server(
|
|
channel_repo=channel_repo,
|
|
schedule_builder=schedule_builder,
|
|
epg_builder=epg_builder,
|
|
host="0.0.0.0",
|
|
port=port,
|
|
cache_manager=cache_manager,
|
|
)
|
|
print(f"Serving at http://0.0.0.0:{port}/ (playlist: http://<host>:{port}/playlist.m3u)")
|
|
server.serve_forever()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|