Jump to content

[BSNova] Burning Series Nova - Das Mega-Tool für BS.TO


NeoGriever
 Share

Recommended Posts

Ich habe das Problem gelöst indem ich in %appdata%\\BSNova die SQLite Datenbanken gelöscht habe.

Ist vielleicht was beim erstellen schiefgegangen. Ich habe sie bei Mega.nz hochgeladen damit man vielleicht den Fehler finden kann. Ich hätte es selber getan, hätte ich den Source gehabt :D. Link.

 

Falls man Kritik üben darf.

Spoiler

Ich habe mir die Datenbank cache angeschaut. Man könnte sie viel übersichtlicher gestalten durch Normalisierung d.h. eine Tabelle Serie etc und dann mit "JOIN" Statements die Informationen rausziehen. Das hat den Vorteil, dass man die Datenbank viel einfacher lesen kann von außen und man schneller Fehler finden kann. 

 

Edited by Lyror
Link to comment
Share on other sites

Diese "Exceptions" bei Downloads treten eher sehr sehr selten auf. Entweder, wenn alle Hoster tot sind (wie gesagt. selten) oder wenn ein interner Fehler bei der Anzeige des Download-Eintrages auftritt.

 

Ich habe mit BSNova bereits einige Serien in Gänze am Stück heruntergeladen. Z. b. habe ich Doctor Who (die neue) in EINEM RUTSCH heruntergeladen. Alle Staffeln. (Und habe diese auch geschaut *lach*) Und nur bei der Ersten kam es zu einem kurzen Fehler.

 

Eine automatische "Retry"-Funktion werde ich nicht einbauen, da dies die so schon sehr instabile Download-Funktion noch instabiler machen würde und es durchaus zu gehäuften Abstürzen kommen könnte. (Bin ehrlich gesagt froh, dass die Download-Funktion noch immer funktioniert XD)

Link to comment
Share on other sites

Ich arbeite aktuell an der nächsten Version. Dabei wird ein sehr interessantes Feature eingeführt, wenn ich es hinkriege. Es wird möglich sein, mit einem BSNova ein anderes BSNova fernzusteuern. Also Remote-Control quasi. Aber auch nur "beschränkt". In Form von: Man kann an den Ziel-BSNova die Downloads weiterleiten anstelle diese beim eigenen BSNova herunterladen zu lassen.

 

Im Grunde also die MyJDownloader-Funktion von JDownloader für BSNova ;)

 

Features des neuen Features:

- Einstellbarer zugelassener Port

- Einstellbarer Sicherheitsschlüssel (Ohne diesen wird keine Verbindung zugelassen)

- Mehrere "Verbindungen" können aufgebaut werden, sodass man die Aufgaben auf mehrere BSNova-Instanzen verteilen kann.

- Einfache "Download-Weiterleitung" durch kleines Menü über der Episodenliste.

 

Es gibt derzeit nur ein kleines Problem:

Wenn ich eine TCP-Verbindung schließe, lässt sich garkeine TCP-Verbindung mehr herstellen. Es kommt dann stets zu dem Fehler: "Der Remote-Server hat die Verbindung verweigert". Und das, obwohl die exakt gleiche Verbindung kurz zuvor ja funktioniert hat. Hat da jemand eine Idee?

 

PS: Hier mal die komplette TCP-Client/Server-Klasse, welche ich für meine Zwecke geschrieben habe:

Imports System.Net.Sockets
Imports System.IO
Imports System.Net

