improve playing local copies of server music

This commit is contained in:
cidoku 2025-10-07 22:45:34 -03:00
parent 32ec736296
commit 2385896830

View File

@ -1,4 +1,4 @@
import thread, time, os, urllib, random, re
import thread, time, os, urllib, random, re , platform
import charselect, ini, AOsocket, images, packets, demo, buttons
from os.path import exists, basename
@ -10,14 +10,12 @@ from PyQt4 import QtGui, QtCore
from functools import partial
from ctypes import create_string_buffer
from urllib2 import Request, urlopen
from urlparse import urlparse
DOWNLOAD_BLACKLIST = []
URL_REGEX = r"https?://(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_+.~#?&/=]*)"
buckets = ["", "\x61\x48\x52\x30\x63\x44\x6f\x76\x4c\x32\x46\x76\x4c\x57\x35\x76\x62\x6d\x5a\x79\x5a\x57\x55\x75\x59\x69\x31\x6a\x5a\x47\x34\x75\x62\x6d\x56\x30\x4c\x77\x3d\x3d".decode("\x62\x61\x73\x65\x36\x34")] # troll
# bucket 0 ("") is used for server's own bucket
bucket = ""
def delay(msec):
dieTime = QtCore.QTime.currentTime().addMSecs(msec)
@ -74,10 +72,6 @@ def downloadThread(link, savepath):
if link in DOWNLOAD_BLACKLIST:
return
for bucket in buckets:
if not bucket: continue
i = buckets.index(bucket)
print "[client] Download missing: %s" % link
fp = urllib.urlopen(bucket + link)
if fp.getcode() == 200:
@ -145,8 +139,9 @@ class MusicDownloadThread(QtCore.QThread):
request.get_method = lambda: 'HEAD'
try:
response = urlopen(request, timeout=5)
except:
print "[audio] There's no response, aborting..."
except Exception as e:
print "[audio] There's no response, aborting. Details below:"
print "[audio]", e, url
self.quit()
return
@ -1599,6 +1594,7 @@ class GUI(QtGui.QWidget):
self.demoRecorder = None
self.demoPlaying = False
self.musicList = {}
self.userPickedMusicItem = False
self.slideEnabled = getOption("General", "slide", False) == 'True'
self.slideAvailable = False
@ -2484,6 +2480,7 @@ class GUI(QtGui.QWidget):
self.stopMusic()
def onMusicItemClicked(self, item):
self.userPickedMusicItem = True
self.sendMC(self.musicList[item.text()])
def onAreaItemClicked(self, item):
@ -3731,35 +3728,52 @@ class GUI(QtGui.QWidget):
audio.playHandle(self.sound, True)
def playMusic(self, mus):
if mus == "~stop.mp3":
self.stopMusic()
if mus == "~stop.mp3" or not mus:
return
if not mus.endswith(".mp3") and "===MUSIC START===.mp3" in self.musicList: #vidya workaround
mus += ".mp3"
musl = mus.lower()
#musp = urllib.unquote(urlparse(musl).path)[1:]
self.stopMusic()
playLocal = False
if exists(AOpath + 'sounds/music/' + musl):
playLocal = True
elif self.userPickedMusicItem:
_musl = self.musicList[self.musicItems.currentItem().text()]
if exists(AOpath + 'sounds/music/' + _musl):
if isinstance(_musl, unicode):
if platform.system() == "Windows":
musl = _musl.encode('mbcs')
else:
musl = _musl.encode('utf-8')
else:
musl = _musl
playLocal = True
self.userPickedMusicItem = False
if playLocal:
self.music = audio.loadHandle(False, AOpath + 'sounds/music/' + musl, 0, 0, BASS_SAMPLE_LOOP)
if self.music:
audio.setHandleAttr(self.music, BASS_ATTRIB_VOL, self.sliMusicVolume.value() / 100.0)
audio.playHandle(self.music, True)
if self.sliMusicVolume.value() == 0:
audio.pauseHandle(self.music)
else:
error = audio.getBassError()
print "[audio] Couldn't play local track! Error", error
elif ini.read_ini_bool("AO2XP.ini", "General", "download music", True):
if mus.lower().startswith("http"):
#self.music = audio.loadURLHandle(mus, 0, BASS_STREAM_BLOCK | BASS_SAMPLE_LOOP)
if musl.startswith("http"):
self.music = audio.loadURLHandle(mus, 0, BASS_SAMPLE_LOOP)
print "[audio] Trying to play", mus
else:
for bucket in buckets:
if not bucket: continue
global bucket
mus = musl = bucket + 'base/sounds/music/' + musl.replace(" ", "%20")
print "[audio] Music stream:", bucket + 'base/sounds/music/' + mus
self.music = audio.loadURLHandle(bucket+'base/sounds/music/' + musl, 0, BASS_STREAM_BLOCK | BASS_SAMPLE_LOOP)
if self.music: break
self.music = audio.loadURLHandle(musl, 0, BASS_SAMPLE_LOOP)
if self.music:
audio.setHandleAttr(self.music, BASS_ATTRIB_VOL, self.sliMusicVolume.value() / 100.0)
@ -3962,11 +3976,14 @@ class GUI(QtGui.QWidget):
# We want only song names without paths or extensions in the music list
for song in musicList:
self.musicList[QtCore.QString(os.path.splitext(basename(song))[0].decode('utf-8').replace("<and>","&"))] = song.decode('utf-8')
_basename = os.path.splitext(basename(song))
self.musicList[QtCore.QString(_basename[0].decode('utf-8').replace("<and>","&"))] = song.decode('utf-8')
if "base/" in webAO_bucket:
webAO_bucket = webAO_bucket.replace("base/", "")
buckets[0] = webAO_bucket
global bucket
bucket = webAO_bucket
self.charSelect.setCharList(charList)
autopick = getOption("General", "auto pick").decode('utf-8').lower()
coincidence = -1
@ -4174,17 +4191,17 @@ class GUI(QtGui.QWidget):
def updateAreaList(self):
try:
for i in range(self.areasLen):
area_players = self.areas[0][i]
area_status = self.areas[1][i].title()
area_cm = self.areas[2][i].decode('utf-8')
area_locked = self.areas[3][i].title()
area_name = self.areas[4][i].decode('utf-8')
if area_status == "Casing":
self.areaItems.item(i).setText("%s\n%s | %s\n%s users | %s" % (area_name, area_status, area_cm, area_players, area_locked))
areaPlayers = self.areas[0][i]
areaStatus = self.areas[1][i].title()
areaCM = self.areas[2][i].decode('utf-8')
areaLocked = self.areas[3][i].title()
areaName = self.areas[4][i].decode('utf-8')
if areaStatus == "Casing":
self.areaItems.item(i).setText("%s\n%s | %s\n%s users | %s" % (areaName, areaStatus, areaCM, areaPlayers, areaLocked))
else:
self.areaItems.item(i).setText("%s\n%s\n%s users | %s" % (area_name, area_status, area_players, area_locked))
self.areaItems.item(i).setText("%s\n%s\n%s users | %s" % (areaName, areaStatus, areaPlayers, areaLocked))
if area_locked == "Locked":
if areaLocked == "Locked":
self.areaItems.item(i).setIcon(QtGui.QIcon(AO2XPpath + "icons/" + "lock.png"))
else:
self.areaItems.item(i).setIcon(QtGui.QIcon(AO2XPpath + "icons/" + "house.png"))