This commit is contained in:
2025-06-11 16:27:25 +03:00
commit 9857919a69
5 changed files with 175 additions and 0 deletions
+132
View File
@@ -0,0 +1,132 @@
#!/usr/bin/env python3
"""
Sync Spotify “Now Playing” → Telegram Bio
----------------------------------------
• Checks Spotify every 45 seconds
• Prepends/clears a 🎶 … line in your Telegram About
• Designed to be run with: nohup python3 nowplaying.py &
"""
import os
import time
import spotipy
import sys
from telethon.sync import TelegramClient
from telethon.tl.functions.users import GetFullUserRequest
from telethon.tl.functions.account import UpdateProfileRequest
from spotipy.oauth2 import SpotifyOAuth
from dotenv import load_dotenv
# ────────────────────────────────────────────
# 1. CONFIGURATION (read from env for safety)
# ────────────────────────────────────────────
load_dotenv()
TG_API_ID = int(os.environ["TG_API_ID"]) # from https://my.telegram.org
TG_API_HASH = os.environ["TG_API_HASH"]
SPOTIPY_CLIENT_ID = os.environ["SPOTIFY_CLIENT_ID"]
SPOTIPY_CLIENT_SECRET = os.environ["SPOTIFY_CLIENT_SECRET"]
SPOTIPY_REDIRECT_URI = os.getenv(
"SPOTIFY_REDIRECT_URI", "http://127.0.0.1:8888/callback"
)
CHECK_EVERY_SEC = 45
PRINT_DEBUG = "--debug" in sys.argv
SINGLE_RUN = "--single" in sys.argv
# ────────────────────────────────────────────
# 2. HELPERS
# ────────────────────────────────────────────
def track_as_string(item: dict) -> str:
"""Make 'Song - Artist1, Artist2'."""
artists = ", ".join(a["name"] for a in item["artists"])
return f"\"{item['name']}\" by {artists}"
# return f"{artists} - {item['name']}"
def strip_old_track(bio: str) -> str:
"""Remove anything after the first 🎶"""
return bio.split("🎶")[0].rstrip()
def printd(*args, **kwargs) -> None:
"""Print debug messages if PRINT_DEBUG is True."""
if PRINT_DEBUG:
print(*args, **kwargs)
# ────────────────────────────────────────────
# 3. MAIN LOOP
# ────────────────────────────────────────────
def main() -> None:
# Spotipy OAuth (needs scope 'user-read-playback-state')
sp = spotipy.Spotify(
auth_manager=SpotifyOAuth(
client_id=SPOTIPY_CLIENT_ID,
client_secret=SPOTIPY_CLIENT_SECRET,
redirect_uri=SPOTIPY_REDIRECT_URI,
scope="user-read-playback-state",
cache_path=".cache", # reuse token silently
)
)
# One Telegram session for the whole run
with TelegramClient("my_account", TG_API_ID, TG_API_HASH) as client:
last_track = None # remember what we already set
while True:
try:
# ── 3-a Spotify: whats playing?
pb = sp.current_playback()
is_playing = pb and pb["is_playing"]
# ── 3-b Telegram: fetch current bio (once each loop)
me = client.get_me()
full = client(GetFullUserRequest(me.id))
base_bio = strip_old_track(full.full_user.about or "")
if is_playing and pb is not None and pb.get("item") is not None:
track_str = track_as_string(pb["item"])
nbsp = "\u00a0"
track_str = track_str.replace(" ", nbsp) # non-breaking spaces
# Update only if changed
if track_str != last_track:
new_bio = f"{base_bio} 🎶{nbsp}Now{nbsp}listening: {track_str}".strip()
client(UpdateProfileRequest(about=new_bio))
printd("🎶 Updated bio →", new_bio)
last_track = track_str
else:
# Nothing playing → clear any old 🎶 line
if last_track is not None:
client(UpdateProfileRequest(about=base_bio))
printd("⊘ Cleared track from bio")
last_track = None
except Exception as e:
print("⚠️ Error:", e)
if SINGLE_RUN:
print("🔚 Single run mode, exiting.")
break
time.sleep(CHECK_EVERY_SEC)
# ────────────────────────────────────────────
if __name__ == "__main__":
if "--help" in sys.argv or "-h" in sys.argv:
print("Sync Spotify Now Playing to Telegram Bio")
print("--------------------------------------------------")
print("Usage: python3 script.py [--debug] [--single] [--help]")
print(" --debug Print debug messages")
print(" --single Run only one iteration and exit")
print(" --help Show this help message and exit")
sys.exit(0)
main()