Public Class BSNovaConnect
	Public Class Server
		Private stream As NetworkStream = Nothing
		Private streamw As StreamWriter = Nothing
		Private streamr As StreamReader = Nothing
		Private Server As TcpListener = Nothing
		Private ipendpoint As IPEndPoint = Nothing
		Private mainthread As Threading.Thread = Nothing
		Private KeepActive As Boolean = True
		Private client As New TcpClient()
		
		Public LastException As Exception = Nothing
		Public Event Response(ByVal content As String)
		
		Public Sub Create(ByVal port As Integer)
			ipendpoint = New IPEndPoint(IPAddress.Any, port)
			mainthread = New Threading.Thread(AddressOf mainserver)
			mainthread.Start()
		End Sub
		Private Sub mainserver()
			Try
				Server = New TcpListener(IPAddress.Any,ipendpoint.Port)
				Server.Start()
				client = Server.AcceptTcpClient()
				stream = client.GetStream()
		        streamr = New StreamReader(stream)
		        streamw = New StreamWriter(stream)
				While KeepActive
					Dim line As String = streamr.ReadLine()
					If line <> "" Then
						If line.ToUpper() = "QUIT" Then
							System.Windows.Forms.MessageBox.Show("Client disconnected")
						Else
							RaiseEvent Response(line)
						End If
					End If
				End While
				KeepActive = True
			Catch ex As Exception
				LastException = ex
			End Try
		End Sub
		Public Sub Disconnect()
			KeepActive = False
		End Sub
		Public Sub Answer(ByVal str As String)
			streamw.WriteLine(str)
			streamw.Flush()
		End Sub
	End Class
	Public Class Client
		Private stream As NetworkStream = Nothing
		Private streamw As StreamWriter = Nothing
		Private streamr As StreamReader = Nothing
		Private Client As New TcpClient()
		Public IP As String = ""
		Public Port As Integer = 80
		Public AuthKey As String = ""
		Private ResponseAwaiter As System.Threading.Thread = Nothing
		
		Public Event Response(ByVal content As String)
		
		Public Overloads Function Connect() As Boolean
			Return(Connect(IP,Port))
		End Function
		Public Overloads Function Connect(ByVal selectedIP As String) As Boolean
			Return(Connect(selectedIP,Port))
		End Function
		Public Overloads Function Connect(ByVal selectedIP As String,ByVal selectedPort As Integer) As Boolean
			Client.Connect(selectedIP,selectedPort)
			If Client.Connected Then
				stream = Client.GetStream()
				streamw = New StreamWriter(stream)
				streamr = New StreamReader(stream)
				
				SendCommand("AUTH" & AuthKey)
				
				Dim accepted As Boolean = False
				Dim cycle As Integer = 20
				While cycle > 0
					Dim buffer As String = streamr.ReadLine().Trim()
					If buffer = "ACCEPTED" Then
						accepted = True
						Exit While
					ElseIf buffer = "FAILED" Then
						accepted = False
						Exit While
					End If
					System.Threading.Thread.Sleep(2)
				End While
				
				If accepted Then
					ResponseAwaiter = New System.Threading.Thread(AddressOf ResponseAwait)
					ResponseAwaiter.Start()
				Else
					Client.Close()
				End If
			End If
			Return(Client.Connected)
		End Function
		Public Sub Disconnect()
			If Client.Connected Then
				Client.Client.Disconnect(False)
				Client.Close()
				Client = New TcpClient()
			End If
		End Sub
		
		Private Sub ResponseAwait()
			While Client.Connected
				Try
					Dim buffer As String = streamr.ReadLine()
					If buffer <> "" Then
						RaiseEvent Response(buffer)
					End If
				Catch
				End Try
			End While
		End Sub
		
		Public ReadOnly Property Connected As Boolean
			Get
				Return(Client.Connected)
			End Get
		End Property
		Public Sub SendCommand(ByVal str As String)
			streamw.WriteLine(str)
			streamw.Flush()
		End Sub
	End Class
End Class

 

Ein grobes Beispiel:

 

If <BSNovaConnect.Client>.Connect("127.0.0.1",7175) Then

    <BSNovaConnect.Client>.Disconnect()

    <BSNovaConnect.Client>.Connect("127.0.0.1",7175) ' Crash, obwohl es eigentlich gehen müsste.

End If

 

Im Quelltext sieht man, dass ich bei Disconnect() den TCP-Clienten neu erstelle, nachdem ich diesen zum Trennen gezwungen habe. Somit ist es eine Neue Verbindung. Aber der Port ist weiterhin durch den geschlossenen TCPClient geblockt/benutzt. Somit kann ich nicht erneut darauf zugreifen. Kennt jemand eine Lösung? Oo

