📜 Tutorial: Membuat Detektor "Now Playing" untuk Last.fm dan AIMP di Python - Terzier - 09-06-2025
Code: import pylast
import time
import os
import threading
import keyboard
import win32gui
import win32process
import psutil
# -------------------------------------------------------------
# KONFIGURASI Last.fm
# -------------------------------------------------------------
API_KEY = '**************************'
API_SECRET = '**************************'
username = '**************************'
output_file = 'D:\\Music Harddisk\\NowPlaying\\nowplaying.txt'
# -------------------------------------------------------------
# FUNGSI Last.fm
# -------------------------------------------------------------
network = pylast.LastFMNetwork(api_key=API_KEY, api_secret=API_SECRET, username=username)
stop_event = threading.Event()
def get_ytm_nowplaying():
"""Mendapatkan lagu yang sedang diputar dari Last.fm."""
try:
user = network.get_user(username)
track = user.get_now_playing()
if track:
return f"{track.get_artist().get_name()} - {track.get_title()}"
except Exception:
pass
return None
# -------------------------------------------------------------
# LOGIKA UTAMA
# -------------------------------------------------------------
def monitor_music():
"""Logika utama untuk mendeteksi dan menulis lagu."""
last_status = None # Variabel untuk menyimpan status sebelumnya
while not stop_event.is_set():
now_playing = get_ytm_nowplaying()
# Cek apakah status sekarang berbeda dengan status sebelumnya
if now_playing != last_status:
# Jika berbeda, perbarui file dan cetak ke konsol
with open(output_file, 'w', encoding='utf-8') as f:
f.write(now_playing if now_playing else "No audio playing")
print(f"Updated: {now_playing if now_playing else 'No audio playing'}")
# Perbarui last_status dengan status yang baru
last_status = now_playing
time.sleep(5)
def main():
"""Fungsi utama."""
print("Monitoring music... Press 'C' to stop.")
monitor_thread = threading.Thread(target=monitor_music)
monitor_thread.start()
try:
keyboard.wait('c')
except keyboard.KeyboardError:
pass
finally:
stop_event.set()
monitor_thread.join()
print("Stopped.")
if __name__ == "__main__":
main()
RE: LastPlay.py | ⏳ Menambahkan Progres "Loading..." - Terzier - 09-06-2025
Code: import pylast
import time
import os
import threading
import keyboard
import sys
# -------------------------------------------------------------
# KONFIGURASI Last.fm
# -------------------------------------------------------------
API_KEY = '**************************'
API_SECRET = '**************************'
username = '**************************'
output_file = 'D:\\Music Harddisk\\WowPlaying\\nowplaying.txt'
# -------------------------------------------------------------
# FUNGSI Last.fm
# -------------------------------------------------------------
network = pylast.LastFMNetwork(api_key=API_KEY, api_secret=API_SECRET, username=username)
stop_event = threading.Event()
def get_ytm_nowplaying():
"""Mendapatkan lagu yang sedang diputar dari Last.fm."""
try:
user = network.get_user(username)
track = user.get_now_playing()
if track:
return f"{track.get_artist().get_name()} - {track.get_title()}"
except Exception:
pass
return None
# -------------------------------------------------------------
# LOGIKA UTAMA
# -------------------------------------------------------------
def monitor_music():
"""Logika utama untuk mendeteksi dan menulis lagu."""
last_status = None
loading_dots = 0
while not stop_event.is_set():
now_playing = get_ytm_nowplaying()
# Jika status lagu berubah
if now_playing != last_status:
# Jika ada lagu baru, langsung perbarui
if now_playing:
with open(output_file, 'w', encoding='utf-8') as f:
f.write(now_playing)
print(f"Updated: {now_playing}")
last_status = now_playing
else:
# Jika status berubah menjadi 'tidak ada lagu'
# Maka, atur ulang status agar loading muncul di bawah
last_status = now_playing
# Jika tidak ada lagu dan last_status sudah tidak ada lagu
if not now_playing and last_status == now_playing:
loading_dots = (loading_dots + 1) % 4
loading_text = "Loading" + "." * loading_dots
# Tulis "Loading..." ke file dan konsol
with open(output_file, 'w', encoding='utf-8') as f:
f.write(loading_text)
# Cetak di konsol
print(f"Updated: {loading_text}", end='\r')
sys.stdout.flush()
time.sleep(1)
def main():
"""Fungsi utama."""
print("Monitoring music... Press 'C' to stop.")
monitor_thread = threading.Thread(target=monitor_music)
monitor_thread.start()
try:
keyboard.wait('c')
except keyboard.KeyboardError:
pass
finally:
stop_event.set()
monitor_thread.join()
# Saat berhenti, hapus teks loading
with open(output_file, 'w', encoding='utf-8') as f:
f.write("Stopped.")
print("\nStopped.")
if __name__ == "__main__":
main()
RE: LastPlay.py | Kode Terakhir - Terzier - 09-06-2025
Code: # =============================================================
# SCRIPT DETEKTOR "NOW PLAYING"
# =============================================================
# Script ini berfungsi untuk mendeteksi lagu yang sedang diputar
# melalui Last.fm (untuk YouTube Music) dan menulis informasinya
# ke dalam sebuah file teks. File ini akan dibaca oleh
# aplikasi seperti RadioCaster.
# =============================================================
# LOG PERUBAHAN
# =============================================================
# 1.0 (2025-09-06) - Versi Awal
# - Berfokus pada deteksi Last.fm.
# - Menulis "No audio playing" jika tidak ada lagu.
# - Pengecekan dilakukan setiap 5 detik.
# 1.1 (2025-09-06) - Penyesuaian Sinkronisasi
# - Menambahkan logika perbandingan status (`last_status`).
# - Skrip hanya akan memperbarui file dan mencetak "Updated" jika
# lagu berubah, berhenti, atau mulai diputar.
# - Menghapus import win32gui, win32process, dan psutil karena
# fungsi deteksi jendela tidak lagi digunakan di versi ini.
# =============================================================
# LIBRARY YANG DIBUTUHKAN
# =============================================================
import pylast # Untuk interaksi dengan Last.fm API.
import time # Untuk jeda (sleep) antar pengecekan.
import os # Untuk fungsi terkait sistem file.
import keyboard # Untuk mendeteksi tombol `C` untuk berhenti.
import threading # Untuk menjalankan monitoring di thread terpisah.
# Catatan: Library win32gui, win32process, dan psutil dihapus di
# versi ini karena kita tidak lagi mendeteksi melalui judul jendela.
# import win32gui
# import win32process
# import psutil
# -------------------------------------------------------------
# KONFIGURASI Last.fm
# -------------------------------------------------------------
API_KEY = '**************************'
API_SECRET = '**************************'
username = '**************************'
# Lokasi file teks output yang akan dibaca oleh RadioCaster.
# Path ini harus SAMA PERSIS dengan yang diatur di RadioCaster & AIMP.
output_file = 'D:\\Music Harddisk\\WowPlaying\\nowplaying.txt'
# -------------------------------------------------------------
# FUNGSI Last.fm
# -------------------------------------------------------------
network = pylast.LastFMNetwork(api_key=API_KEY, api_secret=API_SECRET, username=username)
stop_event = threading.Event()
def get_ytm_nowplaying():
"""Mendapatkan lagu yang sedang diputar dari Last.fm.
Fungsi ini berfungsi untuk mendeteksi musik yang di-scrobble
ke Last.fm (biasanya dari YouTube Music).
"""
try:
user = network.get_user(username)
track = user.get_now_playing()
if track:
return f"{track.get_artist().get_name()} - {track.get_title()}"
except Exception:
# Jika ada error (misalnya, koneksi internet putus),
# fungsi akan mengembalikan None.
pass
return None
# -------------------------------------------------------------
# LOGIKA UTAMA
# -------------------------------------------------------------
def monitor_music():
"""Logika utama untuk mendeteksi dan menulis lagu."""
# Variabel untuk menyimpan status lagu sebelumnya.
# Ini digunakan agar file hanya di-update saat ada perubahan.
last_status = None
while not stop_event.is_set():
now_playing = get_ytm_nowplaying()
# Cek apakah status sekarang berbeda dengan status sebelumnya.
if now_playing != last_status:
# Jika berbeda, perbarui file dan cetak di konsol.
with open(output_file, 'w', encoding='utf-8') as f:
f.write(now_playing if now_playing else "No audio playing")
print(f"Updated: {now_playing if now_playing else 'No audio playing'}")
# Perbarui `last_status` dengan status yang baru.
last_status = now_playing
# Jeda selama 5 detik sebelum pengecekan berikutnya.
time.sleep(5)
def main():
"""Fungsi utama untuk menjalankan program."""
print("Monitoring music... Press 'C' to stop.")
# Buat thread baru agar monitoring berjalan di latar belakang.
monitor_thread = threading.Thread(target=monitor_music)
monitor_thread.start()
try:
# Tunggu hingga tombol 'C' ditekan.
keyboard.wait('c')
except keyboard.KeyboardError:
pass
finally:
# Jika tombol 'C' ditekan, atur `stop_event` untuk menghentikan thread.
stop_event.set()
# Tunggu thread selesai.
monitor_thread.join()
print("Stopped.")
if __name__ == "__main__":
main()
|