Compare commits

...

2 Commits

Author SHA1 Message Date
Dmitrii Okunev
98a210910f Update the Windows MPV build link
Some checks failed
rolling-release / build (push) Has been cancelled
rolling-release / rolling-release (push) Has been cancelled
2025-08-16 23:42:29 +01:00
Dmitrii Okunev
743351a560 Make locking issue in kick a bit more debuggable 2025-08-16 23:23:34 +01:00
4 changed files with 43 additions and 41 deletions

View File

@@ -76,7 +76,7 @@ $(GOPATH)/bin/pkg-config-wrapper:
sh -c 'cd 3rdparty/amd64/windows && wget https://get.videolan.org/vlc/$(WINDOWS_VLC_VERSION)/win64/vlc-$(WINDOWS_VLC_VERSION)-win64.7z && 7z -y x vlc-$(WINDOWS_VLC_VERSION)-win64.7z && rm -f vlc-$(WINDOWS_VLC_VERSION)-win64.7z'
sh -c 'cd 3rdparty/amd64/windows && wget https://github.com/BtbN/FFmpeg-Builds/releases/download/autobuild-2024-04-30-12-51/ffmpeg-n7.0-21-gfb8f0ea7b3-win64-gpl-shared-7.0.zip && unzip -o ffmpeg-n7.0-21-gfb8f0ea7b3-win64-gpl-shared-7.0.zip && rm -f ffmpeg-n7.0-21-gfb8f0ea7b3-win64-gpl-shared-7.0.zip'
mkdir 3rdparty/amd64/windows/mpv
sh -c 'cd 3rdparty/amd64/windows/mpv && wget https://github.com/shinchiro/mpv-winbuild-cmake/releases/download/20250705/mpv-x86_64-20250705-git-614e3c4.7z && 7z -y x mpv-x86_64-20250705-git-614e3c4.7z && rm -f mpv-x86_64-20250705-git-614e3c4.7z'
sh -c 'cd 3rdparty/amd64/windows/mpv && wget https://github.com/shinchiro/mpv-winbuild-cmake/releases/download/20250816/mpv-x86_64-20250816-git-07572dc.7z && 7z -y x mpv-x86_64-20250816-git-07572dc.7z && rm -f mpv-x86_64-20250816-git-07572dc.7z'
touch 3rdparty/amd64/windows/ready
windows-builddir: build/streampanel-windows-amd64

2
go.mod
View File