Link to comment
Share on other sites

Bin inzwischen auch auf der 3.1 er Version und muss sagen: Chapeau ! die Integration des Serienkalenders ist echt nice.

Frage: gibt es bereits eine Auswahlfunktion zwischen deutsch und englisch und finde ich die nur nicht ? ansonsten würd ich das vorschlagen.

Link to comment
Share on other sites

1. BS.To v2 hat nichts mit der API zu tun ;)

2. Sprachdaten? Meinst du, ob es englisch oder deutsch sein soll, wenn entsprechend beide Sprachen hochgeladen sind? Nun ja. Das geht leider noch nicht. Und ich bin mir auch nicht sicher, ob das in die API mit eingebaut wird.

Link to comment
Share on other sites

die idee deines tools finde ich echt toll und wollte dir vorschlagen ein kurzes script das ich selber gemacht habe optional zu implementieren  https://www.dropbox.com/sh/iijzhy21hpnegtz/AACDxnFlb9G7P2yKE9v69AyXa?dl=0  der source code ist in der readme datei (ich weiß es ist auf c++ gemacht aber ich bin mir sicher das es nicht allzu schwierig wird das zu porten) das script überprüft die bs.to seiten auf neue episoden zu vorgegebenen serien und gibt eine meldung aus fals neue episoden online gestellt werden es stehht dir natürlich frei den source code zu verändern :)

Edited by jonnyy
  • Like 2
Link to comment
Share on other sites

1. Ich nutze kein Skype (bzw. sehr selten)

2. Inzwischen habe ich mich schlau genug gelesen, um eine für mich allumfassende tcp-multiclient-server-library umzusetzen, welche ich bei bedarf in all meinen anderen Projekten einsetzen kann ;) (Ähnlich meiner hweb.dll oder meiner globalconfig.dll :D)

3. Danke für die angebotene Hilfe.

 

PS: Die Klasse, welche mir die TCP-Client/Server-Funktionen bereitstellt, kann ich gerne hier zur Verfügung stellen ;)

Link to comment
Share on other sites

Ich habe meine Klasse vervollständigt. Vollständige MultiClient-Unterstützung und sogar mit Disconnect-Erkennung/Events. Sehr hilfreich alles :D Hier ist die Klasse:

 

Imports System.Net.Sockets
Imports System.IO
Imports System.Net

Public Class BSNovaConnect
	Public Class ConnectedClient
		Private client As TcpClient = Nothing
		Private stream As NetworkStream = Nothing
		Private streamw As StreamWriter = Nothing
		Private streamr As StreamReader = Nothing
		Private ReceiveThread As System.Threading.Thread = Nothing
		Private KeepAlive As Boolean = True
		Private cached_ip As IPAddress = Nothing
		Private EindeutigeID As String = ""
		
		Public Event DataReceived(ByRef obj As ConnectedClient,ByVal data As String)
		Public Event Disconnected(ByRef obj As ConnectedClient)
		
		Public Sub New(ByRef connectclient As TcpClient)
			client = connectclient
			client.ReceiveTimeout = 5
			client.SendTimeout = 5
			stream = client.GetStream()
	        streamr = New StreamReader(stream)
	        streamw = New StreamWriter(stream)
	        EindeutigeID = System.Guid.NewGuid().ToString()
	        ReceiveThread = New System.Threading.Thread(AddressOf ReceiveSub)
	        ReceiveThread.Start()
	        Dim disconnectWaiter As New System.Threading.Thread(AddressOf WaitDisconnect)
	        disconnectWaiter.Start()
	        Send("SUID" & EindeutigeID)
	        cached_ip = IPAddress.Parse(client.Client.RemoteEndPoint.ToString().Split(CChar(":"))(0))
		End Sub
		
		Public ReadOnly Property UniqueID As String
			Get
				Return(EindeutigeID)
			End Get
		End Property
		Public ReadOnly Property Connected As Boolean
			Get
				Return(client.Connected)
			End Get
		End Property
		Public ReadOnly Property IP As IPAddress
			Get
				Try
					Return(IPAddress.Parse(client.Client.RemoteEndPoint.ToString().Split(CChar(":"))(0)))
				Catch
					Return(cached_ip)
				End Try
			End Get
		End Property
		
		Private Sub ReceiveSub()
			While KeepAlive
				Try
					If client.Connected Then
						Dim data As String = streamr.ReadLine()
						If data <> "" Then
							Try
								If data.Length > 6 And data.Substring(0,6) = "/nick " Then
									Dim newnick As String = data.Substring(6).Trim()
									If newnick.Length > 3 Then
										Dim oldNick As String = EindeutigeID
										EindeutigeID = newnick
										Send("SUID" & newnick)
										Send("Nickname akzeptiert")
										RaiseEvent DataReceived(Me,"Nicknamenwechsel: " & oldNick & " > " & newnick)
									Else
										Send("Nickname nicht akzeptiert")
										RaiseEvent DataReceived(Me,"Versuchter Nicknamenwechsel fehlgeschlagen")
									End If
								Else
									RaiseEvent DataReceived(Me,data)
								End If
							Catch
								RaiseEvent DataReceived(Me,data)
							End Try
						End If
					Else
						KeepAlive = False
						Disconnect()
					End If
				Catch
				End Try
			End While
			KeepAlive = True
		End Sub
		Private Sub WaitDisconnect()
			Try
				Dim ReadState As Boolean = client.Client.Poll(-1, SelectMode.SelectRead)
				Dim WriteState As Boolean = client.Client.Poll(-1,SelectMode.SelectWrite)
				If ReadState And WriteState Then
					Disconnect()
				Else
					WaitDisconnect()
				End If
			Catch
				Disconnect()
			End Try
		End Sub
		
		Public Sub Disconnect()
			KeepAlive = False
			streamr.Close()
			streamw.Close()
			stream.Close()
			streamr.Dispose()
			streamw.Dispose()
			stream.Dispose()
			client.Close()
			RaiseEvent Disconnected(Me)
		End Sub
		Public Function Send(ByVal s As String) As Boolean
			Try
				If client.Connected Then
					streamw.WriteLine(s)
					streamw.Flush()
					Return(True)
				Else
					Return(False)
				End If
			Catch
				Return(False)
			End Try
		End Function
	End Class
	Public Class Server
		Private Server As TcpListener = Nothing
		Private ipendpoint As IPEndPoint = Nothing
		Private mainthread As Threading.Thread = Nothing
		Private KeepActive As Boolean = True
		Private connections As New List(Of ConnectedClient)
		Public LastException As Exception = Nothing
		Public Event DataReceived(ByRef obj As ConnectedClient,ByVal data As String)
		Public Event NewClient(ByRef obj As ConnectedClient)
		Public Event ClientDisconnected(ByRef obj As ConnectedClient)
		Public Sub Create(ByVal port As Integer)
			ipendpoint = New IPEndPoint(IPAddress.Any, port)
			mainthread = New Threading.Thread(AddressOf mainserver)
			mainthread.Start()
		End Sub
		Public Sub SendToAll(ByVal s As String,Optional ByRef expect As ConnectedClient = Nothing)
			Dim i As ConnectedClient = Nothing
			For Each i In connections
				If i IsNot expect Then
					i.Send(s)
				End If
			Next
		End Sub
		Public Overloads Sub SendTo(ByVal s As String,ByRef targetClient As ConnectedClient)
			targetClient.Send(s)
		End Sub
		Public Overloads Sub SendTo(ByVal s As String,ByRef targetID As String)
			Dim i As ConnectedClient = Nothing
			For Each i In connections
				If i.UniqueID = targetID Then
					SendTo(s,i)
					Exit For
				End If
			Next
		End Sub
		Public Overloads Sub SendTo(ByVal s As String,ByRef targetIP As IPAddress)
			Dim i As ConnectedClient = Nothing
			For Each i In connections
				If i.IP.ToString() = targetIP.ToString() Then
					SendTo(s,i)
					Exit For
				End If
			Next
		End Sub
		Private Sub mainserver()
			Try
				Server = New TcpListener(IPAddress.Any,ipendpoint.Port)
				Server.Start()
				Try
					While KeepActive
						Try
							Dim temp_client As TcpClient = Server.AcceptTcpClient()
							Dim cclient As New ConnectedClient(temp_client)
							RaiseEvent NewClient(cclient)
							AddHandler cclient.DataReceived, AddressOf DataIncome
							AddHandler cclient.Disconnected, AddressOf Disconnected
							connections.Add(cclient)
						Catch
						End Try
					End While
					KeepActive = True
				Catch ex As Exception
					KeepActive = True
					mainserver()
				End Try
			Catch ex As Exception
				LastException = ex
			End Try
		End Sub
		Public Sub Disconnected(ByRef obj As ConnectedClient)
			RaiseEvent ClientDisconnected(obj)
		End Sub
		Public Sub DataIncome(ByRef obj As ConnectedClient,ByVal data As String)
			RaiseEvent DataReceived(obj,data)
		End Sub
		Public Sub Disconnect()
			For Each i As ConnectedClient In connections
				i.Send("TERMINATED")
				i.Disconnect()
			Next
			KeepActive = False
		End Sub
	End Class
	Public Class Client
		Private stream As NetworkStream = Nothing
		Private streamw As StreamWriter = Nothing
		Private streamr As StreamReader = Nothing
		Private Client As New TcpClient()
		Private tempLastResponse As String = ""
		Private ResponseAwaiter As System.Threading.Thread = Nothing
		Public Tag As Object = Nothing
		Public IP As String = ""
		Public Port As Integer = 80
		Public EindeutigeID As String = ""
		
		Public Event Response(ByRef obj As Client,ByVal content As String)
		Public Event Disconnected(ByRef obj As Client)
		
		Public ReadOnly Property Connected As Boolean
			Get
				Return(Client.Connected)
			End Get
		End Property
		Public ReadOnly Property LastResponse As String
			Get
				Return(tempLastResponse)
			End Get
		End Property
		
		Private Sub ResponseAwait()
			Try
				While Client.Connected
					Try
						Dim buffer As String = streamr.ReadLine()
						If buffer <> "" Then
							If buffer.Length > 4 And buffer.Substring(0,4) = "SUID" Then
								EindeutigeID = buffer.Substring(4)
							Else
								tempLastResponse = buffer
								RaiseEvent Response(Me,buffer)
							End If
						End If
					Catch
					End Try
				End While
			Catch
			End Try
		End Sub
		
		Public Overloads Function Connect() As Boolean
			EindeutigeID = System.Guid.NewGuid().ToString()
			Return(Connect(IP,Port))
		End Function
		Public Overloads Function Connect(ByVal selectedIP As String) As Boolean
			Return(Connect(selectedIP,Port))
		End Function
		Public Overloads Function Connect(ByVal selectedIP As String,ByVal selectedPort As Integer) As Boolean
			Client.Connect(selectedIP,selectedPort)
			If Client.Connected Then
				stream = Client.GetStream()
				streamw = New StreamWriter(stream)
				streamr = New StreamReader(stream)
				ResponseAwaiter = New System.Threading.Thread(AddressOf ResponseAwait)
				ResponseAwaiter.Start()
			End If
			Return(Client.Connected)
		End Function
		Public Sub Disconnect()
			If Client.Connected Then
				streamr.Close()
				streamw.Close()
				stream.Close()
				streamr.Dispose()
				streamw.Dispose()
				stream.Dispose()
				Client.Close()
				Client = New TcpClient()
				RaiseEvent Disconnected(Me)
			End If
		End Sub
		Public Sub Send(ByVal str As String)
			If Client.Connected Then
				streamw.WriteLine(str)
				streamw.Flush()
			End If
		End Sub
	End Class
End Class

 

Link to comment
Share on other sites

  • Fox locked this topic
Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...