@@ -321,7 +321,7 @@ require (
github.com/xaionaro-go/xfyne v0.0.0-20250615190411-4c96281f6e25
github.com/xaionaro-go/xlogrus v0.0.0-20250111150201-60557109545a
github.com/xaionaro-go/xpath v0.0.0-20250111145115-55f5728f643f
github.com/xaionaro-go/xsync v0.0.0-20250713122735-6e002588c3d0
github.com/xaionaro-go/xsync v0.0.0-20250816221754-5ff810dd0a2c
github.com/yutopp/go-flv v0.3.1
golang.org/x/crypto v0.39.0
google.golang.org/grpc v1.73.0

2
go.sum
View File

@@ -1159,6 +1159,8 @@ github.com/xaionaro-go/xpath v0.0.0-20250111145115-55f5728f643f h1:ofxY1akRlVdJ/
github.com/xaionaro-go/xpath v0.0.0-20250111145115-55f5728f643f/go.mod h1:f0DVcqddOy1RALOgXJHwpQnkp1u1yeBX/+A2+Bf4EGc=
github.com/xaionaro-go/xsync v0.0.0-20250713122735-6e002588c3d0 h1:JDl35mgD3RsmEx7xbBCSONLceBCTFUWQvPUG5YsWrgU=
github.com/xaionaro-go/xsync v0.0.0-20250713122735-6e002588c3d0/go.mod h1:FCpywNAl4a4hgzE8j7Z+TpdhBQi5WHxnI35jOrFpoQw=
github.com/xaionaro-go/xsync v0.0.0-20250816221754-5ff810dd0a2c h1:d1jyWhrTnHhwk+16Y7fexlXQCqfvm0NCsDvdsg2mcCA=
github.com/xaionaro-go/xsync v0.0.0-20250816221754-5ff810dd0a2c/go.mod h1:FCpywNAl4a4hgzE8j7Z+TpdhBQi5WHxnI35jOrFpoQw=
github.com/xaionaro-go/youtube-live-chat-downloader/v2 v2.0.0-20250726224735-811554015ae8 h1:iRcIRlIryjDkgFoKJZQQWra/zv783CnKtXnpq9z7VTQ=
github.com/xaionaro-go/youtube-live-chat-downloader/v2 v2.0.0-20250726224735-811554015ae8/go.mod h1:TrUogg8mrebgMD/JU094CmSXn3yKrt+CZjiDL3YtmMw=
github.com/xaionaro-go/zerolog2belt v0.0.0-20241103164018-a3bc1ea487e5 h1:jAy7VLg8y8XE1R8jBte4PRDJzOaAE+sUfmttfB9ZcAY=

View File

@@ -160,50 +160,51 @@ func (k *Kick) keepAliveLoop(
func (k *Kick) initChatHandler(
ctx context.Context,
) error {
if !k.ChatHandlerLocker.Lock(ctx) {
return ctx.Err()
}
return xsync.DoA1R1(ctx, &k.ChatHandlerLocker, k.initChatHandlerNoLock, ctx)
}
func (k *Kick) initChatHandlerNoLock(
ctx context.Context,
) error {
chatHandler, err := k.newChatHandlerOBSOLETE(ctx, k.CurrentConfig.Config.Channel, k.onChatHandlerClose)
if err == nil {
k.ChatHandlerLocker.Unlock()
k.ChatHandler = chatHandler
return nil
}
go func() {
defer k.ChatHandlerLocker.Unlock()
defer logger.Debugf(ctx, "/initChatHandler")
for {
logger.Errorf(ctx, "unable to initialize chat handler: %v", err)
time.Sleep(time.Second)
select {
case <-k.CloseCtx.Done():
logger.Debugf(ctx, "initChatHandler: cancelled (case #1)")
return
case <-ctx.Done():
logger.Debugf(ctx, "initChatHandler: cancelled (case #2)")
return
default:
}
chatHandler, err = k.newChatHandlerOBSOLETE(ctx, k.CurrentConfig.Config.Channel, k.onChatHandlerClose)
if err == nil {
break
}
for {
logger.Errorf(ctx, "unable to initialize chat handler: %v", err)
time.Sleep(time.Second)
select {
case <-k.CloseCtx.Done():
logger.Debugf(ctx, "initChatHandler: cancelled (case #1)")
return fmt.Errorf("k.CloseCtx is closed: %w", k.CloseCtx.Err())
case <-ctx.Done():
logger.Debugf(ctx, "initChatHandler: cancelled (case #2)")
return fmt.Errorf("ctx is closed: %w", ctx.Err())
default:
}
chatHandler, err = k.newChatHandlerOBSOLETE(ctx, k.CurrentConfig.Config.Channel, k.onChatHandlerClose)
if err != nil {
logger.Debugf(ctx, "initChatHandler: unable to create a new chat handler: %v", err)
continue
}
k.ChatHandler = chatHandler
}()
return nil
return nil
}
}
func (k *Kick) onChatHandlerClose(
ctx context.Context,
h *ChatHandlerOBSOLETE,
) {
if !k.ChatHandlerLocker.Lock(ctx) {
return
}
defer k.ChatHandlerLocker.Unlock()
xsync.DoA2(ctx, &k.ChatHandlerLocker, k.onChatHandlerCloseNoLock, ctx, h)
}
func (k *Kick) onChatHandlerCloseNoLock(
ctx context.Context,
h *ChatHandlerOBSOLETE,
) {
if h != k.ChatHandler {
logger.Errorf(ctx, "chat handler was already replaced")
return
@@ -550,11 +551,9 @@ func (k *Kick) GetAllCategories(
func (k *Kick) tryGetChatHandler(
ctx context.Context,
) *ChatHandlerOBSOLETE {
if !k.ChatHandlerLocker.Lock(ctx) {
return nil
}
defer k.ChatHandlerLocker.Unlock()
return k.ChatHandler
return xsync.DoR1(ctx, &k.ChatHandlerLocker, func() *ChatHandlerOBSOLETE {
return k.ChatHandler
})
}
func (k *Kick) getChatHandler(
@@ -761,10 +760,11 @@ func (k *Kick) prepareNoLock(ctx context.Context) error {
err = fmt.Errorf("initChannelInfo: %w", err)
return
}
if err = k.initChatHandler(ctx); err != nil {
err = fmt.Errorf("initChatHandler: %w", err)
return
}
observability.Go(ctx, func(ctx context.Context) {
if err = k.initChatHandler(ctx); err != nil {
logger.Errorf(ctx, "initChatHandler: %v", err)
}
})
})
return err
}
@@ -846,7 +846,7 @@ func (k *Kick) refreshAccessToken(
err = k.setToken(ctx, resp, time.Now())
if err != nil {
return fmt.Errorf("unable to set access token: %w")
return fmt.Errorf("unable to set access token: %w", err)
}
return nil